diff --git a/frontend/resources/locales.json b/frontend/resources/locales.json index 923718feca..73ae0bbb64 100644 --- a/frontend/resources/locales.json +++ b/frontend/resources/locales.json @@ -1,6 +1,6 @@ { "auth.already-have-account" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:127" ], + "used-in" : [ "src/app/main/ui/auth/register.cljs:128" ], "translations" : { "en" : "Already have an account?", "fr" : "Vous avez déjà un compte?", @@ -18,7 +18,7 @@ } }, "auth.create-demo-account" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:136", "src/app/main/ui/auth/login.cljs:160" ], + "used-in" : [ "src/app/main/ui/auth/login.cljs:161", "src/app/main/ui/auth/register.cljs:138" ], "translations" : { "en" : "Create demo account", "fr" : "Vous voulez juste essayer?", @@ -27,7 +27,7 @@ } }, "auth.create-demo-profile" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:133", "src/app/main/ui/auth/login.cljs:157" ], + "used-in" : [ "src/app/main/ui/auth/login.cljs:158", "src/app/main/ui/auth/register.cljs:135" ], "translations" : { "en" : "Just wanna try it?", "fr" : "Vous voulez juste essayer?", @@ -45,7 +45,7 @@ } }, "auth.email" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:101", "src/app/main/ui/auth/recovery_request.cljs:47", "src/app/main/ui/auth/login.cljs:99" ], + "used-in" : [ "src/app/main/ui/auth/login.cljs:99", "src/app/main/ui/auth/register.cljs:101", "src/app/main/ui/auth/recovery_request.cljs:47" ], "translations" : { "en" : "Email", "fr" : "Adresse email", @@ -90,7 +90,7 @@ } }, "auth.login-here" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:130" ], + "used-in" : [ "src/app/main/ui/auth/register.cljs:131" ], "translations" : { "en" : "Login here", "fr" : "Se connecter ici", @@ -196,7 +196,7 @@ } }, "auth.password" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:106", "src/app/main/ui/auth/login.cljs:106" ], + "used-in" : [ "src/app/main/ui/auth/login.cljs:106", "src/app/main/ui/auth/register.cljs:106" ], "translations" : { "en" : "Password", "fr" : "Mot de passe", @@ -259,7 +259,7 @@ } }, "auth.register-submit" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:110", "src/app/main/ui/auth/login.cljs:134" ], + "used-in" : [ "src/app/main/ui/auth/login.cljs:134", "src/app/main/ui/auth/register.cljs:110" ], "translations" : { "en" : "Create an account", "fr" : "Créer un compte", @@ -295,7 +295,7 @@ } }, "dashboard.add-shared" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:225", "src/app/main/ui/dashboard/grid.cljs:182" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:228", "src/app/main/ui/dashboard/grid.cljs:182" ], "translations" : { "en" : "Add as Shared Library", "fr" : "", @@ -313,21 +313,21 @@ } }, "dashboard.create-new-team" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:157" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:171" ], "translations" : { "en" : "+ Create new team", "es" : "+ Crear nuevo equipo" } }, "dashboard.default-team-name" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:327" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:341" ], "translations" : { "en" : "Your Penpot", "es" : "Tu Penpot" } }, "dashboard.delete-team" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:311" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:325" ], "translations" : { "en" : "Delete team", "es" : "Eliminar equipo" @@ -343,7 +343,7 @@ } }, "dashboard.empty-files" : { - "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:189" ], + "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:188" ], "translations" : { "en" : "You still have no files here", "fr" : "Vous n'avez encore aucun fichier ici", @@ -351,13 +351,6 @@ "es" : "Todavía no hay ningún archivo aquí" } }, - "dashboard.loading-files" : { - "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:189" ], - "translations" : { - "en" : "loading your files ...", - "es" : "cargando tus ficheros ..." - } - }, "dashboard.invite-profile" : { "used-in" : [ "src/app/main/ui/dashboard/team.cljs:72" ], "translations" : { @@ -366,7 +359,7 @@ } }, "dashboard.leave-team" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:304", "src/app/main/ui/dashboard/sidebar.cljs:307" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:318", "src/app/main/ui/dashboard/sidebar.cljs:321" ], "translations" : { "en" : "Leave team", "es" : "Abandonar equipo" @@ -462,8 +455,15 @@ }, "unused" : true }, + "dashboard.loading-files" : { + "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:194" ], + "translations" : { + "en" : "loading your files ...", + "es" : "cargando tus ficheros ..." + } + }, "dashboard.new-file" : { - "used-in" : [ "src/app/main/ui/dashboard/projects.cljs:107", "src/app/main/ui/dashboard/files.cljs:87" ], + "used-in" : [ "src/app/main/ui/dashboard/projects.cljs:108", "src/app/main/ui/dashboard/files.cljs:87" ], "translations" : { "en" : "+ New File", "fr" : "+ Nouveau fichier", @@ -490,7 +490,7 @@ } }, "dashboard.no-projects-placeholder" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:422" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:436" ], "translations" : { "en" : "Pinned projects will appear here", "es" : "Los proyectos fijados aparecerán aquí" @@ -524,7 +524,7 @@ } }, "dashboard.num-of-members" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:301" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:305" ], "translations" : { "en" : "%s members", "es" : "%s integrantes" @@ -549,7 +549,7 @@ } }, "dashboard.promote-to-owner" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:198" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:202" ], "translations" : { "en" : "Promote to owner", "es" : "Promover a dueño" @@ -565,7 +565,7 @@ } }, "dashboard.remove-shared" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:223", "src/app/main/ui/dashboard/grid.cljs:181" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:226", "src/app/main/ui/dashboard/grid.cljs:181" ], "translations" : { "en" : "Remove as Shared Library", "fr" : "", @@ -574,7 +574,7 @@ } }, "dashboard.search-placeholder" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:113" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:120" ], "translations" : { "en" : "Search...", "fr" : "Rechercher...", @@ -610,7 +610,7 @@ } }, "dashboard.show-all-files" : { - "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:252" ], + "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:262" ], "translations" : { "en" : "Show all files", "es" : "Ver todos los ficheros" @@ -626,28 +626,28 @@ "unused" : true }, "dashboard.switch-team" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:142" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:156" ], "translations" : { "en" : "Switch team", "es" : "Cambiar equipo" } }, "dashboard.team-info" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:284" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:288" ], "translations" : { "en" : "Team info", "es" : "Información del equipo" } }, "dashboard.team-members" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:295" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:299" ], "translations" : { "en" : "Team members", "es" : "Integrantes del equipo" } }, "dashboard.team-projects" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:304" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:308" ], "translations" : { "en" : "Team projects", "es" : "Proyectos del equipo" @@ -681,7 +681,7 @@ } }, "dashboard.update-settings" : { - "used-in" : [ "src/app/main/ui/settings/profile.cljs:82", "src/app/main/ui/settings/password.cljs:96", "src/app/main/ui/settings/options.cljs:72" ], + "used-in" : [ "src/app/main/ui/settings/options.cljs:72", "src/app/main/ui/settings/profile.cljs:82", "src/app/main/ui/settings/password.cljs:96" ], "translations" : { "en" : "Update settings", "fr" : "Mettre à jour les paramètres", @@ -715,7 +715,7 @@ } }, "dashboard.your-penpot" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:146" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:160" ], "translations" : { "en" : "Your Penpot", "es" : "Tu Penpot" @@ -803,16 +803,16 @@ } }, "errors.clipboard-not-implemented" : { - "used-in" : [ "src/app/main/data/workspace.cljs:1375" ], + "used-in" : [ "src/app/main/data/workspace.cljs:1394" ], "translations" : { - "en" : "Your browser cannot do this operation, please use Ctrl-V", + "en" : "Your browser cannot do this operation", "fr" : "", "ru" : "", - "es" : "Tu navegador no puede realizar esta operación, por favor usa Ctrl-V." + "es" : "Tu navegador no puede realizar esta operación" } }, "errors.email-already-exists" : { - "used-in" : [ "src/app/main/ui/auth/verify_token.cljs:80", "src/app/main/ui/settings/change_email.cljs:47" ], + "used-in" : [ "src/app/main/ui/settings/change_email.cljs:47", "src/app/main/ui/auth/verify_token.cljs:80" ], "translations" : { "en" : "Email already used", "fr" : "Adresse e-mail déjà utilisée", @@ -839,7 +839,7 @@ } }, "errors.generic" : { - "used-in" : [ "src/app/main/ui/auth/verify_token.cljs:89", "src/app/main/ui/settings/profile.cljs:42", "src/app/main/ui/settings/options.cljs:32" ], + "used-in" : [ "src/app/main/ui/settings/options.cljs:32", "src/app/main/ui/settings/profile.cljs:42", "src/app/main/ui/auth/verify_token.cljs:89" ], "translations" : { "en" : "Something wrong has happened.", "fr" : "Quelque chose c'est mal passé.", @@ -866,7 +866,7 @@ } }, "errors.media-type-mismatch" : { - "used-in" : [ "src/app/main/data/workspace/persistence.cljs:381", "src/app/main/data/media.cljs:78" ], + "used-in" : [ "src/app/main/data/media.cljs:78", "src/app/main/data/workspace/persistence.cljs:426" ], "translations" : { "en" : "Seems that the contents of the image does not match the file extension.", "fr" : "", @@ -875,7 +875,7 @@ } }, "errors.media-type-not-allowed" : { - "used-in" : [ "src/app/main/data/workspace/persistence.cljs:378", "src/app/main/data/media.cljs:75" ], + "used-in" : [ "src/app/main/data/media.cljs:75", "src/app/main/data/workspace/persistence.cljs:423" ], "translations" : { "en" : "Seems that this is not a valid image.", "fr" : "", @@ -920,7 +920,7 @@ } }, "errors.unexpected-error" : { - "used-in" : [ "src/app/main/data/media.cljs:81", "src/app/main/ui/workspace/sidebar/options/exports.cljs:66", "src/app/main/ui/auth/register.cljs:45", "src/app/main/ui/handoff/exports.cljs:41" ], + "used-in" : [ "src/app/main/data/media.cljs:81", "src/app/main/ui/auth/register.cljs:45", "src/app/main/ui/workspace/sidebar/options/exports.cljs:75", "src/app/main/ui/handoff/exports.cljs:41" ], "translations" : { "en" : "An unexpected error occurred.", "fr" : "Une erreur inattendue c'est produite", @@ -996,21 +996,21 @@ } }, "handoff.attributes.image.download" : { - "used-in" : [ "src/app/main/ui/handoff/attributes/image.cljs:61" ], + "used-in" : [ "src/app/main/ui/handoff/attributes/image.cljs:50" ], "translations" : { "en" : "Dowload source image", "es" : "Descargar imagen original" } }, "handoff.attributes.image.height" : { - "used-in" : [ "src/app/main/ui/handoff/attributes/image.cljs:49" ], + "used-in" : [ "src/app/main/ui/handoff/attributes/image.cljs:38" ], "translations" : { "en" : "Height", "es" : "Altura" } }, "handoff.attributes.image.width" : { - "used-in" : [ "src/app/main/ui/handoff/attributes/image.cljs:44" ], + "used-in" : [ "src/app/main/ui/handoff/attributes/image.cljs:33" ], "translations" : { "en" : "Width", "es" : "Ancho" @@ -1383,7 +1383,7 @@ "unused" : true }, "labels.admin" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:85", "src/app/main/ui/dashboard/team.cljs:176", "src/app/main/ui/dashboard/team.cljs:192" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:85", "src/app/main/ui/dashboard/team.cljs:178", "src/app/main/ui/dashboard/team.cljs:194" ], "translations" : { "en" : "Admin", "es" : "Administración" @@ -1411,7 +1411,7 @@ } }, "labels.cancel" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:201" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:215" ], "translations" : { "en" : "Cancel", "fr" : "Annuler", @@ -1443,7 +1443,7 @@ } }, "labels.delete" : { - "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:179", "src/app/main/ui/dashboard/files.cljs:85" ], + "used-in" : [ "src/app/main/ui/dashboard/files.cljs:85", "src/app/main/ui/dashboard/grid.cljs:179" ], "translations" : { "en" : "Delete", "fr" : "Supprimer", @@ -1466,7 +1466,7 @@ } }, "labels.drafts" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:402" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:416" ], "translations" : { "en" : "Drafts", "fr" : "Brouillons", @@ -1482,14 +1482,14 @@ } }, "labels.editor" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:86", "src/app/main/ui/dashboard/team.cljs:179", "src/app/main/ui/dashboard/team.cljs:193" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:86", "src/app/main/ui/dashboard/team.cljs:181", "src/app/main/ui/dashboard/team.cljs:195" ], "translations" : { "en" : "Editor", "es" : "Editor" } }, "labels.email" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:114", "src/app/main/ui/dashboard/team.cljs:217" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:116", "src/app/main/ui/dashboard/team.cljs:221" ], "translations" : { "en" : "Email", "fr" : "Adresse email", @@ -1498,7 +1498,7 @@ } }, "labels.feedback" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:228", "src/app/main/ui/dashboard/sidebar.cljs:457" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:231", "src/app/main/ui/dashboard/sidebar.cljs:471" ], "translations" : { "en" : "Give feedback", "fr" : "Donnez votre avis", @@ -1507,7 +1507,7 @@ } }, "labels.hide-resolved-comments" : { - "used-in" : [ "src/app/main/ui/workspace/comments.cljs:129", "src/app/main/ui/viewer/header.cljs:175" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:176", "src/app/main/ui/workspace/comments.cljs:129" ], "translations" : { "en" : "Hide resolved comments", "es" : "Ocultar comentarios resueltos" @@ -1537,7 +1537,7 @@ } }, "labels.logout" : { - "used-in" : [ "src/app/main/ui/settings.cljs:31", "src/app/main/ui/dashboard/sidebar.cljs:454" ], + "used-in" : [ "src/app/main/ui/settings.cljs:31", "src/app/main/ui/dashboard/sidebar.cljs:468" ], "translations" : { "en" : "Logout", "fr" : "Quitter", @@ -1546,14 +1546,14 @@ } }, "labels.members" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:60", "src/app/main/ui/dashboard/team.cljs:66", "src/app/main/ui/dashboard/sidebar.cljs:297" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:311", "src/app/main/ui/dashboard/team.cljs:60", "src/app/main/ui/dashboard/team.cljs:66" ], "translations" : { "en" : "Members", "es" : "Integrantes" } }, "labels.name" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:216" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:220" ], "translations" : { "en" : "Name", "fr" : "Nom", @@ -1599,14 +1599,14 @@ } }, "labels.num-of-files" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:310" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:314" ], "translations" : { "en" : [ "1 file", "%s files" ], "es" : [ "1 archivo", "%s archivos" ] } }, "labels.num-of-projects" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:307" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:311" ], "translations" : { "en" : [ "1 project", "%s projects" ], "es" : [ "1 proyecto", "%s proyectos" ] @@ -1629,14 +1629,14 @@ } }, "labels.owner" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:173", "src/app/main/ui/dashboard/team.cljs:298" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:175", "src/app/main/ui/dashboard/team.cljs:302" ], "translations" : { "en" : "Owner", "es" : "Dueño" } }, "labels.password" : { - "used-in" : [ "src/app/main/ui/settings/sidebar.cljs:75", "src/app/main/ui/dashboard/sidebar.cljs:451" ], + "used-in" : [ "src/app/main/ui/settings/sidebar.cljs:75", "src/app/main/ui/dashboard/sidebar.cljs:465" ], "translations" : { "en" : "Password", "fr" : "Mot de passe", @@ -1645,14 +1645,14 @@ } }, "labels.permissions" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:218" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:222" ], "translations" : { "en" : "Permissions", "es" : "Permisos" } }, "labels.profile" : { - "used-in" : [ "src/app/main/ui/settings/sidebar.cljs:70", "src/app/main/ui/dashboard/sidebar.cljs:448" ], + "used-in" : [ "src/app/main/ui/settings/sidebar.cljs:70", "src/app/main/ui/dashboard/sidebar.cljs:462" ], "translations" : { "en" : "Profile", "fr" : "Profil", @@ -1661,7 +1661,7 @@ } }, "labels.projects" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:398" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:412" ], "translations" : { "en" : "Projects", "fr" : "Projetes", @@ -1670,7 +1670,7 @@ } }, "labels.remove" : { - "used-in" : [ "src/app/main/ui/workspace/libraries.cljs:92", "src/app/main/ui/dashboard/team.cljs:204" ], + "used-in" : [ "src/app/main/ui/workspace/libraries.cljs:92", "src/app/main/ui/dashboard/team.cljs:208" ], "translations" : { "en" : "Remove", "fr" : "", @@ -1679,7 +1679,7 @@ } }, "labels.rename" : { - "used-in" : [ "src/app/main/ui/dashboard/grid.cljs:178", "src/app/main/ui/dashboard/sidebar.cljs:300", "src/app/main/ui/dashboard/files.cljs:84" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:314", "src/app/main/ui/dashboard/files.cljs:84", "src/app/main/ui/dashboard/grid.cljs:178" ], "translations" : { "en" : "Rename", "es" : "Renombrar" @@ -1714,7 +1714,7 @@ } }, "labels.settings" : { - "used-in" : [ "src/app/main/ui/settings/sidebar.cljs:80", "src/app/main/ui/dashboard/team.cljs:61", "src/app/main/ui/dashboard/team.cljs:68", "src/app/main/ui/dashboard/sidebar.cljs:298" ], + "used-in" : [ "src/app/main/ui/settings/sidebar.cljs:80", "src/app/main/ui/dashboard/sidebar.cljs:312", "src/app/main/ui/dashboard/team.cljs:61", "src/app/main/ui/dashboard/team.cljs:68" ], "translations" : { "en" : "Settings", "fr" : "Settings", @@ -1723,7 +1723,7 @@ } }, "labels.shared-libraries" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:407" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:421" ], "translations" : { "en" : "Shared Libraries", "fr" : "", @@ -1732,14 +1732,14 @@ } }, "labels.show-all-comments" : { - "used-in" : [ "src/app/main/ui/workspace/comments.cljs:117", "src/app/main/ui/viewer/header.cljs:163" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:164", "src/app/main/ui/workspace/comments.cljs:117" ], "translations" : { "en" : "Show all comments", "es" : "Mostrar todos los comentarios" } }, "labels.show-your-comments" : { - "used-in" : [ "src/app/main/ui/workspace/comments.cljs:122", "src/app/main/ui/viewer/header.cljs:168" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:169", "src/app/main/ui/workspace/comments.cljs:122" ], "translations" : { "en" : "Show only yours comments", "es" : "Mostrar sólo tus comentarios" @@ -1764,7 +1764,7 @@ } }, "labels.viewer" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:87", "src/app/main/ui/dashboard/team.cljs:182", "src/app/main/ui/dashboard/team.cljs:194" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:184" ], "translations" : { "en" : "Viewer", "es" : "Visualizador" @@ -1778,7 +1778,7 @@ } }, "media.loading" : { - "used-in" : [ "src/app/main/data/workspace/persistence.cljs:459", "src/app/main/data/workspace/persistence.cljs:514", "src/app/main/data/media.cljs:60" ], + "used-in" : [ "src/app/main/data/media.cljs:60", "src/app/main/data/workspace/persistence.cljs:504", "src/app/main/data/workspace/persistence.cljs:559" ], "translations" : { "en" : "Loading image...", "fr" : "Chargement de l'image...", @@ -1796,7 +1796,7 @@ "unused" : true }, "modals.add-shared-confirm.accept" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:112", "src/app/main/ui/dashboard/grid.cljs:116" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:114", "src/app/main/ui/dashboard/grid.cljs:116" ], "translations" : { "en" : "Add as Shared Library", "fr" : "", @@ -1805,7 +1805,7 @@ } }, "modals.add-shared-confirm.hint" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:110", "src/app/main/ui/dashboard/grid.cljs:114" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:112", "src/app/main/ui/dashboard/grid.cljs:114" ], "translations" : { "en" : "Once added as Shared Library, the assets of this file library will be available to be used among the rest of your files.", "fr" : "", @@ -1814,7 +1814,7 @@ } }, "modals.add-shared-confirm.message" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:109", "src/app/main/ui/dashboard/grid.cljs:113" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:111", "src/app/main/ui/dashboard/grid.cljs:113" ], "translations" : { "en" : "Add “%s” as Shared Library", "fr" : "", @@ -1981,133 +1981,133 @@ } }, "modals.delete-team-confirm.accept" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:287" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:301" ], "translations" : { "en" : "Delete team", "es" : "Eliminar equipo" } }, "modals.delete-team-confirm.message" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:286" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:300" ], "translations" : { "en" : "Are you sure you want to delete this team? All projects and files associated with team will be permanently deleted.", "es" : "¿Seguro que quieres eliminar este equipo? Todos los proyectos y archivos asociados con el equipo serán eliminados permamentemente." } }, "modals.delete-team-confirm.title" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:285" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:299" ], "translations" : { "en" : "Deleting team", "es" : "Eliminando equipo" } }, "modals.delete-team-member-confirm.accept" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:162" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:164" ], "translations" : { "en" : "Delete member", "es" : "Eliminando miembro" } }, "modals.delete-team-member-confirm.message" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:161" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:163" ], "translations" : { "en" : "Are you sure you want to delete this member from the team?", "es" : "¿Seguro que quieres eliminar este integrante del equipo?" } }, "modals.delete-team-member-confirm.title" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:160" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:162" ], "translations" : { "en" : "Delete team member", "es" : "Eliminar integrante del equipo" } }, "modals.invite-member.title" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:110" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:112" ], "translations" : { "en" : "Invite to join the team", "es" : "Invitar a unirse al equipo" } }, "modals.leave-and-reassign.hint1" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:190" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:204" ], "translations" : { "en" : "You are %s owner.", "es" : "Eres %s dueño." } }, "modals.leave-and-reassign.hint2" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:191" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:205" ], "translations" : { "en" : "Select other member to promote before leave", "es" : "Promociona otro miembro a dueño antes de abandonar el equipo" } }, "modals.leave-and-reassign.promote-and-leave" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:208" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:222" ], "translations" : { "en" : "Promote and leave", "es" : "Promocionar y abandonar" } }, "modals.leave-and-reassign.select-memeber-to-promote" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:168" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:182" ], "translations" : { "en" : "Select a member to promote", "es" : "Selecciona un miembro a promocionar" } }, "modals.leave-and-reassign.title" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:185" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:199" ], "translations" : { "en" : "Select a member to promote", "es" : "Selecciona un miembro a promocionar" } }, "modals.leave-confirm.accept" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:262" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:276" ], "translations" : { "en" : "Leave team", "es" : "Abandonar el equipo" } }, "modals.leave-confirm.message" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:261" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:275" ], "translations" : { "en" : "Are you sure you want to leave this team?", "es" : "¿Seguro que quieres abandonar este equipo?" } }, "modals.leave-confirm.title" : { - "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:260" ], + "used-in" : [ "src/app/main/ui/dashboard/sidebar.cljs:274" ], "translations" : { "en" : "Leaving team", "es" : "Abandonando el equipo" } }, "modals.promote-owner-confirm.accept" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:149" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:151" ], "translations" : { "en" : "Promote", "es" : "Promocionar" } }, "modals.promote-owner-confirm.message" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:148" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:150" ], "translations" : { "en" : "Are you sure you want to promote this user to owner?", "es" : "¿Seguro que quieres promocionar este usuario a dueño?" } }, "modals.promote-owner-confirm.title" : { - "used-in" : [ "src/app/main/ui/dashboard/team.cljs:147" ], + "used-in" : [ "src/app/main/ui/dashboard/team.cljs:149" ], "translations" : { "en" : "Promote to owner", "es" : "Promocionar a dueño" } }, "modals.remove-shared-confirm.accept" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:125", "src/app/main/ui/dashboard/grid.cljs:132" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:127", "src/app/main/ui/dashboard/grid.cljs:132" ], "translations" : { "en" : "Remove as Shared Library", "fr" : "", @@ -2116,7 +2116,7 @@ } }, "modals.remove-shared-confirm.hint" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:123", "src/app/main/ui/dashboard/grid.cljs:130" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:125", "src/app/main/ui/dashboard/grid.cljs:130" ], "translations" : { "en" : "Once removed as Shared Library, the File Library of this file will stop being available to be used among the rest of your files.", "fr" : "", @@ -2125,7 +2125,7 @@ } }, "modals.remove-shared-confirm.message" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:122", "src/app/main/ui/dashboard/grid.cljs:129" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:124", "src/app/main/ui/dashboard/grid.cljs:129" ], "translations" : { "en" : "Remove “%s” as Shared Library", "fr" : "", @@ -2133,23 +2133,8 @@ "es" : "Añadir “%s” como Biblioteca Compartida" } }, - "modals.update-remote-component.message" : { - "translations" : { - "en" : "Update a component in a shared library", - "fr" : "", - "ru" : "", - "es" : "Actualizar un componente en librería" - } - }, - "modals.update-remote-component.hint" : { - "translations" : { - "en" : "You are about to update a component in a shared library. This may affect other files that use it.", - "fr" : "", - "ru" : "", - "es" : "Vas a actualizar un componente en una librería compartida. Esto puede afectar a otros archivos que la usen." - } - }, "modals.update-remote-component.accept" : { + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:95", "src/app/main/ui/workspace/sidebar/options/component.cljs:72" ], "translations" : { "en" : "Update component", "fr" : "", @@ -2158,6 +2143,7 @@ } }, "modals.update-remote-component.cancel" : { + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:94", "src/app/main/ui/workspace/sidebar/options/component.cljs:71" ], "translations" : { "en" : "Cancel", "fr" : "", @@ -2165,6 +2151,24 @@ "es" : "Cancelar" } }, + "modals.update-remote-component.hint" : { + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:93", "src/app/main/ui/workspace/sidebar/options/component.cljs:70" ], + "translations" : { + "en" : "You are about to update a component in a shared library. This may affect other files that use it.", + "fr" : "", + "ru" : "", + "es" : "Vas a actualizar un componente en una librería compartida. Esto puede afectar a otros archivos que la usen." + } + }, + "modals.update-remote-component.message" : { + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:92", "src/app/main/ui/workspace/sidebar/options/component.cljs:69" ], + "translations" : { + "en" : "Update a component in a shared library", + "fr" : "", + "ru" : "", + "es" : "Actualizar un componente en librería" + } + }, "notifications.profile-deletion-not-allowed" : { "used-in" : [ "src/app/main/ui/settings/delete_account.cljs:28" ], "translations" : { @@ -2175,7 +2179,7 @@ } }, "notifications.profile-saved" : { - "used-in" : [ "src/app/main/ui/settings/profile.cljs:38", "src/app/main/ui/settings/options.cljs:36" ], + "used-in" : [ "src/app/main/ui/settings/options.cljs:36", "src/app/main/ui/settings/profile.cljs:38" ], "translations" : { "en" : "Profile saved successfully!", "fr" : "Profil enregistré avec succès!", @@ -2184,7 +2188,7 @@ } }, "notifications.validation-email-sent" : { - "used-in" : [ "src/app/main/ui/auth/register.cljs:54", "src/app/main/ui/settings/change_email.cljs:56" ], + "used-in" : [ "src/app/main/ui/settings/change_email.cljs:56", "src/app/main/ui/auth/register.cljs:54" ], "translations" : { "en" : "Verification email sent to %s. Check your email!", "es" : "Verificación de email enviada a %s. Comprueba tu correo." @@ -2200,7 +2204,7 @@ } }, "settings.multiple" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:154", "src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs:161", "src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs:170", "src/app/main/ui/workspace/sidebar/options/typography.cljs:99", "src/app/main/ui/workspace/sidebar/options/typography.cljs:149", "src/app/main/ui/workspace/sidebar/options/typography.cljs:162", "src/app/main/ui/workspace/sidebar/options/shadow.cljs:213", "src/app/main/ui/workspace/sidebar/options/blur.cljs:79" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/shadow.cljs:213", "src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs:161", "src/app/main/ui/workspace/sidebar/options/rows/color_row.cljs:170", "src/app/main/ui/workspace/sidebar/options/typography.cljs:99", "src/app/main/ui/workspace/sidebar/options/typography.cljs:149", "src/app/main/ui/workspace/sidebar/options/typography.cljs:162", "src/app/main/ui/workspace/sidebar/options/blur.cljs:79", "src/app/main/ui/workspace/sidebar/options/stroke.cljs:145" ], "translations" : { "en" : "Mixed", "fr" : null, @@ -2227,7 +2231,7 @@ "unused" : true }, "viewer.empty-state" : { - "used-in" : [ "src/app/main/ui/handoff.cljs:55", "src/app/main/ui/viewer.cljs:191" ], + "used-in" : [ "src/app/main/ui/handoff.cljs:56", "src/app/main/ui/viewer.cljs:192" ], "translations" : { "en" : "No frames found on the page.", "fr" : "Aucun cadre trouvé sur la page.", @@ -2236,7 +2240,7 @@ } }, "viewer.frame-not-found" : { - "used-in" : [ "src/app/main/ui/handoff.cljs:59", "src/app/main/ui/viewer.cljs:195" ], + "used-in" : [ "src/app/main/ui/handoff.cljs:60", "src/app/main/ui/viewer.cljs:196" ], "translations" : { "en" : "Frame not found.", "fr" : "Cadre introuvable.", @@ -2245,7 +2249,7 @@ } }, "viewer.header.dont-show-interactions" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:124" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:125" ], "translations" : { "en" : "Don't show interactions", "fr" : "Ne pas afficher les interactions", @@ -2254,7 +2258,7 @@ } }, "viewer.header.edit-page" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:265" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:266" ], "translations" : { "en" : "Edit page", "fr" : "Editer la page", @@ -2263,7 +2267,7 @@ } }, "viewer.header.fullscreen" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:276" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:277" ], "translations" : { "en" : "Full Screen", "fr" : "Plein écran", @@ -2272,7 +2276,7 @@ } }, "viewer.header.share.copy-link" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:92" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:93" ], "translations" : { "en" : "Copy link", "fr" : "Copier lien", @@ -2281,7 +2285,7 @@ } }, "viewer.header.share.create-link" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:101" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:102" ], "translations" : { "en" : "Create link", "fr" : "Créer lien", @@ -2290,7 +2294,7 @@ } }, "viewer.header.share.placeholder" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:93" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:94" ], "translations" : { "en" : "Share link will appear here", "fr" : "Le lien de partage apparaîtra ici", @@ -2299,7 +2303,7 @@ } }, "viewer.header.share.remove-link" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:99" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:100" ], "translations" : { "en" : "Remove link", "fr" : "Supprimer le lien", @@ -2308,7 +2312,7 @@ } }, "viewer.header.share.subtitle" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:95" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:96" ], "translations" : { "en" : "Anyone with the link will have access", "fr" : "Toute personne disposant du lien aura accès", @@ -2317,7 +2321,7 @@ } }, "viewer.header.share.title" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:78", "src/app/main/ui/viewer/header.cljs:80", "src/app/main/ui/viewer/header.cljs:86" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:79", "src/app/main/ui/viewer/header.cljs:81", "src/app/main/ui/viewer/header.cljs:87" ], "translations" : { "en" : "Share link", "fr" : "Lien de partage", @@ -2326,7 +2330,7 @@ } }, "viewer.header.show-interactions" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:129" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:130" ], "translations" : { "en" : "Show interactions", "fr" : "Afficher les interactions", @@ -2335,7 +2339,7 @@ } }, "viewer.header.show-interactions-on-click" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:134" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:135" ], "translations" : { "en" : "Show interactions on click", "fr" : "Afficher les interactions au clic", @@ -2344,7 +2348,7 @@ } }, "viewer.header.sitemap" : { - "used-in" : [ "src/app/main/ui/viewer/header.cljs:223" ], + "used-in" : [ "src/app/main/ui/viewer/header.cljs:224" ], "translations" : { "en" : "Sitemap", "fr" : "Plan du site", @@ -2632,21 +2636,21 @@ } }, "workspace.gradients.linear" : { - "used-in" : [ "src/app/main/data/workspace/libraries.cljs:72", "src/app/main/ui/components/color_bullet.cljs:31" ], + "used-in" : [ "src/app/main/data/workspace/libraries.cljs:71", "src/app/main/ui/components/color_bullet.cljs:31" ], "translations" : { "en" : "Linear gradient", "es" : "Degradado lineal" } }, "workspace.gradients.radial" : { - "used-in" : [ "src/app/main/data/workspace/libraries.cljs:73", "src/app/main/ui/components/color_bullet.cljs:32" ], + "used-in" : [ "src/app/main/data/workspace/libraries.cljs:72", "src/app/main/ui/components/color_bullet.cljs:32" ], "translations" : { "en" : "Radial gradient", "es" : "Degradado radial" } }, "workspace.header.menu.disable-dynamic-alignment" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:218" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:220" ], "translations" : { "en" : "Disable dynamic alignment", "fr" : "Désactiver l'alignement dynamique", @@ -2655,7 +2659,7 @@ } }, "workspace.header.menu.disable-snap-grid" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:186" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:188" ], "translations" : { "en" : "Disable snap to grid", "fr" : "Désactiver l'alignement sur la grille", @@ -2664,7 +2668,7 @@ } }, "workspace.header.menu.enable-dynamic-alignment" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:219" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:221" ], "translations" : { "en" : "Enable dynamic aligment", "fr" : "Activer l'alignement dynamique", @@ -2673,7 +2677,7 @@ } }, "workspace.header.menu.enable-snap-grid" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:187" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:189" ], "translations" : { "en" : "Snap to grid", "fr" : "Aligner sur la grille", @@ -2682,7 +2686,7 @@ } }, "workspace.header.menu.hide-assets" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:207" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:209" ], "translations" : { "en" : "Hide assets", "fr" : "", @@ -2691,7 +2695,7 @@ } }, "workspace.header.menu.hide-grid" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:179" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:181" ], "translations" : { "en" : "Hide grids", "fr" : "Masquer la grille", @@ -2700,7 +2704,7 @@ } }, "workspace.header.menu.hide-layers" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:193" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:195" ], "translations" : { "en" : "Hide layers", "fr" : "Masquer les couches", @@ -2709,7 +2713,7 @@ } }, "workspace.header.menu.hide-palette" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:200" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:202" ], "translations" : { "en" : "Hide color palette", "fr" : "Masquer la palette de couleurs", @@ -2718,7 +2722,7 @@ } }, "workspace.header.menu.hide-rules" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:172" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:174" ], "translations" : { "en" : "Hide rules", "fr" : "Masquer les règles", @@ -2727,7 +2731,7 @@ } }, "workspace.header.menu.select-all" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:212" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:214" ], "translations" : { "en" : "Select all", "fr" : "", @@ -2736,7 +2740,7 @@ } }, "workspace.header.menu.show-assets" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:208" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:210" ], "translations" : { "en" : "Show assets", "fr" : "", @@ -2745,7 +2749,7 @@ } }, "workspace.header.menu.show-grid" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:180" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:182" ], "translations" : { "en" : "Show grid", "fr" : "Montrer la grille", @@ -2754,7 +2758,7 @@ } }, "workspace.header.menu.show-layers" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:194" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:196" ], "translations" : { "en" : "Show layers", "fr" : "Montrer les couches", @@ -2763,7 +2767,7 @@ } }, "workspace.header.menu.show-palette" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:201" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:203" ], "translations" : { "en" : "Show color palette", "fr" : "Montrer la palette de couleurs", @@ -2772,7 +2776,7 @@ } }, "workspace.header.menu.show-rules" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:173" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:175" ], "translations" : { "en" : "Show rules", "fr" : "Montrer les règles", @@ -2781,40 +2785,40 @@ } }, "workspace.header.save-error" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:56" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:58" ], "translations" : { "en" : "Error on saving", "es" : "Error al guardar" } }, "workspace.header.saved" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:51" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:53" ], "translations" : { "en" : "Saved", "es" : "Guardado" } }, "workspace.header.saving" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:46" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:48" ], "translations" : { "en" : "Saving", "es" : "Guardando" } }, "workspace.header.unsaved" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:41" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:43" ], "translations" : { "en" : "Unsaved changes", "es" : "Cambios sin guardar" } }, "workspace.header.viewer" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:276" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:279" ], "translations" : { - "en" : "View mode (Ctrl + P)", - "fr" : "Mode visualisation (Ctrl + P)", - "ru" : "Режим просмотра (Ctrl + P)", - "es" : "Modo de visualización (Ctrl + P)" + "en" : "View mode (%s)", + "fr" : "Mode visualisation (%s)", + "ru" : "Режим просмотра (%s)", + "es" : "Modo de visualización (%s)" } }, "workspace.libraries.add" : { @@ -3107,7 +3111,7 @@ } }, "workspace.options.component" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/component.cljs:65" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/component.cljs:81" ], "translations" : { "en" : "Component", "es" : "Componente" @@ -3123,7 +3127,7 @@ } }, "workspace.options.export" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/exports.cljs:123", "src/app/main/ui/handoff/exports.cljs:96" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/exports.cljs:132", "src/app/main/ui/handoff/exports.cljs:96" ], "translations" : { "en" : "Export", "ru" : "Экспорт", @@ -3131,15 +3135,22 @@ } }, "workspace.options.export-object" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/exports.cljs:156", "src/app/main/ui/handoff/exports.cljs:131" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/exports.cljs:166", "src/app/main/ui/handoff/exports.cljs:131" ], "translations" : { "en" : "Export shape", "ru" : "Экспорт фигуры", "es" : "Exportar forma" } }, + "workspace.options.export.suffix" : { + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/exports.cljs:149" ], + "translations" : { + "en" : "Suffix", + "es" : "Sufijo" + } + }, "workspace.options.exporting-object" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/exports.cljs:155", "src/app/main/ui/handoff/exports.cljs:130" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/exports.cljs:165", "src/app/main/ui/handoff/exports.cljs:130" ], "translations" : { "en" : "Exporting...", "ru" : "Экспортирую...", @@ -3147,7 +3158,7 @@ } }, "workspace.options.fill" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/fill.cljs:53" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/fill.cljs:41" ], "translations" : { "en" : "Fill", "fr" : "Remplissage", @@ -3345,7 +3356,7 @@ } }, "workspace.options.group-fill" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/fill.cljs:52" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/fill.cljs:40" ], "translations" : { "en" : "Group fill", "fr" : null, @@ -3354,7 +3365,7 @@ } }, "workspace.options.group-stroke" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:63" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:54" ], "translations" : { "en" : "Group stroke", "fr" : null, @@ -3381,7 +3392,7 @@ } }, "workspace.options.position" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/measures.cljs:146", "src/app/main/ui/workspace/sidebar/options/frame.cljs:118" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/frame.cljs:118", "src/app/main/ui/workspace/sidebar/options/measures.cljs:146" ], "translations" : { "en" : "Position", "fr" : "Position", @@ -3435,7 +3446,7 @@ } }, "workspace.options.selection-fill" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/fill.cljs:51" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/fill.cljs:39" ], "translations" : { "en" : "Selection fill", "fr" : null, @@ -3444,7 +3455,7 @@ } }, "workspace.options.selection-stroke" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:62" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:53" ], "translations" : { "en" : "Selection stroke", "fr" : null, @@ -3516,7 +3527,7 @@ } }, "workspace.options.size" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/measures.cljs:118", "src/app/main/ui/workspace/sidebar/options/frame.cljs:93" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/frame.cljs:93", "src/app/main/ui/workspace/sidebar/options/measures.cljs:118" ], "translations" : { "en" : "Size", "fr" : "Taille", @@ -3534,7 +3545,7 @@ } }, "workspace.options.stroke" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:64" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:55" ], "translations" : { "en" : "Stroke", "fr" : "Bordure", @@ -3543,7 +3554,7 @@ } }, "workspace.options.stroke.center" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:161" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:152" ], "translations" : { "en" : "Center", "fr" : "Centre", @@ -3552,7 +3563,7 @@ } }, "workspace.options.stroke.dashed" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:171" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:162" ], "translations" : { "en" : "Dashed", "fr" : "Tiré", @@ -3561,7 +3572,7 @@ } }, "workspace.options.stroke.dotted" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:170" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:161" ], "translations" : { "en" : "Dotted", "fr" : "Pointillé", @@ -3570,7 +3581,7 @@ } }, "workspace.options.stroke.inner" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:162" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:153" ], "translations" : { "en" : "Inside", "fr" : "Intérieur", @@ -3579,7 +3590,7 @@ } }, "workspace.options.stroke.mixed" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:172" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:163" ], "translations" : { "en" : "Mixed", "fr" : "Mixte", @@ -3588,7 +3599,7 @@ } }, "workspace.options.stroke.outer" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:163" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:154" ], "translations" : { "en" : "Outside", "fr" : "Extérieur", @@ -3597,7 +3608,7 @@ } }, "workspace.options.stroke.solid" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:169" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/stroke.cljs:160" ], "translations" : { "en" : "Solid", "fr" : "Solide", @@ -3726,7 +3737,7 @@ } }, "workspace.options.text-options.none" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/text.cljs:153", "src/app/main/ui/workspace/sidebar/options/typography.cljs:176" ], + "used-in" : [ "src/app/main/ui/workspace/sidebar/options/typography.cljs:176", "src/app/main/ui/workspace/sidebar/options/text.cljs:153" ], "translations" : { "en" : "None", "fr" : "Aucune", @@ -3823,166 +3834,173 @@ } }, "workspace.shape.menu.back" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:107" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:124" ], "translations" : { "en" : "Send to back", "es" : "Enviar al fondo" } }, "workspace.shape.menu.backward" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:104" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:121" ], "translations" : { "en" : "Send backward", "es" : "Enviar atrás" } }, "workspace.shape.menu.copy" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:85" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:102" ], "translations" : { "en" : "Copy", "es" : "Copiar" } }, "workspace.shape.menu.create-component" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:151" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:168" ], "translations" : { "en" : "Create component", "es" : "Crear componente" } }, "workspace.shape.menu.cut" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:88" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:105" ], "translations" : { "en" : "Cut", "es" : "Cortar" } }, "workspace.shape.menu.delete" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:181" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:200" ], "translations" : { "en" : "Delete", "es" : "Eliminar" } }, "workspace.shape.menu.detach-instance" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/component.cljs:79", "src/app/main/ui/workspace/sidebar/options/component.cljs:84", "src/app/main/ui/workspace/context_menu.cljs:163", "src/app/main/ui/workspace/context_menu.cljs:173" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:180", "src/app/main/ui/workspace/context_menu.cljs:190", "src/app/main/ui/workspace/sidebar/options/component.cljs:95", "src/app/main/ui/workspace/sidebar/options/component.cljs:100" ], "translations" : { "en" : "Detach instance", "es" : "Desacoplar instancia" } }, "workspace.shape.menu.duplicate" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:94" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:111" ], "translations" : { "en" : "Duplicate", "es" : "Duplicar" } }, "workspace.shape.menu.forward" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:98" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:115" ], "translations" : { "en" : "Bring forward", "es" : "Mover hacia delante" } }, "workspace.shape.menu.front" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:101" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:118" ], "translations" : { "en" : "Bring to front", "es" : "Mover al frente" } }, "workspace.shape.menu.go-master" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/component.cljs:86", "src/app/main/ui/workspace/context_menu.cljs:177" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:194", "src/app/main/ui/workspace/sidebar/options/component.cljs:102" ], "translations" : { "en" : "Go to master component file", "es" : "Ir al archivo del componente maestro" } }, "workspace.shape.menu.group" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:114" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:131" ], "translations" : { "en" : "Group", "es" : "Grupo" } }, "workspace.shape.menu.hide" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:137" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:154" ], "translations" : { "en" : "Hide", "es" : "Ocultar" } }, "workspace.shape.menu.lock" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:143" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:160" ], "translations" : { "en" : "Lock", "es" : "Bloquear" } }, "workspace.shape.menu.mask" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:117" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:134", "src/app/main/ui/workspace/context_menu.cljs:147" ], "translations" : { "en" : "Mask", "es" : "Máscara" } }, "workspace.shape.menu.paste" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:91", "src/app/main/ui/workspace/context_menu.cljs:190" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:108", "src/app/main/ui/workspace/context_menu.cljs:209" ], "translations" : { "en" : "Paste", "es" : "Pegar" } }, "workspace.shape.menu.reset-overrides" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/component.cljs:80", "src/app/main/ui/workspace/sidebar/options/component.cljs:85", "src/app/main/ui/workspace/context_menu.cljs:165", "src/app/main/ui/workspace/context_menu.cljs:175" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:182", "src/app/main/ui/workspace/context_menu.cljs:192", "src/app/main/ui/workspace/sidebar/options/component.cljs:96", "src/app/main/ui/workspace/sidebar/options/component.cljs:101" ], "translations" : { "en" : "Reset overrides", "es" : "Deshacer modificaciones" } }, "workspace.shape.menu.show" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:135" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:152" ], "translations" : { "en" : "Show", "es" : "Mostrar" } }, "workspace.shape.menu.show-master" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/component.cljs:82", "src/app/main/ui/workspace/context_menu.cljs:169" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:186", "src/app/main/ui/workspace/sidebar/options/component.cljs:98" ], "translations" : { "en" : "Show master component", "es" : "Ver componente maestro" } }, "workspace.shape.menu.ungroup" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:123" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:140" ], "translations" : { "en" : "Ungroup", "es" : "Desagrupar" } }, "workspace.shape.menu.unlock" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:141" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:158" ], "translations" : { "en" : "Unlock", "es" : "Desbloquear" } }, "workspace.shape.menu.unmask" : { - "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:127" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:144" ], "translations" : { "en" : "Unmask", "es" : "Quitar máscara" } }, "workspace.shape.menu.update-master" : { - "used-in" : [ "src/app/main/ui/workspace/sidebar/options/component.cljs:81", "src/app/main/ui/workspace/context_menu.cljs:167" ], + "used-in" : [ "src/app/main/ui/workspace/context_menu.cljs:184", "src/app/main/ui/workspace/context_menu.cljs:196", "src/app/main/ui/workspace/sidebar/options/component.cljs:97", "src/app/main/ui/workspace/sidebar/options/component.cljs:103" ], "translations" : { "en" : "Update master component", "es" : "Actualizar componente maestro" } }, + "workspace.sidebar.history" : { + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:122" ], + "translations" : { + "en" : "History (%s)", + "en" : "Historial (%s)" + } + }, "workspace.sidebar.icons" : { "translations" : { "en" : "Icons", @@ -3992,6 +4010,13 @@ }, "unused" : true }, + "workspace.sidebar.layers" : { + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:112" ], + "translations" : { + "en" : "Layers (%s)", + "es" : "Capas (%s)" + } + }, "workspace.sidebar.sitemap" : { "used-in" : [ "src/app/main/ui/workspace/sidebar/sitemap.cljs:207" ], "translations" : { @@ -4002,7 +4027,7 @@ } }, "workspace.sitemap" : { - "used-in" : [ "src/app/main/ui/workspace/header.cljs:147" ], + "used-in" : [ "src/app/main/ui/workspace/header.cljs:149" ], "translations" : { "en" : "Sitemap", "fr" : null, @@ -4011,41 +4036,41 @@ } }, "workspace.toolbar.assets" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:116" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:117" ], "translations" : { - "en" : "Assets (Ctrl + I)", + "en" : "Assets (%s)", "fr" : "", "ru" : "", - "es" : "Recursos (Ctrl + I)" + "es" : "Recursos (%s)" } }, "workspace.toolbar.color-palette" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:126" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:127" ], "translations" : { - "en" : "Color Palette (---)", - "fr" : "Palette de couleurs (---)", - "ru" : "Палитра цветов (---)", - "es" : "Paleta de colores (---)" + "en" : "Color Palette (%s)", + "fr" : "Palette de couleurs (%s)", + "ru" : "Палитра цветов (%s)", + "es" : "Paleta de colores (%s)" } }, "workspace.toolbar.comments" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:104" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:105" ], "translations" : { - "en" : "Comments", - "es" : "Comentarios" + "en" : "Comments (%s)", + "es" : "Comentarios (%s)" } }, "workspace.toolbar.curve" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:93" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:94" ], "translations" : { - "en" : "Curve", - "fr" : "Courbe", - "ru" : "Кривая", - "es" : "Curva" + "en" : "Curve (%s)", + "fr" : "Courbe (%s)", + "ru" : "Кривая (%s)", + "es" : "Curva (%s)" } }, "workspace.toolbar.ellipse" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:80" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:81" ], "translations" : { "en" : "Ellipse (E)", "fr" : "", @@ -4054,7 +4079,7 @@ } }, "workspace.toolbar.frame" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:70" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:71" ], "translations" : { "en" : "Artboard (A)", "fr" : "Plan de travail (A)", @@ -4063,7 +4088,7 @@ } }, "workspace.toolbar.image" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:42" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:43" ], "translations" : { "en" : "Image (K)", "fr" : "Image (K)", @@ -4071,17 +4096,8 @@ "es" : "Imagen (K)" } }, - "workspace.toolbar.libraries" : { - "translations" : { - "en" : "Libraries (Ctrl + Shift + L)", - "fr" : "Librairies (Ctrl + Shift + L)", - "ru" : "Библиотеки (Ctrl + Shift + L)", - "es" : "Bibliotecas (Ctrl + Mays + L)" - }, - "unused" : true - }, "workspace.toolbar.move" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:64" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:65" ], "translations" : { "en" : "Move", "fr" : "Déplacer", @@ -4090,7 +4106,7 @@ } }, "workspace.toolbar.path" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:98" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:99" ], "translations" : { "en" : "Path (P)", "fr" : "Chemin (P)", @@ -4099,7 +4115,7 @@ } }, "workspace.toolbar.rect" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:75" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:76" ], "translations" : { "en" : "Rectangle (R)", "fr" : "", @@ -4108,7 +4124,7 @@ } }, "workspace.toolbar.text" : { - "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:85" ], + "used-in" : [ "src/app/main/ui/workspace/left_toolbar.cljs:86" ], "translations" : { "en" : "Text (T)", "fr" : "Texte (T)", @@ -4376,7 +4392,7 @@ } }, "workspace.updates.dismiss" : { - "used-in" : [ "src/app/main/data/workspace/libraries.cljs:697" ], + "used-in" : [ "src/app/main/data/workspace/libraries.cljs:690" ], "translations" : { "en" : "Dismiss", "fr" : "", @@ -4385,7 +4401,7 @@ } }, "workspace.updates.there-are-updates" : { - "used-in" : [ "src/app/main/data/workspace/libraries.cljs:693" ], + "used-in" : [ "src/app/main/data/workspace/libraries.cljs:686" ], "translations" : { "en" : "There are updates in shared libraries", "fr" : "", @@ -4394,7 +4410,7 @@ } }, "workspace.updates.update" : { - "used-in" : [ "src/app/main/data/workspace/libraries.cljs:695" ], + "used-in" : [ "src/app/main/data/workspace/libraries.cljs:688" ], "translations" : { "en" : "Update", "fr" : "", @@ -4410,12 +4426,5 @@ "es" : "Pulsar para cerrar la ruta" }, "unused" : true - }, - - "workspace.options.export.suffix": { - "translations" : { - "en" : "Suffix", - "es" : "Sufijo" - } - } + } } diff --git a/frontend/src/app/main/data/shortcuts.cljs b/frontend/src/app/main/data/shortcuts.cljs new file mode 100644 index 0000000000..48afb5ae50 --- /dev/null +++ b/frontend/src/app/main/data/shortcuts.cljs @@ -0,0 +1,75 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; This Source Code Form is "Incompatible With Secondary Licenses", as +;; defined by the Mozilla Public License, v. 2.0. +;; +;; Copyright (c) 2020 UXBOX Labs SL + +(ns app.main.data.shortcuts + (:require + [app.main.data.colors :as mdc] + [app.main.data.workspace.transforms :as dwt] + [app.main.store :as st] + [app.util.dom :as dom] + [potok.core :as ptk] + [beicon.core :as rx] + [app.config :as cfg]) + (:refer-clojure :exclude [meta])) + +(def mac-command "\u2318") +(def mac-option "\u2325") +(def mac-delete "\u232B") +(def mac-shift "\u21E7") +(def mac-control "\u2303") +(def mac-esc "\u238B") + +(def left-arrow "\u2190") +(def up-arrow "\u2191") +(def right-arrow "\u2192") +(def down-arrow "\u2193") + +(defn c-mod + "Adds the control/command modifier to a shortcuts depending on the + operating system for the user" + [shortcut] + (if (cfg/check-platform? :macos) + (str "command+" shortcut) + (str "ctrl+" shortcut))) + +(defn bind-shortcuts [shortcuts bind-fn cb-fn] + (doseq [[key {:keys [command disabled fn]}] shortcuts] + (when-not disabled + (if (vector? command) + (doseq [cmd (seq command)] + (bind-fn cmd (cb-fn key fn))) + (bind-fn command (cb-fn key fn)))))) + +(defn meta [key] + (str + (if (cfg/check-platform? :macos) + mac-command + "Ctrl+") + key)) + +(defn shift [key] + (str + (if (cfg/check-platform? :macos) + mac-shift + "Shift+") + key)) + +(defn meta-shift [key] + (-> key meta shift)) + +(defn supr [] + (if (cfg/check-platform? :macos) + mac-delete + "Supr")) + +(defn esc [] + (if (cfg/check-platform? :macos) + mac-esc + "Escape")) + diff --git a/frontend/src/app/main/data/viewer.cljs b/frontend/src/app/main/data/viewer.cljs index 55f7560d9c..5ee01939b9 100644 --- a/frontend/src/app/main/data/viewer.cljs +++ b/frontend/src/app/main/data/viewer.cljs @@ -415,15 +415,3 @@ (update [_ state] (assoc-in state [:viewer-local :hover] (when hover? id))))) -;; --- Shortcuts - -(def shortcuts - {"+" (st/emitf increase-zoom) - "-" (st/emitf decrease-zoom) - "ctrl+a" (st/emitf (select-all)) - "shift+0" (st/emitf zoom-to-50) - "shift+1" (st/emitf reset-zoom) - "shift+2" (st/emitf zoom-to-200) - "left" (st/emitf select-prev-frame) - "right" (st/emitf select-next-frame)}) - diff --git a/frontend/src/app/main/data/viewer/shortcuts.cljs b/frontend/src/app/main/data/viewer/shortcuts.cljs new file mode 100644 index 0000000000..8b120f1f52 --- /dev/null +++ b/frontend/src/app/main/data/viewer/shortcuts.cljs @@ -0,0 +1,57 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; This Source Code Form is "Incompatible With Secondary Licenses", as +;; defined by the Mozilla Public License, v. 2.0. +;; +;; Copyright (c) 2020 UXBOX Labs SL + +(ns app.main.data.viewer.shortcuts + (:require + [app.config :as cfg] + [app.main.data.colors :as mdc] + [app.main.data.shortcuts :as ds] + [app.main.data.shortcuts :refer [c-mod]] + [app.main.data.viewer :as dv] + [app.main.store :as st] + [app.util.dom :as dom] + [beicon.core :as rx] + [potok.core :as ptk])) + +(def shortcuts + {:increase-zoom {:tooltip "+" + :command "+" + :fn (st/emitf dv/increase-zoom)} + + :decrease-zoom {:tooltip "-" + :command "-" + :fn (st/emitf dv/decrease-zoom)} + + :select-all {:tooltip (ds/meta "A") + :command (ds/c-mod "a") + :fn (st/emitf (dv/select-all))} + + :zoom-50 {:tooltip (ds/shift "0") + :command "shift+0" + :fn (st/emitf dv/zoom-to-50)} + + :reset-zoom {:tooltip (ds/shift "1") + :command "shift+1" + :fn (st/emitf dv/reset-zoom)} + + :zoom-200 {:tooltip (ds/shift "2") + :command "shift+2" + :fn (st/emitf dv/zoom-to-200)} + + :next-frame {:tooltip ds/left-arrow + :command "left" + :fn (st/emitf dv/select-prev-frame)} + + :prev-frame {:tooltip ds/right-arrow + :command "right" + :fn (st/emitf dv/select-next-frame)}}) + +(defn get-tooltip [shortcut] + (assert (contains? shortcuts shortcut) (str shortcut)) + (get-in shortcuts [shortcut :tooltip])) diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index a14f770536..295cdc50aa 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -9,14 +9,13 @@ (ns app.main.data.workspace (:require - [goog.string.path :as path] [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.geom.align :as gal] [app.common.geom.matrix :as gmt] [app.common.geom.point :as gpt] - [app.common.geom.shapes :as gsh] [app.common.geom.proportions :as gpr] - [app.common.geom.align :as gal] + [app.common.geom.shapes :as gsh] [app.common.math :as mth] [app.common.pages :as cp] [app.common.pages.helpers :as cph] @@ -27,33 +26,33 @@ [app.main.data.colors :as mdc] [app.main.data.messages :as dm] [app.main.data.workspace.common :as dwc] + [app.main.data.workspace.drawing :as dwd] + [app.main.data.workspace.drawing.path :as dwdp] + [app.main.data.workspace.groups :as dwg] [app.main.data.workspace.libraries :as dwl] [app.main.data.workspace.notifications :as dwn] [app.main.data.workspace.persistence :as dwp] [app.main.data.workspace.selection :as dws] [app.main.data.workspace.texts :as dwtxt] [app.main.data.workspace.transforms :as dwt] - [app.main.data.workspace.groups :as dwg] - [app.main.data.workspace.drawing :as dwd] - [app.main.data.workspace.drawing.path :as dwdp] [app.main.repo :as rp] [app.main.store :as st] [app.main.streams :as ms] [app.main.worker :as uw] + [app.util.dom :as dom] + [app.util.http :as http] + [app.util.i18n :refer [tr] :as i18n] [app.util.logging :as log] + [app.util.object :as obj] [app.util.router :as rt] [app.util.timers :as ts] [app.util.transit :as t] [app.util.webapi :as wapi] - [app.util.i18n :refer [tr] :as i18n] - [app.util.object :as obj] - [app.util.dom :as dom] - [app.util.http :as http] [beicon.core :as rx] [cljs.spec.alpha :as s] [clojure.set :as set] [cuerdas.core :as str] - ;; [cljs.pprint :refer [pprint]] + [goog.string.path :as path] [potok.core :as ptk])) ;; (log/set-level! :trace) @@ -1225,20 +1224,26 @@ (defn go-to-viewer - [{:keys [file-id page-id] :as params}] - (ptk/reify ::go-to-viewer - ptk/WatchEvent - (watch [_ state stream] - (rx/of ::dwp/force-persist - (rt/nav :viewer params {:index 0}))))) + ([] (go-to-viewer {})) + ([{:keys [file-id page-id]}] + (ptk/reify ::go-to-viewer + ptk/WatchEvent + (watch [_ state stream] + (let [{:keys [current-file-id current-page-id]} state + params {:file-id (or file-id current-file-id) + :page-id (or page-id current-page-id)}] + (rx/of ::dwp/force-persist + (rt/nav :viewer params {:index 0}))))))) (defn go-to-dashboard - [{:keys [team-id] :as project}] - (ptk/reify ::go-to-viewer - ptk/WatchEvent - (watch [_ state stream] - (rx/of ::dwp/force-persist - (rt/nav :dashboard-projects {:team-id team-id}))))) + ([] (go-to-dashboard nil)) + ([{:keys [team-id]}] + (ptk/reify ::go-to-dashboard + ptk/WatchEvent + (watch [_ state stream] + (let [team-id (or team-id (get-in state [:workspace-project :team-id]))] + (rx/of ::dwp/force-persist + (rt/nav :dashboard-projects {:team-id team-id}))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Context Menu @@ -1743,80 +1748,3 @@ (d/export dwg/unmask-group) (d/export dwg/group-selected) (d/export dwg/ungroup-selected) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Shortcuts -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; Shortcuts impl https://github.com/ccampbell/mousetrap - -(defn esc-pressed [] - (ptk/reify :esc-pressed - ptk/WatchEvent - (watch [_ state stream] - ;; Not interrupt when we're editing a path - (let [edition-id (or (get-in state [:workspace-drawing :object :id]) - (get-in state [:workspace-local :edition])) - path-edit-mode (get-in state [:workspace-local :edit-path edition-id :edit-mode])] - (if-not (= :draw path-edit-mode) - (rx/of :interrupt (deselect-all true)) - (rx/empty)))))) - -(defn c-mod - "Adds the control/command modifier to a shortcuts depending on the - operating system for the user" - [shortcut] - (if (cfg/check-platform? :macos) - (str "command+" shortcut) - (str "ctrl+" shortcut))) - -(def shortcuts - {(c-mod "i") #(st/emit! (toggle-layout-flags :assets)) - (c-mod "l") #(st/emit! (toggle-layout-flags :sitemap :layers)) - (c-mod "shift+r") #(st/emit! (toggle-layout-flags :rules)) - (c-mod "a") #(st/emit! (select-all)) - (c-mod "p") #(st/emit! (toggle-layout-flags :colorpalette)) - (c-mod "'") #(st/emit! (toggle-layout-flags :display-grid)) - (c-mod "shift+'") #(st/emit! (toggle-layout-flags :snap-grid)) - "+" #(st/emit! (increase-zoom nil)) - "-" #(st/emit! (decrease-zoom nil)) - (c-mod "g") #(st/emit! group-selected) - "shift+g" #(st/emit! ungroup-selected) - (c-mod "m") #(st/emit! mask-group) - "shift+m" #(st/emit! unmask-group) - (c-mod "k") #(st/emit! dwl/add-component) - "shift+0" #(st/emit! reset-zoom) - "shift+1" #(st/emit! zoom-to-fit-all) - "shift+2" #(st/emit! zoom-to-selected-shape) - (c-mod "d") #(st/emit! duplicate-selected) - (c-mod "z") #(st/emit! dwc/undo) - (c-mod "shift+z") #(st/emit! dwc/redo) - (c-mod "y") #(st/emit! dwc/redo) - (c-mod "q") #(st/emit! dwc/reinitialize-undo) - "a" #(st/emit! (dwd/select-for-drawing :frame)) - "r" #(st/emit! (dwd/select-for-drawing :rect)) - "e" #(st/emit! (dwd/select-for-drawing :circle)) - "t" #(st/emit! dwtxt/start-edit-if-selected - (dwd/select-for-drawing :text)) - "p" #(st/emit! (dwd/select-for-drawing :path)) - "k" (fn [event] - (let [image-upload (dom/get-element "image-upload")] - (dom/click image-upload))) - (c-mod "c") #(st/emit! (copy-selected)) - (c-mod "x") #(st/emit! (copy-selected) delete-selected) - "escape" #(st/emit! (esc-pressed)) - "del" #(st/emit! delete-selected) - "backspace" #(st/emit! delete-selected) - (c-mod "up") #(st/emit! (vertical-order-selected :up)) - (c-mod "down") #(st/emit! (vertical-order-selected :down)) - (c-mod "shift+up") #(st/emit! (vertical-order-selected :top)) - (c-mod "shift+down") #(st/emit! (vertical-order-selected :bottom)) - "shift+up" #(st/emit! (dwt/move-selected :up true)) - "shift+down" #(st/emit! (dwt/move-selected :down true)) - "shift+right" #(st/emit! (dwt/move-selected :right true)) - "shift+left" #(st/emit! (dwt/move-selected :left true)) - "up" #(st/emit! (dwt/move-selected :up false)) - "down" #(st/emit! (dwt/move-selected :down false)) - "right" #(st/emit! (dwt/move-selected :right false)) - "left" #(st/emit! (dwt/move-selected :left false)) - "i" #(st/emit! (mdc/picker-for-selected-shape ))}) diff --git a/frontend/src/app/main/data/workspace/shortcuts.cljs b/frontend/src/app/main/data/workspace/shortcuts.cljs new file mode 100644 index 0000000000..245645fc2e --- /dev/null +++ b/frontend/src/app/main/data/workspace/shortcuts.cljs @@ -0,0 +1,254 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; This Source Code Form is "Incompatible With Secondary Licenses", as +;; defined by the Mozilla Public License, v. 2.0. +;; +;; Copyright (c) 2020 UXBOX Labs SL + +(ns app.main.data.workspace.shortcuts + (:require + [app.config :as cfg] + [app.main.data.colors :as mdc] + [app.main.data.shortcuts :as ds] + [app.main.data.workspace :as dw] + [app.main.data.workspace.common :as dwc] + [app.main.data.workspace.drawing :as dwd] + [app.main.data.workspace.libraries :as dwl] + [app.main.data.workspace.texts :as dwtxt] + [app.main.data.workspace.transforms :as dwt] + [app.main.store :as st] + [app.util.dom :as dom] + [beicon.core :as rx] + [potok.core :as ptk])) + +;; \u2318P + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Shortcuts +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; Shortcuts impl https://github.com/ccampbell/mousetrap + +(defn esc-pressed [] + (ptk/reify :esc-pressed + ptk/WatchEvent + (watch [_ state stream] + ;; Not interrupt when we're editing a path + (let [edition-id (or (get-in state [:workspace-drawing :object :id]) + (get-in state [:workspace-local :edition])) + path-edit-mode (get-in state [:workspace-local :edit-path edition-id :edit-mode])] + (if-not (= :draw path-edit-mode) + (rx/of :interrupt (dw/deselect-all true)) + (rx/empty)))))) + +(def shortcuts + {:toggle-layers {:tooltip (ds/meta "L") + :command (ds/c-mod "l") + :fn #(st/emit! (dw/go-to-layout :layers))} + + :toggle-assets {:tooltip (ds/meta "I") + :command (ds/c-mod "i") + :fn #(st/emit! (dw/go-to-layout :assets))} + + :toggle-history {:tooltip (ds/meta "H") + :command (ds/c-mod "h") + :fn #(st/emit! (dw/go-to-layout :document-history))} + + :toggle-palette {:tooltip (ds/meta "P") + :command (ds/c-mod "p") + :fn #(st/emit! (dw/toggle-layout-flags :colorpalette))} + + :toggle-rules {:tooltip (ds/meta-shift "R") + :command (ds/c-mod "shift+r") + :fn #(st/emit! (dw/toggle-layout-flags :rules))} + + :select-all {:tooltip (ds/meta "A") + :command (ds/c-mod "a") + :fn #(st/emit! (dw/select-all))} + + :toggle-grid {:tooltip (ds/meta "'") + :command (ds/c-mod "'") + :fn #(st/emit! (dw/toggle-layout-flags :display-grid))} + + :toggle-snap-grid {:tooltip (ds/meta-shift "'") + :command (ds/c-mod "shift+'") + :fn #(st/emit! (dw/toggle-layout-flags :snap-grid))} + + :toggle-alignment {:tooltip (ds/meta "\\") + :command (ds/c-mod "\\") + :fn #(st/emit! (dw/toggle-layout-flags :dynamic-alignment))} + + :increase-zoom {:tooltip "+" + :command "+" + :fn #(st/emit! (dw/increase-zoom nil))} + + :decrease-zoom {:tooltip "-" + :command "-" + :fn #(st/emit! (dw/decrease-zoom nil))} + + :group {:tooltip (ds/meta "G") + :command (ds/c-mod "g") + :fn #(st/emit! dw/group-selected)} + + :ungroup {:tooltip (ds/shift "G") + :command "shift+g" + :fn #(st/emit! dw/ungroup-selected)} + + :mask {:tooltip (ds/meta "M") + :command (ds/c-mod "m") + :fn #(st/emit! dw/mask-group)} + + :unmask {:tooltip (ds/meta-shift "M") + :command (ds/c-mod "shift+m") + :fn #(st/emit! dw/unmask-group)} + + :create-component {:tooltip (ds/meta "K") + :command (ds/c-mod "k") + :fn #(st/emit! dwl/add-component)} + + :reset-zoom {:tooltip (ds/shift "0") + :command "shift+0" + :fn #(st/emit! dw/reset-zoom)} + + :fit-all {:tooltip (ds/shift "1") + :command "shift+1" + :fn #(st/emit! dw/zoom-to-fit-all)} + + :zoom-selected {:tooltip (ds/shift "2") + :command "shift+2" + :fn #(st/emit! dw/zoom-to-selected-shape)} + + :duplicate {:tooltip (ds/meta "D") + :command (ds/c-mod "d") + :fn #(st/emit! dw/duplicate-selected)} + + :undo {:tooltip (ds/meta "Z") + :command (ds/c-mod "z") + :fn #(st/emit! dwc/undo)} + + :redo {:tooltip (ds/meta "Y") + :command [(ds/c-mod "shift+z") (ds/c-mod "y")] + :fn #(st/emit! dwc/redo)} + + :clear-undo {:tooltip (ds/meta "Q") + :command (ds/c-mod "q") + :fn #(st/emit! dwc/reinitialize-undo)} + + :draw-frame {:tooltip "A" + :command "a" + :fn #(st/emit! (dwd/select-for-drawing :frame))} + + :draw-rect {:tooltip "R" + :command "r" + :fn #(st/emit! (dwd/select-for-drawing :rect))} + + :draw-ellipse {:tooltip "E" + :command "e" + :fn #(st/emit! (dwd/select-for-drawing :circle))} + + :draw-text {:tooltip "T" + :command "t" + :fn #(st/emit! dwtxt/start-edit-if-selected + (dwd/select-for-drawing :text))} + + :draw-path {:tooltip "P" + :command "p" + :fn #(st/emit! (dwd/select-for-drawing :path))} + + :draw-curve {:tooltip (ds/shift "C") + :command "shift+c" + :fn #(st/emit! (dwd/select-for-drawing :curve))} + + :add-comment {:tooltip "C" + :command "c" + :fn #(st/emit! (dwd/select-for-drawing :comments))} + + :insert-image {:tooltip "K" + :command "k" + :fn #(-> "image-upload" dom/get-element dom/click)} + + :copy {:tooltip (ds/meta "C") + :command (ds/c-mod "c") + :fn #(st/emit! (dw/copy-selected))} + + :cut {:tooltip (ds/meta "X") + :command (ds/c-mod "x") + :fn #(st/emit! (dw/copy-selected) dw/delete-selected)} + + :paste {:tooltip (ds/meta "V") + :disabled true + :command (ds/c-mod "v")} + + :delete {:tooltip (ds/supr) + :command ["del" "backspace"] + :fn #(st/emit! dw/delete-selected)} + + :bring-forward {:tooltip (ds/meta ds/up-arrow) + :command (ds/c-mod "up") + :fn #(st/emit! (dw/vertical-order-selected :up))} + + :bring-backward {:tooltip (ds/meta ds/down-arrow) + :command (ds/c-mod "down") + :fn #(st/emit! (dw/vertical-order-selected :down))} + + :bring-front {:tooltip (ds/meta-shift ds/up-arrow) + :command (ds/c-mod "shift+up") + :fn #(st/emit! (dw/vertical-order-selected :top))} + + :bring-back {:tooltip (ds/meta-shift ds/down-arrow) + :command (ds/c-mod "shift+down") + :fn #(st/emit! (dw/vertical-order-selected :bottom))} + + :move-fast-up {:tooltip (ds/shift ds/up-arrow) + :command "shift+up" + :fn #(st/emit! (dwt/move-selected :up true))} + + :move-fast-down {:tooltip (ds/shift ds/down-arrow) + :command "shift+down" + :fn #(st/emit! (dwt/move-selected :down true))} + + :move-fast-right {:tooltip (ds/shift ds/right-arrow) + :command "shift+right" + :fn #(st/emit! (dwt/move-selected :right true))} + + :move-fast-left {:tooltip (ds/shift ds/left-arrow) + :command "shift+left" + :fn #(st/emit! (dwt/move-selected :left true))} + + :move-unit-up {:tooltip ds/up-arrow + :command "up" + :fn #(st/emit! (dwt/move-selected :up false))} + + :move-unit-down {:tooltip ds/down-arrow + :command "down" + :fn #(st/emit! (dwt/move-selected :down false))} + + :move-unit-left {:tooltip ds/right-arrow + :command "right" + :fn #(st/emit! (dwt/move-selected :right false))} + + :move-unit-right {:tooltip ds/left-arrow + :command "left" + :fn #(st/emit! (dwt/move-selected :left false))} + + :open-color-picker {:tooltip "I" + :command "i" + :fn #(st/emit! (mdc/picker-for-selected-shape ))} + + :open-viewer {:tooltip "G V" + :command "g v" + :fn #(st/emit! (dw/go-to-viewer))} + + :open-dashboard {:tooltip "G D" + :command "g d" + :fn #(st/emit! (dw/go-to-dashboard))} + + :escape {:tooltip (ds/esc) + :command "escape" + :fn #(st/emit! (esc-pressed))}}) + +(defn get-tooltip [shortcut] + (assert (contains? shortcuts shortcut) (str shortcut)) + (get-in shortcuts [shortcut :tooltip])) diff --git a/frontend/src/app/main/ui/handoff.cljs b/frontend/src/app/main/ui/handoff.cljs index 98f416e0f6..95c0434e40 100644 --- a/frontend/src/app/main/ui/handoff.cljs +++ b/frontend/src/app/main/ui/handoff.cljs @@ -11,6 +11,7 @@ (:require [app.common.exceptions :as ex] [app.main.data.viewer :as dv] + [app.main.data.viewer.shortcuts :as sc] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.fullscreen :as fs] @@ -75,7 +76,7 @@ (let [on-mouse-wheel (mf/use-callback (fn [event] - (when (kbd/ctrl? event) + (when (or (kbd/ctrl? event) (kbd/meta? event)) (dom/prevent-default event) (let [event (.getBrowserEvent ^js event) delta (+ (.-deltaY ^js event) @@ -94,7 +95,7 @@ (events/unlistenByKey key1))))] (mf/use-effect on-mount) - (hooks/use-shortcuts dv/shortcuts) + (hooks/use-shortcuts sc/shortcuts) [:& fs/fullscreen-wrapper {} [:div.handoff-layout diff --git a/frontend/src/app/main/ui/handoff/left_sidebar.cljs b/frontend/src/app/main/ui/handoff/left_sidebar.cljs index d44ce15c6a..70d1c701d9 100644 --- a/frontend/src/app/main/ui/handoff/left_sidebar.cljs +++ b/frontend/src/app/main/ui/handoff/left_sidebar.cljs @@ -15,6 +15,7 @@ [app.main.store :as st] [app.main.ui.icons :as i] [app.main.ui.keyboard :as kbd] + [app.main.ui.keyboard :as kbd] [app.main.ui.workspace.sidebar.layers :refer [element-icon layer-name frame-wrapper]] [app.util.dom :as dom] [okulary.core :as l] @@ -52,10 +53,10 @@ (dom/prevent-default event) (let [id (:id item)] (cond - (.-ctrlKey event) + (or (kbd/ctrl? event) (kbd/meta? event)) (st/emit! (dv/toggle-selection id)) - (.-shiftKey event) + (kbd/shift? event) (st/emit! (dv/shift-select-to id)) :else diff --git a/frontend/src/app/main/ui/hooks.cljs b/frontend/src/app/main/ui/hooks.cljs index ba72e96c77..f77217d247 100644 --- a/frontend/src/app/main/ui/hooks.cljs +++ b/frontend/src/app/main/ui/hooks.cljs @@ -10,19 +10,23 @@ (ns app.main.ui.hooks "A collection of general purpose react hooks." (:require - [cljs.spec.alpha :as s] + ["mousetrap" :as mousetrap] [app.common.spec :as us] - [beicon.core :as rx] - [goog.events :as events] - [rumext.alpha :as mf] - [app.util.transit :as t] + [app.main.data.shortcuts :refer [bind-shortcuts]] [app.util.dom :as dom] [app.util.dom.dnd :as dnd] - [app.util.webapi :as wapi] + [app.util.logging :as log] [app.util.timers :as ts] - ["mousetrap" :as mousetrap]) + [app.util.transit :as t] + [app.util.webapi :as wapi] + [beicon.core :as rx] + [cljs.spec.alpha :as s] + [goog.events :as events] + [rumext.alpha :as mf]) (:import goog.events.EventType)) +(log/set-level! :warn) + (defn use-rxsub [ob] (let [[state reset-state!] (mf/useState @ob)] @@ -33,20 +37,18 @@ #js [ob]) state)) -(s/def ::shortcuts - (s/map-of ::us/string fn?)) - (defn use-shortcuts [shortcuts] - (us/assert ::shortcuts shortcuts) (mf/use-effect (fn [] - (->> (seq shortcuts) - (run! (fn [[key f]] - (mousetrap/bind key (fn [event] - (js/console.log "[debug]: shortcut:" key) - (.preventDefault event) - (f event)))))) + (bind-shortcuts + shortcuts + mousetrap/bind + (fn [key cb] + (fn [event] + (log/debug :msg (str "Shortcut" key)) + (.preventDefault event) + (cb event)))) (fn [] (mousetrap/reset)))) nil) diff --git a/frontend/src/app/main/ui/keyboard.cljs b/frontend/src/app/main/ui/keyboard.cljs index ecc03d63bb..93e49a6d58 100644 --- a/frontend/src/app/main/ui/keyboard.cljs +++ b/frontend/src/app/main/ui/keyboard.cljs @@ -13,6 +13,10 @@ [event] (.-ctrlKey event)) +(defn ^boolean meta? + [event] + (.-metaKey event)) + (defn ^boolean shift? [event] (.-shiftKey event)) diff --git a/frontend/src/app/main/ui/viewer.cljs b/frontend/src/app/main/ui/viewer.cljs index b6297e8192..7fb7f80a31 100644 --- a/frontend/src/app/main/ui/viewer.cljs +++ b/frontend/src/app/main/ui/viewer.cljs @@ -16,6 +16,7 @@ [app.common.geom.shapes :as geom] [app.common.pages :as cp] [app.main.data.viewer :as dv] + [app.main.data.viewer.shortcuts :as sc] [app.main.data.comments :as dcm] [app.main.refs :as refs] [app.main.store :as st] @@ -214,7 +215,7 @@ on-mouse-wheel (fn [event] - (when (kbd/ctrl? event) + (when (or (kbd/ctrl? event) (kbd/meta? event)) (dom/prevent-default event) (let [event (.getBrowserEvent ^js event) delta (+ (.-deltaY ^js event) (.-deltaX ^js event))] @@ -240,7 +241,7 @@ (events/unlistenByKey key3))))] (mf/use-effect on-mount) - (hooks/use-shortcuts dv/shortcuts) + (hooks/use-shortcuts sc/shortcuts) [:& fs/fullscreen-wrapper {} [:div.viewer-layout diff --git a/frontend/src/app/main/ui/viewer/header.cljs b/frontend/src/app/main/ui/viewer/header.cljs index 21e15787d1..e38e7b24bd 100644 --- a/frontend/src/app/main/ui/viewer/header.cljs +++ b/frontend/src/app/main/ui/viewer/header.cljs @@ -11,9 +11,10 @@ (:require [app.common.math :as mth] [app.common.uuid :as uuid] + [app.main.data.comments :as dcm] [app.main.data.messages :as dm] [app.main.data.viewer :as dv] - [app.main.data.comments :as dcm] + [app.main.data.viewer.shortcuts :as sc] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.dropdown :refer [dropdown]] @@ -44,15 +45,15 @@ :on-close #(reset! show-dropdown? false)} [:ul.dropdown.zoom-dropdown [:li {:on-click on-increase} - "Zoom in" [:span "+"]] + "Zoom in" [:span (sc/get-tooltip :increase-zoom)]] [:li {:on-click on-decrease} - "Zoom out" [:span "-"]] + "Zoom out" [:span (sc/get-tooltip :decrease-zoom)]] [:li {:on-click on-zoom-to-50} - "Zoom to 50%" [:span "Shift + 0"]] + "Zoom to 50%" [:span (sc/get-tooltip :zoom-50)]] [:li {:on-click on-zoom-to-100} - "Zoom to 100%" [:span "Shift + 1"]] + "Zoom to 100%" [:span (sc/get-tooltip :reset-zoom)]] [:li {:on-click on-zoom-to-200} - "Zoom to 200%" [:span "Shift + 2"]]]]])) + "Zoom to 200%" [:span (sc/get-tooltip :zoom-200)]]]]])) (mf/defc share-link [{:keys [page token] :as props}] @@ -272,7 +273,7 @@ :on-zoom-to-100 (st/emitf dv/reset-zoom) :on-zoom-to-200 (st/emitf dv/zoom-to-200)}] - [:span.btn-icon-dark.btn-small.tooltip.tooltip-bottom + [:span.btn-icon-dark.btn-small.tooltip.tooltip-bottom-left {:alt (t locale "viewer.header.fullscreen") :on-click #(if @fullscreen (fullscreen false) (fullscreen true))} (if @fullscreen diff --git a/frontend/src/app/main/ui/workspace.cljs b/frontend/src/app/main/ui/workspace.cljs index ad5a6b87d7..8c054e9a4d 100644 --- a/frontend/src/app/main/ui/workspace.cljs +++ b/frontend/src/app/main/ui/workspace.cljs @@ -12,15 +12,16 @@ [app.common.geom.point :as gpt] [app.main.constants :as c] [app.main.data.history :as udh] - [app.main.data.workspace :as dw] [app.main.data.messages :as dm] + [app.main.data.workspace :as dw] + [app.main.data.workspace.shortcuts :as sc] [app.main.refs :as refs] [app.main.store :as st] [app.main.streams :as ms] + [app.main.ui.context :as ctx] [app.main.ui.hooks :as hooks] [app.main.ui.icons :as i] [app.main.ui.keyboard :as kbd] - [app.main.ui.context :as ctx] [app.main.ui.workspace.colorpalette :refer [colorpalette]] [app.main.ui.workspace.colorpicker] [app.main.ui.workspace.context-menu :refer [context-menu]] @@ -30,8 +31,8 @@ [app.main.ui.workspace.rules :refer [horizontal-rule vertical-rule]] [app.main.ui.workspace.sidebar :refer [left-sidebar right-sidebar]] [app.main.ui.workspace.viewport :refer [viewport viewport-actions coordinates]] - [app.util.object :as obj] [app.util.dom :as dom] + [app.util.object :as obj] [beicon.core :as rx] [cuerdas.core :as str] [okulary.core :as l] @@ -128,7 +129,7 @@ ;; Close any non-modal dialog that may be still open (st/emitf dm/hide))) - (hooks/use-shortcuts dw/shortcuts) + (hooks/use-shortcuts sc/shortcuts) (let [file (mf/deref refs/workspace-file) project (mf/deref refs/workspace-project) diff --git a/frontend/src/app/main/ui/workspace/context_menu.cljs b/frontend/src/app/main/ui/workspace/context_menu.cljs index ca2343698e..13d3df116f 100644 --- a/frontend/src/app/main/ui/workspace/context_menu.cljs +++ b/frontend/src/app/main/ui/workspace/context_menu.cljs @@ -14,11 +14,12 @@ [app.main.data.workspace :as dw] [app.main.data.workspace.common :as dwc] [app.main.data.workspace.libraries :as dwl] + [app.main.data.workspace.shortcuts :as sc] [app.main.refs :as refs] [app.main.store :as st] [app.main.streams :as ms] - [app.main.ui.context :as ctx] [app.main.ui.components.dropdown :refer [dropdown]] + [app.main.ui.context :as ctx] [app.main.ui.hooks :refer [use-rxsub]] [app.main.ui.icons :as i] [app.util.dom :as dom] @@ -99,52 +100,52 @@ (:component-file shape)))] [:* [:& menu-entry {:title (t locale "workspace.shape.menu.copy") - :shortcut "Ctrl + c" + :shortcut (sc/get-tooltip :copy) :on-click do-copy}] [:& menu-entry {:title (t locale "workspace.shape.menu.cut") - :shortcut "Ctrl + x" + :shortcut (sc/get-tooltip :cut) :on-click do-cut}] [:& menu-entry {:title (t locale "workspace.shape.menu.paste") - :shortcut "Ctrl + v" + :shortcut (sc/get-tooltip :paste) :on-click do-paste}] [:& menu-entry {:title (t locale "workspace.shape.menu.duplicate") - :shortcut "Ctrl + d" + :shortcut (sc/get-tooltip :duplicate) :on-click do-duplicate}] [:& menu-separator] [:& menu-entry {:title (t locale "workspace.shape.menu.forward") - :shortcut "Ctrl + ↑" + :shortcut (sc/get-tooltip :bring-forward) :on-click do-bring-forward}] [:& menu-entry {:title (t locale "workspace.shape.menu.front") - :shortcut "Ctrl + Shift + ↑" + :shortcut (sc/get-tooltip :bring-front) :on-click do-bring-to-front}] [:& menu-entry {:title (t locale "workspace.shape.menu.backward") - :shortcut "Ctrl + ↓" + :shortcut (sc/get-tooltip :bring-backward) :on-click do-send-backward}] [:& menu-entry {:title (t locale "workspace.shape.menu.back") - :shortcut "Ctrl + Shift + ↓" + :shortcut (sc/get-tooltip :bring-back) :on-click do-send-to-back}] [:& menu-separator] (when (> (count selected) 1) [:* [:& menu-entry {:title (t locale "workspace.shape.menu.group") - :shortcut "Ctrl + g" + :shortcut (sc/get-tooltip :group) :on-click do-create-group}] [:& menu-entry {:title (t locale "workspace.shape.menu.mask") - :shortcut "Ctrl + M" + :shortcut (sc/get-tooltip :mask) :on-click do-mask-group}]]) (when (and (= (count selected) 1) (= (:type shape) :group)) [:* [:& menu-entry {:title (t locale "workspace.shape.menu.ungroup") - :shortcut "Shift + g" + :shortcut (sc/get-tooltip :ungroup) :on-click do-remove-group}] (if (:masked-group? shape) [:& menu-entry {:title (t locale "workspace.shape.menu.unmask") - :shortcut "Shift + M" + :shortcut (sc/get-tooltip :unmask) :on-click do-unmask-group}] - [:& menu-entry {:title "Mask" - :shortcut "Ctrl + M" + [:& menu-entry {:title (t locale "workspace.shape.menu.mask") + :shortcut (sc/get-tooltip :group) :on-click do-mask-group}])]) (if (:hidden shape) @@ -165,7 +166,7 @@ [:* [:& menu-separator] [:& menu-entry {:title (t locale "workspace.shape.menu.create-component") - :shortcut "Ctrl + K" + :shortcut (sc/get-tooltip :create-component) :on-click do-add-component}]]) (when (and (:component-id shape) @@ -197,7 +198,7 @@ [:& menu-separator] [:& menu-entry {:title (t locale "workspace.shape.menu.delete") - :shortcut "Supr" + :shortcut (sc/get-tooltip :delete) :on-click do-delete}]])) (mf/defc viewport-context-menu @@ -206,7 +207,7 @@ do-paste (st/emitf dw/paste)] [:* [:& menu-entry {:title (t locale "workspace.shape.menu.paste") - :shortcut "Ctrl + v" + :shortcut (sc/get-tooltip :paste) :on-click do-paste}]])) (mf/defc context-menu diff --git a/frontend/src/app/main/ui/workspace/effects.cljs b/frontend/src/app/main/ui/workspace/effects.cljs index b646717ec1..a0ae1fd3c9 100644 --- a/frontend/src/app/main/ui/workspace/effects.cljs +++ b/frontend/src/app/main/ui/workspace/effects.cljs @@ -52,7 +52,7 @@ drawing? @refs/selected-drawing-tool button (.-which (.-nativeEvent event)) shift? (kbd/shift? event) - ctrl? (kbd/ctrl? event) + ctrl? (or (kbd/ctrl? event) (kbd/meta? event)) allow-click? (and (not blocked) (not drawing?) diff --git a/frontend/src/app/main/ui/workspace/header.cljs b/frontend/src/app/main/ui/workspace/header.cljs index a10b7a149f..158e07c582 100644 --- a/frontend/src/app/main/ui/workspace/header.cljs +++ b/frontend/src/app/main/ui/workspace/header.cljs @@ -13,6 +13,8 @@ [app.config :as cfg] [app.main.data.modal :as modal] [app.main.data.workspace :as dw] + [app.main.data.workspace.shortcuts :as sc] + [app.main.data.workspace.shortcuts :as sc] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.dropdown :refer [dropdown]] @@ -73,15 +75,15 @@ :on-close #(reset! show-dropdown? false)} [:ul.zoom-dropdown [:li {:on-click on-increase} - "Zoom in" [:span "+"]] + "Zoom in" [:span (sc/get-tooltip :increase-zoom)]] [:li {:on-click on-decrease} - "Zoom out" [:span "-"]] + "Zoom out" [:span (sc/get-tooltip :decrease-zoom)]] [:li {:on-click on-zoom-reset} - "Zoom to 100%" [:span "Shift + 0"]] + "Zoom to 100%" [:span (sc/get-tooltip :reset-zoom)]] [:li {:on-click on-zoom-fit} - "Zoom to fit all" [:span "Shift + 1"]] + "Zoom to fit all" [:span (sc/get-tooltip :fit-all)]] [:li {:on-click on-zoom-selected} - "Zoom to selected" [:span "Shift + 2"]]]]])) + "Zoom to selected" [:span (sc/get-tooltip :zoom-selected)]]]]])) ;; --- Header Users @@ -171,52 +173,53 @@ (if (contains? layout :rules) (tr "workspace.header.menu.hide-rules") (tr "workspace.header.menu.show-rules"))] - [:span.shortcut "Ctrl+shift+R"]] + [:span.shortcut (sc/get-tooltip :toggle-rules)]] [:li {:on-click #(st/emit! (dw/toggle-layout-flags :display-grid))} [:span (if (contains? layout :display-grid) (tr "workspace.header.menu.hide-grid") (tr "workspace.header.menu.show-grid"))] - [:span.shortcut "Ctrl+'"]] + [:span.shortcut (sc/get-tooltip :toggle-grid)]] [:li {:on-click #(st/emit! (dw/toggle-layout-flags :snap-grid))} [:span (if (contains? layout :snap-grid) (tr "workspace.header.menu.disable-snap-grid") (tr "workspace.header.menu.enable-snap-grid"))] - [:span.shortcut "Ctrl+Shift+'"]] + [:span.shortcut (sc/get-tooltip :toggle-snap-grid)]] [:li {:on-click #(st/emit! (dw/toggle-layout-flags :sitemap :layers))} [:span (if (or (contains? layout :sitemap) (contains? layout :layers)) (tr "workspace.header.menu.hide-layers") (tr "workspace.header.menu.show-layers"))] - [:span.shortcut "Ctrl+l"]] + [:span.shortcut (sc/get-tooltip :toggle-layers)]] [:li {:on-click #(st/emit! (dw/toggle-layout-flags :colorpalette))} [:span (if (contains? layout :colorpalette) (tr "workspace.header.menu.hide-palette") (tr "workspace.header.menu.show-palette"))] - [:span.shortcut "Ctrl+p"]] + [:span.shortcut (sc/get-tooltip :toggle-palette)]] [:li {:on-click #(st/emit! (dw/toggle-layout-flags :assets))} [:span (if (contains? layout :assets) (tr "workspace.header.menu.hide-assets") (tr "workspace.header.menu.show-assets"))] - [:span.shortcut "Ctrl+i"]] + [:span.shortcut (sc/get-tooltip :toggle-assets)]] [:li {:on-click #(st/emit! (dw/select-all))} [:span (tr "workspace.header.menu.select-all")] - [:span.shortcut "Ctrl+a"]] + [:span.shortcut (sc/get-tooltip :select-all)]] [:li {:on-click #(st/emit! (dw/toggle-layout-flags :dynamic-alignment))} [:span (if (contains? layout :dynamic-alignment) (tr "workspace.header.menu.disable-dynamic-alignment") - (tr "workspace.header.menu.enable-dynamic-alignment"))]] + (tr "workspace.header.menu.enable-dynamic-alignment"))] + [:span.shortcut (sc/get-tooltip :toggle-alignment)]] (if (:is-shared file) [:li {:on-click on-remove-shared} @@ -272,8 +275,8 @@ :on-zoom-fit #(st/emit! dw/zoom-to-fit-all) :on-zoom-selected #(st/emit! dw/zoom-to-selected-shape)}] - [:a.btn-icon-dark.btn-small.tooltip.tooltip-bottom - {:alt (tr "workspace.header.viewer") + [:a.btn-icon-dark.btn-small.tooltip.tooltip-bottom-left + {:alt (tr "workspace.header.viewer" (sc/get-tooltip :open-viewer)) :href (str "#" view-url) :on-click go-viewer} i/play]]])) diff --git a/frontend/src/app/main/ui/workspace/left_toolbar.cljs b/frontend/src/app/main/ui/workspace/left_toolbar.cljs index 9685e102b4..c1d57110e4 100644 --- a/frontend/src/app/main/ui/workspace/left_toolbar.cljs +++ b/frontend/src/app/main/ui/workspace/left_toolbar.cljs @@ -12,6 +12,7 @@ [app.common.geom.point :as gpt] [app.common.media :as cm] [app.main.data.workspace :as dw] + [app.main.data.workspace.shortcuts :as sc] [app.main.refs :as refs] [app.main.store :as st] [app.main.ui.components.file-uploader :refer [file-uploader]] @@ -67,22 +68,22 @@ :on-click (st/emitf :interrupt)} i/pointer-inner] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.frame") + {:alt (tr "workspace.toolbar.frame" (sc/get-tooltip :draw-frame)) :class (when (= selected-drawtool :frame) "selected") :on-click (partial select-drawtool :frame)} i/artboard] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.rect") + {:alt (tr "workspace.toolbar.rect" (sc/get-tooltip :draw-rect)) :class (when (= selected-drawtool :rect) "selected") :on-click (partial select-drawtool :rect)} i/box] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.ellipse") + {:alt (tr "workspace.toolbar.ellipse" (sc/get-tooltip :draw-ellipse)) :class (when (= selected-drawtool :circle) "selected") :on-click (partial select-drawtool :circle)} i/circle] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.text") + {:alt (tr "workspace.toolbar.text" (sc/get-tooltip :draw-text)) :class (when (= selected-drawtool :text) "selected") :on-click (partial select-drawtool :text)} i/text] @@ -90,40 +91,40 @@ [:& image-upload] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.curve") + {:alt (tr "workspace.toolbar.curve" (sc/get-tooltip :draw-curve)) :class (when (= selected-drawtool :curve) "selected") :on-click (partial select-drawtool :curve)} i/pencil] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.path") + {:alt (tr "workspace.toolbar.path" (sc/get-tooltip :draw-path)) :class (when (= selected-drawtool :path) "selected") :on-click (partial select-drawtool :path)} i/pen] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.comments") + {:alt (tr "workspace.toolbar.comments" (sc/get-tooltip :add-comment)) :class (when (= selected-drawtool :comments) "selected") :on-click (partial select-drawtool :comments)} i/chat]] [:ul.left-toolbar-options.panels [:li.tooltip.tooltip-right - {:alt "Layers" + {:alt (tr "workspace.sidebar.layers" (sc/get-tooltip :toggle-layers)) :class (when (contains? layout :layers) "selected") :on-click (st/emitf (dw/go-to-layout :layers))} i/layers] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.assets") + {:alt (tr "workspace.toolbar.assets" (sc/get-tooltip :toggle-assets)) :class (when (contains? layout :assets) "selected") :on-click (st/emitf (dw/go-to-layout :assets))} i/library] [:li.tooltip.tooltip-right - {:alt "History" + {:alt (tr "workspace.sidebar.history" (sc/get-tooltip :toggle-history)) :class (when (contains? layout :document-history) "selected") :on-click (st/emitf (dw/go-to-layout :document-history))} i/undo-history] [:li.tooltip.tooltip-right - {:alt (tr "workspace.toolbar.color-palette") + {:alt (tr "workspace.toolbar.color-palette" (sc/get-tooltip :toggle-palette)) :class (when (contains? layout :colorpalette) "selected") :on-click (st/emitf (dw/toggle-layout-flags :colorpalette))} i/palette]]]])) diff --git a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs index b152fb9ae2..83e776c7c4 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/layers.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/layers.cljs @@ -19,6 +19,7 @@ [app.main.ui.hooks :as hooks] [app.main.ui.icons :as i] [app.main.ui.keyboard :as kbd] + [app.main.ui.keyboard :as kbd] [app.util.dom :as dom] [app.util.i18n :as i18n :refer [t]] [app.util.object :as obj] @@ -140,10 +141,10 @@ (:hidden item)) nil - (.-shiftKey event) + (kbd/shift? event) (st/emit! (dw/shift-select-shapes id)) - (.-ctrlKey event) + (or (kbd/ctrl? event) (kbd/meta? event)) (st/emit! (dw/select-shape id true)) (> (count selected) 1) diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 69b683cd08..4bc17fc84c 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -508,7 +508,7 @@ (let [node (mf/ref-val viewport-ref) target (dom/get-target event)] (cond - (kbd/ctrl? event) + (or (kbd/ctrl? event) (kbd/meta? event)) (let [event (.getBrowserEvent ^js event) pos @ms/mouse-position] (dom/prevent-default event)