diff --git a/_locales/am/messages.json b/_locales/am/messages.json index dc3a042..f595220 100644 --- a/_locales/am/messages.json +++ b/_locales/am/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index dc3a042..f595220 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/bg/messages.json b/_locales/bg/messages.json index dc3a042..f595220 100644 --- a/_locales/bg/messages.json +++ b/_locales/bg/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index dc3a042..f595220 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index dc3a042..f595220 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/da/messages.json b/_locales/da/messages.json index dc3a042..f595220 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/de/messages.json b/_locales/de/messages.json index c1dd629..8896940 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Erstellen" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Dateien erfolgreich exportiert" }, "dataImportedSuccessfully": { "message": "Dateien erfolgreich importiert" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Verschlüsselung" }, @@ -20,14 +41,20 @@ "language": { "message": "Sprache" }, + "light": { + "message": "Light" + }, "lists": { "message": "Listen" }, "myTasks": { "message": "Meine Aufgaben" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "Keine Listen" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Datei auswählen" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/el/messages.json b/_locales/el/messages.json index dc3a042..f595220 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/en/messages.json b/_locales/en/messages.json index dc3a042..f595220 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/es/messages.json b/_locales/es/messages.json index dc3a042..f595220 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/et/messages.json b/_locales/et/messages.json index dc3a042..f595220 100644 --- a/_locales/et/messages.json +++ b/_locales/et/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/fa/messages.json b/_locales/fa/messages.json index dc3a042..f595220 100644 --- a/_locales/fa/messages.json +++ b/_locales/fa/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index dc3a042..f595220 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/fil/messages.json b/_locales/fil/messages.json index dc3a042..f595220 100644 --- a/_locales/fil/messages.json +++ b/_locales/fil/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index dc3a042..f595220 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/gu/messages.json b/_locales/gu/messages.json index dc3a042..f595220 100644 --- a/_locales/gu/messages.json +++ b/_locales/gu/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/he/messages.json b/_locales/he/messages.json index dc3a042..f595220 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json index dc3a042..f595220 100644 --- a/_locales/hi/messages.json +++ b/_locales/hi/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json index dc3a042..f595220 100644 --- a/_locales/hr/messages.json +++ b/_locales/hr/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index dc3a042..f595220 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/id/messages.json b/_locales/id/messages.json index dc3a042..f595220 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/it/messages.json b/_locales/it/messages.json index dc3a042..f595220 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index dc3a042..f595220 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/kn/messages.json b/_locales/kn/messages.json index dc3a042..f595220 100644 --- a/_locales/kn/messages.json +++ b/_locales/kn/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index dc3a042..f595220 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/lt/messages.json b/_locales/lt/messages.json index dc3a042..f595220 100644 --- a/_locales/lt/messages.json +++ b/_locales/lt/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/lv/messages.json b/_locales/lv/messages.json index dc3a042..f595220 100644 --- a/_locales/lv/messages.json +++ b/_locales/lv/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ml/messages.json b/_locales/ml/messages.json index dc3a042..f595220 100644 --- a/_locales/ml/messages.json +++ b/_locales/ml/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/mr/messages.json b/_locales/mr/messages.json index dc3a042..f595220 100644 --- a/_locales/mr/messages.json +++ b/_locales/mr/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ms/messages.json b/_locales/ms/messages.json index dc3a042..f595220 100644 --- a/_locales/ms/messages.json +++ b/_locales/ms/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index dc3a042..f595220 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/no/messages.json b/_locales/no/messages.json index dc3a042..f595220 100644 --- a/_locales/no/messages.json +++ b/_locales/no/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index dc3a042..f595220 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index dc3a042..f595220 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/pt_PT/messages.json b/_locales/pt_PT/messages.json index dc3a042..f595220 100644 --- a/_locales/pt_PT/messages.json +++ b/_locales/pt_PT/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ro/messages.json b/_locales/ro/messages.json index dc3a042..f595220 100644 --- a/_locales/ro/messages.json +++ b/_locales/ro/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 65147e4..2ef3423 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Вы действительно хотите экспортировать данные?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Вы действительно хотите испортировать данные?" + }, + "black": { + "message": "Черная" + }, + "cancel": { + "message": "Отмена" + }, "create": { "message": "Создать" }, + "dark": { + "message": "Темная" + }, "dataExportedSuccessfully": { "message": "Данные успешно экспортированы" }, "dataImportedSuccessfully": { "message": "Данные успешно импортированы" }, + "decryption": { + "message": "Дешифрование" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Шифрование" }, @@ -20,14 +41,20 @@ "language": { "message": "Язык" }, + "light": { + "message": "Светлая" + }, "lists": { "message": "Списки" }, "myTasks": { "message": "Мои задачи" }, - "name": { - "message": "Название" + "newList": { + "message": "Новый список" + }, + "newTask": { + "message": "Новая задача" }, "noLists": { "message": "Нет списков задач" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Выберите файл" + }, + "theme": { + "message": "Тема" } -} +} \ No newline at end of file diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json index dc3a042..f595220 100644 --- a/_locales/sk/messages.json +++ b/_locales/sk/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json index dc3a042..f595220 100644 --- a/_locales/sl/messages.json +++ b/_locales/sl/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index dc3a042..f595220 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index dc3a042..f595220 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/sw/messages.json b/_locales/sw/messages.json index dc3a042..f595220 100644 --- a/_locales/sw/messages.json +++ b/_locales/sw/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/ta/messages.json b/_locales/ta/messages.json index dc3a042..f595220 100644 --- a/_locales/ta/messages.json +++ b/_locales/ta/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/te/messages.json b/_locales/te/messages.json index dc3a042..f595220 100644 --- a/_locales/te/messages.json +++ b/_locales/te/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/th/messages.json b/_locales/th/messages.json index dc3a042..f595220 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index dc3a042..f595220 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index dc3a042..f595220 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index dc3a042..f595220 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index dc3a042..f595220 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -1,13 +1,34 @@ { + "areYouSureYouWantToExportTheData": { + "message": "Are you sure you want to export the data?" + }, + "areYouSureYouWantToImportTheData": { + "message": "Are you sure you want to import the data?" + }, + "black": { + "message": "Black" + }, + "cancel": { + "message": "Cancel" + }, "create": { "message": "Create" }, + "dark": { + "message": "Dark" + }, "dataExportedSuccessfully": { "message": "Data exported successfully" }, "dataImportedSuccessfully": { "message": "Data imported successfully" }, + "decryption": { + "message": "Decryption" + }, + "description_ext": { + "message": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks." + }, "encryption": { "message": "Encryption" }, @@ -20,14 +41,20 @@ "language": { "message": "Language" }, + "light": { + "message": "Light" + }, "lists": { "message": "Lists" }, "myTasks": { "message": "My tasks" }, - "name": { - "message": "Name" + "newList": { + "message": "New list" + }, + "newTask": { + "message": "New task" }, "noLists": { "message": "No lists" @@ -49,5 +76,8 @@ }, "selectFile": { "message": "Select file" + }, + "theme": { + "message": "Theme" } -} +} \ No newline at end of file diff --git a/assets/fonts/OpenSans-Regular.ttf b/assets/fonts/OpenSans-Regular.ttf deleted file mode 100644 index 29bfd35..0000000 Binary files a/assets/fonts/OpenSans-Regular.ttf and /dev/null differ diff --git a/assets/fonts/OpenSans-SemiBold.ttf b/assets/fonts/OpenSans-SemiBold.ttf deleted file mode 100644 index 54e7059..0000000 Binary files a/assets/fonts/OpenSans-SemiBold.ttf and /dev/null differ diff --git a/build.py b/build.py deleted file mode 100644 index 6f9253a..0000000 --- a/build.py +++ /dev/null @@ -1,23 +0,0 @@ -import json -import pathlib -import re - -with open("config.json") as json_file: - data = json.load(json_file) - - for target_key in data: - if re.search(r"\/", target_key): - pathlib.Path(target_key).mkdir(parents=True, exist_ok=True) - - file = open(target_key.search(r"[ \w-]+\.[\w-]*$").group(0), "w", encoding='utf-8') - else: - file = open(target_key, "w", encoding='utf-8') - - for source_key in data[target_key]: - source_file = open(source_key, "r", encoding='utf-8') - - file.write("\r\n" + "".join(source_file.readlines())) - - source_file.close() - - file.close() \ No newline at end of file diff --git a/config.json b/config.json deleted file mode 100644 index 6afda9b..0000000 --- a/config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "popup.js": [ - "src/js/functions.js", - "src/js/header.js", - "src/js/main.js", - "src/js/index.js", - "src/js/footer.js" - ], - "popup.css": [ - "src/css/themes.css", - "src/css/basic.css", - "src/css/header.css", - "src/css/main.css", - "src/css/footer.css" - ] -} \ No newline at end of file diff --git a/assets/icons/128.png b/icons/128.png similarity index 100% rename from assets/icons/128.png rename to icons/128.png diff --git a/assets/icons/16.png b/icons/16.png similarity index 100% rename from assets/icons/16.png rename to icons/16.png diff --git a/assets/icons/32.png b/icons/32.png similarity index 100% rename from assets/icons/32.png rename to icons/32.png diff --git a/assets/icons/48.png b/icons/48.png similarity index 100% rename from assets/icons/48.png rename to icons/48.png diff --git a/manifest.json b/manifest.json index ebc6913..95c69b1 100644 --- a/manifest.json +++ b/manifest.json @@ -1,23 +1,23 @@ { "manifest_version": 2, "name": "ToDo", - "description": "With the To-Do extension you get a simple popup to capture your ideas, goals and daily tasks.", - "version": "2.1.0", + "description": "__MSG_description_ext__", + "version": "3.0.0", "default_locale": "en", "icons": { - "16": "assets/icons/16.png", - "32": "assets/icons/32.png", - "48": "assets/icons/48.png", - "128": "assets/icons/128.png" + "16": "icons/16.png", + "32": "icons/32.png", + "48": "icons/48.png", + "128": "icons/128.png" }, "browser_action": { - "default_popup": "popup.html" + "default_popup": "ui/popup.html" }, - "options_page": "options.html", + "options_page": "ui/options.html", "optional_permissions": [ "downloads" ], "permissions": [ "storage" ] -} +} \ No newline at end of file diff --git a/options.html b/options.html deleted file mode 100644 index 7f0dbc6..0000000 --- a/options.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - To-Do - - - - - - - - - diff --git a/popup.css b/popup.css deleted file mode 100644 index 2aaed39..0000000 --- a/popup.css +++ /dev/null @@ -1,504 +0,0 @@ - -html -{ - --satus-theme-primary: #f6b465; - /*--satus-theme-on-surface: #fafafa;*/ -} -/*--------------------------------------------------------------- ->>> BASIC ------------------------------------------------------------------ -# Fonts -# Body ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -# FONTS ----------------------------------------------------------------*/ - -@font-face -{ - font-family: 'Open Sans'; - font-weight: 400; - - src: url('assets/fonts/OpenSans-Regular.ttf'); -} - -@font-face -{ - font-family: 'Open Sans'; - font-weight: 700; - - src: url('assets/fonts/OpenSans-SemiBold.ttf'); -} - - -/*--------------------------------------------------------------- -# BODY ----------------------------------------------------------------*/ - -body -{ - font-family: 'Open Sans', sans-serif; - font-size: 14px; - - display: flex; - overflow: hidden; - flex-direction: column; - - margin: 0; -} - -/*-------------------------------------------------------------- ->>> HEADER: ----------------------------------------------------------------- -1.0 Buttons - 1.1 Back button -2.0 Title -3.0 Right section -4.0 Search -5.0 Vertical menu ---------------------------------------------------------------*/ - -/*-------------------------------------------------------------- -1.0 BUTTONS ---------------------------------------------------------------*/ - -.satus-header .satus-button -{ - width: 36px; - height: 36px; - padding: 6px; -} - -.satus-header .satus-button::before -{ - border-radius: 50%; -} - - -/*-------------------------------------------------------------- -1.1 BACK BUTTON ---------------------------------------------------------------*/ - -.satus-button--back -{ - position: absolute; -} - -.satus-button--back svg -{ - fill: none; - stroke: currentColor; -} - -body[data-appearance='home'] .satus-button--back -{ - visibility: hidden; -} - - -/*-------------------------------------------------------------- -2.0 TITLE ---------------------------------------------------------------*/ - -.satus-text--title -{ - font-size: .9375rem; - font-weight: 400; - - position: absolute; - left: 56px; - - letter-spacing: .0125em; -} - -body[data-appearance='home'] .satus-text--title -{ - left: 14px; -} - - -/*-------------------------------------------------------------- -3.0 RIGHT SECTION ---------------------------------------------------------------*/ - -.satus-section--align-end -{ - justify-content: flex-end; -} - -.satus-section--align-end .satus-button + .satus-button -{ - margin-left: 8px; -} - -/*-------------------------------------------------------------- ->>> MAIN: ----------------------------------------------------------------- -1.0 Basic -2.0 Section -3.0 Folder -4.0 Button -5.0 Switch -6.0 Encryption ---------------------------------------------------------------*/ - -/*-------------------------------------------------------------- -1.0 BASIC ---------------------------------------------------------------*/ - -.satus-main -{ - flex: 1; -} - - -/*-------------------------------------------------------------- -2.0 SECTION ---------------------------------------------------------------*/ - -.satus-section--main -{ - display: block; - - box-sizing: border-box; - width: calc(100% - 16px); - max-width: 900px; - margin: 8px auto; - padding: 8px 0; - - color: var(--satus-theme-on-surface, #777); - border: 1px solid rgba(0,0,0,.1); - border-radius: 8px; - background-color: var(--satus-theme-surface, #fff); -} - -.satus-text--message -{ - padding: 0 16px; -} - -.satus-main .satus-list--label -{ - font-size: 17px; - - display: block; - - width: calc(100% - 16px); - max-width: 900px; - margin: 16px auto 8px; -} - -.satus-main__container .satus-list -{ - display: block; - - box-sizing: border-box; - width: calc(100% - 16px); - max-width: 900px; - margin: 8px auto; - padding: 8px 0; - - color: var(--satus-theme-on-surface, #777); - border: 1px solid rgba(0,0,0,.1); - border-radius: 8px; - background-color: var(--satus-theme-surface, #fff); -} - -.satus-main__container .satus-list li .satus-section -{ - position: relative; - - width: 100%; -} - -.satus-main .satus-button.satus-button--menu -{ - position: absolute; - z-index: 1; - top: 6px; - right: 8px; - - visibility: hidden; - - width: 34px; - height: 34px; - padding: 6px; - - border-radius: 50%; -} - -.satus-dialog--menu .satus-button -{ - width: 100%; - height: 36px; - padding: 0 16px; - text-align: left; -} - -.satus-main__container .satus-list li .satus-section:hover .satus-button--menu -{ - visibility: visible; -} - -.satus-main__container .satus-list--message -{ - padding-right: 8px; - padding-left: 8px; -} - - -/*-------------------------------------------------------------- -3.0 FOLDER ---------------------------------------------------------------*/ - -.satus-main .satus-folder svg -{ - width: 20px; - height: 20px; - margin: 0 14px 0 0; - - opacity: .75; - - stroke: none; - fill: #f6b465; -} - - -/*-------------------------------------------------------------- -4.0 BUTTON ---------------------------------------------------------------*/ - -.satus-main .satus-button:not(.satus-button--menu) -{ - width: 100%; - height: 48px; - padding: 0 16px; -} - - -/*-------------------------------------------------------------- -5.0 SWITCH ---------------------------------------------------------------*/ - -.satus-switch--checkbox -{ - flex-direction: row-reverse; -} - -.satus-switch--checkbox .satus-switch__label -{ - margin: 0 0 0 16px; - - flex: 1; -} - -.satus-switch--checkbox .satus-switch__value -{ - flex: unset; -} - -.satus-switch--checkbox .satus-switch__track -{ - width: 22px; - min-width: 22px; - max-width: 22px; - height: 22px; - min-height: 22px; - max-height: 22px; - - border-radius: 50%; - background: transparent; - box-shadow: inset 0 0 0 1px #bdbdbd; -} - -.satus-switch--checkbox .satus-switch__track::before -{ - position: absolute; - top: 7px; - left: 5px; - - visibility: hidden; - - width: 10px; - height: 5px; - - transition: unset; - transform: rotate(-45deg); - - opacity: 0; - border: 2px solid #fff; - border-top: none; - border-right: none; - border-radius: unset; - background-color: transparent; -} - -.satus-switch--checkbox .satus-switch__input:checked + .satus-switch__value .satus-switch__track::before -{ - top: 7px; - left: 5px; - - visibility: visible; - - transform: rotate(-45deg); - - opacity: 1; - background-color: transparent; -} - -.satus-switch--checkbox .satus-switch__track::after -{ - content: none; -} - -.satus-switch--checkbox .satus-switch__input:checked + .satus-switch__value .satus-switch__track -{ - background-color: #f6b465; - box-shadow: none; -} - - -/*-------------------------------------------------------------- -6.0 ENCRYPTION ---------------------------------------------------------------*/ - -.satus-dialog--encryption .satus-text -{ - display: block; - - width: calc(100% - 32px); - margin: 0 16px; -} - -.satus-dialog--encryption .satus-text-field -{ - font-size: 16px; - - width: calc(100% - 32px); - margin: 8px 16px; - padding: 4px 8px; - - border: 1px solid #e8e8e8; - border-radius: 4px; - background-color: #fff; -} - -.satus-dialog--encryption .satus-text-field.error -{ - outline: 2px solid rgba(255, 0, 0, .4); -} - -.satus-dialog--encryption .satus-section -{ - width: calc(100% - 32px); - margin: 8px 16px 4px; - padding: 8px 0 4px; - - border-top: 1px solid #e8e8e8; - - justify-content: flex-end; -} - -.satus-dialog--encryption .satus-button -{ - font-size: 14px; - font-weight: 600; - - overflow: hidden; - - height: 28px; - min-height: 28px; - margin-right: 2px; - padding: 8px 16px; - - letter-spacing: .2px; - text-transform: uppercase; - - color: var(--satus-theme-primary); - border-radius: 4px; -} - -/*--------------------------------------------------------------- ->>> FOOTER ------------------------------------------------------------------ -# Button -# Dialog ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -1.0 BUTTON ----------------------------------------------------------------*/ - -.satus-button--create -{ - position: fixed; - right: 16px; - bottom: 16px; - - width: 56px; - height: 56px; - padding: 0; - - color: #fff; - border-radius: 50%; - background: linear-gradient(135deg, #f8d266, #f17953); - box-shadow: 0 2px 1px 1px rgba(230, 109, 70, .7), 0 3px 5px rgba(0,0,0,.35); -} - - -/*--------------------------------------------------------------- -2.0 DIALOG ----------------------------------------------------------------*/ - -.satus-dialog--create .satus-text -{ - display: block; - - width: calc(100% - 32px); - margin: 0 16px; -} - -.satus-dialog--create .satus-text-field -{ - font-size: 16px; - - width: calc(100% - 32px); - margin: 8px 16px; - padding: 4px 8px; - - border: 1px solid #e8e8e8; - border-radius: 4px; - background-color: #fff; -} - -.satus-dialog--create .satus-section -{ - width: calc(100% - 32px); - margin: 8px 16px 4px; - padding: 8px 0 4px; - - border-top: 1px solid #e8e8e8; - - justify-content: flex-end; -} - -.satus-dialog--create .satus-button -{ - font-size: 14px; - font-weight: 600; - - overflow: hidden; - - padding: 8px 16px; - - letter-spacing: .2px; - - color: var(--satus-theme-primary); - border-radius: 4px; -} - -.satus-dialog--create .satus-button:hover -{ - background-color: rgba(0,0,0,.03); -} diff --git a/popup.html b/popup.html deleted file mode 100644 index 460baac..0000000 --- a/popup.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - diff --git a/popup.js b/popup.js deleted file mode 100644 index e8b2508..0000000 --- a/popup.js +++ /dev/null @@ -1,914 +0,0 @@ - -/*--------------------------------------------------------------- ->>> FUNCTIONS ------------------------------------------------------------------ -# Create -# Remove -# Rename -# Update -# Render -# Other ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -# CREATE ----------------------------------------------------------------*/ - -function create() { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')), - value = document.querySelector('.satus-text-field--value').value, - container = document.querySelector('.satus-main .satus-scrollbar__content'), - index = -1; - - container.innerHTML = ''; - - if (history_item.appearanceKey === 'home') { - data.lists.push({ - name: value, - items: [] - }); - } else { - data.lists[history_item.storage_key].items.push({ - name: value, - value: false - }); - - index = history_item.storage_key; - } - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - - satus.render(render(index), container); - - document.querySelector('.satus-dialog').close(); -} - - -/*--------------------------------------------------------------- -# REMOVE ----------------------------------------------------------------*/ - -function remove() { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')); - - if (main.history.length > 1) { - var key = this.dataset.key; - - data.lists[history_item.storage_key].items.splice(key, 1); - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } - - update(); - } else { - data.lists.splice(this.dataset.key, 1); - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - - update(); - } -} - -/*--------------------------------------------------------------- -# RENAME ----------------------------------------------------------------*/ - -function rename(name, key) { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')); - - if (main.history.length > 1) { - data.lists[history_item.storage_key].items[key].name = name; - } else { - data.lists[key].name = name; - } - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - - update(); -} - - -/*--------------------------------------------------------------- -# UPDATE ----------------------------------------------------------------*/ - -function update(container) { - var self = (this === window ? document.querySelector('.satus-main') : this), - item = self.history[self.history.length - 1], - id = item.appearanceKey, - data = JSON.parse(satus.storage.get('data') || '{}'), - index = -1; - - if (!satus.isset(container)) { - container = document.querySelector('.satus-main__container'); - } - - document.body.dataset.appearance = id; - container.dataset.appearance = id; - - document.querySelector('.satus-text--title').innerText = satus.locale.getMessage(item.label) || satus.locale.getMessage('lists'); - - container.querySelector('.satus-scrollbar__content').innerHTML = ''; - - if (item.appearanceKey === 'home') { - if (Object.keys(data).length === 0) { - satus.storage.set('data', JSON.stringify({ - lists: [{ - name: satus.locale.getMessage('myTasks'), - items: [] - }] - })); - } - } else if (item.appearanceKey === 'list') { - index = item.storage_key; - } - - satus.render(render(index), container.querySelector('.satus-scrollbar__content')); -} - - -/*--------------------------------------------------------------- -# RENDER ----------------------------------------------------------------*/ - -function render(index) { - var object = JSON.parse(satus.storage.get('data')).lists; - - if (index === -1) { - if (object.length === 0) { - var container = { - type: 'section', - class: 'satus-section--main', - - text: { - type: 'text', - class: 'satus-text--message', - label: 'noLists' - } - }; - } else { - var container = { - type: 'list', - compact: true, - sortable: true, - onchange: change - }; - - for (var i = 0, l = object.length; i < l; i++) { - container[i] = { - type: 'section', - - folder: { - type: 'folder', - label: object[i].name, - before: '', - appearanceKey: 'list', - storage_key: String(i), - dataset: { - key: i - } - }, - actions: { - type: 'button', - class: 'satus-button--menu', - before: '', - onclick: { - type: 'dialog', - class: 'satus-dialog--menu', - style: { - - }, - - button_rename: { - type: 'button', - label: 'rename', - dataset: { - key: i - }, - onclick: function() { - satus.render({ - type: 'dialog', - class: 'satus-dialog--create', - - label: { - type: 'text', - label: 'name' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--value', - dataset: { - key: this.dataset.key - }, - onkeydown: function(event) { - if (event.keyCode === 13) { - rename(this.value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - }, - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'rename', - dataset: { - key: this.dataset.key - }, - onclick: function() { - rename(document.querySelector('.satus-text-field--value').value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - } - } - }); - - document.querySelector('.satus-dialog').close(); - } - }, - button_remove: { - type: 'button', - label: 'remove', - dataset: { - key: i - }, - onclick: function() { - this.r = remove; - - this.r(); - - document.querySelector('.satus-dialog').close(); - } - } - } - } - }; - } - } - } else { - object = object[index]; - - if (object.items.length === 0) { - var container = { - type: 'section', - class: 'satus-section--main', - - text: { - type: 'text', - class: 'satus-text--message', - label: 'noTasks' - } - }; - } else { - var container = { - type: 'list', - compact: true, - sortable: true, - onchange: change - }; - - for (var i = 0, l = object.items.length; i < l; i++) { - container[i] = { - type: 'section', - - checkbox: { - type: 'switch', - class: 'satus-switch--checkbox', - label: object.items[i].name, - value: object.items[i].value, - storage_key: String(i), - dataset: { - key: i - }, - onchange: function() { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')); - - data.lists[history_item.storage_key].items[this.dataset.key].value = this.querySelector('input').checked; - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } - } - }, - actions: { - type: 'button', - class: 'satus-button--menu', - before: '', - onclick: { - type: 'dialog', - class: 'satus-dialog--menu', - style: { - - }, - - button_rename: { - type: 'button', - label: 'rename', - dataset: { - key: i - }, - onclick: function() { - satus.render({ - type: 'dialog', - class: 'satus-dialog--create', - - label: { - type: 'text', - label: 'name' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--value', - dataset: { - key: this.dataset.key - }, - onkeydown: function(event) { - if (event.keyCode === 13) { - rename(this.value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - }, - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'rename', - dataset: { - key: this.dataset.key - }, - onclick: function() { - rename(document.querySelector('.satus-text-field--value').value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - } - } - }); - - document.querySelector('.satus-dialog').close(); - } - }, - button_remove: { - type: 'button', - label: 'remove', - dataset: { - key: i - }, - onclick: function() { - this.r = remove; - - this.r(); - - document.querySelector('.satus-dialog').close(); - } - } - } - } - }; - } - } - } - - return container; -} - - -/*--------------------------------------------------------------- -# OTHER ----------------------------------------------------------------*/ - -function change(old_index, new_index) { - var main = document.querySelector('.satus-main'), - data = JSON.parse(satus.storage.get('data')), - old_index2 = Number(document.querySelectorAll('.satus-main .satus-list li')[old_index].querySelector('button').dataset.key), - new_index2 = Number(document.querySelectorAll('.satus-main .satus-list li')[new_index].querySelector('button').dataset.key); - - if (main.history.length > 1) { - var index = main.history[main.history.length - 1].storage_key; - - data.lists[index].items.splice(new_index2, 0, data.lists[index].items.splice(old_index2, 1)[0]); - } else { - data.lists.splice(new_index2, 0, data.lists.splice(old_index2, 1)[0]); - } - - document.querySelectorAll('.satus-main .satus-list li')[old_index].querySelector('button').dataset.key = new_index2; - document.querySelectorAll('.satus-main .satus-list li')[new_index].querySelector('button').dataset.key = old_index2; - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } -} - -function importData() { - satus.render({ - type: 'dialog', - - select_file: { - type: 'button', - label: 'selectFile', - onclick: function() { - var input = document.createElement('input'); - - input.type = 'file'; - - input.addEventListener('change', function() { - var file_reader = new FileReader(); - - file_reader.onload = function() { - var data = JSON.parse(this.result); - - for (var key in data) { - satus.storage.set(key, data[key]); - } - - if (location.href.indexOf('action=import') !== -1) { - window.close(); - } else { - document.querySelector('.satus-dialog__scrim').click(); - - satus.render({ - type: 'dialog', - - message: { - type: 'text', - label: 'dataImportedSuccessfully' - }, - section: { - type: 'section', - class: 'controls', - - ok: { - type: 'button', - label: 'ok', - onclick: function() { - document.querySelector('.satus-dialog__scrim').click(); - } - } - } - }); - } - }; - - file_reader.readAsText(this.files[0]); - }); - - input.click(); - } - } - }); -} - -function exportData() { - var blob = new Blob([JSON.stringify(satus.storage.data)], { - type: 'application/json;charset=utf-8' - }); - - satus.render({ - type: 'dialog', - - export: { - type: 'button', - label: 'export', - onclick: function() { - chrome.permissions.request({ - permissions: ['downloads'] - }, function(granted) { - if (granted) { - chrome.downloads.download({ - url: URL.createObjectURL(blob), - filename: 'todo.json', - saveAs: true - }, function() { - setTimeout(function() { - if (location.href.indexOf('action=export') !== -1) { - window.close(); - } else { - document.querySelector('.satus-dialog__scrim').click(); - - satus.render({ - type: 'dialog', - - message: { - type: 'text', - label: 'dataExportedSuccessfully' - }, - section: { - type: 'section', - class: 'controls', - - ok: { - type: 'button', - label: 'ok', - onclick: function() { - document.querySelector('.satus-dialog__scrim').click(); - } - } - } - }); - } - }, 100); - }); - } - }); - } - } - }); -} - -/*--------------------------------------------------------------- ->>> HEADER ----------------------------------------------------------------*/ - -var Menu = { - header: { - type: 'header', - - section_start: { - type: 'section', - class: 'satus-section--align-start', - - button_back: { - type: 'button', - class: 'satus-button--back', - before: '', - onclick: function() { - document.querySelector('.satus-main').back(); - } - }, - title: { - type: 'text', - class: 'satus-text--title' - } - }, - section_end: { - type: 'section', - class: 'satus-section--align-end', - - button_vert: { - type: 'button', - before: '', - onclick: { - type: 'dialog', - class: 'satus-dialog--vertical-menu', - - language: { - type: 'select', - before: '', - label: 'language', - options: [ - { - label: 'English', - value: 'en' - }, - { - label: 'Русский', - value: 'ru' - } - ], - onchange: function(name, value) { - satus.locale.import(value, function() { - var self = (this === window ? document.querySelector('.satus-main') : this), - item = self.history[self.history.length - 1]; - - document.querySelector('.satus-text--title').innerText = satus.locale.getMessage(item.label) || satus.locale.getMessage('lists'); - - document.querySelector('.satus-dialog .satus-select__label').innerText = satus.locale.getMessage('language'); - document.querySelector('.satus-dialog .satus-switch__label').innerText = satus.locale.getMessage('encryption'); - document.querySelectorAll('.satus-dialog .satus-button__label')[0].innerText = satus.locale.getMessage('export'); - document.querySelectorAll('.satus-dialog .satus-button__label')[1].innerText = satus.locale.getMessage('import'); - }); - } - }, - encrypted: { - type: 'switch', - before: '', - label: 'encryption', - onclick: function() { - setTimeout(function() { - if (satus.storage.get('encrypted') === true) { - satus.storage.set('encrypted', false); - - satus.render({ - type: 'dialog', - class: 'satus-dialog--encryption', - onclickclose: function() { - document.querySelector('.satus-dialog .satus-switch input').checked = false; - }, - - title: { - type: 'text', - label: 'password' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--password', - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - }, - onkeydown: async function(event) { - if (event.keyCode === 13) { - if (document.querySelector('.satus-text-field--password').value.length > 1) { - satus.storage.set('data', await satus.aes.encrypt(satus.storage.get('data'), document.querySelector('.satus-text-field--password').value)); - - password = document.querySelector('.satus-text-field--password').value; - - satus.storage.set('encrypted', true); - - document.querySelectorAll('.satus-dialog')[1].close(); - } else { - document.querySelector('.satus-text-field--password').classList.add('error'); - } - } - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'ok', - onclick: async function() { - if (document.querySelector('.satus-text-field--password').value.length > 1) { - satus.storage.set('data', await satus.aes.encrypt(satus.storage.get('data'), document.querySelector('.satus-text-field--password').value)); - - password = document.querySelector('.satus-text-field--password').value; - - satus.storage.set('encrypted', true); - - document.querySelectorAll('.satus-dialog')[1].close(); - } else { - document.querySelector('.satus-text-field--password').classList.add('error'); - } - } - } - } - }); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - }, 100); - } - }, - export: { - type: 'button', - label: 'export', - before: '', - onclick: function() { - if (location.href.indexOf('/options.html') !== -1) { - exportData(); - } else { - chrome.tabs.create({ - url: 'options.html?action=export' - }); - } - } - }, - import: { - type: 'button', - label: 'import', - before: '', - onclick: function() { - if (location.href.indexOf('/options.html') !== -1) { - importData(); - } else { - chrome.tabs.create({ - url: 'options.html?action=import' - }); - } - } - } - } - } - } - } -}; - -/*--------------------------------------------------------------- ->>> MAIN ----------------------------------------------------------------*/ - -Menu.main = { - type: 'main', - appearanceKey: 'home', - on: { - change: update - } -}; - -/*--------------------------------------------------------------- ->>> INDEX ----------------------------------------------------------------*/ - -var password = ''; - -satus.storage.import(function() { - satus.locale.import(satus.storage.get('language'), function() { - satus.modules.updateStorageKeys(Menu, function() { - if (location.href.indexOf('action=import') !== -1) { - importData(); - } else if (location.href.indexOf('action=export') !== -1) { - exportData(); - } else { - var encrypted = satus.storage.get('encrypted'); - - if (encrypted) { - satus.render({ - type: 'dialog', - class: 'satus-dialog--encryption', - clickclose: false, - - title: { - type: 'text', - label: 'password' - }, - text_field: { - type: 'text-field', - id: 'password', - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - }, - onkeypress: async function(event) { - if (event.keyCode === 13) { - var data = await satus.aes.decrypt(satus.storage.get('data'), document.querySelector('#password').value); - - if (data) { - satus.storage.data.data = data; - - password = document.querySelector('#password').value; - - satus.render(Menu); - - document.querySelector('.satus-dialog').close(); - } else { - document.querySelector('#password').classList.add('error'); - - document.querySelector('#password').focus(); - } - } - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'ok', - - onclick: async function() { - var data = await satus.aes.decrypt(satus.storage.get('data'), document.querySelector('#password').value); - - if (data) { - satus.storage.data.data = data; - - password = document.querySelector('#password').value; - - satus.render(Menu); - - document.querySelector('.satus-dialog').close(); - } else { - document.querySelector('#password').classList.add('error'); - - document.querySelector('#password').focus(); - } - } - } - } - }); - } else { - satus.render(Menu); - } - } - }); - }); -}); - -/*--------------------------------------------------------------- ->>> FOOTER ----------------------------------------------------------------*/ - -Menu.create = { - type: 'button', - before: '', - class: 'satus-button--create', - onclick: { - type: 'dialog', - class: 'satus-dialog--create', - - label: { - type: 'text', - label: 'name' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--value', - onkeydown: function(event) { - if (event.keyCode === 13) { - create(); - } - }, - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'create', - onclick: create - } - } - } -}; diff --git a/py/locale.py b/py/locale.py new file mode 100644 index 0000000..83a289a --- /dev/null +++ b/py/locale.py @@ -0,0 +1,180 @@ +#--------------------------------------------------------------- +# >>> TABLE OF CONTENTS: +#--------------------------------------------------------------- +# 1.0 Import modules +# 2.0 Lower camel case +# 3.0 Get list of files +# 4.0 Add item +# 5.0 Remove item +# 6.0 Decode +# 7.0 Add locales +# 8.0 Initialization +#--------------------------------------------------------------- + +#--------------------------------------------------------------- +# 1.0 IMPORT MODULES +#--------------------------------------------------------------- + +import io +import json +import os +import pathlib +import re + + +#--------------------------------------------------------------- +# 2.0 LOWER CAMEL CASE +#--------------------------------------------------------------- + +def lowerCamelCase(string): + string = re.sub(r"(-|_)+", " ", string).title() + string = re.sub(r"[^a-zA-Z0-9]", "", string) + + return string[0].lower() + string[1:] + + +#--------------------------------------------------------------- +# 3.0 GET LIST OF FILES +#--------------------------------------------------------------- + +def getListOfFiles(dirName): + allFiles = list() + + for entry in os.listdir(dirName): + fullPath = os.path.join(dirName, entry) + + if not os.path.isdir(fullPath): + allFiles.append(fullPath) + + for entry in os.listdir(dirName): + fullPath = os.path.join(dirName, entry) + + if os.path.isdir(fullPath): + allFiles = allFiles + getListOfFiles(fullPath) + + return allFiles + + +#--------------------------------------------------------------- +# 4.0 ADD ITEM +#--------------------------------------------------------------- + +def addItem(allFiles): + message = input("Enter your message: ") + camelized_message = lowerCamelCase(message) + + for keyFile in allFiles: + with open(keyFile, "r+") as json_file: + data = json.load(json_file) + + if ((camelized_message in data) == False) : + data[camelized_message] = { + "message": message + } + + json_file.seek(0) + json.dump(data, json_file, ensure_ascii=False, indent=4, sort_keys=True) + json_file.truncate() + + +#--------------------------------------------------------------- +# 5.0 REMOVE ITEM +#--------------------------------------------------------------- + +def removeItem(allFiles): + key = input("Enter your key (lowerCamelCase): ") + + for keyFile in allFiles: + with open(keyFile, "r+") as json_file: + data = json.load(json_file) + + if data[key]: + del data[key] + + json_file.seek(0) + json.dump(data, json_file, ensure_ascii=False, indent=4, sort_keys=True) + json_file.truncate() + + +#--------------------------------------------------------------- +# 6.0 DECODE +#--------------------------------------------------------------- + +def decodeCharacters(allFiles): + for keyFile in allFiles: + with open(keyFile, "r+") as json_file: + data = json.load(json_file) + + json_file.seek(0) + json.dump(data, json_file, ensure_ascii=False, indent=4, sort_keys=True) + json_file.truncate() + + +#--------------------------------------------------------------- +# 7.0 ADD LOCALES +#--------------------------------------------------------------- + +def addLocales(): + locales = [ + "ar", + "bn", + "de", + "el", + "en", + "es", + "fr", + "hin", + "hr", + "id", + "it", + "ja", + "ko", + "nb_NO", + "nl", + "no", + "pl", + "pt_BR", + "pt_PT", + "ro", + "ru", + "sk", + "tr", + "zh_CN", + "zh_TW" + ] + + for locale in locales: + if not os.path.exists(os.path.dirname("../_locales/" + locale)): + pathlib.Path("../_locales/" + locale).mkdir(parents=True, exist_ok=True) + + file = io.open("../_locales/" + locale + '/messages.json', mode='w', encoding='utf-8') + + file.write("{}") + + file.close() + + +#--------------------------------------------------------------- +# 8.0 INITIALIZATION +#--------------------------------------------------------------- + +allFiles = getListOfFiles("../_locales/") + +operation = input(""" +-------------------------------- +Add item: 1 +Remove item: 2 +Decode: 3 +Add locales: 4 +-------------------------------- + +Enter number: """) + +if operation == "1": + addItem(allFiles) +elif operation == "2" : + removeItem(allFiles) +elif operation == "3" : + decodeCharacters(allFiles) +elif operation == "4" : + addLocales() \ No newline at end of file diff --git a/satus.css b/satus.css deleted file mode 100644 index 44de157..0000000 --- a/satus.css +++ /dev/null @@ -1,1690 +0,0 @@ - -/*--------------------------------------------------------------- ->>> ANIMATIONS ----------------------------------------------------------------*/ - -.satus-animation--fade-in -{ - animation: fadeIn 250ms; -} - -.satus-animation--fade-out -{ - animation: fadeOut 250ms; -} - -.satus-animation--fade-in-left -{ - animation: fadeInLeft 250ms; -} - -.satus-animation--fade-in-right -{ - animation: fadeInRight 250ms; -} - -.satus-animation--fade-out-left -{ - animation: fadeOutLeft 250ms; -} - -.satus-animation--fade-out-right -{ - animation: fadeOutRight 250ms; -} - -.satus-animation--zoom-in -{ - animation: zoomIn 250ms; -} - -.satus-animation--zoom-out -{ - animation: zoomOut 250ms; -} - -@keyframes fadeIn -{ - from - { - opacity: 0; - } - to - { - opacity: 1; - } -} - -@keyframes fadeOut -{ - from - { - opacity: 1; - } - to - { - opacity: 0; - } -} - -@keyframes fadeInLeft -{ - from - { - transform: translateX(-10%); - - opacity: 0; - } - to - { - transform: translateX(0%); - - opacity: 1; - } -} - -@keyframes fadeInRight -{ - from - { - transform: translateX(10%); - - opacity: 0; - } - to - { - transform: translateX(0%); - - opacity: 1; - } -} - -@keyframes fadeOutLeft -{ - from - { - transform: translateX(0%); - - opacity: 1; - } - to - { - transform: translateX(-10%); - - opacity: 0; - } -} - -@keyframes fadeOutRight -{ - from - { - transform: translateX(0%); - - opacity: 1; - } - to - { - transform: translateX(10%); - - opacity: 0; - } -} - -@keyframes zoomIn -{ - from - { - transform: scale(.8); - - opacity: 0; - } - to - { - transform: scale(1); - - opacity: 1; - } -} - -@keyframes zoomOut -{ - from - { - transform: scale(1); - - opacity: 1; - } - to - { - transform: scale(.8); - - opacity: 0; - } -} - -/*--------------------------------------------------------------- ->>> THEMES ------------------------------------------------------------------ -1.0 Default ----------------------------------------------------------------*/ - -html, body -{ - margin: 0 -} - -html -{ - --satus-theme-primary: #f6b465; - - --satus-theme-dialog: #f7f7f6; - --satus-theme-dialog-backdrop: rgba(25,25,25,.2); - --satus-theme-dialog-shadow: inset 0 -1px 1px 1px rgba(0,0,0,.1), 0 2px 6px rgba(0, 0, 0, .15); - --satus-theme-dialog-text: #777; - - --satus-theme-header: #fff; - --satus-theme-header-text: #777; - - --satus-theme-main: #f7f7f6; - --satus-theme-main-text: #777; - - --satus-theme-section: #fff; - - --satus-theme-button: transparent; - - --satus-theme-scrollbar: rgba(0, 0, 0, .2); - --satus-theme-scrollbar-focus: rgba(0, 0, 0, .4); - - --satus-theme-tooltip: rgba(0, 0, 0, .4); - - --satus-theme-ripple: rgba(0, 0, 0, .04); - - --satus-theme-shortcut: #fff; - - - - - --satus-theme-tabs-background: #efefef; - --satus-theme-tabs-border: #dfdfdf; -} - -/*--------------------------------------------------------------- ->>> TABLE ------------------------------------------------------------------ -1.0 Head -2.0 Body -3.0 Paging ----------------------------------------------------------------*/ - -.satus-table -{ - font-size: 14px; - - position: relative; - - overflow: hidden; - - box-sizing: border-box; - - border: 1px solid #ececec; - border-radius: 6px; -} - - -/*--------------------------------------------------------------- -1.0 HEAD ----------------------------------------------------------------*/ - -.satus-table__head -{ - position: relative; - z-index: 1; - - display: flex; - - box-sizing: border-box; - width: 100%; - height: 44px; - padding: 0 8px; - - background: #fff; - box-shadow: 0 2px 4px rgba(0, 0, 0, .1); -} - -.satus-table__head > div -{ - font-weight: 600; - - display: inline-flex; - - box-sizing: border-box; - padding: 0 8px 0 0; - - opacity: .7; - - flex-shrink: 0; - align-items: center; -} - -.satus-table__head > div:last-child -{ - padding: 0; -} - -.satus-table__head > div:hover -{ - cursor: pointer; - - opacity: 1; -} - -.satus-table__head > div[data-sorting=false]:hover -{ - cursor: default; -} - -.satus-table__head > div > span -{ - position: relative; -} - -.satus-table__head > div[data-sorting=asc] > span::after -{ - position: absolute; - top: calc(50% - 2px); - right: -14px; - - width: 0; - height: 0; - - content: ''; - - border-right: 4px solid transparent; - border-bottom: 5px solid currentColor; - border-left: 4px solid transparent; -} - -.satus-table__head > div[data-sorting=desc] > span::after -{ - position: absolute; - top: calc(50% - 2px); - right: -13px; - - width: 0; - height: 0; - - content: ''; - - border-top: 5px solid currentColor; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - - -/*--------------------------------------------------------------- -2.0 BODY ----------------------------------------------------------------*/ - -.satus-table__body -{ - overflow: hidden; - - width: 100%; - height: calc(100% - 39px); - - background: #fff; - - flex: 1; -} - -.satus-table__row -{ - padding: 0 8px; - - border-bottom: 1px solid rgba(0, 0, 0, .1); -} - -.satus-table__row:nth-child(2n) -{ - background: rgba(0,0,0,.03); -} - -.satus-table__cell -{ - display: inline-block; - overflow: hidden; - - box-sizing: border-box; - padding: 8px 8px 8px 0; - - white-space: nowrap; - text-overflow: ellipsis; - word-wrap: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; - - overflow-wrap: break-word; -} - -.satus-table__cell:last-child -{ - padding-right: 0; -} - -.satus-table__cell input -{ - box-sizing: border-box; - width: 100%; - height: calc(100% - 10px); - margin: 5px 0; - padding: 1px 2px; - - border: 1px solid #d2d2d2; - border-radius: 4px; - outline: none; -} - - -/*--------------------------------------------------------------- -3.0 PAGING ----------------------------------------------------------------*/ - -.satus-table__paging > button -{ - min-width: 32px; - height: 32px; - padding: 0 8px; - - cursor: pointer; - - color: var(--satus-theme-on-surface, #555); - border: none; - background: transparent; -} - -.satus-table__paging > button.active -{ - color: #2979ff; -} - -/*--------------------------------------------------------------- ->>> HEADER ------------------------------------------------------------------ -1.0 Basic -2.0 Buttons - 2.1 Back -3.0 Title -4.0 Vertical menu ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -1.0 BASIC ----------------------------------------------------------------*/ - -.satus-header -{ - position: relative; - z-index: 1; - - display: flex; - - box-sizing: border-box; - width: 100%; - min-height: 58px; - padding: 0 8px; - - color: var(--satus-theme-header-text); - background-color: var(--satus-theme-header); - box-shadow: 0 0 3px rgba(0,0,0,.1); - - fill: var(--satus-theme-header-text); -} - - -/*--------------------------------------------------------------- -2.0 BUTTONS ----------------------------------------------------------------*/ - -.satus-header .satus-button -{ - width: 36px; - height: 36px; - padding: 6px; - border-radius: 50%; -} - - -/*--------------------------------------------------------------- -3.0 BACK BUTTON ----------------------------------------------------------------*/ - -.satus-button--back -{ - position: absolute; -} - -body[data-appearance='home'] .satus-button--back -{ - visibility: hidden; -} - - -/*--------------------------------------------------------------- -3.0 TITLE ----------------------------------------------------------------*/ - -.satus-header .satus-text--title -{ - font-size: 15px; - font-weight: 400; - - position: absolute; - left: 56px; -} - -body[data-appearance='home'] .satus-text--title -{ - left: 14px; -} - - -/*--------------------------------------------------------------- -4.0 VERTICAL MENU ----------------------------------------------------------------*/ - -.satus-dialog--vertical-menu .satus-dialog__surface -{ - position: absolute; - top: 8px; - right: 8px; - left: auto; - - min-width: 180px; - max-width: 220px; - - transform-origin: right top; -} - -.satus-dialog--vertical-menu .satus-button, -.satus-dialog--vertical-menu .satus-folder, -.satus-dialog--vertical-menu .satus-switch -{ - width: 100%; - height: 36px; - padding: 0 16px; - - text-align: left; -} - -.satus-dialog--vertical-menu svg -{ - width: 20px !important; - height: 20px !important; - - opacity: .75; -} - -/*--------------------------------------------------------------- ->>> SELECT ----------------------------------------------------------------*/ - -.satus-select > svg -{ - width: 20px -} - -.satus-select > svg + .satus-select__label -{ - margin: 0 0 0 8px; -} - -.satus-select__value -{ - font-size: 12px; - - text-align: right; - - opacity: .7; - - flex: 1; -} - - -.satus-dialog--select-component .satus-dialog__surface -{ - position: absolute; - - max-width: unset; - - transform: unset; - animation: unset; - - opacity: 1; -} - -.satus-dialog--select-component .satus-section -{ - top: 48px; - - flex-direction: column; - - transform: translateY(-16px); - animation: listIn 50ms linear forwards; - animation-delay: 20ms; - - opacity: .5; -} - -.satus-dialog--select-component .satus-button -{ - width: 100%; - height: 48px; - padding: 0 16px; -} - -@keyframes listIn -{ - from - { - transform: translateY(-16px); - - opacity: .5; - } - to - { - transform: translateY(0); - - opacity: 1; - } -} - -.satus-section--align-end -{ - justify-content: flex-end; -} - -/*-------------------------------------------------------------- ->>> SWITCH ---------------------------------------------------------------*/ - -.satus-switch -{ - position: relative; - - display: flex; - - box-sizing: border-box; - width: 100%; - height: 48px; - padding: 0 16px; - - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: -moz-none; - user-select: none; - - background-color: transparent; - - align-items: center; - justify-content: flex-start; -} - -.satus-switch:hover -{ - background-color: var(--satus-theme-ripple); -} - -.satus-switch__input -{ - position: absolute; - z-index: 1; - top: 0; - left: 0; - - width: 100%; - height: 100%; - margin: 0; - padding: 0; - - opacity: 0; - outline: none; - - -webkit-appearance: none; -} - - -/* LABEL */ - -.satus-switch > * + .satus-switch__label { - margin: 0 0 0 8px; -} - -.satus-switch__label -{ - padding: 0 16px 0 0; -} - - -/* TRACK*/ - -.satus-switch__value -{ - display: inline-flex; - justify-content: flex-end; - align-items: center; - flex: 1; -} - -.satus-switch__track -{ - position: relative; - - width: 32px; - min-width: 32px; - height: 18px; - - border-radius: 18px; - background: #bdbdbd; -} - -.satus-switch__track::before -{ - position: absolute; - top: -7px; - left: -7px; - - width: 32px; - height: 32px; - - content: ''; - transition: left .1s cubic-bezier(.4, 0, .2, 1), transform 200ms, background-color 200ms; - transform: scale(0); - - opacity: 0; - border-radius: 50%; - background-color: #000; - - will-change: left, transform, background-color; -} - -.satus-switch__input:checked + .satus-switch__value .satus-switch__track::before -{ - left: 8px; - - background-color: var(--satus-theme-primary, #54d2a3); -} - -.satus-switch__input:focus + .satus-switch__value .satus-switch__track::before -{ - transform: scale(1); - - opacity: .08; -} - -.satus-switch__input:checked:focus + .satus-switch__value .satus-switch__track::before -{ - opacity: .25; -} - -.satus-switch__track::after -{ - position: absolute; - - width: 14px; - height: 14px; - - content: ''; - transition: transform .1s cubic-bezier(.4, 0, .2, 1); - transform: translate(2px, 2px); - - border-radius: 50%; - background-color: #fff; - - will-change: transform; -} - -.satus-switch__input:checked + .satus-switch__value .satus-switch__track -{ - background: var(--satus-theme-primary, #54d2a3); -} - -.satus-switch__input:checked + .satus-switch__value .satus-switch__track::after -{ - transform: translate(16px, 2px); -} - -/*-------------------------------------------------------------- ->>> TABS ---------------------------------------------------------------*/ - -.satus-tabs__bar -{ - position: relative; - - display: flex; - overflow: hidden; - - box-sizing: border-box; - width: calc(100% - 16px); - margin: 16px 8px 4px; - - border: 1px solid var(--satus-theme-tabs-border); - border-radius: 18px; - background-color: var(--satus-theme-tabs-background); -} - -.satus-tabs__bar > div:not(.satus-tabs__bar--select) -{ - z-index: 1; - - display: flex; - - height: 32px; - - cursor: pointer; - transition: opacity .25s; - - opacity: .5; - - flex: 1; - align-items: center; - justify-content: center; -} - -.satus-tabs__bar > div.active -{ - opacity: 1; -} - -.satus-tabs__bar--select -{ - position: absolute; - z-index: 0; - left: 0; - - width: 50%; - height: 32px; - - transition: left .25s; - - border-radius: 18px; - background: var(--satus-theme-header); - box-shadow: 1px 0 4px rgba(0,0,0,.075); -} - -.satus-tabs__main -{ - position: relative -} - -.satus-tabs__main > div -{ - display: inline-block; - width: 100%; - min-height: 100%; -} - -.satus-tabs__main > .old -{ - position: absolute; - left: 0; - top: 0; -} - -.satus-tabs__tab.satus-animation--fade-out-left:not(.old) -{ - z-index: 1 -} - -/*--------------------------------------------------------------- ->>> FOLDER ----------------------------------------------------------------*/ - -.satus-button.satus-folder -{ - text-transform: unset -} - -/*--------------------------------------------------------------- ->>> TEXT ----------------------------------------------------------------*/ - -.satus-text-field -{ - font: inherit; - - box-sizing: border-box; - width: 100%; - margin: 0; - padding: 0; - padding: 0 8px; - - color: inherit; - border: none; - outline: none; - background: unset; -} - -/*--------------------------------------------------------------- ->>> MAIN ------------------------------------------------------------------ -1.0 General -2.0 Other ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -1.0 GENERAL ----------------------------------------------------------------*/ - -.satus-main -{ - position: relative; - - overflow: hidden; - - width: 100%; - height: 100%; - - color: var(--satus-theme-main-text); - background-color: var(--satus-theme-main); - - flex: 1; -} - -.satus-main__container -{ - position: absolute; - top: 0; - left: 0; - - overflow: auto; - - box-sizing: border-box; - width: 100%; - height: 100%; - - transition: 250ms; - - background-color: var(--satus-theme-main); -} - - -/*--------------------------------------------------------------- -2.0 OTHER ----------------------------------------------------------------*/ - -.satus-main .satus-button -{ - width: 100%; - height: 48px; - padding: 0 16px; - - text-align: left; - - border-radius: 0; - - justify-content: flex-start; -} - -/*-------------------------------------------------------------- ->>> SLIDER ---------------------------------------------------------------*/ - -.satus-slider -{ - position: relative; - - display: flex; - flex-direction: column; - - box-sizing: border-box; - width: 100%; - min-height: 64px; - padding: 0 16px; - - -webkit-user-select: none; - -moz-user-select: -moz-none; - user-select: none; - - outline: none; - - align-items: flex-start; - justify-content: center; -} - -.satus-slider::before -{ - position: absolute; - top: 0; - left: 0; - - width: 100%; - height: 100%; - - content: ''; - - opacity: 0; - background-color: var(--satus-theme-button); -} - -.satus-slider:hover::before -{ - opacity: 1; -} - - -/* LABEL */ - -.satus-slider__label -{ - cursor: default; -} - - -.satus-slider__range -{ - position: absolute; - z-index: 1; - top: 0; - left: 0; - - box-sizing: border-box; - width: 100%; - height: 100%; - margin: 0; - padding: 0; - - opacity: 0; -} - - -/* TRACK */ - -.satus-slider__container -{ - position: relative; - - width: 100%; - height: 12px; - margin: 8px 0 0; -} - -.satus-slider__track-container -{ - position: absolute; - top: calc(50% - 1px); - - width: 100%; - height: 2px; - - pointer-events: none; -} - -.satus-slider__track-container::before -{ - position: absolute; - top: 0; - left: 0; - - width: 100%; - height: 2px; - - content: ''; - - opacity: .26; - background-color: var(--satus-theme-primary); -} - -.satus-slider__track -{ - position: relative; - - width: 0; - height: 100%; - - background-color: var(--satus-theme-primary); - - will-change: width; -} - -.satus-slider:not(.satus-slider--dragging) .satus-slider__track -{ - transition: width 100ms ease-out; -} - -.satus-slider__thumb -{ - position: absolute; - top: -5px; - right: -12px; - - width: 12px; - height: 12px; - - border-radius: 50%; - background-color: var(--satus-theme-primary); - box-shadow: 0 1px 5px rgba(0, 0, 0, .15); -} - -.satus-slider .satus-slider__thumb::before -{ - font-size: 13px; - - position: absolute; - top: -34px; - left: 50%; - - visibility: hidden; - - box-sizing: border-box; - min-width: 28px; - padding: 4px 4px; - - content: attr(data-value); - transform: translateX(-50%); - text-align: center; - pointer-events: none; - - color: #fff; - border-radius: 4px; - background: var(--satus-theme-tooltip); -} - -.satus-slider:hover .satus-slider__thumb::before, -.satus-slider__range:focus .satus-slider__container .satus-slider__thumb::before -{ - visibility: visible; -} - -.satus-slider__ring -{ - position: absolute; - top: -11px; - right: -18px; - - width: 24px; - height: 24px; - - transition: 100ms; - transform: scale(0); - - opacity: 0; - border-radius: 50%; - background-color: var(--satus-theme-primary); -} - -.satus-slider__range:focus + .satus-slider__container .satus-slider__ring -{ - transform: scale(1); - - opacity: .25; -} - -.satus-scrollbar -{ - position: relative; - - overflow: hidden; - - width: 100%; - height: 100%; -} - -.satus-scrollbar__wrapper -{ - overflow-y: scroll; - - width: 150%; - height: 100%; -} - -.satus-scrollbar__content -{ - display: inline-block; -} - -.satus-scrollbar__thumb -{ - position: absolute; - z-index: 999; - top: 0; - right: 0; - - min-height: 32px; - padding: 0 2px; - - transition: background-color 200ms, opacity 300ms; - - opacity: 0; -} - -.satus-scrollbar__thumb::after -{ - display: block; - - width: 3px; - height: 100%; - - content: ''; - - background-color: var(--satus-theme-scrollbar); -} - -.satus-scrollbar__thumb:hover::after -{ - background-color: var(--satus-theme-scrollbar-focus); -} - -.satus-scrollbar.active .satus-scrollbar__thumb, -.satus-scrollbar__thumb:hover -{ - transition: background-color 200ms, opacity 100ms; - - opacity: 1; -} - -/*-------------------------------------------------------------- ->>> LIST ---------------------------------------------------------------*/ - -.satus-list--compact, -.satus-list--compact li -{ - margin: 0; - padding: 0; - - list-style: none; -} - -/*--------------------------------------------------------------- ->>> DIALOG ------------------------------------------------------------------ -1.0 General -2.0 Other ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -1.0 GENERAL ----------------------------------------------------------------*/ - -.satus-dialog -{ - position: absolute; - z-index: 100; - top: 0; - left: 0; - - display: flex; - - width: 100vw; - height: 100vh; - - justify-content: center; - align-items: center; -} - -.satus-dialog__scrim -{ - position: absolute; - top: 0; - left: 0; - - width: 100%; - height: 100%; - - animation: fadeIn 150ms linear forwards; - - opacity: 0; - background: var(--satus-theme-dialog-backdrop); - - backdrop-filter: blur(8px); -} - -.satus-dialog__surface -{ - font-size: 14px; - - display: flex; - flex-direction: column; - - width: 95%; - min-width: 240px; - max-width: 560px; - max-height: 80%; - padding: 8px 0; - - transform: scale(.8); - animation: zoomIn 150ms linear forwards; - animation-delay: 20ms; - - opacity: 0; - color: var(--satus-theme-dialog-text); - border-radius: 6px; - background-color: var(--satus-theme-dialog); - box-shadow: var(--satus-theme-dialog-shadow); -} - -.satus-dialog--closing .satus-dialog__scrim -{ - animation: fadeOut 70ms linear forwards; -} - -.satus-dialog--closing .satus-dialog__surface -{ - animation: zoomOut 70ms linear forwards; -} - - -/*--------------------------------------------------------------- -2.0 OTHER ----------------------------------------------------------------*/ - -.satus-dialog .satus-button -{ - justify-content: flex-start; -} - -/*--------------------------------------------------------------- ->>> BUTTON ----------------------------------------------------------------*/ - -.satus-button -{ - font: inherit; - - display: inline-flex; - - height: 36px; - margin: 0; - padding: 0 8px; - - cursor: pointer; - - color: inherit; - border: none; - border-radius: 4px; - outline: none; - background-color: transparent; - - align-items: center; - justify-content: center; - -webkit-tap-highlight-color: transparent; - -webkit-appearance: none; -} - -.satus-button:hover -{ - background-color: var(--satus-theme-ripple); -} - -.satus-button > svg -{ - width: 22px; - height: 22px -} - -.satus-button > svg + .satus-button__label -{ - margin: 0 0 0 8px -} - -/*-------------------------------------------------------------- ->>> TEXT ---------------------------------------------------------------*/ - -.satus-text -{ - margin: 0; - - color: inherit; - border: none; - font-family: inherit; -} - -/*-------------------------------------------------------------- ->>> SECTION ---------------------------------------------------------------*/ - -.satus-section -{ - display: inline-flex; - - box-sizing: border-box; - - align-items: center; - flex: 1; -} - -.satus-main .satus-section -{ - background-color: var(--satus-theme-section); -} - -.satus-section--label -{ - font-size: 17px; - display: block; - width: calc(100% - 16px); - max-width: 900px; - margin: 16px auto 8px; -} - -/*--------------------------------------------------------------- ->>> COLOR PICKER ----------------------------------------------------------------*/ - -.satus-color-picker -{ - display: flex; - flex-direction: column; - - justify-content: center; - align-items: center; -} - -.satus-color-picker__container -{ - position: relative; -} - -.satus-color-picker canvas -{ - border-radius: 50%; -} - -.satus-color-picker__cursor -{ - position: absolute; - top: 128px; - left: 128px; - - width: 12px; - height: 12px; - - transform: translate(-50%, -50%); - pointer-events: none; - - border: 2px solid rgba(0,0,0,.4); - border-radius: 50%; -} - -.satus-color-picker__value -{ - width: 28px; - height: 28px; - margin: 0 8px 0 0; - - border: 2px solid #dcdcdc; - border-radius: 4px; -} - -/*--------------------------------------------------------------- ->>> SHORTCUT ------------------------------------------------------------------ -# Canvas -# Popup ----------------------------------------------------------------*/ - -.satus-shortcut -{ - position: relative; - - display: flex; - overflow: hidden; - - box-sizing: border-box; - width: 100%; - height: 48px; - min-height: 48px; - padding: 0 16px; - - cursor: pointer; - - justify-content: space-between; - align-items: center; -} - -.satus-shortcut:hover -{ - background-color: var(--satus-theme-ripple); -} - -.satus-shortcut .satus-shortcut__label, -.satus-shortcut .satus-shortcut__value -{ - flex: 1 -} - -.satus-shortcut .satus-shortcut__label + .satus-shortcut__value -{ - justify-content: flex-end -} - - -/*--------------------------------------------------------------- -# CANVAS ----------------------------------------------------------------*/ - -.satus-shortcut__value -{ - display: flex; - - box-sizing: border-box; - width: 100%; - height: 48px; - - align-items: center; -} - - -.satus-shortcut__key -{ - font-size: 12px; - line-height: 12px; - - display: flex; - - box-sizing: border-box; - min-width: 28px; - height: 28px; - padding: 4px 8px; - - border: 1px solid rgba(0,0,0,.1); - border-radius: 4px; - background: var(--satus-theme-shortcut); - box-shadow: 0 1px 1px rgba(0,0,0,.1), inset 0 -1px 0 rgba(0,0,0,.1); - - align-items: center; - justify-content: center; -} - -.satus-shortcut__plus -{ - position: relative; - - width: 10px; - height: 10px; - margin: 8px 6px; -} - -.satus-shortcut__plus::before -{ - position: absolute; - top: 0; - left: 4px; - - width: 2px; - height: 10px; - - content: ''; - - background-color: #ccc; -} - -.satus-shortcut__plus::after -{ - position: absolute; - top: 4px; - left: 0; - - width: 10px; - height: 2px; - - content: ''; - - background-color: #ccc; -} - -.satus-shortcut__mouse -{ - position: relative; - - display: flex; - - width: 24px; - height: 32px; - - border-radius: 50%; - border-top-left-radius: 12px; - border-top-right-radius: 12px; - background: #fff; - box-shadow: 0 1px 3px rgba(0,0,0,.15), inset 0 -3px 0 rgba(0,0,0,.1); -} - -.satus-shortcut__mouse > div -{ - position: absolute; - top: 0; - left: 11px; - - width: 2px; - height: 10px; - - border-radius: 2px; - background: #ccc; -} - -.satus-shortcut__mouse::before -{ - position: absolute; - top: 0; - left: 18px; - - width: 2px; - height: 14px; - - content: ''; - - background: #f96754; -} - -.satus-shortcut__mouse.false::after -{ - position: absolute; - top: -5px; - left: 15px; - - width: 0; - height: 0; - - content: ''; - - border-right: 4px solid transparent; - border-bottom: 6px solid #f96754; - border-left: 4px solid transparent; -} - -.satus-shortcut__mouse.true::after -{ - position: absolute; - top: 13px; - left: 15px; - - width: 0; - height: 0; - - content: ''; - - border-top: 6px solid #f96754; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.satus-shortcut__mouse.click::before { - position: absolute; - top: 0px; - left: -1px; - width: 10px; - height: 10px; - content: ''; - background: #f96754; - border-radius: 50%; -} - -.satus-shortcut__mouse.context::before { - position: absolute; - top: 0px; - left: 15px; - width: 10px; - height: 10px; - content: ''; - background: #f96754; - border-radius: 50%; -} - - -/*--------------------------------------------------------------- -# POPUP ----------------------------------------------------------------*/ - -.satus-shortcut-dialog-label -{ - font-size: 16px; - font-weight: 500; - - box-sizing: border-box; - width: 100%; - margin: 4px 0 10px; - padding: 0 16px; -} - -.satus-shortcut__canvas -{ - display: flex; - - box-sizing: border-box; - width: 100%; - height: 68px; - padding: 16px; - - background: #dedede; - - align-items: center; -} - -.satus-section_shortcut -{ - width: 100%; - margin: 8px 0 0; - - justify-content: flex-end; -} - -.satus-button_shortcut -{ - font-weight: 500; - - overflow: hidden; - - height: 28px; - min-height: 28px; - margin-right: 2px; - padding: 4px 8px; - - text-transform: uppercase; - - color: #f96754; - border-radius: 4px; -} diff --git a/satus.js b/satus.js deleted file mode 100644 index 3320faf..0000000 --- a/satus.js +++ /dev/null @@ -1,2505 +0,0 @@ - -/*-------------------------------------------------------------- ->>> TABLE OF CONTENTS: ----------------------------------------------------------------- -# Events -# Render -# Camelize -# Animation duration ---------------------------------------------------------------*/ - -var Satus = {}, - satus = Satus; - - -/*-------------------------------------------------------------- -# EVENTS ---------------------------------------------------------------*/ - -Satus.events = {}; - -Satus.on = function(event, handler) { - if (!this.isset(this.events[event])) { - this.events[event] = []; - } - - this.events[event].push(handler); -}; - - -/*-------------------------------------------------------------- -# COMPONENTS ---------------------------------------------------------------*/ - -Satus.components = {}; - - -/*-------------------------------------------------------------- -# MODULES ---------------------------------------------------------------*/ - -Satus.modules = {}; - - -/*-------------------------------------------------------------- -# ISSET ---------------------------------------------------------------*/ - -Satus.isset = function(variable) { - if (typeof variable === 'undefined' || variable === null) { - return false; - } - - return true; -}; - - -/*-------------------------------------------------------------- -# CAMELIZE ---------------------------------------------------------------*/ - -Satus.camelize = function(string) { - return string.replace(/-[a-z]/g, function(match) { - return match[1].toUpperCase(); - }); -}; - - -/*-------------------------------------------------------------- -# ANIMATION DURATION ---------------------------------------------------------------*/ - -Satus.getAnimationDuration = function(element) { - return Number(window.getComputedStyle(element).getPropertyValue('animation-duration').replace(/[^0-9.]/g, '')) * 1000; -}; - -/*--------------------------------------------------------------- ->>> AES-CTR ------------------------------------------------------------------ -1.0 Encryption -2.0 Decryption ----------------------------------------------------------------*/ - -satus.aes = {}; - -/*--------------------------------------------------------------- -1.0 ENCRYPTION ----------------------------------------------------------------*/ - -satus.aes.encrypt = async function(text, password) { - var iv = crypto.getRandomValues(new Uint8Array(12)), - algorithm = { - name: 'AES-GCM', - iv: iv - }; - - return Array.from(iv).map(b => ('00' + b.toString(16)).slice(-2)).join('') + btoa(Array.from(new Uint8Array(await crypto.subtle.encrypt( - algorithm, - await crypto.subtle.importKey('raw', await crypto.subtle.digest('SHA-256', new TextEncoder().encode(password)), algorithm, false, ['encrypt']), - new TextEncoder().encode(text) - ))).map(byte => String.fromCharCode(byte)).join('')); -}; - - -/*--------------------------------------------------------------- -2.0 DECRYPTION ----------------------------------------------------------------*/ - -satus.aes.decrypt = async function(text, password) { - var iv = text.slice(0,24).match(/.{2}/g).map(byte => parseInt(byte, 16)), - algorithm = { - name: 'AES-GCM', - iv: new Uint8Array(iv) - }; - - try { - var data = new TextDecoder().decode(await crypto.subtle.decrypt( - algorithm, - await crypto.subtle.importKey( - 'raw', - await crypto.subtle.digest('SHA-256', new TextEncoder().encode(password)), - algorithm, - false, - ['decrypt'] - ), - new Uint8Array(atob(text.slice(24)).match(/[\s\S]/g).map(ch => ch.charCodeAt(0))) - )); - } catch (err) { - return false; - } - - return data; -}; - -/*-------------------------------------------------------------- -# LOCALE ---------------------------------------------------------------*/ - -satus.locale = { - messages: {} -}; - - -/*-------------------------------------------------------------- -# GET MESSAGE ---------------------------------------------------------------*/ - -satus.locale.getMessage = function(string) { - return this.messages[string] || string; -}; - -/*-------------------------------------------------------------- -# IMPORT LOCALE ---------------------------------------------------------------*/ - -satus.locale.import = function(language, callback) { - var xhr = new XMLHttpRequest(); - - if (typeof language === 'function') { - var callback = language; - } - - if (typeof language !== 'string') { - var language = chrome.i18n.getUILanguage(); - } - - xhr.onload = function() { - try { - var object = JSON.parse(this.responseText); - - for (var key in object) { - satus.locale.messages[key] = object[key].message; - } - - callback(language); - } catch (err) { - function listener(request) { - if (request !== null && typeof request === 'object') { - if (request.name === 'translation_response') { - var object = JSON.parse(request.value); - - chrome.runtime.onMessage.removeListener(listener); - - for (var key in object) { - satus.locale.messages[key] = object[key].message; - } - - callback(language); - } - } - } - - chrome.runtime.onMessage.addListener(listener); - - chrome.runtime.sendMessage({ - name: 'translation_request', - path: '_locales/' + language + '/messages.json' - }); - } - }; - - xhr.onerror = function() { - if (language === 'en') { - callback(); - } else { - satus.locale.import('en', callback); - } - }; - - xhr.open('GET', '_locales/' + language + '/messages.json', true); - xhr.send(); -}; - -/*-------------------------------------------------------------- -# CLONE NODE STYLES ---------------------------------------------------------------*/ - -Satus.cloneNodeStyles = function(origin, target) { - target.style.cssText = window.getComputedStyle(origin, '').cssText; - - for (var i = 0, l = origin.children.length; i < l; i++) { - Satus.cloneNodeStyles(origin.children[i], target.children[i]); - } -}; -/*----------------------------------------------------------------------------- ->>> «USER» MODULE -------------------------------------------------------------------------------- -1.0 Variables -2.0 Software - 2.1 OS - 2.2.1 Name - 2.2.2 Type - 2.2 Browser - 2.2.1 Name - 2.2.2 Version - 2.2.3 Platform - 2.2.4 Languages - 2.2.5 Cookies - 2.2.6 Flash - 2.2.8 Video formats - 2.2.9 Audio formats - 2.2.10 WebGL -3.0 Hardware - 3.1 Screen - 3.2 RAM - 3.3 GPU - 3.4 Cores - 3.5 Touch - 3.6 Connection -4.0 Clearing ------------------------------------------------------------------------------*/ - -Satus.modules.user = function() { - /*----------------------------------------------------------------------------- - 1.0 VARIABLES - -----------------------------------------------------------------------------*/ - - var user_agent = navigator.userAgent, - random_cookie = 'ta{t`nX6cMXK,Wsc', - video = document.createElement('video'), - video_formats = { - ogg: 'video/ogg; codecs="theora"', - h264: 'video/mp4; codecs="avc1.42E01E"', - webm: 'video/webm; codecs="vp8, vorbis"', - vp9: 'video/webm; codecs="vp9"', - hls: 'application/x-mpegURL; codecs="avc1.42E01E"' - }, - audio = document.createElement('audio'), - audio_formats = { - mp3: 'audio/mpeg', - mp4: 'audio/mp4', - aif: 'audio/x-aiff' - }, - cvs = document.createElement('canvas'), - ctx = cvs.getContext('webgl'), - data = { - browser: { - audio: null, - cookies: null, - flash: null, - java: null, - languages: null, - name: null, - platform: null, - version: null, - video: null, - webgl: null - }, - os: { - name: null, - type: null - }, - device: { - connection: { - type: null, - speed: null - }, - cores: null, - gpu: null, - max_touch_points: null, - ram: null, - screen: null, - touch: null - } - }; - - - /*----------------------------------------------------------------------------- - 2.0 SOFTWARE - -----------------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------------- - 2.1.0 OS - -----------------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------------- - 2.1.1 NAME - -----------------------------------------------------------------------------*/ - - if (navigator.appVersion.indexOf('Win') !== -1) { - if (navigator.appVersion.match(/(Windows 10.0|Windows NT 10.0)/)) { - data.os.name = 'Windows 10'; - } else if (navigator.appVersion.match(/(Windows 8.1|Windows NT 6.3)/)) { - data.os.name = 'Windows 8.1'; - } else if (navigator.appVersion.match(/(Windows 8|Windows NT 6.2)/)) { - data.os.name = 'Windows 8'; - } else if (navigator.appVersion.match(/(Windows 7|Windows NT 6.1)/)) { - data.os.name = 'Windows 7'; - } else if (navigator.appVersion.match(/(Windows NT 6.0)/)) { - data.os.name = 'Windows Vista'; - } else if (navigator.appVersion.match(/(Windows NT 5.1|Windows XP)/)) { - data.os.name = 'Windows XP'; - } else { - data.os.name = 'Windows'; - } - } else if (navigator.appVersion.indexOf('(iPhone|iPad|iPod)') !== -1) { - data.os.name = 'iOS'; - } else if (navigator.appVersion.indexOf('Mac') !== -1) { - data.os.name = 'macOS'; - } else if (navigator.appVersion.indexOf('Android') !== -1) { - data.os.name = 'Android'; - } else if (navigator.appVersion.indexOf('OpenBSD') !== -1) { - data.os.name = 'OpenBSD'; - } else if (navigator.appVersion.indexOf('SunOS') !== -1) { - data.os.name = 'SunOS'; - } else if (navigator.appVersion.indexOf('Linux') !== -1) { - data.os.name = 'Linux'; - } else if (navigator.appVersion.indexOf('X11') !== -1) { - data.os.name = 'UNIX'; - } - - /*----------------------------------------------------------------------------- - 2.1.2 TYPE - -----------------------------------------------------------------------------*/ - - if (navigator.appVersion.match(/(Win64|x64|x86_64|WOW64)/)) { - data.os.type = '64-bit'; - } else { - data.os.type = '32-bit'; - } - - - /*----------------------------------------------------------------------------- - 2.2.0 BROWSER - -----------------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------------- - 2.2.1 NAME - -----------------------------------------------------------------------------*/ - - if (user_agent.indexOf('Opera') !== -1) { - data.browser.name = 'Opera'; - } else if (user_agent.indexOf('Vivaldi') !== -1) { - data.browser.name = 'Vivaldi'; - } else if (user_agent.indexOf('Edge') !== -1) { - data.browser.name = 'Edge'; - } else if (user_agent.indexOf('Chrome') !== -1) { - data.browser.name = 'Chrome'; - } else if (user_agent.indexOf('Safari') !== -1) { - data.browser.name = 'Safari'; - } else if (user_agent.indexOf('Firefox') !== -1) { - data.browser.name = 'Firefox'; - } else if (user_agent.indexOf('MSIE') !== -1) { - data.browser.name = 'IE'; - } - - - /*----------------------------------------------------------------------------- - 2.2.2 VERSION - -----------------------------------------------------------------------------*/ - - var browser_version = user_agent.match(new RegExp(data.browser.name + '/([0-9.]+)')); - - if (browser_version[1]) { - data.browser.version = browser_version[1]; - } - - - /*----------------------------------------------------------------------------- - 2.2.3 PLATFORM - -----------------------------------------------------------------------------*/ - - data.browser.platform = navigator.platform || null; - - - /*----------------------------------------------------------------------------- - 2.2.4 LANGUAGES - -----------------------------------------------------------------------------*/ - - data.browser.languages = navigator.languages || null; - - - /*----------------------------------------------------------------------------- - 2.2.5 COOKIES - -----------------------------------------------------------------------------*/ - - if (document.cookie) { - document.cookie = random_cookie; - - if (document.cookie.indexOf(random_cookie) !== -1) { - data.browser.cookies = true; - } - } - - - /*----------------------------------------------------------------------------- - 2.2.6 FLASH - -----------------------------------------------------------------------------*/ - - try { - if (new ActiveXObject('ShockwaveFlash.ShockwaveFlash')) { - data.browser.flash = true; - } - } catch (e) { - if (navigator.mimeTypes['application/x-shockwave-flash']) { - data.browser.flash = true; - } - } - - - /*----------------------------------------------------------------------------- - 2.2.7 JAVA - -----------------------------------------------------------------------------*/ - - if (typeof navigator.javaEnabled === 'function' && navigator.javaEnabled()) { - data.browser.java = true; - } - - - /*----------------------------------------------------------------------------- - 2.2.8 VIDEO FORMATS - -----------------------------------------------------------------------------*/ - - if (typeof video.canPlayType === 'function') { - data.browser.video = {}; - - for (var i in video_formats) { - var can_play_type = video.canPlayType(video_formats[i]); - - if (can_play_type === '') { - data.browser.video[i] = false; - } else { - data.browser.video[i] = can_play_type; - } - } - } - - - /*----------------------------------------------------------------------------- - 2.2.9 AUDIO FORMATS - -----------------------------------------------------------------------------*/ - - if (typeof audio.canPlayType === 'function') { - data.browser.audio = {}; - - for (var i in audio_formats) { - var can_play_type = audio.canPlayType(audio_formats[i]); - - if (can_play_type == '') { - data.browser.audio[i] = false; - } else { - data.browser.audio[i] = can_play_type; - } - } - } - - - /*----------------------------------------------------------------------------- - 2.2.10 WEBGL - -----------------------------------------------------------------------------*/ - - if (ctx && ctx instanceof WebGLRenderingContext) { - data.browser.webgl = true; - } - - - /*----------------------------------------------------------------------------- - 3.0 HARDWARE - -----------------------------------------------------------------------------*/ - - /*----------------------------------------------------------------------------- - 3.1 SCREEN - -----------------------------------------------------------------------------*/ - - if (screen) { - data.device.screen = screen.width + 'x' + screen.height; - } - - - /*----------------------------------------------------------------------------- - 3.2 RAM - -----------------------------------------------------------------------------*/ - - if ('deviceMemory' in navigator) { - data.device.ram = navigator.deviceMemory + ' GB'; - } - - - /*----------------------------------------------------------------------------- - 3.3 GPU - -----------------------------------------------------------------------------*/ - - if ( - ctx && - ctx instanceof WebGLRenderingContext && - 'getParameter' in ctx && - 'getExtension' in ctx - ) { - var info = ctx.getExtension('WEBGL_debug_renderer_info'); - - if (info) { - data.device.gpu = ctx.getParameter(info.UNMASKED_RENDERER_WEBGL); - } - } - - - /*----------------------------------------------------------------------------- - 3.4 CORES - -----------------------------------------------------------------------------*/ - - if (navigator.hardwareConcurrency) { - data.device.cores = navigator.hardwareConcurrency; - } - - - /*----------------------------------------------------------------------------- - 3.5 TOUCH - -----------------------------------------------------------------------------*/ - - if ( - window.hasOwnProperty('ontouchstart') || - window.DocumentTouch && document instanceof window.DocumentTouch || - navigator.maxTouchPoints > 0 || - window.navigator.msMaxTouchPoints > 0 - ) { - data.device.touch = true; - data.device.max_touch_points = navigator.maxTouchPoints; - } - - - /*----------------------------------------------------------------------------- - 3.6 CONNECTION - -----------------------------------------------------------------------------*/ - - if (typeof navigator.connection === 'object') { - data.device.connection.type = navigator.connection.effectiveType || null; - - if (navigator.connection.downlink) { - data.device.connection.speed = navigator.connection.downlink + ' Mbps'; - } - } - - - /*----------------------------------------------------------------------------- - 4.0 CLEARING - -----------------------------------------------------------------------------*/ - - video.remove(); - audio.remove(); - cvs.remove(); - - - return data; -}; -/*--------------------------------------------------------------- ->>> MATH ------------------------------------------------------------------ -1.0 Converts degrees to radians ----------------------------------------------------------------*/ - -satus.math = {}; - - -/*--------------------------------------------------------------- -1.0 CONVERTS DEGREES TO RADIANS ----------------------------------------------------------------*/ - -satus.math.degToRad = function(degrees) { - return degrees * (Math.PI / 180); -}; - -/*----------------------------------------------------------------------------- ->>> «SEARCH» MODULE ------------------------------------------------------------------------------*/ - -Satus.search = function(query, object, callback, categories) { - var threads = 0, - folder = '', - results = {}; - - function parse(items) { - threads++; - - for (var key in items) { - var item = items[key]; - - if (categories === true && item.type === 'folder' && folder !== item.label) { - folder = item.label; - } - - if (['switch', 'select', 'slider'].indexOf(item.type) !== -1 && key.indexOf(query) !== -1) { - if (categories === true) { - if (!results[folder]) { - results[folder] = {}; - } - - results[folder][key] = item; - } else { - results[key] = item; - } - } - - if (typeof item === 'object') { - parse(item); - } - } - - threads--; - - if (threads === 0) { - callback(results); - } - } - - parse(object); -}; - -/*-------------------------------------------------------------- ->>> RENDER ---------------------------------------------------------------*/ - -Satus.render = function(element, container, callback) { - function convert(object) { - if (object && object.type) { - var type = Satus.camelize(object.type), - component = Satus.components[type](object), - excluded_properties = ['type', 'label', 'class', 'title', 'storage', 'onclick']; - - function applyProperties(object, target) { - for (var key in object) { - if (Satus.isset(object[key]) && typeof object[key] === 'object' && !object[key].type) { - if (typeof target[key] !== 'object') { - target[key] = {}; - } - - applyProperties(object[key], target[key]); - } else if (excluded_properties.indexOf(key) === -1) { - target[key] = object[key]; - } - } - } - - applyProperties(object, component); - - component.skelet = object; - - component.classList.add('satus-' + object.type); - - if (object.class) { - var class_list = object.class.split(' '); - - for (var i = 0, l = class_list.length; i < l; i++) { - component.classList.add(class_list[i]); - } - } - - if (object.before) { - var component_before = document.createElement('span'); - - component_before.innerHTML = object.before; - - for (var i = component_before.children.length - 1; i > -1; i--) { - component.insertBefore(component_before.children[i], component.firstChild); - } - } - - if (object.after) { - var component_after = document.createElement('span'); - - component_after.innerHTML = object.after; - - for (var i = component_after.children.length - 1; i > -1; i--) { - component.appendChild(component_after.children[i]); - } - } - - (container || document.body).appendChild(component); - - if (typeof object.onclick === 'object') { - component.addEventListener('click', function() { - Satus.render(this.skelet.onclick); - }); - } else if (typeof object.onclick === 'function') { - component.onclick = object.onclick; - } - - if (Satus.isset(Satus.events.render)) { - for (var i = 0, l = Satus.events.render.length; i < l; i++) { - Satus.events.render[i](component, object); - } - } - - if (typeof component.onrender === 'function') { - component.onrender(object); - } - - if (callback) { - callback(); - } - } - } - - if (element.type) { - convert(element); - } else { - for (var key in element) { - convert(element[key]); - } - } -}; - -/*--------------------------------------------------------------- ->>> CHROMIUM STORAGE ------------------------------------------------------------------ -1.0 Get -2.0 Set -3.0 Import -4.0 Clear ----------------------------------------------------------------*/ - -satus.storage = { - data: {} -}; - -/*--------------------------------------------------------------- -1.0 GET ----------------------------------------------------------------*/ - -satus.storage.get = function(name) { - if (satus.isset(name)) { - var target = satus.storage.data; - - name = name.split('/').filter(function(value) { - return value != ''; - }); - - for (var i = 0, l = name.length; i < l; i++) { - if (Satus.isset(target[name[i]])) { - target = target[name[i]]; - } else { - return undefined; - } - } - - return target; - } -}; - - -/*--------------------------------------------------------------- -2.0 SET ----------------------------------------------------------------*/ - -satus.storage.set = function(name, value) { - var items = {}, - target = Satus.storage.data; - - if (!satus.isset(name)) { - return false; - } - - name = name.split('/').filter(function(value) { - return value != ''; - }); - - for (var i = 0, l = name.length; i < l; i++) { - var item = name[i]; - - if (i < l - 1) { - - if (target[item]) { - target = target[item]; - } else { - target[item] = {}; - - target = target[item]; - } - } else { - target[item] = value; - } - } - - for (var key in satus.storage.data) { - items[key] = satus.storage.data[key]; - } - - chrome.storage.local.set(items); -}; - - -/*--------------------------------------------------------------- -3.0 IMPORT ----------------------------------------------------------------*/ - -satus.storage.import = function(name, callback) { - if (typeof name === 'function') { - chrome.storage.local.get(function(items) { - satus.storage.data = items; - - if (name) { - name(items); - } - }); - } else { - chrome.storage.local.get(name, function(items) { - for (var key in items) { - satus.storage.data[key] = items[key]; - } - - if (callback) { - callback(items[name]); - } - }); - } -}; - - -/*--------------------------------------------------------------- -4.0 CLEAR ----------------------------------------------------------------*/ - -satus.storage.clear = function() { - chrome.storage.local.clear(); - - delete satus.storage.data; -}; - -/*-------------------------------------------------------------- ->>> STORAGE KEYS ---------------------------------------------------------------*/ - -Satus.modules.updateStorageKeys = function(object, callback) { - var threads = 0; - - function parse(items) { - threads++; - - for (var key in items) { - var item = items[key]; - - - if (item.type) { - item.storage_key = key; - } - - if (typeof item === 'object') { - parse(item); - } - } - - threads--; - - if (threads === 0) { - callback(); - } - } - - parse(object); -}; -Satus.components.table = function(item) { - var component = document.createElement('div'), - component_head = document.createElement('div'), - component_body = document.createElement('div'), - component_scrollbar = Satus.components.scrollbar(component_body, item.scrollbar), - table = document.createElement('div'); - - table.className = 'satus-table__container'; - component_head.className = 'satus-table__head'; - component_body.className = 'satus-table__body'; - - function update(data) { - var pages = item.pages, - start = Math.max((component.pagingIndex - 1) * component.paging, 0), - end = component.pagingIndex * component.paging; - - if (end > data.length) { - end = data.length; - } else if (end === 0) { - end = component.paging; - } - - table.innerHTML = ''; - - if (data) { - for (var i = start, l = end; i < l; i++) { - if (data[i]) { - var tr = document.createElement('div'); - - tr.className = 'satus-table__row'; - - for (var j = 0, k = data[i].length; j < k; j++) { - var td = document.createElement('div'); - - - td.className = 'satus-table__cell'; - - if (data[i][j].html) { - td.innerHTML = data[i][j].html; - } else if (data[i][j].text) { - td.innerText = data[i][j].text; - } - - if (item.columns[j].onrender) { - td.onrender = item.columns[j].onrender; - - td.onrender(); - } - - tr.appendChild(td); - } - - table.appendChild(tr); - } - } - } - - component.pagingUpdate(); - } - - function sortArray(array, index, mode) { - if (array[0]) { - if (mode === 'asc') { - if (typeof array[0][index].text === 'number') { - sorted = array.sort(function(a, b) { - return a[index].text - b[index].text; - }); - } else { - sorted = array.sort(function(a, b) { - return a[index].text.localeCompare(b[index].text); - }); - } - } else { - if (typeof array[0][index].text === 'number') { - sorted = array.sort(function(a, b) { - return b[index].text - a[index].text; - }); - } else { - sorted = array.sort(function(a, b) { - return b[index].text.localeCompare(a[index].text); - }); - } - } - } - - return array; - } - - function sort() { - var mode = this.dataset.sorting, - index = Array.prototype.indexOf.call(this.parentElement.children, this), - sorted; - - if (component.data[0][index] && component.data[0][index].hasOwnProperty('text')) { - if (mode === 'none') { - mode = 'asc'; - } else if (mode === 'asc') { - mode = 'desc'; - } else if (mode === 'desc') { - mode = 'asc'; - } - - if (this.parentNode.querySelector('div[data-sorting=asc], div[data-sorting=desc]')) { - this.parentNode.querySelector('div[data-sorting=asc], div[data-sorting=desc]').dataset.sorting = 'none'; - } - - this.dataset.sorting = mode; - - sorted = sortArray(component.data, index, mode); - - update(sorted); - } else { - this.dataset.sorting = false; - } - } - - function resize() {} - - for (var i = 0, l = item.columns.length; i < l; i++) { - var column = document.createElement('div'); - - column.dataset.sorting = 'none'; - column.addEventListener('click', sort); - column.addEventListener('click', function() { - if (typeof item.beforeUpdate === 'function') { - item.beforeUpdate(item); - } - }); - column.innerHTML = '' + item.columns[i].title + ''; - - component_head.appendChild(column); - } - - component_scrollbar.appendChild(table); - - component.appendChild(component_head); - component.appendChild(component_body); - - component.data = item.data; - component.paging = item.paging; - component.pages = item.pages; - component.pagingIndex = 1; - - component.update = function(data, update_pages) { - if (Satus.isset(data)) { - this.data = data; - } - - if (update_pages !== false) { - item.pages = Math.ceil(this.data.length / this.paging); - } - - if (this.querySelector('div[data-sorting=asc], div[data-sorting=desc]')) { - var mode = this.querySelector('div[data-sorting=asc], div[data-sorting=desc]').dataset.sorting, - index = Array.prototype.indexOf.call(this.querySelector('div[data-sorting=asc], div[data-sorting=desc]').parentElement.children, this.querySelector('div[data-sorting=asc], div[data-sorting=desc]')); - - update(sortArray(this.data, index, mode)); - } else { - for (var i = 0, l = item.columns.length; i < l; i++) { - if (item.columns[i].hasOwnProperty('sorting')) { - if (this.data[0][i].hasOwnProperty('text')) { - this.querySelectorAll('.satus-table__head > div')[i].dataset.sorting = item.columns[i].sorting; - } else { - this.querySelectorAll('.satus-table__head > div')[i].dataset.sorting = false; - } - - update(sortArray(this.data, i, item.columns[i].sorting)); - - i = l; - } - } - } - }; - - - // PAGING - function pagingButton(i, c) { - var button = document.createElement('button'); - - if (i === component.pagingIndex) { - button.className = 'active'; - } - - button.innerText = i; - button.parentComponent = component; - button.addEventListener('click', function() { - if (typeof item.beforeUpdate === 'function') { - item.beforeUpdate(item); - } - - this.parentComponent.pagingIndex = Number(this.innerText); - this.parentComponent.update(this.parentComponent.data); - this.parentComponent.pagingUpdate(); - }); - - c.appendChild(button); - } - - function pagingUpdate() { - if (typeof this.paging === 'number') { - var pages = item.pages, - c = this.querySelector('.satus-table__paging'); - - c.innerHTML = ''; - - if (pages > 1) { - pagingButton(1, c); - - if (component.pagingIndex - 2 > 2) { - var span = document.createElement('span'); - - span.innerText = '...'; - - c.appendChild(span); - } - - for (var i = component.pagingIndex - 2 < 2 ? 2 : component.pagingIndex - 2, l = component.pagingIndex + 2 > pages - 1 ? pages - 1 : component.pagingIndex + 2; i <= l; i++) { - pagingButton(i, c); - } - - if (component.pagingIndex + 2 < pages - 1) { - var span = document.createElement('span'); - - span.innerText = '...'; - - c.appendChild(span); - } - - pagingButton(pages, c); - } - } - - resize(); - } - - component.pagingUpdate = pagingUpdate; - - component_paging = document.createElement('div'); - - component_paging.className = 'satus-table__paging'; - - component_scrollbar.appendChild(component_paging); - - // END PAGING - - if (item.data) { - component.update(item.data, false); - } - - return component; -}; - -/*-------------------------------------------------------------- ->>> HEADER ---------------------------------------------------------------*/ - -Satus.components.header = function(object) { - var component = document.createElement('header'); - - for (var key in object) { - Satus.render(object[key], component); - } - - return component; -}; -/*-------------------------------------------------------------- ->>> SELECT ---------------------------------------------------------------*/ - -Satus.components.select = function(element) { - var component = document.createElement('button'), - component_label = document.createElement('span'), - component_value = document.createElement('span'), - label = Satus.locale.getMessage(element.label); - - component.classList.add('satus-button'); - - component_label.className = 'satus-select__label'; - component_label.innerText = label; - - component_value.className = 'satus-select__value'; - - if (element.storage_key) { - var value = Satus.storage.get(element.storage_key); - - component.dataset.storageKey = element.storage_key; - - for (var i = 0, l = element.options.length; i < l; i++) { - if (value === element.options[i].value) { - value = element.options[i].label; - } - } - - component_value.innerText = Satus.locale.getMessage(value || element.options[0].label); - } - - component.onclick = function() { - var position = this.getBoundingClientRect(), - dialog = { - type: 'dialog', - class: 'satus-dialog--select-component' - }; - - for (var key in element.options) { - dialog[key] = element.options[key]; - - dialog[key].type = 'button'; - dialog[key].dataset = {}; - dialog[key].dataset.key = element.options[key].label; - dialog[key].dataset.value = element.options[key].value; - dialog[key].onclick = function() { - component_value.innerText = Satus.locale.getMessage(this.dataset.key); - - Satus.storage.set(component.dataset.storageKey, this.dataset.value); - - if (typeof element.onchange === 'function') { - element.onchange(this.dataset.key, this.dataset.value); - } - - var parent = this.parentNode; - - while (!parent.classList.contains('satus-dialog')) { - parent = parent.parentNode; - } - - parent.querySelector('.satus-dialog__scrim').click(); - }; - } - - Satus.render(dialog); - }; - - component.appendChild(component_label); - component.appendChild(component_value); - - return component; -}; - -/*-------------------------------------------------------------- ->>> SWITCH ---------------------------------------------------------------*/ - -Satus.components.switch = function(element) { - var component = document.createElement('div'), - value; - - // LABEL - if (Satus.isset(element.label)) { - var component_label = document.createElement('span'); - - component_label.className = 'satus-switch__label'; - component_label.innerText = Satus.locale.getMessage(element.label); - - component.appendChild(component_label); - } - - - // INPUT - var component_input = document.createElement('input'); - - component_input.type = 'checkbox'; - component_input.className = 'satus-switch__input'; - - if (element.storage_key) { - value = Satus.storage.get(element.storage_key); - - component_input.dataset.storageKey = element.storage_key; - } - - if (!Satus.isset(value)) { - value = element.value; - } - - if (value) { - component_input.checked = value; - } - - component_input.addEventListener('change', function() { - Satus.storage.set(this.dataset.storageKey, this.checked); - }); - - component.appendChild(component_input); - - - // TRACK - var component_value = document.createElement('div'), - component_track = document.createElement('div'); - - component_value.className = 'satus-switch__value'; - component_track.className = 'satus-switch__track'; - - component_value.appendChild(component_track); - component.appendChild(component_value); - - - // MOUSE MOVE - component_track.addEventListener('mousedown', function(event) { - var prevent = false, - difference = 0; - - function click(event) { - event.preventDefault(); - event.stopPropagation(); - - component.removeEventListener('click', click); - - return false; - } - - function mousemove(event) { - var checkbox = component.querySelector('input'), - movement = event.movementX; - - if (movement * difference < 0) { - difference = 0; - } else { - difference += movement; - - if (prevent === false) { - prevent = true; - component.addEventListener('click', click); - } - } - - if (difference < -5) { - checkbox.checked = false; - } else if (difference > 5) { - checkbox.checked = true; - } - } - - function mouseup(event) { - window.removeEventListener('mousemove', mousemove); - window.removeEventListener('mouseup', mouseup); - } - - window.addEventListener('mousemove', mousemove); - window.addEventListener('mouseup', mouseup); - }); - - - // TOUCH MOVE - component_track.addEventListener('touchstart', function(event) { - var previous_x = 0, - difference = 0; - - function mousemove(event) { - var checkbox = component.querySelector('input'), - movement = event.touches[0].clientX - previous_x; - - previous_x = event.touches[0].clientX; - - if (movement * difference < 0) { - difference = 0; - } else { - difference += movement; - } - - if (difference < -5) { - checkbox.checked = false; - } else if (difference > 5) { - checkbox.checked = true; - } - } - - function mouseup(event) { - window.removeEventListener('touchmove', mousemove); - window.removeEventListener('touchend', mouseup); - } - - window.addEventListener('touchmove', mousemove); - window.addEventListener('touchend', mouseup); - }); - - - return component; -}; - -/*-------------------------------------------------------------- ->>> TABS ---------------------------------------------------------------*/ - -Satus.components.tabs = function(object) { - var component = document.createElement('div'), - tabbar = document.createElement('div'), - tabbar_select = document.createElement('div'), - main = document.createElement('div'), - i = 0; - - tabbar.className = 'satus-tabs__bar'; - main.className = 'satus-tabs__main'; - tabbar_select.className = 'satus-tabs__bar--select'; - - tabbar.appendChild(tabbar_select); - - function update() { - var index = Number(this.dataset.key); - - tabbar_select.style.left = this.offsetLeft + 'px'; - - if (this.parentNode.querySelector('.active')) { - var prev_index = Number(this.parentNode.querySelector('.active').dataset.key); - - this.parentNode.querySelector('.active').classList.remove('active'); - } - - this.classList.add('active'); - - var container = document.createElement('div'); - - container.className = 'satus-tabs__tab'; - - satus.render(this.menu, container); - - if (main.children.length >= 1) { - container.classList.add(index > prev_index ? 'satus-animation--fade-in-right' : 'satus-animation--fade-in-left'); - - main.children[0].classList.add('old'); - main.children[0].classList.add(index > prev_index ? 'satus-animation--fade-out-left' : 'satus-animation--fade-out-right'); - - main.appendChild(container); - - setTimeout(function() { - main.children[0].remove(); - - container.classList.remove(index > prev_index ? 'satus-animation--fade-in-right' : 'satus-animation--fade-in-left'); - }, 250); - } else { - main.appendChild(container); - } - } - - for (var key in object) { - if (object[key].type === 'tab') { - var tab = document.createElement('div'); - - tab.innerText = satus.locale.getMessage(object[key].label); - tab.dataset.key = i; - tab.onclick = update; - tab.menu = Object.assign({}, object[key]); - - delete tab.menu.type; - - tabbar.appendChild(tab); - - i++; - } - } - - tabbar.children[1].click(); - - component.appendChild(tabbar); - component.appendChild(main); - - return component; -}; - -/*--------------------------------------------------------------- ->>> FOLDER ----------------------------------------------------------------*/ - -Satus.components.folder = function(element) { - var component = document.createElement('button'); - - component.classList.add('satus-button'); - - if (satus.isset(element.label)) { - var label = document.createElement('span'); - - label.className = 'satus-button__label'; - label.innerText = satus.locale.getMessage(element.label); - - component.appendChild(label); - } - - component.addEventListener('click', function() { - var parent = document.querySelector(component.skelet.parent) || document.querySelector('.satus-main'); - - if (!component.skelet.parent || !parent.classList.contains('satus-main')) { - while (!parent.classList.contains('satus-main')) { - parent = parent.parentNode; - } - } - - parent.open(this.skelet, this.skelet.onopen); - }); - - return component; -}; - -/*--------------------------------------------------------------- ->>> TEXT FIELD ----------------------------------------------------------------*/ - -Satus.components.textField = function(element) { - if (element.rows > 1) { - var component = document.createElement('textarea'); - } else { - var component = document.createElement('input'); - - component.type = 'text'; - } - - return component; -}; - -/*-------------------------------------------------------------- ->>> MAIN ---------------------------------------------------------------*/ - -Satus.components.main = function(object) { - var component = document.createElement('main'); - - component.history = [object]; - - function create(self, animation, callback) { - var container = self.querySelector('.satus-main__container'), - component_container = document.createElement('div'), - component_scrollbar = Satus.components.scrollbar(component_container), - object = self.history[self.history.length - 1]; - - component_container.className = 'satus-main__container'; - - if (animation === 2) { - container.classList.add('satus-animation--fade-out-left'); - component_container.className = 'satus-main__container satus-animation--fade-in-right'; - } else if (animation === 1) { - self.history.pop(); - - object = self.history[self.history.length - 1]; - - container.classList.add('satus-animation--fade-out-right'); - component_container.className = 'satus-main__container satus-animation--fade-in-left'; - } - - document.body.dataset.appearance = object.appearanceKey; - component_container.dataset.appearance = object.appearanceKey; - - for (var key in object) { - Satus.render(object[key], component_scrollbar); - } - - self.appendChild(component_container); - - if (self.historyListener) { - self.historyListener(component_container); - } - - if (object.onopen || callback) { - component_scrollbar.onopen = object.onopen || callback; - - component_scrollbar.onopen(); - } - - if (container) { - setTimeout(function() { - container.remove(); - }, Satus.getAnimationDuration(container)); - } - } - - create(component, 0); - - component.back = function() { - create(this, 1); - }; - - component.open = function(element, callback) { - this.history.push(element); - - create(this, 2, callback); - }; - - if (object.on && object.on.change || object.onchange) { - component.historyListener = object.on && object.on.change || object.onchange; - - component.historyListener(component.querySelector('.satus-main__container')); - } - - return component; -}; - -/*-------------------------------------------------------------- ->>> SLIDER ---------------------------------------------------------------*/ - -Satus.components.slider = function(element) { - var component = document.createElement('div'); - - // LABEL - if (Satus.isset(element.label)) { - var component_label = document.createElement('span'); - - component_label.className = 'satus-slider__label'; - component_label.innerText = Satus.locale.getMessage(element.label); - - component.appendChild(component_label); - } - - - // RANGE - var component_range = document.createElement('input'); - - component_range.type = 'range'; - component_range.className = 'satus-slider__range'; - component_range.min = element.min || 0; - component_range.max = element.max || 10; - component_range.step = element.step || 1; - - component_range.oninput = function() { - var track = this.parentNode.querySelector('.satus-slider__track'), - thumb = this.parentNode.querySelector('.satus-slider__thumb'), - min = Number(this.min) || 0, - max = Number(this.max) || 1, - step = Number(this.step) || 1, - value = Number(this.value) || 0, - offset = (value - min) / (max - min) * 100; - - track.style.width = 'calc(' + offset + '% - ' + Math.floor(offset * 12 / 100) + 'px)'; - - Satus.storage.set(this.dataset.storageKey, Number(this.value)); - - component_thumb.dataset.value = this.value; - - if (component.onchange) { - component.onchange(Number(this.value)); - } - }; - - component.change = function(value) { - component_range.value = value; - - component_thumb.dataset.value = value; - - component_range.oninput(); - }; - - component.addEventListener('mousedown', function() { - function mousemove() { - component.classList.add('satus-slider--dragging'); - } - - function mouseup() { - component.classList.remove('satus-slider--dragging'); - - window.removeEventListener('mousemove', mousemove); - window.removeEventListener('mouseup', mouseup); - } - - window.addEventListener('mousemove', mousemove); - window.addEventListener('mouseup', mouseup); - }); - - if (element.onchange) { - component.onchange = element.onchange; - } - - component.appendChild(component_range); - - - // CONTAINER - var component_container = document.createElement('div'); - - component_container.className = 'satus-slider__container'; - - component.appendChild(component_container); - - - // TRACK - var component_track_container = document.createElement('div'), - component_track = document.createElement('div'); - - component_track_container.className = 'satus-slider__track-container'; - component_track.className = 'satus-slider__track'; - - component_track_container.appendChild(component_track); - component_container.appendChild(component_track_container); - - - // FOCUS RING - var component_ring = document.createElement('div'); - - component_ring.className = 'satus-slider__ring'; - - component_track.appendChild(component_ring); - - - // THUMB - var component_thumb = document.createElement('div'); - - component_thumb.className = 'satus-slider__thumb'; - - component_track.appendChild(component_thumb); - - if (element.storage_key) { - var value = Satus.storage.get(element.storage_key) || element.value; - - component_range.dataset.storageKey = element.storage_key; - - if (value) { - component_range.value = value; - - if (!Satus.isset(value)) { - value = element.value; - } - - var offset = (Number(component_range.value) - Number(component_range.min)) / (Number(component_range.max) - Number(component_range.min)) * 100; - - component_track.style.width = 'calc(' + offset + '% - ' + Math.floor(offset * 12 / 100) + 'px)'; - component_thumb.dataset.value = value; - } else { - component_range.value = 0; - component_thumb.dataset.value = 0; - } - } - - - return component; -}; -/*----------------------------------------------------------------------------- ->>> SCROLL BAR ------------------------------------------------------------------------------*/ - -Satus.components.scrollbar = function(parent, enabled) { - if (enabled === false) { - return parent; - } - - var component = document.createElement('div'), - component_wrapper = document.createElement('div'), - component_content = document.createElement('div'), - component_thumb = document.createElement('div'); - - component.className = 'satus-scrollbar'; - component_wrapper.className = 'satus-scrollbar__wrapper'; - component_content.className = 'satus-scrollbar__content'; - component_thumb.className = 'satus-scrollbar__thumb'; - - - // RESIZE - - function resize() { - component_content.style.width = component.offsetWidth + 'px'; - component_wrapper.style.height = component.offsetHeight + 'px'; - - if (component_wrapper.scrollHeight > component_wrapper.offsetHeight) { - component_thumb.style.height = component_wrapper.offsetHeight / component_wrapper.scrollHeight * component_wrapper.offsetHeight + 'px'; - } - } - - window.addEventListener('resize', resize); - - new MutationObserver(resize).observe(component_content, { - subtree: true, - childList: true - }); - - - // HOVER - - component.timeout = false; - - function active() { - if (component.timeout) { - clearTimeout(component.timeout); - - component.timeout = false; - } - - component.classList.add('active'); - - component.timeout = setTimeout(function() { - component.classList.remove('active'); - - component.timeout = false; - }, 1000); - } - - component.addEventListener('mousemove', active); - - - // SCROLL - - component_wrapper.addEventListener('scroll', function(event) { - active(); - - component_thumb.style.top = Math.floor(component_wrapper.scrollTop * (component_wrapper.offsetHeight - component_thumb.offsetHeight) / (component_wrapper.scrollHeight - component_wrapper.offsetHeight)) + 'px'; - }); - - component_thumb.addEventListener('mousedown', function(event) { - var offsetY = event.layerY; - - if (event.button !== 0) { - return false; - } - - function mousemove(event) { - var offset = 100 / ((component.offsetHeight - component_thumb.offsetHeight) / (event.clientY - offsetY - component.getBoundingClientRect().top)), - scroll = component_wrapper.scrollHeight - component.offsetHeight; - - component_wrapper.scrollTop = scroll / 100 * offset; - - event.preventDefault(); - - return false; - } - - function mouseup() { - window.removeEventListener('mouseup', mouseup); - window.removeEventListener('mousemove', mousemove); - } - - window.addEventListener('mouseup', mouseup); - window.addEventListener('mousemove', mousemove); - }); - - component_wrapper.appendChild(component_content); - component.appendChild(component_wrapper); - component.appendChild(component_thumb); - - parent.appendChild(component); - - return component_content; -}; -/*-------------------------------------------------------------- ->>> DIV ---------------------------------------------------------------*/ - -Satus.components.div = function(object) { - var component = document.createElement('div'); - - for (var key in object) { - Satus.render(object[key], component); - } - - return component; -}; - -/*-------------------------------------------------------------- ->>> LIST ---------------------------------------------------------------*/ - -Satus.components.list = function(object) { - var ul = document.createElement('ul'); - - if (object.compact === true) { - ul.classList.add('satus-list'); - ul.classList.add('satus-list--compact'); - } - - for (var key in object) { - if (Satus.isset(object[key].type)) { - var li = document.createElement('li'); - - if (object.sortable === true) { - function mousedown(event) { - if (event.button === 0) { - var self = this, - dragging = false, - clone = false, - current_index = Array.from(self.parentNode.children).indexOf(self), - bounding = this.getBoundingClientRect(), - first_x = event.clientX, - first_y = event.clientY, - offset_x = event.clientX - bounding.left, - offset_y = event.clientY - bounding.top; - - function mousemove(event) { - if (Math.abs(first_y - event.clientY) <= 5) { - return false; - } - - if (dragging === false) { - clone = self.cloneNode(true); - - Satus.cloneNodeStyles(self, clone); - clone.style.position = 'fixed'; - clone.style.pointerEvents = 'none'; - clone.style.backgroundColor = '#fff'; - self.style.visibility = 'hidden'; - - document.body.appendChild(clone); - - dragging = true; - } - - var x = bounding.left, //event.clientX - offset_x - y = event.clientY - offset_y, - index = Math.floor(y / self.offsetHeight) - 1; - - clone.style.left = x + 'px'; - clone.style.top = y + 'px'; - - if (index !== current_index) { - var new_clone = self.cloneNode(true); - - index = Math.max(Math.min(index, self.parentNode.children.length - 1), 0); - - if (index > 0) { - if (index > current_index) { - self.parentNode.insertBefore(new_clone, self.parentNode.children[index].nextSibling); - } else { - self.parentNode.insertBefore(new_clone, self.parentNode.children[index]); - } - } else { - self.parentNode.insertBefore(new_clone, self.parentNode.children[index]); - } - - self.remove(); - - self = new_clone; - - self.addEventListener('mousedown', mousedown); - - if (typeof object.onchange === 'function') { - object.onchange(current_index, index); - } - - current_index = index; - } - } - - function mouseup(event) { - if (clone) { - clone.remove(); - self.style.visibility = ''; - } - - if (typeof object.onend === 'function') { - object.onend(); - } - - window.removeEventListener('mousemove', mousemove); - window.removeEventListener('mouseup', mouseup); - } - - window.addEventListener('mousemove', mousemove); - window.addEventListener('mouseup', mouseup); - } - } - - li.addEventListener('mousedown', mousedown); - } - - Satus.render(object[key], li); - - ul.appendChild(li); - } - } - - return ul; -}; - -/*--------------------------------------------------------------- ->>> DIALOG ----------------------------------------------------------------*/ - -Satus.components.dialog = function(element) { - var component = document.createElement('div'), - component_scrim = document.createElement('div'), - component_surface = document.createElement('div'), - component_scrollbar = Satus.components.scrollbar(component_surface), - options = element.options || {}; - - component_scrim.className = 'satus-dialog__scrim'; - component_surface.className = 'satus-dialog__surface'; - - for (var key in element) { - Satus.render(element[key], component_scrollbar); - } - - function close() { - window.removeEventListener('keydown', keydown); - - component.classList.add('satus-dialog--closing'); - - if (typeof element.onclose === 'function') { - element.onclose(); - } - - setTimeout(function() { - component.remove(); - }, Satus.getAnimationDuration(component_surface)); - } - - function keydown(event) { - if (event.keyCode === 27) { - if (element.clickclose === false) { - return false; - } - - if (typeof element.onclickclose === 'function') { - element.onclickclose(); - } - - event.preventDefault(); - - close(); - } else if (event.keyCode === 9) { - var elements = component_surface.querySelectorAll('button, input'), - focused = false; - - event.preventDefault(); - - for (var i = 0, l = elements.length; i < l; i++) { - if (elements[i] === document.activeElement && elements[i + 1]) { - elements[i + 1].focus(); - - focused = true; - - i = l; - } - } - - if (focused === false) { - elements[0].focus(); - } - } - } - - component_scrim.addEventListener('click', function() { - if (element.clickclose === false) { - return false; - } - - if (typeof element.onclickclose === 'function') { - element.onclickclose(); - } - - close(); - }); - window.addEventListener('keydown', function(event) { - keydown(event); - }); - - component.appendChild(component_scrim); - component.appendChild(component_surface); - - component.close = close; - - // OPTIONS - - if (options.left) { - component_surface.style.left = options.left + 'px'; - } - - if (options.top) { - component_surface.style.top = options.top + 'px'; - } - - if (options.width) { - component_surface.style.width = options.width + 'px'; - } - - if (options.height) { - component_surface.style.height = options.height + 'px'; - } - - // END OPTIONS - - return component; -}; - -/*--------------------------------------------------------------- ->>> BUTTON ----------------------------------------------------------------*/ - -satus.components.button = function(element) { - var component = document.createElement('button'); - - if (satus.isset(element.label)) { - var label = document.createElement('span'); - - label.className = 'satus-button__label'; - label.innerText = satus.locale.getMessage(element.label); - - component.appendChild(label); - } - - return component; -}; - -/*-------------------------------------------------------------- ->>> TEXT ---------------------------------------------------------------*/ - -Satus.components.text = function(element) { - var component = document.createElement('span'); - - if (Satus.isset(element.label)) { - var component_label = document.createElement('span'); - - component_label.className = 'satus-text__label'; - component_label.innerText = Satus.locale.getMessage(element.label); - - component.appendChild(component_label); - } - - if (Satus.isset(element.value)) { - var component_value = document.createElement('span'); - - component_value.className = 'satus-text__value'; - component_value.innerText = Satus.locale.getMessage(element.value); - - component.appendChild(component_value); - } - - return component; -}; -/*-------------------------------------------------------------- ->>> SECTION ---------------------------------------------------------------*/ - -Satus.components.section = function(element) { - var component = document.createElement('section'); - - for (var key in element) { - Satus.render(element[key], component); - } - - return component; -}; - -/*--------------------------------------------------------------- ->>> COLOR PICKER ----------------------------------------------------------------*/ - -Satus.components.colorPicker = function(element) { - var component = document.createElement('div'), - container = document.createElement('div'), - cursor = document.createElement('div'), - cvs = document.createElement('canvas'), - ctx = cvs.getContext('2d'), - value = satus.storage.set(element.storage_key) || { - color: [255, 255, 255, 255], - x: 128, - y: 128 - }, - pivot_pointer = 0, - rgb = [255, 0, 0]; - - cvs.width = 256; - cvs.height = 256; - - container.className = 'satus-color-picker__container'; - cursor.className = 'satus-color-picker__cursor'; - - for (var i = 0; i < 360; i++) { - var b = (pivot_pointer + 3 - 1) % 3; - - if (rgb[pivot_pointer] < 255) { - rgb[pivot_pointer] = Math.min(rgb[pivot_pointer] + 4.322, 255); - } else if (rgb[b] > 0) { - rgb[b] = rgb[b] > 4.322 ? rgb[b] - 4.322 : 0; - } else if (rgb[pivot_pointer] >= 255) { - rgb[pivot_pointer] = 255; - - pivot_pointer = (pivot_pointer + 1) % 3; - } - - var radial_gradient = ctx.createRadialGradient(128, 128, 0, 128, 128, 128); - - radial_gradient.addColorStop(0, '#fff'); - radial_gradient.addColorStop(1, 'rgb(' + rgb.map(function(rgb) { - return Math.floor(rgb); - }).join(',') + ')'); - - ctx.fillStyle = radial_gradient; - ctx.globalCompositeOperation = 'source-over'; - ctx.beginPath(); - ctx.moveTo(128, 128); - ctx.arc(128, 128, 128, satus.math.degToRad(i), satus.math.degToRad(360)); - ctx.closePath(); - ctx.fill(); - } - - function select(event) { - var coordinates = cvs.getBoundingClientRect(), - x = event.clientX - coordinates.left, - y = event.clientY - coordinates.top, - color = ctx.getImageData(x, y, 1, 1).data, - rgb = ''; - - cursor.style.left = x + 'px'; - cursor.style.top = y + 'px'; - - value.x = x; - value.y = y; - value.color = color; - - component.querySelector('.satus-color-picker__value').style.background = 'rgba(' + value.color[0] + ', ' + value.color[1] + ', ' + value.color[2] + ', ' + value.color[3] / 255 + ')'; - } - - function mouseup(event) { - cvs.removeEventListener('mousemove', select); - window.removeEventListener('mouseup', mouseup); - } - - cvs.addEventListener('mousedown', function(event) { - select(event); - - this.addEventListener('mousemove', select); - window.addEventListener('mouseup', mouseup); - }); - - component.appendChild(container); - container.appendChild(cvs); - container.appendChild(cursor); - - satus.render({ - type: 'section', - style: { - margin: '16px 0 8px' - }, - - value: { - type: 'div', - class: 'satus-color-picker__value', - style: { - background: 'rgba(' + value.color[0] + ', ' + value.color[1] + ', ' + value.color[2] + ', ' + value.color[3] / 255 + ')' - } - }, - cancel: { - type: 'button', - label: 'cancel', - onclick: function() { - document.querySelector('.satus-dialog__scrim').click(); - } - }, - save: { - type: 'button', - label: 'save', - onclick: function() { - satus.storage.set(element.storage_key, { - color: value.color, - x: value.x, - y: value.y - }); - - document.querySelector('.satus-dialog__scrim').click(); - } - } - }, component); - - return component; -}; - -/*--------------------------------------------------------------- ->>> SHORTCUT ----------------------------------------------------------------*/ - -satus.components.shortcut = function(object) { - var component = document.createElement('div'), - value, - options = object.options || {}, - mousewheel_timeout = false, - mousewheel_only = false; - - try { - value = JSON.parse(Satus.storage.get(object.storage_key)); - } catch (err) { - value = object.value || {}; - } - - function renderValue() { - var keys_value = []; - - if (value.altKey === true) { - keys_value.push('
Alt
'); - } - - if (value.ctrlKey === true) { - keys_value.push('
Ctrl
'); - } - - if (value.shiftKey === true) { - keys_value.push('
Shift
'); - } - - if (value.key === ' ') { - keys_value.push('
Space bar
'); - - } else if (typeof value.key === 'string' && ['Shift', 'Control', 'Alt'].indexOf(value.key) === -1) { - if (value.key === 'ArrowUp') { - keys_value.push('
'); - } else if (value.key === 'ArrowRight') { - keys_value.push('
'); - } else if (value.key === 'ArrowDown') { - keys_value.push('
'); - } else if (value.key === 'ArrowLeft') { - keys_value.push('
'); - } else { - keys_value.push('
' + value.key.toUpperCase() + '
'); - } - } - - if (value.wheel) { - keys_value.push('
'); - } - - if (value.click) { - keys_value.push('
'); - } - - if (value.context) { - keys_value.push('
'); - } - - return keys_value.join('
'); - } - - if (satus.isset(object.label)) { - var label = document.createElement('div'); - - label.className = 'satus-shortcut__label'; - - label.innerText = satus.locale.getMessage(object.label); - - component.appendChild(label); - } - - if (options.hide_value !== true) { - var component_value = document.createElement('div'); - - component_value.className = 'satus-shortcut__value'; - - component_value.innerHTML = renderValue(); - - component.appendChild(component_value); - } - - component.addEventListener('click', function() { - var component_dialog = document.createElement('div'), - component_scrim = document.createElement('div'), - component_surface = document.createElement('div'), - component_canvas = document.createElement('div'), - component_section = document.createElement('section'), - component_button_reset = document.createElement('div'), - component_button_cancel = document.createElement('div'), - component_button_save = document.createElement('div'); - - component_dialog.className = 'satus-dialog satus-dialog_open'; - component_scrim.className = 'satus-dialog__scrim'; - component_surface.className = 'satus-dialog__surface satus-dialog__surface_shortcut'; - component_canvas.className = 'satus-shortcut__canvas'; - component_section.className = 'satus-section satus-section--align-end satus-section_shortcut'; - component_button_reset.className = 'satus-button satus-button_shortcut'; - component_button_cancel.className = 'satus-button satus-button_shortcut'; - component_button_save.className = 'satus-button satus-button_shortcut'; - - component_button_reset.innerText = Satus.locale.getMessage('reset'); - component_button_cancel.innerText = Satus.locale.getMessage('cancel'); - component_button_save.innerText = Satus.locale.getMessage('save'); - - component_canvas.innerHTML = renderValue(); - - function keydown(event) { - event.preventDefault(); - event.stopPropagation(); - - mousewheel_only = false; - clearTimeout(mousewheel_timeout); - - value = { - key: event.key, - keyCode: event.keyCode, - shiftKey: event.shiftKey, - ctrlKey: event.ctrlKey, - altKey: event.altKey, - click: false, - context: false, - wheel: false - }; - - component_canvas.innerHTML = renderValue(); - - return false; - } - - function mousewheel(event) { - event.stopPropagation(); - - if (mousewheel_only === true) { - delete value.shiftKey; - delete value.altKey; - delete value.ctrlKey; - delete value.keyCode; - delete value.key; - } - - value.click = false; - value.context = false; - - clearTimeout(mousewheel_timeout); - - mousewheel_timeout = setTimeout(function() { - mousewheel_only = true; - }, 300); - - value.wheel = event.deltaY; - - component_canvas.innerHTML = renderValue(); - - return false; - } - - component_canvas.addEventListener('click', function(event) { - event.stopPropagation(); - - if (mousewheel_only === true) { - delete value.shiftKey; - delete value.altKey; - delete value.ctrlKey; - delete value.keyCode; - delete value.key; - } - - value.wheel = false; - value.context = false; - - clearTimeout(mousewheel_timeout); - - mousewheel_timeout = setTimeout(function() { - mousewheel_only = true; - }, 300); - - value.click = true; - - component_canvas.innerHTML = renderValue(); - - return false; - }); - - component_canvas.addEventListener('contextmenu', function(event) { - event.stopPropagation(); - event.preventDefault(); - - if (mousewheel_only === true) { - delete value.shiftKey; - delete value.altKey; - delete value.ctrlKey; - delete value.keyCode; - delete value.key; - } - - value.wheel = false; - value.click = false; - - clearTimeout(mousewheel_timeout); - - mousewheel_timeout = setTimeout(function() { - mousewheel_only = true; - }, 300); - - value.context = true; - - component_canvas.innerHTML = renderValue(); - - return false; - }); - - window.addEventListener('keydown', keydown); - window.addEventListener('mousewheel', mousewheel); - - function close() { - window.removeEventListener('keydown', keydown); - window.removeEventListener('mousewheel', mousewheel); - - component_dialog.classList.remove('satus-dialog_open'); - - mousewheel_timeout = false; - mousewheel_only = false; - - setTimeout(function() { - component_dialog.remove(); - }, Number(document.defaultView.getComputedStyle(component_dialog, '').getPropertyValue('animation-duration').replace(/[^0-9.]/g, '') * 1000)); - } - - component_scrim.addEventListener('click', close); - - component_button_reset.addEventListener('click', function() { - Satus.storage.set(object.storage_key, null); - value = (Satus.storage.get(object.storage_key) ? JSON.parse(Satus.storage.get(object.storage_key)) : false) || object.value || {}; - component_value.innerHTML = renderValue(); - close(); - }); - - component_button_cancel.addEventListener('click', function() { - value = (Satus.storage.get(object.storage_key) ? JSON.parse(Satus.storage.get(object.storage_key)) : false) || object.value || {}; - close(); - }); - - component_button_save.addEventListener('click', function() { - Satus.storage.set(object.storage_key, JSON.stringify(value)); - - if (typeof object.onchange === 'function') { - object.onchange(object, value); - } - - close(); - }); - - component_section.appendChild(component_button_reset); - component_section.appendChild(component_button_cancel); - component_section.appendChild(component_button_save); - - component_surface.appendChild(component_canvas); - component_surface.appendChild(component_section); - - component_dialog.appendChild(component_scrim); - component_dialog.appendChild(component_surface); - - document.body.appendChild(component_dialog); - }); - - return component; -}; diff --git a/src/css/basic.css b/src/css/basic.css deleted file mode 100644 index 868cbe8..0000000 --- a/src/css/basic.css +++ /dev/null @@ -1,43 +0,0 @@ -/*--------------------------------------------------------------- ->>> BASIC ------------------------------------------------------------------ -# Fonts -# Body ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -# FONTS ----------------------------------------------------------------*/ - -@font-face -{ - font-family: 'Open Sans'; - font-weight: 400; - - src: url('assets/fonts/OpenSans-Regular.ttf'); -} - -@font-face -{ - font-family: 'Open Sans'; - font-weight: 700; - - src: url('assets/fonts/OpenSans-SemiBold.ttf'); -} - - -/*--------------------------------------------------------------- -# BODY ----------------------------------------------------------------*/ - -body -{ - font-family: 'Open Sans', sans-serif; - font-size: 14px; - - display: flex; - overflow: hidden; - flex-direction: column; - - margin: 0; -} diff --git a/src/css/footer.css b/src/css/footer.css deleted file mode 100644 index 7ca00c7..0000000 --- a/src/css/footer.css +++ /dev/null @@ -1,83 +0,0 @@ -/*--------------------------------------------------------------- ->>> FOOTER ------------------------------------------------------------------ -# Button -# Dialog ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -1.0 BUTTON ----------------------------------------------------------------*/ - -.satus-button--create -{ - position: fixed; - right: 16px; - bottom: 16px; - - width: 56px; - height: 56px; - padding: 0; - - color: #fff; - border-radius: 50%; - background: linear-gradient(135deg, #f8d266, #f17953); - box-shadow: 0 2px 1px 1px rgba(230, 109, 70, .7), 0 3px 5px rgba(0,0,0,.35); -} - - -/*--------------------------------------------------------------- -2.0 DIALOG ----------------------------------------------------------------*/ - -.satus-dialog--create .satus-text -{ - display: block; - - width: calc(100% - 32px); - margin: 0 16px; -} - -.satus-dialog--create .satus-text-field -{ - font-size: 16px; - - width: calc(100% - 32px); - margin: 8px 16px; - padding: 4px 8px; - - border: 1px solid #e8e8e8; - border-radius: 4px; - background-color: #fff; -} - -.satus-dialog--create .satus-section -{ - width: calc(100% - 32px); - margin: 8px 16px 4px; - padding: 8px 0 4px; - - border-top: 1px solid #e8e8e8; - - justify-content: flex-end; -} - -.satus-dialog--create .satus-button -{ - font-size: 14px; - font-weight: 600; - - overflow: hidden; - - padding: 8px 16px; - - letter-spacing: .2px; - - color: var(--satus-theme-primary); - border-radius: 4px; -} - -.satus-dialog--create .satus-button:hover -{ - background-color: rgba(0,0,0,.03); -} diff --git a/src/css/header.css b/src/css/header.css deleted file mode 100644 index 3ae8033..0000000 --- a/src/css/header.css +++ /dev/null @@ -1,83 +0,0 @@ -/*-------------------------------------------------------------- ->>> HEADER: ----------------------------------------------------------------- -1.0 Buttons - 1.1 Back button -2.0 Title -3.0 Right section -4.0 Search -5.0 Vertical menu ---------------------------------------------------------------*/ - -/*-------------------------------------------------------------- -1.0 BUTTONS ---------------------------------------------------------------*/ - -.satus-header .satus-button -{ - width: 36px; - height: 36px; - padding: 6px; -} - -.satus-header .satus-button::before -{ - border-radius: 50%; -} - - -/*-------------------------------------------------------------- -1.1 BACK BUTTON ---------------------------------------------------------------*/ - -.satus-button--back -{ - position: absolute; -} - -.satus-button--back svg -{ - fill: none; - stroke: currentColor; -} - -body[data-appearance='home'] .satus-button--back -{ - visibility: hidden; -} - - -/*-------------------------------------------------------------- -2.0 TITLE ---------------------------------------------------------------*/ - -.satus-text--title -{ - font-size: .9375rem; - font-weight: 400; - - position: absolute; - left: 56px; - - letter-spacing: .0125em; -} - -body[data-appearance='home'] .satus-text--title -{ - left: 14px; -} - - -/*-------------------------------------------------------------- -3.0 RIGHT SECTION ---------------------------------------------------------------*/ - -.satus-section--align-end -{ - justify-content: flex-end; -} - -.satus-section--align-end .satus-button + .satus-button -{ - margin-left: 8px; -} diff --git a/src/css/main.css b/src/css/main.css deleted file mode 100644 index 22ce581..0000000 --- a/src/css/main.css +++ /dev/null @@ -1,286 +0,0 @@ -/*-------------------------------------------------------------- ->>> MAIN: ----------------------------------------------------------------- -1.0 Basic -2.0 Section -3.0 Folder -4.0 Button -5.0 Switch -6.0 Encryption ---------------------------------------------------------------*/ - -/*-------------------------------------------------------------- -1.0 BASIC ---------------------------------------------------------------*/ - -.satus-main -{ - flex: 1; -} - - -/*-------------------------------------------------------------- -2.0 SECTION ---------------------------------------------------------------*/ - -.satus-section--main -{ - display: block; - - box-sizing: border-box; - width: calc(100% - 16px); - max-width: 900px; - margin: 8px auto; - padding: 8px 0; - - color: var(--satus-theme-on-surface, #777); - border: 1px solid rgba(0,0,0,.1); - border-radius: 8px; - background-color: var(--satus-theme-surface, #fff); -} - -.satus-text--message -{ - padding: 0 16px; -} - -.satus-main .satus-list--label -{ - font-size: 17px; - - display: block; - - width: calc(100% - 16px); - max-width: 900px; - margin: 16px auto 8px; -} - -.satus-main__container .satus-list -{ - display: block; - - box-sizing: border-box; - width: calc(100% - 16px); - max-width: 900px; - margin: 8px auto; - padding: 8px 0; - - color: var(--satus-theme-on-surface, #777); - border: 1px solid rgba(0,0,0,.1); - border-radius: 8px; - background-color: var(--satus-theme-surface, #fff); -} - -.satus-main__container .satus-list li .satus-section -{ - position: relative; - - width: 100%; -} - -.satus-main .satus-button.satus-button--menu -{ - position: absolute; - z-index: 1; - top: 6px; - right: 8px; - - visibility: hidden; - - width: 34px; - height: 34px; - padding: 6px; - - border-radius: 50%; -} - -.satus-dialog--menu .satus-button -{ - width: 100%; - height: 36px; - padding: 0 16px; - text-align: left; -} - -.satus-main__container .satus-list li .satus-section:hover .satus-button--menu -{ - visibility: visible; -} - -.satus-main__container .satus-list--message -{ - padding-right: 8px; - padding-left: 8px; -} - - -/*-------------------------------------------------------------- -3.0 FOLDER ---------------------------------------------------------------*/ - -.satus-main .satus-folder svg -{ - width: 20px; - height: 20px; - margin: 0 14px 0 0; - - opacity: .75; - - stroke: none; - fill: #f6b465; -} - - -/*-------------------------------------------------------------- -4.0 BUTTON ---------------------------------------------------------------*/ - -.satus-main .satus-button:not(.satus-button--menu) -{ - width: 100%; - height: 48px; - padding: 0 16px; -} - - -/*-------------------------------------------------------------- -5.0 SWITCH ---------------------------------------------------------------*/ - -.satus-switch--checkbox -{ - flex-direction: row-reverse; -} - -.satus-switch--checkbox .satus-switch__label -{ - margin: 0 0 0 16px; - - flex: 1; -} - -.satus-switch--checkbox .satus-switch__value -{ - flex: unset; -} - -.satus-switch--checkbox .satus-switch__track -{ - width: 22px; - min-width: 22px; - max-width: 22px; - height: 22px; - min-height: 22px; - max-height: 22px; - - border-radius: 50%; - background: transparent; - box-shadow: inset 0 0 0 1px #bdbdbd; -} - -.satus-switch--checkbox .satus-switch__track::before -{ - position: absolute; - top: 7px; - left: 5px; - - visibility: hidden; - - width: 10px; - height: 5px; - - transition: unset; - transform: rotate(-45deg); - - opacity: 0; - border: 2px solid #fff; - border-top: none; - border-right: none; - border-radius: unset; - background-color: transparent; -} - -.satus-switch--checkbox .satus-switch__input:checked + .satus-switch__value .satus-switch__track::before -{ - top: 7px; - left: 5px; - - visibility: visible; - - transform: rotate(-45deg); - - opacity: 1; - background-color: transparent; -} - -.satus-switch--checkbox .satus-switch__track::after -{ - content: none; -} - -.satus-switch--checkbox .satus-switch__input:checked + .satus-switch__value .satus-switch__track -{ - background-color: #f6b465; - box-shadow: none; -} - - -/*-------------------------------------------------------------- -6.0 ENCRYPTION ---------------------------------------------------------------*/ - -.satus-dialog--encryption .satus-text -{ - display: block; - - width: calc(100% - 32px); - margin: 0 16px; -} - -.satus-dialog--encryption .satus-text-field -{ - font-size: 16px; - - width: calc(100% - 32px); - margin: 8px 16px; - padding: 4px 8px; - - border: 1px solid #e8e8e8; - border-radius: 4px; - background-color: #fff; -} - -.satus-dialog--encryption .satus-text-field.error -{ - outline: 2px solid rgba(255, 0, 0, .4); -} - -.satus-dialog--encryption .satus-section -{ - width: calc(100% - 32px); - margin: 8px 16px 4px; - padding: 8px 0 4px; - - border-top: 1px solid #e8e8e8; - - justify-content: flex-end; -} - -.satus-dialog--encryption .satus-button -{ - font-size: 14px; - font-weight: 600; - - overflow: hidden; - - height: 28px; - min-height: 28px; - margin-right: 2px; - padding: 8px 16px; - - letter-spacing: .2px; - text-transform: uppercase; - - color: var(--satus-theme-primary); - border-radius: 4px; -} diff --git a/src/css/themes.css b/src/css/themes.css deleted file mode 100644 index 8cc9182..0000000 --- a/src/css/themes.css +++ /dev/null @@ -1,5 +0,0 @@ -html -{ - --satus-theme-primary: #f6b465; - /*--satus-theme-on-surface: #fafafa;*/ -} \ No newline at end of file diff --git a/src/js/footer.js b/src/js/footer.js deleted file mode 100644 index 4b95449..0000000 --- a/src/js/footer.js +++ /dev/null @@ -1,43 +0,0 @@ -/*--------------------------------------------------------------- ->>> FOOTER ----------------------------------------------------------------*/ - -Menu.create = { - type: 'button', - before: '', - class: 'satus-button--create', - onclick: { - type: 'dialog', - class: 'satus-dialog--create', - - label: { - type: 'text', - label: 'name' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--value', - onkeydown: function(event) { - if (event.keyCode === 13) { - create(); - } - }, - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'create', - onclick: create - } - } - } -}; diff --git a/src/js/functions.js b/src/js/functions.js deleted file mode 100644 index 98da517..0000000 --- a/src/js/functions.js +++ /dev/null @@ -1,594 +0,0 @@ -/*--------------------------------------------------------------- ->>> FUNCTIONS ------------------------------------------------------------------ -# Create -# Remove -# Rename -# Update -# Render -# Other ----------------------------------------------------------------*/ - -/*--------------------------------------------------------------- -# CREATE ----------------------------------------------------------------*/ - -function create() { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')), - value = document.querySelector('.satus-text-field--value').value, - container = document.querySelector('.satus-main .satus-scrollbar__content'), - index = -1; - - container.innerHTML = ''; - - if (history_item.appearanceKey === 'home') { - data.lists.push({ - name: value, - items: [] - }); - } else { - data.lists[history_item.storage_key].items.push({ - name: value, - value: false - }); - - index = history_item.storage_key; - } - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - - satus.render(render(index), container); - - document.querySelector('.satus-dialog').close(); -} - - -/*--------------------------------------------------------------- -# REMOVE ----------------------------------------------------------------*/ - -function remove() { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')); - - if (main.history.length > 1) { - var key = this.dataset.key; - - data.lists[history_item.storage_key].items.splice(key, 1); - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } - - update(); - } else { - data.lists.splice(this.dataset.key, 1); - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - - update(); - } -} - -/*--------------------------------------------------------------- -# RENAME ----------------------------------------------------------------*/ - -function rename(name, key) { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')); - - if (main.history.length > 1) { - data.lists[history_item.storage_key].items[key].name = name; - } else { - data.lists[key].name = name; - } - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - - update(); -} - - -/*--------------------------------------------------------------- -# UPDATE ----------------------------------------------------------------*/ - -function update(container) { - var self = (this === window ? document.querySelector('.satus-main') : this), - item = self.history[self.history.length - 1], - id = item.appearanceKey, - data = JSON.parse(satus.storage.get('data') || '{}'), - index = -1; - - if (!satus.isset(container)) { - container = document.querySelector('.satus-main__container'); - } - - document.body.dataset.appearance = id; - container.dataset.appearance = id; - - document.querySelector('.satus-text--title').innerText = satus.locale.getMessage(item.label) || satus.locale.getMessage('lists'); - - container.querySelector('.satus-scrollbar__content').innerHTML = ''; - - if (item.appearanceKey === 'home') { - if (Object.keys(data).length === 0) { - satus.storage.set('data', JSON.stringify({ - lists: [{ - name: satus.locale.getMessage('myTasks'), - items: [] - }] - })); - } - } else if (item.appearanceKey === 'list') { - index = item.storage_key; - } - - satus.render(render(index), container.querySelector('.satus-scrollbar__content')); -} - - -/*--------------------------------------------------------------- -# RENDER ----------------------------------------------------------------*/ - -function render(index) { - var object = JSON.parse(satus.storage.get('data')).lists; - - if (index === -1) { - if (object.length === 0) { - var container = { - type: 'section', - class: 'satus-section--main', - - text: { - type: 'text', - class: 'satus-text--message', - label: 'noLists' - } - }; - } else { - var container = { - type: 'list', - compact: true, - sortable: true, - onchange: change - }; - - for (var i = 0, l = object.length; i < l; i++) { - container[i] = { - type: 'section', - - folder: { - type: 'folder', - label: object[i].name, - before: '', - appearanceKey: 'list', - storage_key: String(i), - dataset: { - key: i - } - }, - actions: { - type: 'button', - class: 'satus-button--menu', - before: '', - onclick: { - type: 'dialog', - class: 'satus-dialog--menu', - style: { - - }, - - button_rename: { - type: 'button', - label: 'rename', - dataset: { - key: i - }, - onclick: function() { - satus.render({ - type: 'dialog', - class: 'satus-dialog--create', - - label: { - type: 'text', - label: 'name' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--value', - dataset: { - key: this.dataset.key - }, - onkeydown: function(event) { - if (event.keyCode === 13) { - rename(this.value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - }, - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'rename', - dataset: { - key: this.dataset.key - }, - onclick: function() { - rename(document.querySelector('.satus-text-field--value').value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - } - } - }); - - document.querySelector('.satus-dialog').close(); - } - }, - button_remove: { - type: 'button', - label: 'remove', - dataset: { - key: i - }, - onclick: function() { - this.r = remove; - - this.r(); - - document.querySelector('.satus-dialog').close(); - } - } - } - } - }; - } - } - } else { - object = object[index]; - - if (object.items.length === 0) { - var container = { - type: 'section', - class: 'satus-section--main', - - text: { - type: 'text', - class: 'satus-text--message', - label: 'noTasks' - } - }; - } else { - var container = { - type: 'list', - compact: true, - sortable: true, - onchange: change - }; - - for (var i = 0, l = object.items.length; i < l; i++) { - container[i] = { - type: 'section', - - checkbox: { - type: 'switch', - class: 'satus-switch--checkbox', - label: object.items[i].name, - value: object.items[i].value, - storage_key: String(i), - dataset: { - key: i - }, - onchange: function() { - var main = document.querySelector('.satus-main'), - history_item = main.history[main.history.length - 1], - data = JSON.parse(satus.storage.get('data')); - - data.lists[history_item.storage_key].items[this.dataset.key].value = this.querySelector('input').checked; - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } - } - }, - actions: { - type: 'button', - class: 'satus-button--menu', - before: '', - onclick: { - type: 'dialog', - class: 'satus-dialog--menu', - style: { - - }, - - button_rename: { - type: 'button', - label: 'rename', - dataset: { - key: i - }, - onclick: function() { - satus.render({ - type: 'dialog', - class: 'satus-dialog--create', - - label: { - type: 'text', - label: 'name' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--value', - dataset: { - key: this.dataset.key - }, - onkeydown: function(event) { - if (event.keyCode === 13) { - rename(this.value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - }, - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'rename', - dataset: { - key: this.dataset.key - }, - onclick: function() { - rename(document.querySelector('.satus-text-field--value').value, this.dataset.key); - - document.querySelector('.satus-dialog').close(); - } - } - } - }); - - document.querySelector('.satus-dialog').close(); - } - }, - button_remove: { - type: 'button', - label: 'remove', - dataset: { - key: i - }, - onclick: function() { - this.r = remove; - - this.r(); - - document.querySelector('.satus-dialog').close(); - } - } - } - } - }; - } - } - } - - return container; -} - - -/*--------------------------------------------------------------- -# OTHER ----------------------------------------------------------------*/ - -function change(old_index, new_index) { - var main = document.querySelector('.satus-main'), - data = JSON.parse(satus.storage.get('data')), - old_index2 = Number(document.querySelectorAll('.satus-main .satus-list li')[old_index].querySelector('button').dataset.key), - new_index2 = Number(document.querySelectorAll('.satus-main .satus-list li')[new_index].querySelector('button').dataset.key); - - if (main.history.length > 1) { - var index = main.history[main.history.length - 1].storage_key; - - data.lists[index].items.splice(new_index2, 0, data.lists[index].items.splice(old_index2, 1)[0]); - } else { - data.lists.splice(new_index2, 0, data.lists.splice(old_index2, 1)[0]); - } - - document.querySelectorAll('.satus-main .satus-list li')[old_index].querySelector('button').dataset.key = new_index2; - document.querySelectorAll('.satus-main .satus-list li')[new_index].querySelector('button').dataset.key = old_index2; - - satus.storage.data.data = JSON.stringify(data); - - if (satus.storage.get('encrypted') === true) { - (async function() { - chrome.storage.local.set({ - data: await satus.aes.encrypt(satus.storage.get('data'), password) - }); - })(); - } else { - satus.storage.set('data', satus.storage.get('data')); - } -} - -function importData() { - satus.render({ - type: 'dialog', - - select_file: { - type: 'button', - label: 'selectFile', - onclick: function() { - var input = document.createElement('input'); - - input.type = 'file'; - - input.addEventListener('change', function() { - var file_reader = new FileReader(); - - file_reader.onload = function() { - var data = JSON.parse(this.result); - - for (var key in data) { - satus.storage.set(key, data[key]); - } - - if (location.href.indexOf('action=import') !== -1) { - window.close(); - } else { - document.querySelector('.satus-dialog__scrim').click(); - - satus.render({ - type: 'dialog', - - message: { - type: 'text', - label: 'dataImportedSuccessfully' - }, - section: { - type: 'section', - class: 'controls', - - ok: { - type: 'button', - label: 'ok', - onclick: function() { - document.querySelector('.satus-dialog__scrim').click(); - } - } - } - }); - } - }; - - file_reader.readAsText(this.files[0]); - }); - - input.click(); - } - } - }); -} - -function exportData() { - var blob = new Blob([JSON.stringify(satus.storage.data)], { - type: 'application/json;charset=utf-8' - }); - - satus.render({ - type: 'dialog', - - export: { - type: 'button', - label: 'export', - onclick: function() { - chrome.permissions.request({ - permissions: ['downloads'] - }, function(granted) { - if (granted) { - chrome.downloads.download({ - url: URL.createObjectURL(blob), - filename: 'todo.json', - saveAs: true - }, function() { - setTimeout(function() { - if (location.href.indexOf('action=export') !== -1) { - window.close(); - } else { - document.querySelector('.satus-dialog__scrim').click(); - - satus.render({ - type: 'dialog', - - message: { - type: 'text', - label: 'dataExportedSuccessfully' - }, - section: { - type: 'section', - class: 'controls', - - ok: { - type: 'button', - label: 'ok', - onclick: function() { - document.querySelector('.satus-dialog__scrim').click(); - } - } - } - }); - } - }, 100); - }); - } - }); - } - } - }); -} diff --git a/src/js/header.js b/src/js/header.js deleted file mode 100644 index edf040a..0000000 --- a/src/js/header.js +++ /dev/null @@ -1,171 +0,0 @@ -/*--------------------------------------------------------------- ->>> HEADER ----------------------------------------------------------------*/ - -var Menu = { - header: { - type: 'header', - - section_start: { - type: 'section', - class: 'satus-section--align-start', - - button_back: { - type: 'button', - class: 'satus-button--back', - before: '', - onclick: function() { - document.querySelector('.satus-main').back(); - } - }, - title: { - type: 'text', - class: 'satus-text--title' - } - }, - section_end: { - type: 'section', - class: 'satus-section--align-end', - - button_vert: { - type: 'button', - before: '', - onclick: { - type: 'dialog', - class: 'satus-dialog--vertical-menu', - - language: { - type: 'select', - before: '', - label: 'language', - options: [ - { - label: 'English', - value: 'en' - }, - { - label: 'Русский', - value: 'ru' - } - ], - onchange: function(name, value) { - satus.locale.import(value, function() { - var self = (this === window ? document.querySelector('.satus-main') : this), - item = self.history[self.history.length - 1]; - - document.querySelector('.satus-text--title').innerText = satus.locale.getMessage(item.label) || satus.locale.getMessage('lists'); - - document.querySelector('.satus-dialog .satus-select__label').innerText = satus.locale.getMessage('language'); - document.querySelector('.satus-dialog .satus-switch__label').innerText = satus.locale.getMessage('encryption'); - document.querySelectorAll('.satus-dialog .satus-button__label')[0].innerText = satus.locale.getMessage('export'); - document.querySelectorAll('.satus-dialog .satus-button__label')[1].innerText = satus.locale.getMessage('import'); - }); - } - }, - encrypted: { - type: 'switch', - before: '', - label: 'encryption', - onclick: function() { - setTimeout(function() { - if (satus.storage.get('encrypted') === true) { - satus.storage.set('encrypted', false); - - satus.render({ - type: 'dialog', - class: 'satus-dialog--encryption', - onclickclose: function() { - document.querySelector('.satus-dialog .satus-switch input').checked = false; - }, - - title: { - type: 'text', - label: 'password' - }, - text_field: { - type: 'text-field', - class: 'satus-text-field--password', - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - }, - onkeydown: async function(event) { - if (event.keyCode === 13) { - if (document.querySelector('.satus-text-field--password').value.length > 1) { - satus.storage.set('data', await satus.aes.encrypt(satus.storage.get('data'), document.querySelector('.satus-text-field--password').value)); - - password = document.querySelector('.satus-text-field--password').value; - - satus.storage.set('encrypted', true); - - document.querySelectorAll('.satus-dialog')[1].close(); - } else { - document.querySelector('.satus-text-field--password').classList.add('error'); - } - } - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'ok', - onclick: async function() { - if (document.querySelector('.satus-text-field--password').value.length > 1) { - satus.storage.set('data', await satus.aes.encrypt(satus.storage.get('data'), document.querySelector('.satus-text-field--password').value)); - - password = document.querySelector('.satus-text-field--password').value; - - satus.storage.set('encrypted', true); - - document.querySelectorAll('.satus-dialog')[1].close(); - } else { - document.querySelector('.satus-text-field--password').classList.add('error'); - } - } - } - } - }); - } else { - satus.storage.set('data', satus.storage.get('data')); - } - }, 100); - } - }, - export: { - type: 'button', - label: 'export', - before: '', - onclick: function() { - if (location.href.indexOf('/options.html') !== -1) { - exportData(); - } else { - chrome.tabs.create({ - url: 'options.html?action=export' - }); - } - } - }, - import: { - type: 'button', - label: 'import', - before: '', - onclick: function() { - if (location.href.indexOf('/options.html') !== -1) { - importData(); - } else { - chrome.tabs.create({ - url: 'options.html?action=import' - }); - } - } - } - } - } - } - } -}; diff --git a/src/js/index.js b/src/js/index.js deleted file mode 100644 index 56e543e..0000000 --- a/src/js/index.js +++ /dev/null @@ -1,90 +0,0 @@ -/*--------------------------------------------------------------- ->>> INDEX ----------------------------------------------------------------*/ - -var password = ''; - -satus.storage.import(function() { - satus.locale.import(satus.storage.get('language'), function() { - satus.modules.updateStorageKeys(Menu, function() { - if (location.href.indexOf('action=import') !== -1) { - importData(); - } else if (location.href.indexOf('action=export') !== -1) { - exportData(); - } else { - var encrypted = satus.storage.get('encrypted'); - - if (encrypted) { - satus.render({ - type: 'dialog', - class: 'satus-dialog--encryption', - clickclose: false, - - title: { - type: 'text', - label: 'password' - }, - text_field: { - type: 'text-field', - id: 'password', - onrender: function() { - var self = this; - - setTimeout(function() { - self.focus(); - }); - }, - onkeypress: async function(event) { - if (event.keyCode === 13) { - var data = await satus.aes.decrypt(satus.storage.get('data'), document.querySelector('#password').value); - - if (data) { - satus.storage.data.data = data; - - password = document.querySelector('#password').value; - - satus.render(Menu); - - document.querySelector('.satus-dialog').close(); - } else { - document.querySelector('#password').classList.add('error'); - - document.querySelector('#password').focus(); - } - } - } - }, - section: { - type: 'section', - - button: { - type: 'button', - label: 'ok', - - onclick: async function() { - var data = await satus.aes.decrypt(satus.storage.get('data'), document.querySelector('#password').value); - - if (data) { - satus.storage.data.data = data; - - password = document.querySelector('#password').value; - - satus.render(Menu); - - document.querySelector('.satus-dialog').close(); - } else { - document.querySelector('#password').classList.add('error'); - - document.querySelector('#password').focus(); - } - } - } - } - }); - } else { - satus.render(Menu); - } - } - }); - }); -}); diff --git a/src/js/main.js b/src/js/main.js deleted file mode 100644 index 99b74c0..0000000 --- a/src/js/main.js +++ /dev/null @@ -1,11 +0,0 @@ -/*--------------------------------------------------------------- ->>> MAIN ----------------------------------------------------------------*/ - -Menu.main = { - type: 'main', - appearanceKey: 'home', - on: { - change: update - } -}; diff --git a/ui/fonts/LICENSE.txt b/ui/fonts/LICENSE.txt new file mode 100644 index 0000000..75b5248 --- /dev/null +++ b/ui/fonts/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/ui/fonts/Roboto-Black.ttf b/ui/fonts/Roboto-Black.ttf new file mode 100644 index 0000000..43a00e0 Binary files /dev/null and b/ui/fonts/Roboto-Black.ttf differ diff --git a/ui/fonts/Roboto-BlackItalic.ttf b/ui/fonts/Roboto-BlackItalic.ttf new file mode 100644 index 0000000..5082cdc Binary files /dev/null and b/ui/fonts/Roboto-BlackItalic.ttf differ diff --git a/ui/fonts/Roboto-Bold.ttf b/ui/fonts/Roboto-Bold.ttf new file mode 100644 index 0000000..3742457 Binary files /dev/null and b/ui/fonts/Roboto-Bold.ttf differ diff --git a/ui/fonts/Roboto-BoldItalic.ttf b/ui/fonts/Roboto-BoldItalic.ttf new file mode 100644 index 0000000..e85e7fb Binary files /dev/null and b/ui/fonts/Roboto-BoldItalic.ttf differ diff --git a/ui/fonts/Roboto-Italic.ttf b/ui/fonts/Roboto-Italic.ttf new file mode 100644 index 0000000..c9df607 Binary files /dev/null and b/ui/fonts/Roboto-Italic.ttf differ diff --git a/ui/fonts/Roboto-Light.ttf b/ui/fonts/Roboto-Light.ttf new file mode 100644 index 0000000..0e97751 Binary files /dev/null and b/ui/fonts/Roboto-Light.ttf differ diff --git a/ui/fonts/Roboto-LightItalic.ttf b/ui/fonts/Roboto-LightItalic.ttf new file mode 100644 index 0000000..3ad14fa Binary files /dev/null and b/ui/fonts/Roboto-LightItalic.ttf differ diff --git a/ui/fonts/Roboto-Medium.ttf b/ui/fonts/Roboto-Medium.ttf new file mode 100644 index 0000000..e89b0b7 Binary files /dev/null and b/ui/fonts/Roboto-Medium.ttf differ diff --git a/ui/fonts/Roboto-MediumItalic.ttf b/ui/fonts/Roboto-MediumItalic.ttf new file mode 100644 index 0000000..a5a41d3 Binary files /dev/null and b/ui/fonts/Roboto-MediumItalic.ttf differ diff --git a/ui/fonts/Roboto-Regular.ttf b/ui/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..3d6861b Binary files /dev/null and b/ui/fonts/Roboto-Regular.ttf differ diff --git a/ui/fonts/Roboto-Thin.ttf b/ui/fonts/Roboto-Thin.ttf new file mode 100644 index 0000000..7d084ae Binary files /dev/null and b/ui/fonts/Roboto-Thin.ttf differ diff --git a/ui/fonts/Roboto-ThinItalic.ttf b/ui/fonts/Roboto-ThinItalic.ttf new file mode 100644 index 0000000..c173389 Binary files /dev/null and b/ui/fonts/Roboto-ThinItalic.ttf differ diff --git a/ui/options.html b/ui/options.html new file mode 100644 index 0000000..19afeee --- /dev/null +++ b/ui/options.html @@ -0,0 +1,42 @@ + + + + + + ToDo + + + + + + + + + + \ No newline at end of file diff --git a/ui/popup.html b/ui/popup.html new file mode 100644 index 0000000..009a882 --- /dev/null +++ b/ui/popup.html @@ -0,0 +1,41 @@ + + + + + + ToDo + + + + + + + + + + \ No newline at end of file diff --git a/ui/satus/satus.css b/ui/satus/satus.css new file mode 100644 index 0000000..fc4fc67 --- /dev/null +++ b/ui/satus/satus.css @@ -0,0 +1 @@ +body{--satus-primary:#f6b465;--satus-switch-background:rgba(0,0,0,.08);--satus-header-background:#fff;--satus-header-text:#848471;--satus-layers-background:#f6f6f4;--satus-layers-text:#848471;--satus-section-card-background:#fff;--satus-modal-background:#f6f6f4;--satus-modal-text:#848471;--satus-hover:rgba(0, 0, 0, .04);--satus-text-field--background:#e8e8e3;--satus-text-field--border:#d6d6cd;--satus-text-field--text:#848471;--satus-switch-track:#b8b8b8;--satus-switch-track--active:var(--satus-primary);--satus-switch-thumb:#fff;--satus-tabs:#fff;--satus-tooltip:rgba(0,0,0,.4);--satus-sortable-ghost:rgba(0, 0, 0, .80);--satus-sortable-background:#f9cf9f;--satus-sortable-text:#fff;--satus-divider:#e0e0e0;--satus-tabs-background:#e8e8e3;--satus-tabs-foreground:#fff;--satus-context-menu--border:#ccc;--satus-checkbox--background:rgb(90, 90, 73, .08);--satus-checkbox--border:rgb(90, 90, 73, .16);--satus-checkbox--mark:#fff}body[theme=dark]{--satus-primary:#90a5e0;--satus-switch-background:rgba(0,0,0,.08);--satus-header-background:#232b43;--satus-header-text:#bcc4dc;--satus-layers-background:#0e111b;--satus-layers-text:#bcc4dc;--satus-section-card-background:#1d2335;--satus-modal-background:#252e46;--satus-modal-text:#bcc4dc;--satus-hover:rgba(255, 255, 255, .08);--satus-text-field--background:#20273c;--satus-text-field--border:#2e3957;--satus-text-field--text:#c4c4d4;--satus-switch-track:#101219;--satus-switch-track--active:var(--satus-primary);--satus-switch-thumb:#d7dcea;--satus-tooltip:rgba(255,255,255,.4);--satus-sortable-ghost:rgba(255, 255, 255, .8);--satus-sortable-background:var(--satus-primary);--satus-sortable-text:#fff;--satus-divider:#3e4865;--satus-tabs-background:#1f2433;--satus-tabs-foreground:#344165;--satus-context-menu--border:#2e3957;--satus-checkbox--background:rgb(233, 234, 237, .08);--satus-checkbox--border:rgb(233, 234, 237, .16);--satus-checkbox--mark:#fff}body[theme=black]{--satus-primary:#8f8f8f;--satus-switch-background:rgba(255,255,255,.08);--satus-header-background:#1f1f1f;--satus-header-text:#ccc;--satus-layers-background:#000;--satus-layers-text:#ccc;--satus-section-card-background:#1a1a1a;--satus-modal-background:#212121;--satus-modal-text:#ccc;--satus-hover:rgba(255, 255, 255, .08);--satus-text-field--background:#333333;--satus-text-field--border:#525252;--satus-text-field--text:#ccc;--satus-switch-track:#111;--satus-switch-track--active:var(--satus-primary);--satus-switch-thumb:#ddd;--satus-tooltip:rgba(255,255,255,.4);--satus-sortable-ghost:rgba(255, 255, 255, .8);--satus-sortable-background:var(--satus-primary);--satus-sortable-text:#fff;--satus-divider:#444;--satus-tabs-background:#111;--satus-tabs-foreground:#2e2e2e;--satus-context-menu--border:#525252;--satus-checkbox--background:rgb(235, 235, 235, .08);--satus-checkbox--border:rgb(235, 235, 235, .16);--satus-checkbox--mark:#fff}.satus-color-picker{font-size:inherit;position:relative;display:flex;box-sizing:border-box;margin:0;cursor:pointer;color:inherit;border:none;outline:0;background-color:var(--satus-theme-button);justify-content:space-between;-webkit-tap-highlight-color:transparent;align-items:center;-webkit-appearance:none}.satus-color-picker__value{width:22px;height:22px;border:2px solid rgba(0,0,0,.16);border-radius:50%;background:#fff}.satus-modal--color-picker{position:relative}.satus-modal--color-picker .satus-modal__surface{padding-top:0}.satus-color-picker__palette{position:relative;overflow:hidden;width:100%;height:256px;background-color:red}.satus-color-picker__palette:before{position:absolute;top:0;left:0;width:100%;height:100%;content:'';background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,transparent)}.satus-color-picker__cursor{position:absolute;width:5px;height:5px;transform:translate(-50%,-50%);pointer-events:none;border:1px solid #fff;border-radius:50%;box-shadow:0 0 0 1px #000}.satus-modal--color-picker .satus-modal__surface .satus-section--color{margin:8px 16px 0;align-items:center}.satus-color-picker__color{width:32px;height:32px;margin:0 16px 0 0;border:2px solid rgba(0,0,0,.16);border-radius:50%;background:red}.satus-slider.satus-color-picker__hue{padding:0;flex:1}.satus-color-picker__hue .satus-slider__track{height:16px;border-radius:4px;background-image:linear-gradient(90deg,red,#ff2a00,#f50,#ff7f00,#fa0,#ffd400,#ff0,#d4ff00,#af0,#80ff00,#5f0,#2bff00,#0f0,#00ff2b,#0f5,#00ff80,#0fa,#00ffd5,#0ff,#00d4ff,#0af,#007fff,#05f,#002bff,#00f,#2a00ff,#50f,#7f00ff,#a0f,#d400ff,#f0f,#ff00d4,#f0a,#ff0080,#f05,#ff002b,red)}.satus-color-picker__hue .satus-slider__handle{width:16px;height:16px;background:#fff;box-shadow:0 0 4px rgb(0,0,0,.64)}.satus-color-picker__hue .satus-slider__handle:focus::after,.satus-color-picker__hue .satus-slider__track-fill,.satus-color-picker__hue::before{display:none}.satus-main{color:var(--satus-main-text);background:var(--satus-main-background);overflow-y:auto;box-sizing:border-box}.satus-tabs{display:flex;height:26px!important}.satus-tabs__content{position:relative;overflow:hidden;width:100%;height:100%;border:2px solid var(--satus-tabs-background);border-radius:4px;background:var(--satus-tabs-background)}.satus-tabs__selection{position:absolute;z-index:0;top:0;left:0;height:100%;transition:left .25s;border-radius:4px;background:var(--satus-tabs-foreground)}.satus-tabs__button{font:inherit;position:relative;z-index:1;overflow:hidden;height:100%;padding:0 4px;white-space:nowrap;text-overflow:ellipsis;color:inherit;border:none;background:0 0;flex:1}.satus-tabs__button:hover{cursor:pointer}.satus-menubar,.satus-menubar ul{margin:0;padding:0;list-style:none;background:var(--satus-menubar-background);color:var(--satus-menubar-text)}.satus-menubar li>.satus-button{height:32px;font-size:14px}.satus-menubar>li>ul{display:none;position:absolute}.satus-menubar>li>:focus+ul,.satus-menubar>li>ul:hover{display:block}.satus-button{font:inherit;position:relative;overflow:hidden;height:48px;margin:0;padding:8px;text-align:left;white-space:nowrap;text-overflow:ellipsis;color:var(--satus-button-text,inherit);border:none;background:var(--satus-button-background,transparent);appearance:none}.satus-button:hover{cursor:pointer;background-color:var(--satus-hover)}.satus-list{list-style:none;margin:0}.satus-list__item{display:flex;align-items:center;justify-content:space-between;min-height:48px}.satus-list__item>:last-child{text-align:right}.satus-section{display:flex;box-sizing:border-box;flex-wrap:wrap}.satus-section--align-start{align-items:center;justify-content:flex-start}.satus-section--align-end{align-items:center;justify-content:flex-end}.satus-section--space-between{align-items:center;justify-content:space-between}.satus-section--column{flex-direction:column}.satus-section--card{flex-direction:column;box-sizing:border-box;width:100%;max-width:900px;margin:8px auto;padding:8px 0;color:var(--satus-section-card-text);border:1px solid rgba(0,0,0,.1);border-radius:8px;background:var(--satus-section-card-background)}.satus-section--card>:not(.satus-button){box-sizing:border-box;width:100%;min-height:48px;padding:0 16px;text-align:left}.satus-section--card>.satus-radio,.satus-section--card>.satus-select,.satus-section--card>.satus-switch{display:flex;justify-content:space-between;align-items:center}.satus-section--card>.satus-button:hover,.satus-section--card>.satus-radio:hover,.satus-section--card>.satus-select:hover,.satus-section--card>.satus-slider:hover,.satus-section--card>.satus-switch:hover{background-color:var(--satus-hover)}.satus-section--card>.satus-button{padding:0 16px;width:100%}.satus-section--card>.satus-button>svg{width:20px;margin:2px 16px 0 0;color:var(--satus-primary)}::-webkit-scrollbar{width:4px}::-webkit-scrollbar:hover{width:8px}::-webkit-scrollbar-thumb{background:rgba(0,0,0,.3)}.satus-modal{position:absolute;z-index:100;top:0;left:0;display:flex;width:100%;height:100vh;justify-content:center;align-items:center}.satus-modal__scrim{position:absolute;top:0;left:0;width:100%;height:100%;animation:modalFadeIn 150ms linear forwards;opacity:0;background:rgba(0,0,0,.16);backdrop-filter:blur(8px)}.satus-modal__surface{display:flex;overflow-y:auto;flex-direction:column;width:95%;min-width:240px;max-width:560px;max-height:80%;margin:0 16px;padding:12px 16px;transform:scale(.8);animation:modalZoomIn 150ms linear forwards;animation-delay:20ms;opacity:0;color:var(--satus-modal-text);border-radius:6px;background-color:var(--satus-modal-background);box-shadow:inset 0 -1px 1px 1px rgb(0,0,0,.1),0 2px 6px rgb(0,0,0,.15)}.satus-modal__surface .satus-section--actions{display:flex;width:100%;margin:8px 0 0;padding:0;justify-content:flex-end;align-items:center}.satus-modal__surface .satus-section--actions .satus-button{font-weight:500;height:32px;margin-left:8px;padding:0 8px;letter-spacing:.5px;color:var(--satus-primary);border-radius:4px}.satus-modal--closing .satus-modal__scrim{animation:modalFadeOut 70ms linear forwards}.satus-modal--closing .satus-modal__surface{animation:modalZoomOut 70ms linear forwards}.satus-modal--vertical .satus-modal__surface{position:absolute;top:8px;right:8px;left:auto;min-width:200px;max-width:200px;margin:0;padding:8px 0;transform-origin:right top}.satus-modal--vertical .satus-modal__surface>.satus-button,.satus-modal--vertical .satus-modal__surface>.satus-select,.satus-modal--vertical .satus-modal__surface>.satus-switch{display:flex;height:36px;padding:0 16px;align-items:center}.satus-modal--vertical .satus-modal__surface>.satus-tabs{padding:0 12px}.satus-modal--vertical .satus-modal__surface>.satus-span{font-size:13px;font-weight:500;margin:6px 0;padding:0 12px}.satus-modal--vertical .satus-modal__surface>.satus-button:hover,.satus-modal--vertical .satus-modal__surface>.satus-select:hover,.satus-modal--vertical .satus-modal__surface>.satus-switch:hover{background-color:var(--satus-hover)}.satus-modal--vertical .satus-button svg{width:20px;height:18px;margin:0 14px 0 0;opacity:.75;flex:0 0 20px}.satus-modal--vertical .satus-button .satus-span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}@keyframes modalFadeIn{from{opacity:0}to{opacity:1}}@keyframes modalFadeOut{from{opacity:1}to{opacity:0}}@keyframes modalZoomIn{from{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}@keyframes modalZoomOut{from{transform:scale(1);opacity:1}to{transform:scale(.8);opacity:0}}.satus-checkbox{position:relative;font:inherit;display:flex;color:inherit;border:none;background:0 0;appearance:none;align-items:center;justify-content:flex-start}.satus-checkbox:hover{cursor:pointer;background-color:var(--satus-hover)}.satus-checkbox:focus{outline:0}.satus-checkbox__content{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.satus-checkbox::before{display:flex;min-width:16px;width:16px;height:16px;margin:0 12px 0 0;content:'';border:1px solid var(--satus-checkbox--border);border-radius:6px;background:var(--satus-checkbox--background);align-items:center;justify-content:center}.satus-checkbox[data-value=true]::before{background:var(--satus-primary)}.satus-checkbox[data-value=true]::after{position:absolute;top:20px;left:20px;width:8px;height:4px;content:'';transform:rotate(-45deg);border:2px solid var(--satus-checkbox--mark);border-top:none;border-right:none}.satus-switch{font:inherit;display:flex;transition:background-color 75ms;color:inherit;border:none;outline:0;background-color:transparent;justify-content:space-between;align-items:center}.satus-switch:hover{cursor:pointer}.satus-switch__content{display:flex;align-items:center}.satus-switch__content>svg{width:20px;height:18px;margin:0 14px 0 0;opacity:.75}.satus-switch>i{width:38px;height:20px;transition:background-color 150ms;border-radius:20px;background-color:var(--satus-switch-track);flex:0 0 38px}.satus-section--card .satus-switch>i{margin-left:16px}.satus-switch[data-value=true]>i{background-color:var(--satus-switch-track--active)}.satus-switch>i::before{display:block;width:16px;height:16px;margin:2px;content:'';transition:transform 150ms cubic-bezier(.4,0,.2,1);border-radius:50%;background-color:var(--satus-switch-thumb);will-change:transform}.satus-switch[data-value=true]>i::before{transform:translateX(18px)}.satus-slider{box-sizing:border-box;width:100%;padding:8px 16px 0;outline:0}.satus-slider__container{position:relative;height:32px;width:100%}.satus-slider__track{position:absolute;top:50%;left:0;height:2px;width:100%;transform:translateY(-50%)}.satus-slider__track::before{position:absolute;left:0;top:0;width:100%;height:100%;background:var(--satus-primary);opacity:.24;content:''}.satus-slider__handle:focus::after{content:attr(data-value);position:absolute;left:50%;top:-2px;background:var(--satus-primary);color:#fff;display:block;transform:translate(-50%,-100%);padding:1px 4px;border-radius:4px}.satus-slider__track-fill{position:absolute;left:0;top:0;height:100%;background:var(--satus-primary)}.satus-slider__handle{position:absolute;width:10px;height:10px;background:var(--satus-primary);border-radius:50%;transform:translate(-50%,-50%);top:50%;left:0}.satus-slider__handle::before{content:'';background:var(--satus-primary);position:absolute;left:50%;top:50%;width:1px;height:1px;opacity:0;border-radius:50%;transform:translate(-50%,-50%) scale(1);transition:.2s}.satus-slider:focus .satus-slider__handle::before{transform:translate(-50%,-50%) scale(26);opacity:.24}.satus-shortcut{justify-content:space-between}.satus-shortcut__value{text-transform:uppercase;font-size:11px;opacity:.5}.satus-shortcut__actions{display:flex;justify-content:flex-end}.satus-shortcut__actions .satus-button{height:32px;background:rgba(0,0,0,.15);margin:8px 4px 0;border-radius:8px}.satus-shortcut__actions .satus-button:hover{background:rgba(0,0,0,.25)}.satus-shortcut__primary{display:flex;box-sizing:border-box;width:100%;height:68px;padding:16px;background:rgba(0,0,0,.16);align-items:center}.satus-shortcut__key{display:flex;box-sizing:border-box;min-width:32px;height:32px;padding:4px 8px;border-radius:4px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.15),inset 0 -3px 0 rgba(0,0,0,.1);align-items:center;justify-content:center}.satus-shortcut__plus{position:relative;width:12px;height:12px;margin:8px}.satus-shortcut__plus::before{position:absolute;top:0;left:5px;width:2px;height:12px;content:'';background-color:#aaa}.satus-shortcut__plus::after{position:absolute;top:5px;left:0;width:12px;height:2px;content:'';background-color:#aaa}.satus-shortcut__mouse{position:relative;display:flex;width:28px;height:36px;border-radius:50%;border-top-left-radius:12px;border-top-right-radius:12px;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.15),inset 0 -3px 0 rgba(0,0,0,.1)}.satus-shortcut__mouse>div{position:absolute;top:0;left:13px;width:2px;height:11px;border-radius:2px;background:#ccc}.satus-shortcut__mouse::before{position:absolute;top:-4px;left:21px;width:2px;height:18px;content:'';background:#f96754}.satus-shortcut__mouse.false::after{position:absolute;top:-12px;left:17px;width:0;height:0;content:'';border-right:5px solid transparent;border-bottom:8px solid #f96754;border-left:5px solid transparent}.satus-shortcut__mouse.true::after{position:absolute;top:14px;left:17px;width:0;height:0;content:'';border-top:8px solid #f96754;border-right:5px solid transparent;border-left:5px solid transparent}.satus-section_shortcut{width:100%;margin:8px 0 0;justify-content:flex-end}.satus-button_shortcut{font-weight:500;overflow:hidden;height:28px;min-height:28px;margin-right:2px;padding:4px 8px;text-transform:uppercase;color:#f96754;border-radius:4px}.satus-base{display:flex;flex-direction:column;width:100%;height:100%}.satus-text-field{position:relative;padding:0 16px;background-color:var(--satus-text-field--background);border-radius:8px;color:var(--satus-text-field--text);overflow:hidden;display:flex}.satus-text-field__pre{display:flex;position:relative;height:100%;margin:0;padding:0;overflow:hidden;align-items:center;flex:1}.satus-text-field__input{font:inherit;position:absolute;top:0;left:0;width:100%;min-width:0;max-width:none;height:100%;min-height:0;max-height:none;margin:0;padding:0;opacity:0;border:none;appearance:none;z-index:9}.satus-text-field__hidden-text{position:absolute;pointer-events:none;opacity:0}.satus-text-field__text{position:absolute;top:0;left:0;display:flex;height:100%;margin:0;align-items:center}.satus-text-field__cursor{position:absolute;top:6px;left:0;display:none;width:2px;height:25px;animation:blink 1s step-end 8;background:#fa0}.satus-text-field__selection{position:absolute;top:5px;left:0;display:none;width:0;height:25px;border:1px solid rgba(255,255,255,.2);border-radius:3px;background:rgba(255,255,255,.1)}.satus-text-field__input:focus+*+*+*+.satus-text-field__cursor,.satus-text-field__selection:not([disabled]){display:block}@keyframes blink{from,to{opacity:1}50%{opacity:0}}.satus-text-field__text>.group{color:#47ff47;background-color:rgb(71,255,71,.16)}.satus-text-field__text>.character-class{color:#ffc247;background-color:rgb(255,170,0,.16)}.satus-text-field__text>.quantifier{color:#47c2ff;background-color:rgb(71,194,255,.16)}.satus-text-field__text>.anchor{color:#47c2ff;background-color:rgb(71,194,255,.16)}.satus-text-field__text>.metasequence{color:#47ff47;background-color:rgb(71,255,71,.16)}.satus-text-field__text>.text{color:#c4c4d4;background-color:rgb(196,196,212,.16)}.satus-header{z-index:1;display:flex;box-sizing:border-box;height:56px;padding:0 12px;color:var(--satus-header-text);background:var(--satus-header-background);box-shadow:0 1px 2px rgb(47,41,34,.16);align-items:center;justify-content:space-between}.satus-header .satus-button{width:40px;min-width:40px;height:40px;padding:8px;color:inherit;border-radius:50%}.satus-header .satus-section--align-start>*{margin-right:8px}.satus-header .satus-span--title{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1}.satus-alert{display:flex;box-sizing:border-box;min-height:48px;margin:8px;padding:8px 16px;border-radius:8px;align-items:center}.satus-alert--error{color:#c55959;border:1px solid #641616;background:#430f0f}.satus-layers{position:relative;overflow:hidden;color:var(--satus-layers-text);background:var(--satus-layers-background);flex:1}.satus-layer{position:absolute;top:0;left:0;display:flex;overflow-y:auto;box-sizing:border-box;width:100%;height:100%;padding:0 12px;flex-wrap:wrap;align-content:flex-start}.satus-divider{height:1px;margin:16px 0 12px;background:var(--satus-divider)}.satus-input[type=password],.satus-input[type=text]{font:inherit;box-sizing:border-box;width:100%;margin:0;padding:0;padding:0 8px;color:var(--satus-text-field--text,inherit);border:none;outline:0;background:0 0;appearance:none;font-size:16px;margin:8px 0;padding:4px 8px;border:1px solid var(--satus-text-field--border);border-radius:4px;background-color:var(--satus-text-field--background)}.satus-aside{color:var(--satus-aside-text);background:var(--satus-aside-background);box-sizing:border-box}.satus-select{position:relative;display:flex;box-sizing:border-box;align-items:center;justify-content:space-between}.satus-select__content{display:flex;align-items:center}.satus-select__content>svg{width:20px;height:18px;margin:0 14px 0 0;opacity:.75}.satus-select__value{margin-left:16px;text-align:right;opacity:.75}.satus-select select{font:inherit;position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;padding:inherit;cursor:pointer;opacity:0;color:inherit;border:none;outline:0;background:0 0;appearance:none}.satus-select:hover{cursor:pointer;background-color:var(--satus-hover)}.satus-modal--contextmenu .satus-modal__scrim{background:0 0;backdrop-filter:none;animation:none;visibility:visible;opacity:1;transform:none}.satus-modal--contextmenu .satus-modal__surface{position:absolute;margin:0;box-sizing:border-box;min-width:200px;max-width:200px;padding:4px 0;border-radius:4px;border:1px solid var(--satus-context-menu--border);box-shadow:none;animation:none;visibility:visible;opacity:1;transform:none}.satus-modal--contextmenu .satus-modal__surface>*{display:flex;height:32px;padding:0 16px;align-items:center}.satus-modal--contextmenu .satus-modal__surface .satus-button svg{width:20px;height:18px;margin:0 14px 0 0;opacity:.75;fill:none;stroke:var(--satus-primary);flex:0 0 20px}.satus-modal--contextmenu .satus-modal__surface .satus-button .satus-span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.satus-pluviam{position:absolute;transform:scale(0);animation-name:pluviam;animation-duration:1s;opacity:var(--satus-pluviam-opacity,.08);border-radius:50%;background:var(--satus-pluviam-background,#000);animation-fill-mode:forwards}@keyframes pluviam{0%{transform:scale(0);opacity:var(--satus-pluviam-opacity,.08)}70%{transform:scale(.8);opacity:var(--satus-pluviam-opacity,.08)}100%{transform:scale(1);opacity:0}}.satus-sortable__chosen{color:var(--satus-sortable-text)!important;background-color:var(--satus-sortable-background)!important}.satus-sortable__ghost{position:fixed!important;z-index:999!important;top:0!important;left:0!important;pointer-events:none!important;box-shadow:0 1px 3px rgb(0,0,0,.2),0 4px 8px rgb(0,0,0,.1),inset 0 0 0 1px rgb(0,0,0,.16);will-change:transform!important;opacity:.8!important} \ No newline at end of file diff --git a/ui/satus/satus.js b/ui/satus/satus.js new file mode 100644 index 0000000..fc28a04 --- /dev/null +++ b/ui/satus/satus.js @@ -0,0 +1 @@ +var satus={components:{},events:{},locale:{strings:{}},storage:{attributes:{},data:{}},append:function(e,t){(t||document.body).appendChild(e)},getAnimationDuration:function(e){return 1e3*Number(window.getComputedStyle(e).getPropertyValue("animation-duration").replace(/[^0-9.]/g,""))},attr:function(e,t){if(t)for(var n in t){var a;e.is_svg?e.setAttributeNS(null,n,t[n]):(a=t[n],-1!==["placeholder","title"].indexOf(n)&&(a=satus.locale.get(a)),e.setAttribute(n,a))}},elementIndex:function(e){return Array.prototype.slice.call(e.parentNode.children).indexOf(e)},data:function(e,t){if(t)for(var n in t)e.dataset[n]=t[n]},properties:function(e,t){if(t)for(var n in t)e[n]=t[n]},camelize:function(e){for(var t="",n=0,a=e.length;nparseInt(e,16)),a={name:"AES-GCM",iv:new Uint8Array(n)};try{var s=(new TextDecoder).decode(await crypto.subtle.decrypt(a,await crypto.subtle.importKey("raw",await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(t)),a,!1,["decrypt"]),new Uint8Array(atob(e.slice(24)).match(/[\s\S]/g).map(e=>e.charCodeAt(0)))))}catch(e){return!1}return s},satus.encrypt=async function(e,t){var n=crypto.getRandomValues(new Uint8Array(12)),a={name:"AES-GCM",iv:n};return Array.from(n).map(e=>("00"+e.toString(16)).slice(-2)).join("")+btoa(Array.from(new Uint8Array(await crypto.subtle.encrypt(a,await crypto.subtle.importKey("raw",await crypto.subtle.digest("SHA-256",(new TextEncoder).encode(t)),a,!1,["encrypt"]),(new TextEncoder).encode(e)))).map(e=>String.fromCharCode(e)).join(""))},satus.isArray=function(e){return!!Array.isArray(e)},satus.isNumber=function(e){return"number"==typeof e&&!1===isNaN(e)},satus.indexOf=function(e,t){var n=0;if(satus.isArray(t))n=t.indexOf(e);else for(;e=e.previousElementSibling;)n++;return n},satus.toIndex=function(e,t,n){satus.isArray(n)&&n.splice(e,0,n.splice(satus.indexOf(t,n),1)[0])},satus.clone=function(e){for(var t=e.cloneNode(!0),n=window.getComputedStyle(e.parentNode),a=window.getComputedStyle(e),s="",o=0,r=a.length;o>> SCRIPT +---------------------------------------------------------------- +# Skeleton +# Initialization +--------------------------------------------------------------*/ + +/*-------------------------------------------------------------- +# SKELETON +--------------------------------------------------------------*/ + +var password, + lists = [], + skeleton = { + component: 'base', + + header: { + component: 'header', + + section_1: { + component: 'section', + variant: 'align-start', + + back: { + component: 'button', + attr: { + 'hidden': 'true' + }, + on: { + click: 'layers.back' + }, + + svg: { + component: 'svg', + attr: { + 'viewBox': '0 0 24 24', + 'fill': 'none', + 'stroke-width': '1.5', + 'stroke': 'currentColor' + }, + + path: { + component: 'path', + attr: { + 'd': 'M14 18l-6-6 6-6' + } + } + } + }, + title: { + component: 'span', + variant: 'title' + } + }, + section_2: { + component: 'section', + variant: 'align-end', + + menu: { + component: 'button', + on: { + click: { + component: 'modal', + variant: 'vertical', + + label: { + component: 'span', + text: 'theme' + }, + theme: { + component: 'tabs', + items: [ + 'light', + 'dark', + 'black' + ] + }, + divider: { + component: 'divider' + }, + language: { + component: 'select', + on: { + change: function (name, value) { + var self = this; + + satus.ajax('_locales/' + this.querySelector('select').value + '/messages.json', function (response) { + response = JSON.parse(response); + + for (var key in response) { + satus.locale.strings[key] = response[key].message; + } + + self.base.skeleton.header.section_1.title.rendered.textContent = satus.locale.get('languages'); + + self.base.skeleton.layers.rendered.update(); + }); + } + }, + options: [{ + value: 'en', + text: 'English' + }, { + value: 'ru', + text: 'Русский' + }, { + value: 'de', + text: 'Deutsch' + }], + + svg: { + component: 'svg', + attr: { + 'viewBox': '0 0 24 24', + 'fill': 'currentColor' + }, + + path: { + component: 'path', + attr: { + 'd': 'M12.9 15l-2.6-2.4c1.8-2 3-4.2 3.8-6.6H17V4h-7V2H8v2H1v2h11.2c-.7 2-1.8 3.8-3.2 5.3-1-1-1.7-2.1-2.3-3.3h-2c.7 1.6 1.7 3.2 3 4.6l-5.1 5L4 19l5-5 3.1 3.1.8-2zm5.6-5h-2L12 22h2l1.1-3H20l1.1 3h2l-4.5-12zm-2.6 7l1.6-4.3 1.6 4.3H16z' + } + } + }, + label: { + component: 'span', + text: 'language' + } + }, + encrypted: { + component: 'switch', + storage: false, + on: { + change: function () { + crypt(this.dataset.value === 'true', JSON.stringify(lists), function (mode, data) { + if (mode) { + satus.storage.set('encrypted', true); + } else { + satus.storage.set('encrypted', false); + } + + satus.storage.set('lists', data); + }); + } + }, + + svg: { + component: 'svg', + attr: { + 'viewBox': '0 0 24 24', + 'fill': 'none', + 'stroke': 'currentColor', + 'stroke-linecap': 'round', + 'stroke-linejoin': 'round', + 'stroke-width': '2' + }, + + path: { + component: 'path', + attr: { + 'd': 'M21 2l-2 2m-7.61 7.61a5.5 5.5 0 11-7.778 7.778 5.5 5.5 0 017.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4' + } + } + }, + label: { + component: 'span', + text: 'encryption' + } + }, + export: { + component: 'button', + on: { + click: function () { + if (location.href.indexOf('/options.html?action=export') !== -1) { + exportData(); + } else { + chrome.tabs.create({ + url: 'ui/options.html?action=export' + }); + } + } + }, + + svg: { + component: 'svg', + attr: { + 'viewBox': '0 0 24 24', + 'fill': 'none', + 'stroke': 'currentColor', + 'stroke-linecap': 'round', + 'stroke-linejoin': 'round', + 'stroke-width': '2' + }, + + path: { + component: 'path', + attr: { + 'd': 'M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M17 8l-5-5-5 5M12 3v12' + } + } + }, + label: { + component: 'span', + text: 'export' + } + }, + import: { + component: 'button', + on: { + click: function () { + if (location.href.indexOf('/options.html?action=import') !== -1) { + importData(); + } else { + chrome.tabs.create({ + url: 'ui/options.html?action=import' + }); + } + } + }, + + svg: { + component: 'svg', + attr: { + 'viewBox': '0 0 24 24', + 'fill': 'none', + 'stroke': 'currentColor', + 'stroke-linecap': 'round', + 'stroke-linejoin': 'round', + 'stroke-width': '2' + }, + + path: { + component: 'path', + attr: { + 'd': 'M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M7 10l5 5 5-5M12 15V3' + } + } + }, + label: { + component: 'span', + text: 'import' + } + } + } + }, + + svg: { + component: 'svg', + attr: { + 'viewBox': '0 0 24 24', + 'fill': 'currentColor' + }, + + circle_1: { + component: 'circle', + attr: { + 'cx': '12', + 'cy': '5.25', + 'r': '1' + } + }, + circle_2: { + component: 'circle', + attr: { + 'cx': '12', + 'cy': '12', + 'r': '1' + } + }, + circle_3: { + component: 'circle', + attr: { + 'cx': '12', + 'cy': '18.75', + 'r': '1' + } + } + } + } + } + }, + layers: { + component: 'layers', + on: { + open: function () { + var skeleton = this.path[this.path.length - 1], + parent = skeleton.parent, + section = this.base.skeleton.header.section_1, + is_home = this.path.length <= 1, + title = 'ToDo'; + + if (parent) { + if (parent.label) { + title = parent.label.text; + } else if (parent.text) { + title = parent.text; + } + } + + section.back.rendered.hidden = is_home; + section.title.rendered.innerText = satus.locale.get(title); + + if (this.path.length === 1) { + updateLists(); + } + } + } + }, + create: { + component: 'button', + variant: 'create', + attr: { + 'title': 'create' + }, + on: { + click: { + component: 'modal', + + title: { + component: 'span', + text: function () { + if (skeleton.layers.rendered.path.length > 1) { + return 'newTask'; + } else { + return 'newList'; + } + } + }, + input: { + component: 'input', + type: 'text', + autofocus: true, + storage: false, + on: { + render: function () { + this.focus(); + }, + keydown: function (event) { + if (event.key === 'Enter') { + this.parentNode.parentNode.skeleton.actions.create.rendered.click(); + } + } + } + }, + actions: { + component: 'section', + variant: 'actions', + + create: { + component: 'button', + text: 'create', + on: { + click: function () { + var path = skeleton.layers.rendered.path, + modal = this.skeleton.parent.parent, + name = modal.input.rendered.value; + + if (path.length > 1) { + var layer = path[path.length - 1], + task = { + name: name, + value: false, + time: new Date().getTime() + }; + + layer.tasks.push(task); + + satus.empty(layer.rendered); + + updateTasks(layer.tasks); + } else { + lists.push({ + name: name, + tasks: [] + }); + + updateLists(); + } + + satus.storage.set('lists', lists); + + modal.rendered.close(); + } + } + } + } + } + } + } +}; + +function updateLists() { + var layer = skeleton.layers.rendered.children[0], + section = { + component: 'section', + variant: 'card' + }; + + satus.empty(layer); + + if (lists.length === 0) { + section.span = { + component: 'span', + text: 'noLists', + style: { + 'display': 'flex', + 'alignItems': 'center' + } + }; + } + + for (var i = 0, l = lists.length; i < l; i++) { + var list = lists[i]; + + section['list_' + i] = { + component: 'button', + variant: 'folder', + attr: { + title: list.name + }, + list: list, + sortable: true, + contextMenu: { + rename: { + component: 'button', + text: 'rename', + on: { + click: function () { + var modal = this.parentNode.parentNode; + + satus.render({ + component: 'modal', + parent: modal.skeleton.parent, + + title: { + component: 'span', + text: 'rename' + }, + input: { + component: 'input', + type: 'text', + autofocus: true, + storage: false, + value: modal.skeleton.parent.list.name, + on: { + render: function () { + this.focus(); + this.select(); + }, + keydown: function (event) { + if (event.key === 'Enter') { + this.parentNode.parentNode.skeleton.actions.ok.rendered.click(); + } + } + } + }, + actions: { + component: 'section', + variant: 'actions', + + cancel: { + component: 'button', + text: 'cancel', + on: { + click: function () { + var modal = this.parentNode.parentNode.parentNode; + + modal.close(); + } + } + }, + ok: { + component: 'button', + text: 'ok', + on: { + click: function () { + var modal = this.parentNode.parentNode.parentNode, + item = modal.skeleton.parent; + + item.list.name = modal.skeleton.input.rendered.value; + + satus.storage.set('lists', lists); + + updateLists(); + + modal.close(); + } + } + } + } + }); + + modal.close(); + } + } + }, + remove: { + component: 'button', + text: 'remove', + on: { + click: function () { + var modal = this.parentNode.parentNode, + parent = modal.skeleton.parent; + + satus.remove(parent.list, lists); + + satus.storage.set('lists', lists); + + updateLists(); + + modal.close(); + } + } + } + }, + on: { + click: { + component: 'section', + variant: 'card', + tasks: list.tasks, + on: { + render: function () { + updateTasks(this.skeleton.tasks); + } + } + }, + sort: function () { + var index = satus.indexOf(this); + + satus.toIndex(index, this.skeleton.list, lists); + + satus.storage.set('lists', lists); + } + }, + + svg: { + component: 'svg', + attr: { + 'viewBox': '0 0 24 24', + 'fill': 'var(--satus-primary)' + }, + + path: { + component: 'path', + attr: { + 'd': 'M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z' + } + } + }, + label: { + component: 'span', + text: list.name + } + }; + } + + satus.empty(layer); + satus.render(section, layer); +} + +function updateTasks(tasks) { + var path = skeleton.layers.rendered.path, + section = path[path.length - 1].rendered; + + satus.empty(section); + + if (tasks.length === 0) { + satus.render({ + component: 'span', + text: 'noTasks', + style: { + 'display': 'flex', + 'alignItems': 'center' + } + }, section); + } + + for (var i = 0, l = tasks.length; i < l; i++) { + var task = tasks[i]; + + satus.render({ + component: 'checkbox', + attr: { + title: task.name + }, + text: [task.name], + value: task.value, + storage: false, + tasks: tasks, + task: task, + contextMenu: { + rename: { + component: 'button', + text: 'rename', + on: { + click: function () { + var modal = this.parentNode.parentNode; + + satus.render({ + component: 'modal', + parent: modal.skeleton.parent, + + title: { + component: 'span', + text: 'rename' + }, + input: { + component: 'input', + type: 'text', + autofocus: true, + storage: false, + value: modal.skeleton.parent.task.name, + on: { + render: function () { + this.focus(); + this.select(); + }, + keydown: function (event) { + if (event.key === 'Enter') { + this.parentNode.parentNode.skeleton.actions.ok.rendered.click(); + } + } + } + }, + actions: { + component: 'section', + variant: 'actions', + + cancel: { + component: 'button', + text: 'cancel', + on: { + click: function () { + var modal = this.parentNode.parentNode.parentNode; + + modal.close(); + } + } + }, + ok: { + component: 'button', + text: 'ok', + on: { + click: function () { + var modal = this.parentNode.parentNode.parentNode, + item = modal.skeleton.parent; + + item.task.name = modal.skeleton.input.rendered.value; + + satus.storage.set('lists', lists); + + updateTasks(item.tasks); + + modal.close(); + } + } + } + } + }); + + modal.close(); + } + } + }, + remove: { + component: 'button', + text: 'remove', + on: { + click: function () { + var path = skeleton.layers.rendered.path, + layer = path[path.length - 1], + modal = this.parentNode.parentNode, + parent = modal.skeleton.parent; + + satus.remove(parent.task, parent.tasks); + + satus.storage.set('lists', lists); + + updateTasks(parent.tasks); + + modal.close(); + } + } + } + }, + sortable: true, + on: { + change: function () { + this.skeleton.task.value = this.storageValue; + + satus.storage.set('lists', lists); + }, + sort: function () { + var index = satus.indexOf(this); + + satus.toIndex(index, this.skeleton.task, this.skeleton.tasks); + + satus.storage.set('lists', lists); + } + } + }, section); + } +} + +function crypt(mode, data, callback) { + satus.render({ + component: 'modal', + parent: this.skeleton, + + title: { + component: 'span', + text: mode ? 'encryption' : 'decryption' + }, + input: { + component: 'input', + type: 'password', + on: { + render: function() { + this.focus(); + }, + keydown: async function(event) { + if (event.key === 'Enter') { + this.parentNode.parentNode.skeleton.actions.ok.rendered.click(); + } + } + } + }, + actions: { + component: 'section', + variant: 'actions', + + ok: { + component: 'button', + text: 'ok', + on: { + click: async function() { + var modal = this.skeleton.parent.parent, + input = modal.input.rendered; + + if (input.value.length > 1) { + if (mode) { + data = await satus.encrypt(data, input.value); + password = input.value; + } else { + data = JSON.parse(await satus.decrypt(data, input.value)); + password = input.value; + } + + if (callback) { + callback(mode, data); + } + + modal.rendered.close(); + } else { + input.classList.add('error'); + } + } + } + } + } + }); +} + +function exportData() { + if (location.href.indexOf('action=export') !== -1) { + var blob; + + try { + blob = new Blob([JSON.stringify(satus.storage.data)], { + type: 'application/json;charset=utf-8' + }); + } catch (error) { + return modalError(error); + } + + satus.render({ + component: 'modal', + + label: { + component: 'span', + text: 'areYouSureYouWantToExportTheData' + }, + actions: { + component: 'section', + variant: 'actions', + + ok: { + component: 'button', + text: 'ok', + on: { + click: function () { + try { + chrome.permissions.request({ + permissions: ['downloads'] + }, function (granted) { + if (granted) { + chrome.downloads.download({ + url: URL.createObjectURL(blob), + filename: 'todo.json', + saveAs: true + }, function () { + setTimeout(function () { + close(); + }, 1000); + }); + } + }); + } catch (error) { + return modalError(error); + } + + this.parentNode.parentNode.parentNode.close(); + } + } + }, + cancel: { + component: 'button', + text: 'cancel', + on: { + click: function () { + this.parentNode.parentNode.parentNode.close(); + } + } + } + } + }); + } +} + +function importData() { + if (location.href.indexOf('action=import') !== -1) { + satus.render({ + component: 'modal', + + label: { + component: 'span', + text: 'areYouSureYouWantToImportTheData' + }, + actions: { + component: 'section', + variant: 'actions', + + ok: { + component: 'button', + text: 'ok', + on: { + click: function () { + var input = document.createElement('input'); + + input.type = 'file'; + + input.addEventListener('change', function () { + var file_reader = new FileReader(); + + file_reader.onload = function () { + var data = JSON.parse(this.result); + + for (var key in data) { + satus.storage.set(key, data[key]); + } + + close(); + }; + + file_reader.readAsText(this.files[0]); + }); + + input.click(); + + this.parentNode.parentNode.parentNode.close(); + } + } + }, + cancel: { + component: 'button', + text: 'cancel', + on: { + click: function () { + this.parentNode.parentNode.parentNode.close(); + } + } + } + } + }); + } +} + +async function encr(callback) { + data = await satus.encrypt(JSON.stringify(lists), password); + + satus.storage.set('lists', data); + satus.storage.set('encrypted', true); + satus.storage.set('data', null); + + callback(); +} + +function migrateData(callback) { + var data = satus.storage.get('data'); + + function change(data, callback) { + lists = []; + + try { + if (typeof data === 'string') { + data = JSON.parse(data); + } + + for (var i = 0, l = data.lists.length; i < l; i++) { + var list = data.lists[i]; + + lists.push({ + name: list.name, + tasks: [] + }); + + for (var j = 0, k = list.items.length; j < k; j++) { + var task = list.items[j]; + + lists[i].tasks.push({ + name: task.name, + value: task.value, + date: new Date().getTime() + }); + } + } + + encr(callback); + } catch (error) { + console.log(error); + + callback(); + } + } + + if (data) { + if (satus.storage.get('encrypted')) { + crypt(false, data, function (mode, data) { + change(data, callback); + }); + } else { + change(data, callback); + } + } else { + callback(); + } +} + + +/*-------------------------------------------------------------- +# INITIALIZATION +--------------------------------------------------------------*/ + +satus.storage.attributes = { + theme: true +}; + +satus.storage.import(function (items) { + satus.locale.import(items.language, '../_locales/', function () { + migrateData(function() { + if (lists.length > 0) { + satus.render(skeleton); + } else if (Array.isArray(satus.storage.get('lists'))) { + lists = satus.storage.get('lists'); + + satus.render(skeleton); + } else if (satus.storage.get('encrypted') === true) { + crypt(false, satus.storage.get('lists'), function (mode, data) { + lists = data; + + satus.render(skeleton); + }); + } else { + satus.render(skeleton); + } + + exportData(); + importData(); + }); + }); +}); \ No newline at end of file diff --git a/ui/styles.css b/ui/styles.css new file mode 100644 index 0000000..02cabe5 --- /dev/null +++ b/ui/styles.css @@ -0,0 +1,73 @@ +/*-------------------------------------------------------------- +>>> SCRIPT +---------------------------------------------------------------- +# +--------------------------------------------------------------*/ + +.satus-header .satus-section--align-start { + max-width: calc(100% - 40px); +} + +.satus-button--folder { + display: flex; + align-items: center; +} + +.satus-button.satus-button--folder > svg { + min-width: 20px; + width: 20px; + margin: -2px 16px 0 0; +} + +.satus-button--folder > .satus-span { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + display: block; +} + +/*-------------------------------------------------------------- +# +--------------------------------------------------------------*/ + +.satus-button--create { + position: fixed; + right: 16px; + bottom: 16px; + width: 56px; + height: 56px; + background: linear-gradient(135deg, #f8d266, #f17953); + box-shadow: 0 2px 1px 1px rgb(230, 109, 70, .7), 0 3px 5px rgb(0, 0, 0, .35); + border-radius: 50%; + color: #fff; +} + +body[theme=dark] .satus-button--create { + background: linear-gradient(135deg, var(--satus-primary), rgb(45, 75, 159)); + box-shadow: 0 2px 1px 1px rgb(45, 75, 159, .7), 0 3px 5px rgb(0, 0, 0, .35); +} + +body[theme=black] .satus-button--create { + background: linear-gradient(135deg, var(--satus-primary), rgb(64, 64, 64)); + box-shadow: 0 2px 1px 1px rgb(64, 64, 64, .7), 0 3px 5px rgb(0, 0, 0, .35); +} + +.satus-button--create::before { + content: ''; + position: absolute; + width: 14px; + height: 2px; + background: currentColor; + left: calc(50% - 7px); + top: calc(50% - 1px); +} + +.satus-button--create::after { + content: ''; + position: absolute; + width: 2px; + height: 14px; + background: currentColor; + left: calc(50% - 1px); + top: calc(50% - 7px); +} \ No newline at end of file