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