Compare commits
26 Commits
release/20
...
fix/pretti
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca54c8498c | ||
|
|
385a587cfd | ||
|
|
215df02783 | ||
|
|
7c7ed68b20 | ||
|
|
c910a0314a | ||
|
|
ddaec1b9ac | ||
|
|
9dbdef9286 | ||
|
|
e77eef1532 | ||
|
|
1fe0b8861d | ||
|
|
aeb9172144 | ||
|
|
1b413e2f47 | ||
|
|
d6c8400116 | ||
|
|
4a0205e622 | ||
|
|
c2520006ac | ||
|
|
99817fd8bd | ||
|
|
3f35fedd9d | ||
|
|
b7c2d13992 | ||
|
|
a6426587fb | ||
|
|
5f68356278 | ||
|
|
08f61e7408 | ||
|
|
9beda15f00 | ||
|
|
09d1663f81 | ||
|
|
f43b6e7cff | ||
|
|
6581eb4fd1 | ||
|
|
caedfe5c1e | ||
|
|
f6a234aaf9 |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hoppscotch-backend",
|
"name": "hoppscotch-backend",
|
||||||
"version": "2023.4.2",
|
"version": "2023.4.3",
|
||||||
"description": "",
|
"description": "",
|
||||||
"author": "",
|
"author": "",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|||||||
@@ -360,13 +360,15 @@ describe('UserHistoryService', () => {
|
|||||||
});
|
});
|
||||||
describe('removeRequestFromHistory', () => {
|
describe('removeRequestFromHistory', () => {
|
||||||
test('Should resolve right and delete request from users history', async () => {
|
test('Should resolve right and delete request from users history', async () => {
|
||||||
|
const executedOn = new Date();
|
||||||
|
|
||||||
mockPrisma.userHistory.delete.mockResolvedValueOnce({
|
mockPrisma.userHistory.delete.mockResolvedValueOnce({
|
||||||
userUid: 'abc',
|
userUid: 'abc',
|
||||||
id: '1',
|
id: '1',
|
||||||
request: [{}],
|
request: [{}],
|
||||||
responseMetadata: [{}],
|
responseMetadata: [{}],
|
||||||
reqType: ReqType.REST,
|
reqType: ReqType.REST,
|
||||||
executedOn: new Date(),
|
executedOn: executedOn,
|
||||||
isStarred: false,
|
isStarred: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -376,7 +378,7 @@ describe('UserHistoryService', () => {
|
|||||||
request: JSON.stringify([{}]),
|
request: JSON.stringify([{}]),
|
||||||
responseMetadata: JSON.stringify([{}]),
|
responseMetadata: JSON.stringify([{}]),
|
||||||
reqType: ReqType.REST,
|
reqType: ReqType.REST,
|
||||||
executedOn: new Date(),
|
executedOn: executedOn,
|
||||||
isStarred: false,
|
isStarred: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -384,7 +386,7 @@ describe('UserHistoryService', () => {
|
|||||||
await userHistoryService.removeRequestFromHistory('abc', '1'),
|
await userHistoryService.removeRequestFromHistory('abc', '1'),
|
||||||
).toEqualRight(userHistory);
|
).toEqualRight(userHistory);
|
||||||
});
|
});
|
||||||
test('Should resolve left and error out when req id is invalid ', async () => {
|
test('Should resolve left and error out when req id is invalid', async () => {
|
||||||
mockPrisma.userHistory.delete.mockResolvedValueOnce(null);
|
mockPrisma.userHistory.delete.mockResolvedValueOnce(null);
|
||||||
|
|
||||||
return expect(
|
return expect(
|
||||||
|
|||||||
@@ -207,16 +207,19 @@
|
|||||||
:root.light {
|
:root.light {
|
||||||
@include light-theme;
|
@include light-theme;
|
||||||
@include light-editor-theme;
|
@include light-editor-theme;
|
||||||
|
color-scheme: light;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root.dark {
|
:root.dark {
|
||||||
@include dark-theme;
|
@include dark-theme;
|
||||||
@include dark-editor-theme;
|
@include dark-editor-theme;
|
||||||
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root.black {
|
:root.black {
|
||||||
@include black-theme;
|
@include black-theme;
|
||||||
@include black-editor-theme;
|
@include black-editor-theme;
|
||||||
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root[data-accent="blue"] {
|
:root[data-accent="blue"] {
|
||||||
|
|||||||
@@ -432,6 +432,7 @@
|
|||||||
"view_my_links": "View my links"
|
"view_my_links": "View my links"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
|
"audio": "Audio",
|
||||||
"body": "Response Body",
|
"body": "Response Body",
|
||||||
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)",
|
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)",
|
||||||
"headers": "Headers",
|
"headers": "Headers",
|
||||||
@@ -445,6 +446,7 @@
|
|||||||
"status": "Status",
|
"status": "Status",
|
||||||
"time": "Time",
|
"time": "Time",
|
||||||
"title": "Response",
|
"title": "Response",
|
||||||
|
"video": "Video",
|
||||||
"waiting_for_connection": "waiting for connection",
|
"waiting_for_connection": "waiting for connection",
|
||||||
"xml": "XML"
|
"xml": "XML"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,44 +1,44 @@
|
|||||||
{
|
{
|
||||||
"action": {
|
"action": {
|
||||||
"autoscroll": "Autoscroll",
|
"autoscroll": "Desplazamiento automático",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"choose_file": "Seleccionar archivo",
|
"choose_file": "Seleccionar archivo",
|
||||||
"clear": "Limpiar",
|
"clear": "Limpiar",
|
||||||
"clear_all": "Limpiar todo",
|
"clear_all": "Limpiar todo",
|
||||||
"close": "Cerrar",
|
"close": "Cerrar",
|
||||||
"connect": "Conectar",
|
"connect": "Conectar",
|
||||||
"connecting": "Connecting",
|
"connecting": "Conectando",
|
||||||
"copy": "Copiar",
|
"copy": "Copiar",
|
||||||
"delete": "Borrar",
|
"delete": "Borrar",
|
||||||
"disconnect": "Desconectar",
|
"disconnect": "Desconectar",
|
||||||
"dismiss": "Descartar",
|
"dismiss": "Descartar",
|
||||||
"dont_save": "Don't save",
|
"dont_save": "No guardar",
|
||||||
"download_file": "Descargar archivo",
|
"download_file": "Descargar archivo",
|
||||||
"drag_to_reorder": "Arrastrar para reordenar",
|
"drag_to_reorder": "Arrastrar para reordenar",
|
||||||
"duplicate": "Duplicar",
|
"duplicate": "Duplicar",
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"filter": "Filter",
|
"filter": "Filtrar",
|
||||||
"go_back": "Volver",
|
"go_back": "Volver",
|
||||||
"go_forward": "Go forward",
|
"go_forward": "Adelante",
|
||||||
"group_by": "Group by",
|
"group_by": "Agrupar por",
|
||||||
"label": "Etiqueta",
|
"label": "Etiqueta",
|
||||||
"learn_more": "Aprender más",
|
"learn_more": "Aprender más",
|
||||||
"less": "Menos",
|
"less": "Menos",
|
||||||
"more": "Más",
|
"more": "Más",
|
||||||
"new": "Nuevo",
|
"new": "Nuevo",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
"open_workspace": "Open workspace",
|
"open_workspace": "Abrir espacio de trabajo",
|
||||||
"paste": "Pegar",
|
"paste": "Pegar",
|
||||||
"prettify": "Embellecer",
|
"prettify": "Embellecer",
|
||||||
"remove": "Eliminar",
|
"remove": "Eliminar",
|
||||||
"restore": "Restaurar",
|
"restore": "Restaurar",
|
||||||
"save": "Guardar",
|
"save": "Guardar",
|
||||||
"scroll_to_bottom": "Scroll to bottom",
|
"scroll_to_bottom": "Desplazar hacia abajo",
|
||||||
"scroll_to_top": "Scroll to top",
|
"scroll_to_top": "Desplazar hacia arriba",
|
||||||
"search": "Buscar",
|
"search": "Buscar",
|
||||||
"send": "Enviar",
|
"send": "Enviar",
|
||||||
"start": "Comenzar",
|
"start": "Comenzar",
|
||||||
"starting": "Starting",
|
"starting": "Iniciando",
|
||||||
"stop": "Detener",
|
"stop": "Detener",
|
||||||
"to_close": "para cerrar",
|
"to_close": "para cerrar",
|
||||||
"to_navigate": "para navegar",
|
"to_navigate": "para navegar",
|
||||||
@@ -56,16 +56,16 @@
|
|||||||
"chat_with_us": "Habla con nosotros",
|
"chat_with_us": "Habla con nosotros",
|
||||||
"contact_us": "Contáctanos",
|
"contact_us": "Contáctanos",
|
||||||
"copy": "Copiar",
|
"copy": "Copiar",
|
||||||
"copy_user_id": "Copy User Auth Token",
|
"copy_user_id": "Copiar token de autenticación de usuario",
|
||||||
"developer_option": "Developer options",
|
"developer_option": "Opciones para desarrolladores",
|
||||||
"developer_option_description": "Developer tools which helps in development and maintenance of Hoppscotch.",
|
"developer_option_description": "Herramientas para desarrolladores que ayudan en el desarrollo y mantenimiento de Hoppscotch.",
|
||||||
"discord": "Discord",
|
"discord": "Discord",
|
||||||
"documentation": "Documentación",
|
"documentation": "Documentación",
|
||||||
"github": "GitHub",
|
"github": "GitHub",
|
||||||
"help": "Ayuda y comentarios",
|
"help": "Ayuda y comentarios",
|
||||||
"home": "Inicio",
|
"home": "Inicio",
|
||||||
"invite": "Invitar",
|
"invite": "Invitar",
|
||||||
"invite_description": "En Hoppscotch, diseñamos una interfaz simple e intuitiva para crear y administrar sus APIs. Hoppscotch es una herramienta que le ayuda a crear, probar, documentar y compartir sus APIs.",
|
"invite_description": "En Hoppscotch, diseñamos una interfaz simple e intuitiva para crear y administrar tus APIs. Hoppscotch es una herramienta que le ayuda a crear, probar, documentar y compartir tus APIs.",
|
||||||
"invite_your_friends": "Invita a tus amigos",
|
"invite_your_friends": "Invita a tus amigos",
|
||||||
"join_discord_community": "Únete a nuestra comunidad Discord",
|
"join_discord_community": "Únete a nuestra comunidad Discord",
|
||||||
"keyboard_shortcuts": "Atajos de teclado",
|
"keyboard_shortcuts": "Atajos de teclado",
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
"shortcuts": "Atajos",
|
"shortcuts": "Atajos",
|
||||||
"spotlight": "Destacar",
|
"spotlight": "Destacar",
|
||||||
"status": "Estado",
|
"status": "Estado",
|
||||||
"status_description": "Check the status of the website",
|
"status_description": "Comprobar el estado del sitio web",
|
||||||
"terms_and_privacy": "Términos y privacidad",
|
"terms_and_privacy": "Términos y privacidad",
|
||||||
"twitter": "Twitter",
|
"twitter": "Twitter",
|
||||||
"type_a_command_search": "Escribe un comando o buscar algo…",
|
"type_a_command_search": "Escribe un comando o buscar algo…",
|
||||||
@@ -118,18 +118,18 @@
|
|||||||
},
|
},
|
||||||
"collection": {
|
"collection": {
|
||||||
"created": "Colección creada",
|
"created": "Colección creada",
|
||||||
"different_parent": "Cannot reorder collection with different parent",
|
"different_parent": "No se puede reordenar la colección con un padre diferente",
|
||||||
"edit": "Editar colección",
|
"edit": "Editar colección",
|
||||||
"invalid_name": "Proporciona un nombre válido para la colección.",
|
"invalid_name": "Proporciona un nombre válido para la colección.",
|
||||||
"invalid_root_move": "Collection already in the root",
|
"invalid_root_move": "La colección ya está en la raíz",
|
||||||
"moved": "Moved Successfully",
|
"moved": "Movido con éxito",
|
||||||
"my_collections": "Mis colecciones",
|
"my_collections": "Mis colecciones",
|
||||||
"name": "Mi nueva colección",
|
"name": "Mi nueva colección",
|
||||||
"name_length_insufficient": "El nombre de la colección debe tener al menos 3 caracteres",
|
"name_length_insufficient": "El nombre de la colección debe tener al menos 3 caracteres",
|
||||||
"new": "Nueva colección",
|
"new": "Nueva colección",
|
||||||
"order_changed": "Collection Order Updated",
|
"order_changed": "Orden de colección actualizada",
|
||||||
"renamed": "Colección renombrada",
|
"renamed": "Colección renombrada",
|
||||||
"request_in_use": "Petición en uso",
|
"request_in_use": "Solicitud en uso",
|
||||||
"save_as": "Guardar como",
|
"save_as": "Guardar como",
|
||||||
"select": "Seleccionar colección",
|
"select": "Seleccionar colección",
|
||||||
"select_location": "Seleccionar ubicación",
|
"select_location": "Seleccionar ubicación",
|
||||||
@@ -138,17 +138,17 @@
|
|||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"exit_team": "¿Estás seguro de que quieres dejar este equipo?",
|
"exit_team": "¿Estás seguro de que quieres dejar este equipo?",
|
||||||
"logout": "¿Está seguro de que desea cerrar la sesión?",
|
"logout": "¿Estás seguro de que deseas cerrar la sesión?",
|
||||||
"remove_collection": "¿Está seguro de que desea eliminar esta colección de forma permanente?",
|
"remove_collection": "¿Estás seguro de que deseas eliminar esta colección de forma permanente?",
|
||||||
"remove_environment": "¿Está seguro de que desea eliminar este entorno de forma permanente?",
|
"remove_environment": "¿Estás seguro de que deseas eliminar este entorno de forma permanente?",
|
||||||
"remove_folder": "¿Está seguro de que desea eliminar esta carpeta de forma permanente?",
|
"remove_folder": "¿Estás seguro de que deseas eliminar esta carpeta de forma permanente?",
|
||||||
"remove_history": "¿Está seguro de que desea eliminar todo el historial de forma permanente?",
|
"remove_history": "¿Estás seguro de que deseas eliminar todo el historial de forma permanente?",
|
||||||
"remove_request": "¿Está seguro de que desea eliminar esta petición de forma permanente?",
|
"remove_request": "¿Estás seguro de que deseas eliminar esta solicitud de forma permanente?",
|
||||||
"remove_team": "¿Está seguro de que desea eliminar este equipo?",
|
"remove_team": "¿Estás seguro de que deseas eliminar este equipo?",
|
||||||
"remove_telemetry": "¿Está seguro de que desea darse de baja de la telemetría?",
|
"remove_telemetry": "¿Estás seguro de que deseas darse de baja de la telemetría?",
|
||||||
"request_change": "Are you sure you want to discard current request, unsaved changes will be lost.",
|
"request_change": "¿Estás seguro de que deseas descartar la solicitud actual, los cambios no guardados se perderán.",
|
||||||
"save_unsaved_tab": "Do you want to save changes made in this tab?",
|
"save_unsaved_tab": "¿Deseas guardar los cambios realizados en esta pestaña?",
|
||||||
"sync": "¿Está seguro de que desea sincronizar este espacio de trabajo?"
|
"sync": "¿Estás seguro de que deseas sincronizar este espacio de trabajo?"
|
||||||
},
|
},
|
||||||
"count": {
|
"count": {
|
||||||
"header": "Encabezado {count}",
|
"header": "Encabezado {count}",
|
||||||
@@ -163,28 +163,28 @@
|
|||||||
"generate_message": "Importar cualquier colección de Hoppscotch para generar documentación de la API sobre la marcha."
|
"generate_message": "Importar cualquier colección de Hoppscotch para generar documentación de la API sobre la marcha."
|
||||||
},
|
},
|
||||||
"empty": {
|
"empty": {
|
||||||
"authorization": "Esta petición no utiliza ninguna autorización.",
|
"authorization": "Esta solicitud no utiliza ninguna autorización.",
|
||||||
"body": "Esta petición no tiene cuerpo",
|
"body": "Esta solicitud no tiene cuerpo",
|
||||||
"collection": "La colección está vacía",
|
"collection": "La colección está vacía",
|
||||||
"collections": "Las colecciones están vacías",
|
"collections": "Las colecciones están vacías",
|
||||||
"documentation": "Conectarse a un punto final de GraphQL para ver la documentación",
|
"documentation": "Conectarse a un punto final de GraphQL para ver la documentación",
|
||||||
"endpoint": "El punto final no puede estar vacío",
|
"endpoint": "El punto final no puede estar vacío",
|
||||||
"environments": "Los entornos están vacíos",
|
"environments": "Los entornos están vacíos",
|
||||||
"folder": "La carpeta está vacía",
|
"folder": "La carpeta está vacía",
|
||||||
"headers": "Esta petición no tiene encabezados",
|
"headers": "Esta solicitud no tiene encabezados",
|
||||||
"history": "El historial está vacío",
|
"history": "El historial está vacío",
|
||||||
"invites": "La lista de invitados está vacía",
|
"invites": "La lista de invitados está vacía",
|
||||||
"members": "El equipo está vacío",
|
"members": "El equipo está vacío",
|
||||||
"parameters": "Esta petición no tiene ningún parámetro",
|
"parameters": "Esta solicitud no tiene ningún parámetro",
|
||||||
"pending_invites": "No hay invitaciones pendientes para este equipo",
|
"pending_invites": "No hay invitaciones pendientes para este equipo",
|
||||||
"profile": "Iniciar sesión para ver tu perfil",
|
"profile": "Iniciar sesión para ver tu perfil",
|
||||||
"protocols": "Los protocolos están vacíos",
|
"protocols": "Los protocolos están vacíos",
|
||||||
"schema": "Conectarse a un punto final de GraphQL",
|
"schema": "Conectarse a un punto final de GraphQL",
|
||||||
"shortcodes": "Los shortcodes están vacíos",
|
"shortcodes": "Aún no se han creado Shortcodes",
|
||||||
"subscription": "Subscriptions are empty",
|
"subscription": "Subscriptions are empty",
|
||||||
"team_name": "Nombre del equipo vacío",
|
"team_name": "Nombre del equipo vacío",
|
||||||
"teams": "Los equipos están vacíos",
|
"teams": "Los equipos están vacíos",
|
||||||
"tests": "No hay pruebas para esta petición"
|
"tests": "No hay pruebas para esta solicitud"
|
||||||
},
|
},
|
||||||
"environment": {
|
"environment": {
|
||||||
"add_to_global": "Añadir a Global",
|
"add_to_global": "Añadir a Global",
|
||||||
@@ -194,38 +194,38 @@
|
|||||||
"deleted": "Eliminar el entorno",
|
"deleted": "Eliminar el entorno",
|
||||||
"edit": "Editar entorno",
|
"edit": "Editar entorno",
|
||||||
"invalid_name": "Proporciona un nombre válido para el entorno.",
|
"invalid_name": "Proporciona un nombre válido para el entorno.",
|
||||||
"my_environments": "My Environments",
|
"my_environments": "Mis entornos",
|
||||||
"nested_overflow": "las variables de entorno anidadas están limitadas a 10 niveles",
|
"nested_overflow": "las variables de entorno anidadas están limitadas a 10 niveles",
|
||||||
"new": "Nuevo entorno",
|
"new": "Nuevo entorno",
|
||||||
"no_environment": "Sin entorno",
|
"no_environment": "Sin entorno",
|
||||||
"no_environment_description": "No se ha seleccionado ningún entorno. Elije qué hacer con las siguientes variables.",
|
"no_environment_description": "No se ha seleccionado ningún entorno. Elije qué hacer con las siguientes variables.",
|
||||||
"select": "Seleccionar entorno",
|
"select": "Seleccionar entorno",
|
||||||
"team_environments": "Team Environments",
|
"team_environments": "Entornos de trabajo en equipo",
|
||||||
"title": "Entornos",
|
"title": "Entornos",
|
||||||
"updated": "Actualización del entorno",
|
"updated": "Entorno actualizado",
|
||||||
"variable_list": "Lista de variables"
|
"variable_list": "Lista de variables"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"browser_support_sse": "Este navegador no parece ser compatible con los eventos enviados por el servidor.",
|
"browser_support_sse": "Este navegador no parece ser compatible con los eventos enviados por el servidor.",
|
||||||
"check_console_details": "Consulta el registro de la consola para obtener más detalles.",
|
"check_console_details": "Consulta el registro de la consola para obtener más detalles.",
|
||||||
"curl_invalid_format": "cURL no está formateado correctamente",
|
"curl_invalid_format": "cURL no está formateado correctamente",
|
||||||
"danger_zone": "Danger zone",
|
"danger_zone": "Zona de peligro",
|
||||||
"delete_account": "Your account is currently an owner in these teams:",
|
"delete_account": "Tu cuenta es actualmente propietaria en estos equipos:",
|
||||||
"delete_account_description": "You must either remove yourself, transfer ownership, or delete these teams before you can delete your account.",
|
"delete_account_description": "Para poder eliminar tu cuenta, debes darte de baja, transferir la propiedad o eliminar estos equipos.",
|
||||||
"empty_req_name": "Nombre de petición vacío",
|
"empty_req_name": "Nombre de solicitud vacío",
|
||||||
"f12_details": "(F12 para más detalles)",
|
"f12_details": "(F12 para más detalles)",
|
||||||
"gql_prettify_invalid_query": "No se puede aplicar embellecedor a una consulta no válida, resuelve los errores de sintaxis de la consulta y vuelve a intentarlo",
|
"gql_prettify_invalid_query": "No se puede aplicar embellecedor a una consulta no válida, resuelve los errores de sintaxis de la consulta y vuelve a intentarlo",
|
||||||
"incomplete_config_urls": "URLs de configuración incompletas",
|
"incomplete_config_urls": "URLs de configuración incompletas",
|
||||||
"incorrect_email": "Correo electrónico incorrecto",
|
"incorrect_email": "Correo electrónico incorrecto",
|
||||||
"invalid_link": "Enlace no válido",
|
"invalid_link": "Enlace no válido",
|
||||||
"invalid_link_description": "El enlace que has pulsado no es válido o ha caducado.",
|
"invalid_link_description": "El enlace que has pulsado no es válido o ha caducado.",
|
||||||
"json_parsing_failed": "Invalid JSON",
|
"json_parsing_failed": "JSON no válido",
|
||||||
"json_prettify_invalid_body": "No se puede aplicar embellecedor a un cuerpo inválido, resuelve errores de sintaxis json y vuelve a intentarlo",
|
"json_prettify_invalid_body": "No se puede aplicar embellecedor a un cuerpo inválido, resuelve errores de sintaxis json y vuelve a intentarlo",
|
||||||
"network_error": "Parece que hay un error de red. Por favor, inténtalo de nuevo.",
|
"network_error": "Parece que hay un error de red. Por favor, inténtalo de nuevo.",
|
||||||
"network_fail": "No se pudo enviar la petición",
|
"network_fail": "No se pudo enviar la solicitud",
|
||||||
"no_duration": "Sin duración",
|
"no_duration": "Sin duración",
|
||||||
"no_results_found": "No matches found",
|
"no_results_found": "No se han encontrado coincidencias",
|
||||||
"page_not_found": "This page could not be found",
|
"page_not_found": "No se ha podido encontrar esta página",
|
||||||
"script_fail": "No se pudo ejecutar el script de solicitud previa",
|
"script_fail": "No se pudo ejecutar el script de solicitud previa",
|
||||||
"something_went_wrong": "Algo salió mal",
|
"something_went_wrong": "Algo salió mal",
|
||||||
"test_script_fail": "No se ha podido ejecutar la secuencia de comandos posterior a la solicitud"
|
"test_script_fail": "No se ha podido ejecutar la secuencia de comandos posterior a la solicitud"
|
||||||
@@ -256,7 +256,7 @@
|
|||||||
"subscriptions": "Suscripciones"
|
"subscriptions": "Suscripciones"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"time": "Time",
|
"time": "Tiempo",
|
||||||
"url": "URL"
|
"url": "URL"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
@@ -265,19 +265,19 @@
|
|||||||
"save_workspace": "Guardar mi espacio de trabajo"
|
"save_workspace": "Guardar mi espacio de trabajo"
|
||||||
},
|
},
|
||||||
"helpers": {
|
"helpers": {
|
||||||
"authorization": "El encabezado de autorización se generará automáticamente cuando se envía la petición.",
|
"authorization": "El encabezado de autorización se generará automáticamente cuando se envía la solicitud.",
|
||||||
"generate_documentation_first": "Generar la documentación primero",
|
"generate_documentation_first": "Generar la documentación primero",
|
||||||
"network_fail": "No se puede acceder a la API. Comprueba tu conexión de red y vuelve a intentarlo.",
|
"network_fail": "No se puede acceder a la API. Comprueba tu conexión de red y vuelve a intentarlo.",
|
||||||
"offline": "Parece estar desconectado. Es posible que los datos de este espacio de trabajo no estén actualizados.",
|
"offline": "Parece estar desconectado. Es posible que los datos de este espacio de trabajo no estén actualizados.",
|
||||||
"offline_short": "Pareces estar desconectado.",
|
"offline_short": "Pareces estar desconectado.",
|
||||||
"post_request_tests": "Los scripts de prueba están escritos en JavaScript y se ejecutan después de recibir la respuesta.",
|
"post_request_tests": "Los scripts de prueba están escritos en JavaScript y se ejecutan después de recibir la respuesta.",
|
||||||
"pre_request_script": "Los scripts previos a la petición están escritos en JavaScript y se ejecutan antes de que se envíe la petición.",
|
"pre_request_script": "Los scripts previos a la solicitud están escritos en JavaScript y se ejecutan antes de que se envíe la solicitud.",
|
||||||
"script_fail": "Parece que hay un problema técnico en el script de solicitud previa. Comprueba el error a continuación y corrige el script en consecuencia.",
|
"script_fail": "Parece que hay un problema técnico en el script de solicitud previa. Comprueba el error a continuación y corrige el script en consecuencia.",
|
||||||
"test_script_fail": "Parece que hay un error con el script de prueba. Por favor, corrige los errores y ejecute las pruebas de nuevo",
|
"test_script_fail": "Parece que hay un error con el script de prueba. Por favor, corrige los errores y ejecute las pruebas de nuevo",
|
||||||
"tests": "Escribir un script de prueba para automatizar la depuración."
|
"tests": "Escribir un script de prueba para automatizar la depuración."
|
||||||
},
|
},
|
||||||
"hide": {
|
"hide": {
|
||||||
"collection": "Collapse Collection Panel",
|
"collection": "Colapsar el panel de colecciones",
|
||||||
"more": "Ocultar más",
|
"more": "Ocultar más",
|
||||||
"preview": "Ocultar vista previa",
|
"preview": "Ocultar vista previa",
|
||||||
"sidebar": "Ocultar barra lateral"
|
"sidebar": "Ocultar barra lateral"
|
||||||
@@ -308,40 +308,40 @@
|
|||||||
"title": "Importar"
|
"title": "Importar"
|
||||||
},
|
},
|
||||||
"layout": {
|
"layout": {
|
||||||
"collapse_collection": "Collapse or Expand Collections",
|
"collapse_collection": "Contraer o expandir colecciones",
|
||||||
"collapse_sidebar": "Collapse or Expand the sidebar",
|
"collapse_sidebar": "Contraer o expandir la barra lateral",
|
||||||
"column": "Disposición vertical",
|
"column": "Disposición vertical",
|
||||||
"name": "Layout",
|
"name": "Diseño",
|
||||||
"row": "Disposición horizontal",
|
"row": "Disposición horizontal",
|
||||||
"zen_mode": "Modo zen"
|
"zen_mode": "Modo zen"
|
||||||
},
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"close_unsaved_tab": "You have unsaved changes",
|
"close_unsaved_tab": "Tienes cambios sin guardar",
|
||||||
"collections": "Colecciones",
|
"collections": "Colecciones",
|
||||||
"confirm": "Confirmar",
|
"confirm": "Confirmar",
|
||||||
"edit_request": "Editar petición",
|
"edit_request": "Editar solicitud",
|
||||||
"import_export": "Importación y exportación"
|
"import_export": "Importación y exportación"
|
||||||
},
|
},
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
"already_subscribed": "You are already subscribed to this topic.",
|
"already_subscribed": "Ya estás suscrito a este tema.",
|
||||||
"clean_session": "Clean Session",
|
"clean_session": "Borrar sesión",
|
||||||
"clear_input": "Clear input",
|
"clear_input": "Borrar entrada",
|
||||||
"clear_input_on_send": "Clear input on send",
|
"clear_input_on_send": "Borrar entrada al enviar",
|
||||||
"client_id": "Client ID",
|
"client_id": "Identificación del cliente",
|
||||||
"color": "Pick a color",
|
"color": "Elige un color",
|
||||||
"communication": "Comunicación",
|
"communication": "Comunicación",
|
||||||
"connection_config": "Connection Config",
|
"connection_config": "Configuración de conexión",
|
||||||
"connection_not_authorized": "This MQTT connection does not use any authentication.",
|
"connection_not_authorized": "Esta conexión MQTT no utiliza ninguna autenticación.",
|
||||||
"invalid_topic": "Please provide a topic for the subscription",
|
"invalid_topic": "Indica un tema para la suscripción",
|
||||||
"keep_alive": "Keep Alive",
|
"keep_alive": "Mantenerse vivo",
|
||||||
"log": "Registro",
|
"log": "Registro",
|
||||||
"lw_message": "Last-Will Message",
|
"lw_message": "Mensaje de última voluntad",
|
||||||
"lw_qos": "Last-Will QoS",
|
"lw_qos": "QoS de última voluntad",
|
||||||
"lw_retain": "Last-Will Retain",
|
"lw_retain": "Última voluntad",
|
||||||
"lw_topic": "Last-Will Topic",
|
"lw_topic": "Tema de última voluntad",
|
||||||
"message": "Mensaje",
|
"message": "Mensaje",
|
||||||
"new": "New Subscription",
|
"new": "Nueva suscripción",
|
||||||
"not_connected": "Please start a MQTT connection first.",
|
"not_connected": "Por favor, inicia primero una conexión MQTT.",
|
||||||
"publish": "Publicar",
|
"publish": "Publicar",
|
||||||
"qos": "QoS",
|
"qos": "QoS",
|
||||||
"ssl": "SSL",
|
"ssl": "SSL",
|
||||||
@@ -353,7 +353,7 @@
|
|||||||
"url": "URL"
|
"url": "URL"
|
||||||
},
|
},
|
||||||
"navigation": {
|
"navigation": {
|
||||||
"doc": "Docs",
|
"doc": "Documentación",
|
||||||
"graphql": "GraphQL",
|
"graphql": "GraphQL",
|
||||||
"profile": "Perfil",
|
"profile": "Perfil",
|
||||||
"realtime": "Tiempo real",
|
"realtime": "Tiempo real",
|
||||||
@@ -363,7 +363,7 @@
|
|||||||
"preRequest": {
|
"preRequest": {
|
||||||
"javascript_code": "Código JavaScript",
|
"javascript_code": "Código JavaScript",
|
||||||
"learn": "Leer documentación",
|
"learn": "Leer documentación",
|
||||||
"script": "Script previo a la petición",
|
"script": "Script previo a la solicitud",
|
||||||
"snippets": "Fragmentos"
|
"snippets": "Fragmentos"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
@@ -385,55 +385,55 @@
|
|||||||
"star": "Eliminar estrella"
|
"star": "Eliminar estrella"
|
||||||
},
|
},
|
||||||
"request": {
|
"request": {
|
||||||
"added": "Petición agregada",
|
"added": "Solicitud agregada",
|
||||||
"authorization": "Autorización",
|
"authorization": "Autorización",
|
||||||
"body": "Cuerpo de la petición",
|
"body": "Cuerpo de la solicitud",
|
||||||
"choose_language": "Seleccionar lenguaje",
|
"choose_language": "Seleccionar lenguaje",
|
||||||
"content_type": "Tipo de contenido",
|
"content_type": "Tipo de contenido",
|
||||||
"content_type_titles": {
|
"content_type_titles": {
|
||||||
"others": "Others",
|
"others": "Otros",
|
||||||
"structured": "Structured",
|
"structured": "Estructurado",
|
||||||
"text": "Text"
|
"text": "Texto"
|
||||||
},
|
},
|
||||||
"copy_link": "Copiar enlace",
|
"copy_link": "Copiar enlace",
|
||||||
"different_collection": "Cannot reorder requests from different collections",
|
"different_collection": "No se pueden reordenar solicitudes de diferentes colecciones",
|
||||||
"duplicated": "Request duplicated",
|
"duplicated": "Solicitud duplicada",
|
||||||
"duration": "Duración",
|
"duration": "Duración",
|
||||||
"enter_curl": "Ingrese cURL",
|
"enter_curl": "Ingrese cURL",
|
||||||
"generate_code": "Generar código",
|
"generate_code": "Generar código",
|
||||||
"generated_code": "Código generado",
|
"generated_code": "Código generado",
|
||||||
"header_list": "Lista de encabezados",
|
"header_list": "Lista de encabezados",
|
||||||
"invalid_name": "Proporciona un nombre para la petición.",
|
"invalid_name": "Proporciona un nombre para la solicitud.",
|
||||||
"method": "Método",
|
"method": "Método",
|
||||||
"moved": "Request moved",
|
"moved": "Request moved",
|
||||||
"name": "Nombre de petición",
|
"name": "Nombre de solicitud",
|
||||||
"new": "New Request",
|
"new": "Nueva solicitud",
|
||||||
"order_changed": "Request Order Updated",
|
"order_changed": "Orden de solicitudes actualizadas",
|
||||||
"override": "Override",
|
"override": "Anular",
|
||||||
"override_help": "Set <kbd>Content-Type</kbd> in Headers",
|
"override_help": "Establecer <kbd>Content-Type</kbd> en las cabeceras",
|
||||||
"overriden": "Overridden",
|
"overriden": "Anulado",
|
||||||
"parameter_list": "Parámetros de consulta",
|
"parameter_list": "Parámetros de consulta",
|
||||||
"parameters": "Parámetros",
|
"parameters": "Parámetros",
|
||||||
"path": "Ruta",
|
"path": "Ruta",
|
||||||
"payload": "Carga útil",
|
"payload": "Carga útil",
|
||||||
"query": "Consulta",
|
"query": "Consulta",
|
||||||
"raw_body": "Cuerpo de petición sin procesar",
|
"raw_body": "Cuerpo de solicitud sin procesar",
|
||||||
"renamed": "Petición renombrada",
|
"renamed": "Solicitud renombrada",
|
||||||
"run": "Ejecutar",
|
"run": "Ejecutar",
|
||||||
"save": "Guardar",
|
"save": "Guardar",
|
||||||
"save_as": "Guardar como",
|
"save_as": "Guardar como",
|
||||||
"saved": "Petición guardada",
|
"saved": "Solicitud guardada",
|
||||||
"share": "Compartir",
|
"share": "Compartir",
|
||||||
"share_description": "Share Hoppscotch with your friends",
|
"share_description": "Comparte Hoppscotch con tus amigos",
|
||||||
"title": "Petición",
|
"title": "Solicitud",
|
||||||
"type": "Tipo de petición",
|
"type": "Tipo de solicitud",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"variables": "Variables",
|
"variables": "Variables",
|
||||||
"view_my_links": "Ver mis enlaces"
|
"view_my_links": "Ver mis enlaces"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"body": "Cuerpo de respuesta",
|
"body": "Cuerpo de respuesta",
|
||||||
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)",
|
"filter_response_body": "Filtrar el cuerpo de la respuesta JSON (utiliza la sintaxis JSONPath)",
|
||||||
"headers": "Encabezados",
|
"headers": "Encabezados",
|
||||||
"html": "HTML",
|
"html": "HTML",
|
||||||
"image": "Imagen",
|
"image": "Imagen",
|
||||||
@@ -451,7 +451,7 @@
|
|||||||
"settings": {
|
"settings": {
|
||||||
"accent_color": "Color de acentuación",
|
"accent_color": "Color de acentuación",
|
||||||
"account": "Cuenta",
|
"account": "Cuenta",
|
||||||
"account_deleted": "Your account has been deleted",
|
"account_deleted": "Tu cuenta ha sido eliminada",
|
||||||
"account_description": "Personaliza la configuración de tu cuenta.",
|
"account_description": "Personaliza la configuración de tu cuenta.",
|
||||||
"account_email_description": "Tu dirección de correo electrónico principal.",
|
"account_email_description": "Tu dirección de correo electrónico principal.",
|
||||||
"account_name_description": "Este es tu nombre para mostrar.",
|
"account_name_description": "Este es tu nombre para mostrar.",
|
||||||
@@ -460,8 +460,8 @@
|
|||||||
"change_font_size": "Cambiar tamaño de fuente",
|
"change_font_size": "Cambiar tamaño de fuente",
|
||||||
"choose_language": "Elegir idioma",
|
"choose_language": "Elegir idioma",
|
||||||
"dark_mode": "Oscuro",
|
"dark_mode": "Oscuro",
|
||||||
"delete_account": "Delete account",
|
"delete_account": "Eliminar cuenta",
|
||||||
"delete_account_description": "Once you delete your account, all your data will be permanently deleted. This action cannot be undone.",
|
"delete_account_description": "Una vez que elimines tu cuenta, todos tus datos se borrarán permanentemente. Esta acción no se puede deshacer.",
|
||||||
"expand_navigation": "Expandir la navegación",
|
"expand_navigation": "Expandir la navegación",
|
||||||
"experiments": "Experimentos",
|
"experiments": "Experimentos",
|
||||||
"experiments_notice": "Esta es una colección de experimentos en los que estamos trabajando que podrían resultar útiles, divertidos, ambos o ninguno. No son definitivos y es posible que no sean estables, por lo que si sucede algo demasiado extraño, no se asuste. Solo apaga la maldita cosa. Fuera de bromas,",
|
"experiments_notice": "Esta es una colección de experimentos en los que estamos trabajando que podrían resultar útiles, divertidos, ambos o ninguno. No son definitivos y es posible que no sean estables, por lo que si sucede algo demasiado extraño, no se asuste. Solo apaga la maldita cosa. Fuera de bromas,",
|
||||||
@@ -480,7 +480,7 @@
|
|||||||
"light_mode": "Luz",
|
"light_mode": "Luz",
|
||||||
"official_proxy_hosting": "El proxy oficial está alojado en Hoppscotch.",
|
"official_proxy_hosting": "El proxy oficial está alojado en Hoppscotch.",
|
||||||
"profile": "Perfil",
|
"profile": "Perfil",
|
||||||
"profile_description": "Update your profile details",
|
"profile_description": "Actualiza los datos de tu perfil",
|
||||||
"profile_email": "Correo electrónico",
|
"profile_email": "Correo electrónico",
|
||||||
"profile_name": "Nombre de perfil",
|
"profile_name": "Nombre de perfil",
|
||||||
"proxy": "Proxy",
|
"proxy": "Proxy",
|
||||||
@@ -488,8 +488,8 @@
|
|||||||
"proxy_use_toggle": "Utilizar el middleware de proxy para enviar peticiones",
|
"proxy_use_toggle": "Utilizar el middleware de proxy para enviar peticiones",
|
||||||
"read_the": "Leer el",
|
"read_the": "Leer el",
|
||||||
"reset_default": "Restablecer a los predeterminados",
|
"reset_default": "Restablecer a los predeterminados",
|
||||||
"short_codes": "Short codes",
|
"short_codes": "Shortcodes",
|
||||||
"short_codes_description": "Short codes which were created by you.",
|
"short_codes_description": "Shortcodes creados por ti.",
|
||||||
"sidebar_on_left": "Barra lateral a la izquierda",
|
"sidebar_on_left": "Barra lateral a la izquierda",
|
||||||
"sync": "Sincronizar",
|
"sync": "Sincronizar",
|
||||||
"sync_collections": "Colecciones",
|
"sync_collections": "Colecciones",
|
||||||
@@ -503,15 +503,15 @@
|
|||||||
"theme_description": "Personaliza el tema de tu aplicación.",
|
"theme_description": "Personaliza el tema de tu aplicación.",
|
||||||
"use_experimental_url_bar": "Utilizar la barra de URL experimental con resaltado de entorno",
|
"use_experimental_url_bar": "Utilizar la barra de URL experimental con resaltado de entorno",
|
||||||
"user": "Usuario",
|
"user": "Usuario",
|
||||||
"verified_email": "Verified email",
|
"verified_email": "Correo electrónico verificado",
|
||||||
"verify_email": "Verificar correo electrónico"
|
"verify_email": "Verificar correo electrónico"
|
||||||
},
|
},
|
||||||
"shortcodes": {
|
"shortcodes": {
|
||||||
"actions": "Actions",
|
"actions": "Acciones",
|
||||||
"created_on": "Created on",
|
"created_on": "Creado el",
|
||||||
"deleted": "Shortcode deleted",
|
"deleted": "Código corto eliminado",
|
||||||
"method": "Method",
|
"method": "Método",
|
||||||
"not_found": "Shortcode not found",
|
"not_found": "Shortcode no encontrado",
|
||||||
"short_code": "Short code",
|
"short_code": "Short code",
|
||||||
"url": "URL"
|
"url": "URL"
|
||||||
},
|
},
|
||||||
@@ -539,7 +539,7 @@
|
|||||||
"title": "Navegación"
|
"title": "Navegación"
|
||||||
},
|
},
|
||||||
"request": {
|
"request": {
|
||||||
"copy_request_link": "Copiar enlace de petición",
|
"copy_request_link": "Copiar enlace de solicitud",
|
||||||
"delete_method": "Seleccionar método DELETE",
|
"delete_method": "Seleccionar método DELETE",
|
||||||
"get_method": "Seleccionar método GET",
|
"get_method": "Seleccionar método GET",
|
||||||
"head_method": "Seleccionar método HEAD",
|
"head_method": "Seleccionar método HEAD",
|
||||||
@@ -548,10 +548,10 @@
|
|||||||
"post_method": "Seleccionar método POST",
|
"post_method": "Seleccionar método POST",
|
||||||
"previous_method": "Seleccionar método anterior",
|
"previous_method": "Seleccionar método anterior",
|
||||||
"put_method": "Seleccionar método PUT",
|
"put_method": "Seleccionar método PUT",
|
||||||
"reset_request": "Petición de reinicio",
|
"reset_request": "Solicitud de reinicio",
|
||||||
"save_to_collections": "Guardar en colecciones",
|
"save_to_collections": "Guardar en colecciones",
|
||||||
"send_request": "Enviar petición",
|
"send_request": "Enviar solicitud",
|
||||||
"title": "Petición"
|
"title": "Solicitud"
|
||||||
},
|
},
|
||||||
"response": {
|
"response": {
|
||||||
"copy": "Copiar la respuesta al portapapeles",
|
"copy": "Copiar la respuesta al portapapeles",
|
||||||
@@ -593,8 +593,8 @@
|
|||||||
"connected_to": "Conectado a {name}",
|
"connected_to": "Conectado a {name}",
|
||||||
"connecting_to": "Conectando con {name}...",
|
"connecting_to": "Conectando con {name}...",
|
||||||
"connection_error": "Failed to connect",
|
"connection_error": "Failed to connect",
|
||||||
"connection_failed": "Connection failed",
|
"connection_failed": "Error de conexión",
|
||||||
"connection_lost": "Connection lost",
|
"connection_lost": "Conexión perdida",
|
||||||
"copied_to_clipboard": "Copiado al portapapeles",
|
"copied_to_clipboard": "Copiado al portapapeles",
|
||||||
"deleted": "Eliminado",
|
"deleted": "Eliminado",
|
||||||
"deprecated": "OBSOLETO",
|
"deprecated": "OBSOLETO",
|
||||||
@@ -609,18 +609,18 @@
|
|||||||
"history_deleted": "Historial eliminado",
|
"history_deleted": "Historial eliminado",
|
||||||
"linewrap": "Envolver líneas",
|
"linewrap": "Envolver líneas",
|
||||||
"loading": "Cargando...",
|
"loading": "Cargando...",
|
||||||
"message_received": "Message: {message} arrived on topic: {topic}",
|
"message_received": "Mensaje: {mensaje} llegó sobre el tema: {topic}",
|
||||||
"mqtt_subscription_failed": "Something went wrong while subscribing to topic: {topic}",
|
"mqtt_subscription_failed": "Algo ha ido mal al suscribirse al tema: {topic}",
|
||||||
"none": "Ninguno",
|
"none": "Ninguno",
|
||||||
"nothing_found": "Nada encontrado para",
|
"nothing_found": "Nada encontrado para",
|
||||||
"published_error": "Something went wrong while publishing msg: {topic} to topic: {message}",
|
"published_error": "Algo ha ido mal al publicar el mensaje: {topic} al tema: {message}",
|
||||||
"published_message": "Published message: {message} to topic: {topic}",
|
"published_message": "Mensaje publicado: {mensaje} al tema: {topic}",
|
||||||
"reconnection_error": "Failed to reconnect",
|
"reconnection_error": "Fallo en la reconexión",
|
||||||
"subscribed_failed": "Failed to subscribe to topic: {topic}",
|
"subscribed_failed": "Error al suscribirse al tema: {topic}",
|
||||||
"subscribed_success": "Successfully subscribed to topic: {topic}",
|
"subscribed_success": "Suscrito con éxito al tema: {topic}",
|
||||||
"unsubscribed_failed": "Failed to unsubscribe from topic: {topic}",
|
"unsubscribed_failed": "Error al darse de baja del tema: {topic}",
|
||||||
"unsubscribed_success": "Successfully unsubscribed from topic: {topic}",
|
"unsubscribed_success": "Se ha cancelado la suscripción al tema: {topic}",
|
||||||
"waiting_send_request": "Esperando para enviar petición"
|
"waiting_send_request": "Esperando para enviar solicitud"
|
||||||
},
|
},
|
||||||
"support": {
|
"support": {
|
||||||
"changelog": "Leer más sobre los últimos lanzamientos",
|
"changelog": "Leer más sobre los últimos lanzamientos",
|
||||||
@@ -644,7 +644,7 @@
|
|||||||
"history": "Historial",
|
"history": "Historial",
|
||||||
"mqtt": "MQTT",
|
"mqtt": "MQTT",
|
||||||
"parameters": "Parámetros",
|
"parameters": "Parámetros",
|
||||||
"pre_request_script": "Script previo a la petición",
|
"pre_request_script": "Script previo a la solicitud",
|
||||||
"queries": "Consultas",
|
"queries": "Consultas",
|
||||||
"query": "Consulta",
|
"query": "Consulta",
|
||||||
"schema": "Esquema",
|
"schema": "Esquema",
|
||||||
@@ -664,9 +664,9 @@
|
|||||||
"email_do_not_match": "El correo electrónico no coincide con los datos de tu cuenta. Ponte en contacto con el propietario de tu equipo.",
|
"email_do_not_match": "El correo electrónico no coincide con los datos de tu cuenta. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"exit": "Salir del equipo",
|
"exit": "Salir del equipo",
|
||||||
"exit_disabled": "Solo el propietario puede salir del equipo",
|
"exit_disabled": "Solo el propietario puede salir del equipo",
|
||||||
"invalid_coll_id": "Invalid collection ID",
|
"invalid_coll_id": "Identificador de colección no válido",
|
||||||
"invalid_email_format": "El formato de correo electrónico no es válido",
|
"invalid_email_format": "El formato de correo electrónico no es válido",
|
||||||
"invalid_id": "ID de equipo inválido. Ponte en contacto con el propietario de tu equipo.",
|
"invalid_id": "Identificador de equipo inválido. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"invalid_invite_link": "Enlace de invitación inválido",
|
"invalid_invite_link": "Enlace de invitación inválido",
|
||||||
"invalid_invite_link_description": "El enlace que has seguido no es válido. Ponte en contacto con el propietario de tu equipo.",
|
"invalid_invite_link_description": "El enlace que has seguido no es válido. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"invalid_member_permission": "Proporcionar un permiso válido al miembro del equipo",
|
"invalid_member_permission": "Proporcionar un permiso válido al miembro del equipo",
|
||||||
@@ -683,7 +683,7 @@
|
|||||||
"login_to_continue": "Iniciar sesión para continuar",
|
"login_to_continue": "Iniciar sesión para continuar",
|
||||||
"login_to_continue_description": "Tienes que estar conectado para unirte a un equipo.",
|
"login_to_continue_description": "Tienes que estar conectado para unirte a un equipo.",
|
||||||
"logout_and_try_again": "Cerrar la sesión e iniciar sesión con otra cuenta",
|
"logout_and_try_again": "Cerrar la sesión e iniciar sesión con otra cuenta",
|
||||||
"member_has_invite": "Este ID de correo electrónico ya tiene una invitación. Ponte en contacto con el propietario de tu equipo.",
|
"member_has_invite": "Este Identificador de correo electrónico ya tiene una invitación. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"member_not_found": "Miembro no encontrado. Ponte en contacto con el propietario de tu equipo.",
|
"member_not_found": "Miembro no encontrado. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"member_removed": "Usuario eliminado",
|
"member_removed": "Usuario eliminado",
|
||||||
"member_role_updated": "Funciones de usuario actualizadas",
|
"member_role_updated": "Funciones de usuario actualizadas",
|
||||||
@@ -696,10 +696,10 @@
|
|||||||
"new_name": "Mi nuevo equipo",
|
"new_name": "Mi nuevo equipo",
|
||||||
"no_access": "No tienes acceso de edición a estas colecciones.",
|
"no_access": "No tienes acceso de edición a estas colecciones.",
|
||||||
"no_invite_found": "No se ha encontrado la invitación. Ponte en contacto con el propietario de tu equipo.",
|
"no_invite_found": "No se ha encontrado la invitación. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"no_request_found": "Request not found.",
|
"no_request_found": "Solicitud no encontrada.",
|
||||||
"not_found": "Equipo no encontrado. Ponte en contacto con el propietario de tu equipo.",
|
"not_found": "Equipo no encontrado. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"not_valid_viewer": "No eres un espectador válido. Ponte en contacto con el propietario de tu equipo.",
|
"not_valid_viewer": "No eres un espectador válido. Ponte en contacto con el propietario de tu equipo.",
|
||||||
"parent_coll_move": "Cannot move collection to a child collection",
|
"parent_coll_move": "No se puede mover la colección a una colección hija",
|
||||||
"pending_invites": "Invitaciones pendientes",
|
"pending_invites": "Invitaciones pendientes",
|
||||||
"permissions": "Permisos",
|
"permissions": "Permisos",
|
||||||
"same_target_destination": "Same target and destination",
|
"same_target_destination": "Same target and destination",
|
||||||
@@ -707,12 +707,12 @@
|
|||||||
"select_a_team": "Seleccionar un equipo",
|
"select_a_team": "Seleccionar un equipo",
|
||||||
"title": "Equipos",
|
"title": "Equipos",
|
||||||
"we_sent_invite_link": "¡Hemos enviado un enlace de invitación a todos los invitados!",
|
"we_sent_invite_link": "¡Hemos enviado un enlace de invitación a todos los invitados!",
|
||||||
"we_sent_invite_link_description": "Pide a todos los invitados que revisen su bandeja de entrada. Haz clic en el enlace para unirse al equipo."
|
"we_sent_invite_link_description": "Pide a todos los invitados que revisen tu bandeja de entrada. Haz clic en el enlace para unirse al equipo."
|
||||||
},
|
},
|
||||||
"team_environment": {
|
"team_environment": {
|
||||||
"deleted": "Environment Deleted",
|
"deleted": "Entorno eliminado",
|
||||||
"duplicate": "Environment Duplicated",
|
"duplicate": "Entorno duplicado",
|
||||||
"not_found": "Environment not found."
|
"not_found": "Entorno no encontrado."
|
||||||
},
|
},
|
||||||
"test": {
|
"test": {
|
||||||
"failed": "prueba fallida",
|
"failed": "prueba fallida",
|
||||||
@@ -732,9 +732,9 @@
|
|||||||
"url": "URL"
|
"url": "URL"
|
||||||
},
|
},
|
||||||
"workspace": {
|
"workspace": {
|
||||||
"change": "Change workspace",
|
"change": "Cambiar el espacio de trabajo",
|
||||||
"personal": "My Workspace",
|
"personal": "Mi espacio de trabajo",
|
||||||
"team": "Team Workspace",
|
"team": "Espacio de trabajo en equipo",
|
||||||
"title": "Workspaces"
|
"title": "Espacios de trabajo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ export const APP_INFO = {
|
|||||||
keywords:
|
keywords:
|
||||||
"hoppscotch, hopp scotch, hoppscotch online, hoppscotch app, postwoman, postwoman chrome, postwoman online, postwoman for mac, postwoman app, postwoman for windows, postwoman google chrome, postwoman chrome app, get postwoman, postwoman web, postwoman android, postwoman app for chrome, postwoman mobile app, postwoman web app, api, request, testing, tool, rest, websocket, sse, graphql, socketio",
|
"hoppscotch, hopp scotch, hoppscotch online, hoppscotch app, postwoman, postwoman chrome, postwoman online, postwoman for mac, postwoman app, postwoman for windows, postwoman google chrome, postwoman chrome app, get postwoman, postwoman web, postwoman android, postwoman app for chrome, postwoman mobile app, postwoman web app, api, request, testing, tool, rest, websocket, sse, graphql, socketio",
|
||||||
app: {
|
app: {
|
||||||
background: "#202124",
|
background: "#181818",
|
||||||
|
lightThemeColor: "#ffffff",
|
||||||
|
darkThemeColor: "#181818",
|
||||||
},
|
},
|
||||||
social: {
|
social: {
|
||||||
twitter: "@hoppscotch_io",
|
twitter: "@hoppscotch_io",
|
||||||
@@ -108,7 +110,17 @@ export const META_TAGS = (env: Record<string, string>): IHTMLTag[] => [
|
|||||||
// PWA
|
// PWA
|
||||||
{
|
{
|
||||||
name: "theme-color",
|
name: "theme-color",
|
||||||
content: APP_INFO.app.background,
|
content: APP_INFO.app.darkThemeColor,
|
||||||
|
media: "(prefers-color-scheme: dark)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "theme-color",
|
||||||
|
content: APP_INFO.app.lightThemeColor,
|
||||||
|
media: "(prefers-color-scheme: light)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "supported-color-schemes",
|
||||||
|
content: "light dark",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "mask-icon",
|
name: "mask-icon",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@hoppscotch/common",
|
"name": "@hoppscotch/common",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2023.4.2",
|
"version": "2023.4.3",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
||||||
"dev:vite": "vite",
|
"dev:vite": "vite",
|
||||||
@@ -92,6 +92,7 @@
|
|||||||
"vuedraggable-es": "^4.1.1",
|
"vuedraggable-es": "^4.1.1",
|
||||||
"wonka": "^4.0.15",
|
"wonka": "^4.0.15",
|
||||||
"workbox-window": "^6.5.4",
|
"workbox-window": "^6.5.4",
|
||||||
|
"xml-formatter": "^3.4.1",
|
||||||
"yargs-parser": "^21.1.1"
|
"yargs-parser": "^21.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
BIN
packages/hoppscotch-common/public/icons/pwa-1024x1024.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
packages/hoppscotch-common/public/icons/pwa-128x128.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
packages/hoppscotch-common/public/icons/pwa-16x16.png
Normal file
|
After Width: | Height: | Size: 400 B |
BIN
packages/hoppscotch-common/public/icons/pwa-192x192.png
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
packages/hoppscotch-common/public/icons/pwa-256x256.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
packages/hoppscotch-common/public/icons/pwa-32x32.png
Normal file
|
After Width: | Height: | Size: 871 B |
BIN
packages/hoppscotch-common/public/icons/pwa-512x512.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
@@ -131,7 +131,6 @@ declare module '@vue/runtime-core' {
|
|||||||
IconLucideListEnd: typeof import('~icons/lucide/list-end')['default']
|
IconLucideListEnd: typeof import('~icons/lucide/list-end')['default']
|
||||||
IconLucideMinus: typeof import('~icons/lucide/minus')['default']
|
IconLucideMinus: typeof import('~icons/lucide/minus')['default']
|
||||||
IconLucideSearch: typeof import('~icons/lucide/search')['default']
|
IconLucideSearch: typeof import('~icons/lucide/search')['default']
|
||||||
IconLucideUser: typeof import('~icons/lucide/user')['default']
|
|
||||||
IconLucideUsers: typeof import('~icons/lucide/users')['default']
|
IconLucideUsers: typeof import('~icons/lucide/users')['default']
|
||||||
LensesHeadersRenderer: typeof import('./components/lenses/HeadersRenderer.vue')['default']
|
LensesHeadersRenderer: typeof import('./components/lenses/HeadersRenderer.vue')['default']
|
||||||
LensesHeadersRendererEntry: typeof import('./components/lenses/HeadersRendererEntry.vue')['default']
|
LensesHeadersRendererEntry: typeof import('./components/lenses/HeadersRendererEntry.vue')['default']
|
||||||
@@ -142,7 +141,6 @@ declare module '@vue/runtime-core' {
|
|||||||
LensesRenderersRawLensRenderer: typeof import('./components/lenses/renderers/RawLensRenderer.vue')['default']
|
LensesRenderersRawLensRenderer: typeof import('./components/lenses/renderers/RawLensRenderer.vue')['default']
|
||||||
LensesRenderersXMLLensRenderer: typeof import('./components/lenses/renderers/XMLLensRenderer.vue')['default']
|
LensesRenderersXMLLensRenderer: typeof import('./components/lenses/renderers/XMLLensRenderer.vue')['default']
|
||||||
LensesResponseBodyRenderer: typeof import('./components/lenses/ResponseBodyRenderer.vue')['default']
|
LensesResponseBodyRenderer: typeof import('./components/lenses/ResponseBodyRenderer.vue')['default']
|
||||||
ProfilePicture: typeof import('./components/profile/Picture.vue')['default']
|
|
||||||
ProfileShortcode: typeof import('./components/profile/Shortcode.vue')['default']
|
ProfileShortcode: typeof import('./components/profile/Shortcode.vue')['default']
|
||||||
ProfileShortcodes: typeof import('./components/profile/Shortcodes.vue')['default']
|
ProfileShortcodes: typeof import('./components/profile/Shortcodes.vue')['default']
|
||||||
ProfileUserDelete: typeof import('./components/profile/UserDelete.vue')['default']
|
ProfileUserDelete: typeof import('./components/profile/UserDelete.vue')['default']
|
||||||
|
|||||||
@@ -42,9 +42,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, watch } from "vue"
|
|
||||||
import { useI18n } from "@composables/i18n"
|
import { useI18n } from "@composables/i18n"
|
||||||
import { useToast } from "@composables/toast"
|
import { useToast } from "@composables/toast"
|
||||||
|
import { useVModel } from "@vueuse/core"
|
||||||
|
|
||||||
const toast = useToast()
|
const toast = useToast()
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
@@ -53,28 +53,22 @@ const props = withDefaults(
|
|||||||
defineProps<{
|
defineProps<{
|
||||||
show: boolean
|
show: boolean
|
||||||
loadingState: boolean
|
loadingState: boolean
|
||||||
editingRequestName: string
|
modelValue?: string
|
||||||
}>(),
|
}>(),
|
||||||
{
|
{
|
||||||
show: false,
|
show: false,
|
||||||
loadingState: false,
|
loadingState: false,
|
||||||
editingRequestName: "",
|
modelValue: "",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
(e: "submit", name: string): void
|
(e: "submit", name: string): void
|
||||||
(e: "hide-modal"): void
|
(e: "hide-modal"): void
|
||||||
|
(e: "update:modelValue", value: string): void
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
const name = ref("")
|
const name = useVModel(props, "modelValue")
|
||||||
|
|
||||||
watch(
|
|
||||||
() => props.editingRequestName,
|
|
||||||
(newName) => {
|
|
||||||
name.value = newName
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
const editRequest = () => {
|
const editRequest = () => {
|
||||||
if (name.value.trim() === "") {
|
if (name.value.trim() === "") {
|
||||||
|
|||||||
@@ -126,7 +126,7 @@
|
|||||||
/>
|
/>
|
||||||
<CollectionsEditRequest
|
<CollectionsEditRequest
|
||||||
:show="showModalEditRequest"
|
:show="showModalEditRequest"
|
||||||
:editing-request-name="editingRequest ? editingRequest.name : ''"
|
v-bind:model-value="editingRequest ? editingRequest.name : ''"
|
||||||
:loading-state="modalLoadingState"
|
:loading-state="modalLoadingState"
|
||||||
@submit="updateEditingRequest"
|
@submit="updateEditingRequest"
|
||||||
@hide-modal="displayModalEditRequest(false)"
|
@hide-modal="displayModalEditRequest(false)"
|
||||||
|
|||||||
@@ -36,13 +36,12 @@
|
|||||||
? IconCheck
|
? IconCheck
|
||||||
: undefined
|
: undefined
|
||||||
"
|
"
|
||||||
class="my-2"
|
|
||||||
:active-info-icon="
|
:active-info-icon="
|
||||||
selectedEnvironmentIndex.type === 'NO_ENV_SELECTED'
|
selectedEnvironmentIndex.type === 'NO_ENV_SELECTED'
|
||||||
"
|
"
|
||||||
@click="
|
@click="
|
||||||
() => {
|
() => {
|
||||||
setSelectedEnvironmentIndex({ type: 'NO_ENV_SELECTED' })
|
selectedEnvironmentIndex = { type: 'NO_ENV_SELECTED' }
|
||||||
hide()
|
hide()
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ const switchToMyEnvironments = () => {
|
|||||||
adapter.changeTeamID(undefined)
|
adapter.changeTeamID(undefined)
|
||||||
}
|
}
|
||||||
|
|
||||||
const updateSelectedTeam = (newSelectedTeam: SelectedTeam) => {
|
const updateSelectedTeam = (newSelectedTeam: SelectedTeam | undefined) => {
|
||||||
if (newSelectedTeam) {
|
if (newSelectedTeam) {
|
||||||
environmentType.value.selectedTeam = newSelectedTeam
|
environmentType.value.selectedTeam = newSelectedTeam
|
||||||
REMEMBERED_TEAM_ID.value = newSelectedTeam.id
|
REMEMBERED_TEAM_ID.value = newSelectedTeam.id
|
||||||
@@ -150,25 +150,23 @@ const workspace = useReadonlyStream(workspaceStatus$, { type: "personal" })
|
|||||||
// Used to switch environment type and team when user switch workspace in the global workspace switcher
|
// Used to switch environment type and team when user switch workspace in the global workspace switcher
|
||||||
// Check if there is a teamID in the workspace, if yes, switch to team environment and select the team
|
// Check if there is a teamID in the workspace, if yes, switch to team environment and select the team
|
||||||
// If there is no teamID, switch to my environment
|
// If there is no teamID, switch to my environment
|
||||||
watch(
|
watch(workspace, (newWorkspace) => {
|
||||||
() => workspace.value.type === "team" && workspace.value.teamID,
|
if (newWorkspace.type === "personal") {
|
||||||
(teamID) => {
|
switchToMyEnvironments()
|
||||||
if (!teamID) {
|
setSelectedEnvironmentIndex({
|
||||||
switchToMyEnvironments()
|
type: "NO_ENV_SELECTED",
|
||||||
|
})
|
||||||
|
} else if (newWorkspace.type === "team") {
|
||||||
|
const team = myTeams.value?.find((t) => t.id === newWorkspace.teamID)
|
||||||
|
updateSelectedTeam(team)
|
||||||
|
|
||||||
|
if (selectedEnvironmentIndex.value.type !== "MY_ENV") {
|
||||||
setSelectedEnvironmentIndex({
|
setSelectedEnvironmentIndex({
|
||||||
type: "NO_ENV_SELECTED",
|
type: "NO_ENV_SELECTED",
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
const team = myTeams.value?.find((t) => t.id === teamID)
|
|
||||||
if (team) {
|
|
||||||
updateSelectedTeam(team)
|
|
||||||
setSelectedEnvironmentIndex({
|
|
||||||
type: "NO_ENV_SELECTED",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
})
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => currentUser.value,
|
() => currentUser.value,
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ import { useToast } from "@composables/toast"
|
|||||||
import { isJSONContentType } from "~/helpers/utils/contenttypes"
|
import { isJSONContentType } from "~/helpers/utils/contenttypes"
|
||||||
import jsonLinter from "~/helpers/editor/linting/json"
|
import jsonLinter from "~/helpers/editor/linting/json"
|
||||||
import { readFileAsText } from "~/helpers/functional/files"
|
import { readFileAsText } from "~/helpers/functional/files"
|
||||||
|
import xmlFormat from "xml-formatter"
|
||||||
|
|
||||||
type PossibleContentTypes = Exclude<
|
type PossibleContentTypes = Exclude<
|
||||||
ValidContentTypes,
|
ValidContentTypes,
|
||||||
@@ -197,26 +198,10 @@ const prettifyRequestBody = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const prettifyXML = (xml: string) => {
|
const prettifyXML = (xml: string) => {
|
||||||
const PADDING = " ".repeat(2) // set desired indent size here
|
return xmlFormat(xml, {
|
||||||
const reg = /(>)(<)(\/*)/g
|
indentation: " ",
|
||||||
let pad = 0
|
collapseContent: true,
|
||||||
xml = xml.replace(reg, "$1\r\n$2$3")
|
lineSeparator: "\n",
|
||||||
return xml
|
})
|
||||||
.split("\r\n")
|
|
||||||
.map((node) => {
|
|
||||||
let indent = 0
|
|
||||||
if (node.match(/.+<\/\w[^>]*>$/)) {
|
|
||||||
indent = 0
|
|
||||||
} else if (node.match(/^<\/\w/) && pad > 0) {
|
|
||||||
pad -= 1
|
|
||||||
} else if (node.match(/^<\w[^>]*[^\/]>.*$/)) {
|
|
||||||
indent = 1
|
|
||||||
} else {
|
|
||||||
indent = 0
|
|
||||||
}
|
|
||||||
pad += indent
|
|
||||||
return PADDING.repeat(pad - indent) + node
|
|
||||||
})
|
|
||||||
.join("\r\n")
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -258,6 +258,8 @@ import IconSave from "~icons/lucide/save"
|
|||||||
import IconShare2 from "~icons/lucide/share-2"
|
import IconShare2 from "~icons/lucide/share-2"
|
||||||
import { HoppRESTTab } from "~/helpers/rest/tab"
|
import { HoppRESTTab } from "~/helpers/rest/tab"
|
||||||
import { getDefaultRESTRequest } from "~/helpers/rest/default"
|
import { getDefaultRESTRequest } from "~/helpers/rest/default"
|
||||||
|
import { platform } from "~/platform"
|
||||||
|
import { getCurrentStrategyID } from "~/helpers/network"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -320,6 +322,12 @@ const newSendRequest = async () => {
|
|||||||
|
|
||||||
loading.value = true
|
loading.value = true
|
||||||
|
|
||||||
|
// Log the request run into analytics
|
||||||
|
platform.analytics?.logHoppRequestRunToAnalytics({
|
||||||
|
platform: "rest",
|
||||||
|
strategy: getCurrentStrategyID(),
|
||||||
|
})
|
||||||
|
|
||||||
// Double calling is because the function returns a TaskEither than should be executed
|
// Double calling is because the function returns a TaskEither than should be executed
|
||||||
const streamResult = await runRESTRequest$(tab)()
|
const streamResult = await runRESTRequest$(tab)()
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex flex-col flex-1">
|
||||||
|
<div
|
||||||
|
class="sticky z-10 flex items-center justify-between flex-shrink-0 pl-4 overflow-x-auto border-b bg-primary border-dividerLight top-lowerSecondaryStickyFold"
|
||||||
|
>
|
||||||
|
<label class="font-semibold truncate text-secondaryLight">
|
||||||
|
{{ t("response.body") }}
|
||||||
|
</label>
|
||||||
|
<div class="flex">
|
||||||
|
<HoppButtonSecondary
|
||||||
|
v-if="response.body"
|
||||||
|
v-tippy="{ theme: 'tooltip', allowHTML: true }"
|
||||||
|
:title="`${t(
|
||||||
|
'action.download_file'
|
||||||
|
)} <kbd>${getSpecialKey()}</kbd><kbd>J</kbd>`"
|
||||||
|
:icon="downloadIcon"
|
||||||
|
@click="downloadResponse"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-1 items-center justify-center overflow-auto">
|
||||||
|
<audio controls :src="audiosrc"></audio>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from "vue"
|
||||||
|
import { useI18n } from "@composables/i18n"
|
||||||
|
import { useDownloadResponse } from "@composables/lens-actions"
|
||||||
|
import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse"
|
||||||
|
import { defineActionHandler } from "~/helpers/actions"
|
||||||
|
import { getPlatformSpecialKey as getSpecialKey } from "~/helpers/platformutils"
|
||||||
|
import { flow, pipe } from "fp-ts/function"
|
||||||
|
import * as S from "fp-ts/string"
|
||||||
|
import * as RNEA from "fp-ts/ReadonlyNonEmptyArray"
|
||||||
|
import * as A from "fp-ts/Array"
|
||||||
|
import * as O from "fp-ts/Option"
|
||||||
|
import { objFieldMatches } from "~/helpers/functional/object"
|
||||||
|
|
||||||
|
const t = useI18n()
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
response: HoppRESTResponse & {
|
||||||
|
type: "success" | "fail"
|
||||||
|
}
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const audiosrc = computed(() =>
|
||||||
|
URL.createObjectURL(
|
||||||
|
new Blob([props.response.body], {
|
||||||
|
type: "audio/mp3",
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
const responseType = computed(() =>
|
||||||
|
pipe(
|
||||||
|
props.response,
|
||||||
|
O.fromPredicate(objFieldMatches("type", ["fail", "success"] as const)),
|
||||||
|
O.chain(
|
||||||
|
// Try getting content-type
|
||||||
|
flow(
|
||||||
|
(res) => res.headers,
|
||||||
|
A.findFirst((h) => h.key.toLowerCase() === "content-type"),
|
||||||
|
O.map(flow((h) => h.value, S.split(";"), RNEA.head, S.toLowerCase))
|
||||||
|
)
|
||||||
|
),
|
||||||
|
O.getOrElse(() => "text/plain")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
const { downloadIcon, downloadResponse } = useDownloadResponse(
|
||||||
|
responseType.value,
|
||||||
|
computed(() => props.response.body)
|
||||||
|
)
|
||||||
|
|
||||||
|
defineActionHandler("response.file.download", () => downloadResponse())
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex flex-col flex-1">
|
||||||
|
<div
|
||||||
|
class="sticky z-10 flex items-center justify-between flex-shrink-0 pl-4 overflow-x-auto border-b bg-primary border-dividerLight top-lowerSecondaryStickyFold"
|
||||||
|
>
|
||||||
|
<label class="font-semibold truncate text-secondaryLight">
|
||||||
|
{{ t("response.body") }}
|
||||||
|
</label>
|
||||||
|
<div class="flex">
|
||||||
|
<HoppButtonSecondary
|
||||||
|
v-if="response.body"
|
||||||
|
v-tippy="{ theme: 'tooltip', allowHTML: true }"
|
||||||
|
:title="`${t(
|
||||||
|
'action.download_file'
|
||||||
|
)} <kbd>${getSpecialKey()}</kbd><kbd>J</kbd>`"
|
||||||
|
:icon="downloadIcon"
|
||||||
|
@click="downloadResponse"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-1 items-center justify-center overflow-auto">
|
||||||
|
<video controls :src="videosrc"></video>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from "vue"
|
||||||
|
import { useI18n } from "@composables/i18n"
|
||||||
|
import { useDownloadResponse } from "@composables/lens-actions"
|
||||||
|
import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse"
|
||||||
|
import { defineActionHandler } from "~/helpers/actions"
|
||||||
|
import { getPlatformSpecialKey as getSpecialKey } from "~/helpers/platformutils"
|
||||||
|
import { flow, pipe } from "fp-ts/function"
|
||||||
|
import * as S from "fp-ts/string"
|
||||||
|
import * as RNEA from "fp-ts/ReadonlyNonEmptyArray"
|
||||||
|
import * as A from "fp-ts/Array"
|
||||||
|
import * as O from "fp-ts/Option"
|
||||||
|
import { objFieldMatches } from "~/helpers/functional/object"
|
||||||
|
|
||||||
|
const t = useI18n()
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
response: HoppRESTResponse & {
|
||||||
|
type: "success" | "fail"
|
||||||
|
}
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const videosrc = computed(() =>
|
||||||
|
URL.createObjectURL(
|
||||||
|
new Blob([props.response.body], {
|
||||||
|
type: "video/mp4",
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
const responseType = computed(() =>
|
||||||
|
pipe(
|
||||||
|
props.response,
|
||||||
|
O.fromPredicate(objFieldMatches("type", ["fail", "success"] as const)),
|
||||||
|
O.chain(
|
||||||
|
// Try getting content-type
|
||||||
|
flow(
|
||||||
|
(res) => res.headers,
|
||||||
|
A.findFirst((h) => h.key.toLowerCase() === "content-type"),
|
||||||
|
O.map(flow((h) => h.value, S.split(";"), RNEA.head, S.toLowerCase))
|
||||||
|
)
|
||||||
|
),
|
||||||
|
O.getOrElse(() => "text/plain")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
const { downloadIcon, downloadResponse } = useDownloadResponse(
|
||||||
|
responseType.value,
|
||||||
|
computed(() => props.response.body)
|
||||||
|
)
|
||||||
|
|
||||||
|
defineActionHandler("response.file.download", () => downloadResponse())
|
||||||
|
</script>
|
||||||
@@ -38,6 +38,7 @@ import {
|
|||||||
baseHighlightStyle,
|
baseHighlightStyle,
|
||||||
} from "@helpers/editor/themes/baseTheme"
|
} from "@helpers/editor/themes/baseTheme"
|
||||||
import { HoppEnvironmentPlugin } from "@helpers/editor/extensions/HoppEnvironment"
|
import { HoppEnvironmentPlugin } from "@helpers/editor/extensions/HoppEnvironment"
|
||||||
|
import xmlFormat from "xml-formatter"
|
||||||
import { platform } from "~/platform"
|
import { platform } from "~/platform"
|
||||||
// TODO: Migrate from legacy mode
|
// TODO: Migrate from legacy mode
|
||||||
|
|
||||||
@@ -152,6 +153,27 @@ const getLanguage = (langMime: string): Language | null => {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses xml-formatter to format the XML document
|
||||||
|
* @param doc Document to parse
|
||||||
|
* @param langMime Language mime type
|
||||||
|
* @returns Parsed document if mime type is xml, else returns the original document
|
||||||
|
*/
|
||||||
|
const parseDoc = (
|
||||||
|
doc: string | undefined,
|
||||||
|
langMime: string
|
||||||
|
): string | undefined => {
|
||||||
|
if (langMime === "application/xml" && doc) {
|
||||||
|
return xmlFormat(doc, {
|
||||||
|
indentation: " ",
|
||||||
|
collapseContent: true,
|
||||||
|
lineSeparator: "\n",
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return doc
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const getEditorLanguage = (
|
const getEditorLanguage = (
|
||||||
langMime: string,
|
langMime: string,
|
||||||
linter: LinterDefinition | undefined,
|
linter: LinterDefinition | undefined,
|
||||||
@@ -187,6 +209,8 @@ export function useCodemirror(
|
|||||||
: null
|
: null
|
||||||
|
|
||||||
const initView = (el: any) => {
|
const initView = (el: any) => {
|
||||||
|
if (el) platform.ui?.onCodemirrorInstanceMount?.(el)
|
||||||
|
|
||||||
const extensions = [
|
const extensions = [
|
||||||
basicSetup,
|
basicSetup,
|
||||||
baseTheme,
|
baseTheme,
|
||||||
@@ -259,7 +283,7 @@ export function useCodemirror(
|
|||||||
view.value = new EditorView({
|
view.value = new EditorView({
|
||||||
parent: el,
|
parent: el,
|
||||||
state: EditorState.create({
|
state: EditorState.create({
|
||||||
doc: value.value,
|
doc: parseDoc(value.value, options.extendedEditorConfig.mode ?? ""),
|
||||||
extensions,
|
extensions,
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
@@ -268,7 +292,6 @@ export function useCodemirror(
|
|||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
if (el.value) {
|
if (el.value) {
|
||||||
if (!view.value) initView(el.value)
|
if (!view.value) initView(el.value)
|
||||||
platform.ui?.onCodemirrorInstanceMount?.(el.value)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { pipe, flow } from "fp-ts/function"
|
|||||||
import { tupleToRecord } from "~/helpers/functional/record"
|
import { tupleToRecord } from "~/helpers/functional/record"
|
||||||
import { safeParseJSON } from "~/helpers/functional/json"
|
import { safeParseJSON } from "~/helpers/functional/json"
|
||||||
import { optionChoose } from "~/helpers/functional/option"
|
import { optionChoose } from "~/helpers/functional/option"
|
||||||
|
import xmlFormat from "xml-formatter"
|
||||||
|
|
||||||
const isJSON = flow(safeParseJSON, O.isSome)
|
const isJSON = flow(safeParseJSON, O.isSome)
|
||||||
|
|
||||||
@@ -213,45 +214,18 @@ export function parseBody(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prettifies XML string
|
* Prettifies XML string using xml-formatter
|
||||||
* @param sourceXml The string to format
|
* @param sourceXml The string to format
|
||||||
* @returns Indented XML string (uses spaces)
|
* @returns Indented XML string (uses spaces)
|
||||||
*/
|
*/
|
||||||
function prettifyXml(sourceXml: string) {
|
function prettifyXml(sourceXml: string) {
|
||||||
return pipe(
|
return pipe(
|
||||||
O.tryCatch(() => {
|
O.tryCatch(() => {
|
||||||
const xmlDoc = new DOMParser().parseFromString(
|
return xmlFormat(sourceXml, {
|
||||||
sourceXml,
|
indentation: " ",
|
||||||
"application/xml"
|
collapseContent: true,
|
||||||
)
|
lineSeparator: "\n",
|
||||||
|
})
|
||||||
if (xmlDoc.querySelector("parsererror")) {
|
|
||||||
throw new Error("Unstructured Body")
|
|
||||||
}
|
|
||||||
|
|
||||||
const xsltDoc = new DOMParser().parseFromString(
|
|
||||||
[
|
|
||||||
// describes how we want to modify the XML - indent everything
|
|
||||||
'<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
|
|
||||||
' <xsl:strip-space elements="*"/>',
|
|
||||||
' <xsl:template match="para[content-style][not(text())]">', // change to just text() to strip space in text nodes
|
|
||||||
' <xsl:value-of select="normalize-space(.)"/>',
|
|
||||||
" </xsl:template>",
|
|
||||||
' <xsl:template match="node()|@*">',
|
|
||||||
' <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>',
|
|
||||||
" </xsl:template>",
|
|
||||||
' <xsl:output indent="yes"/>',
|
|
||||||
"</xsl:stylesheet>",
|
|
||||||
].join("\n"),
|
|
||||||
"application/xml"
|
|
||||||
)
|
|
||||||
|
|
||||||
const xsltProcessor = new XSLTProcessor()
|
|
||||||
xsltProcessor.importStylesheet(xsltDoc)
|
|
||||||
const resultDoc = xsltProcessor.transformToDocument(xmlDoc)
|
|
||||||
const resultXml = new XMLSerializer().serializeToString(resultDoc)
|
|
||||||
|
|
||||||
return resultXml
|
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,8 +121,8 @@ function getPressedKey(ev: KeyboardEvent): Key | null {
|
|||||||
else if (val === "arrowright") return "right"
|
else if (val === "arrowright") return "right"
|
||||||
|
|
||||||
// Check letter keys
|
// Check letter keys
|
||||||
if (val.length === 1 && val.toUpperCase() !== val.toLowerCase())
|
const isLetter = ev.code.toLowerCase().startsWith("key")
|
||||||
return val as Key
|
if (isLetter) return ev.code.toLowerCase().substring(3) as Key
|
||||||
|
|
||||||
// Check if number keys
|
// Check if number keys
|
||||||
if (val.length === 1 && !isNaN(val as any)) return val as Key
|
if (val.length === 1 && !isNaN(val as any)) return val as Key
|
||||||
|
|||||||
16
packages/hoppscotch-common/src/helpers/lenses/audioLens.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { defineAsyncComponent } from "vue"
|
||||||
|
import { Lens } from "./lenses"
|
||||||
|
|
||||||
|
const audioLens: Lens = {
|
||||||
|
lensName: "response.audio",
|
||||||
|
isSupportedContentType: (contentType) =>
|
||||||
|
/\baudio\/(?:wav|mpeg|mp4|aac|aacp|ogg|webm|x-caf|flac|mp3|)\b/i.test(
|
||||||
|
contentType
|
||||||
|
),
|
||||||
|
renderer: "audiores",
|
||||||
|
rendererImport: defineAsyncComponent(
|
||||||
|
() => import("~/components/lenses/renderers/AudioLensRenderer.vue")
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
export default audioLens
|
||||||
@@ -5,6 +5,8 @@ import imageLens from "./imageLens"
|
|||||||
import htmlLens from "./htmlLens"
|
import htmlLens from "./htmlLens"
|
||||||
import xmlLens from "./xmlLens"
|
import xmlLens from "./xmlLens"
|
||||||
import pdfLens from "./pdfLens"
|
import pdfLens from "./pdfLens"
|
||||||
|
import audioLens from "./audioLens"
|
||||||
|
import videoLens from "./videoLens"
|
||||||
import { defineAsyncComponent } from "vue"
|
import { defineAsyncComponent } from "vue"
|
||||||
|
|
||||||
export type Lens = {
|
export type Lens = {
|
||||||
@@ -20,6 +22,8 @@ export const lenses: Lens[] = [
|
|||||||
htmlLens,
|
htmlLens,
|
||||||
xmlLens,
|
xmlLens,
|
||||||
pdfLens,
|
pdfLens,
|
||||||
|
audioLens,
|
||||||
|
videoLens,
|
||||||
rawLens,
|
rawLens,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
16
packages/hoppscotch-common/src/helpers/lenses/videoLens.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { defineAsyncComponent } from "vue"
|
||||||
|
import { Lens } from "./lenses"
|
||||||
|
|
||||||
|
const videoLens: Lens = {
|
||||||
|
lensName: "response.video",
|
||||||
|
isSupportedContentType: (contentType) =>
|
||||||
|
/\bvideo\/(?:webm|x-m4v|quicktime|x-ms-wmv|x-flv|mpeg|x-msvideo|x-ms-asf|mp4|)\b/i.test(
|
||||||
|
contentType
|
||||||
|
),
|
||||||
|
renderer: "videores",
|
||||||
|
rendererImport: defineAsyncComponent(
|
||||||
|
() => import("~/components/lenses/renderers/VideoLensRenderer.vue")
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
export default videoLens
|
||||||
@@ -7,8 +7,8 @@ pw.env.set("variable", "value");`,
|
|||||||
{
|
{
|
||||||
name: "Environment: Set timestamp variable",
|
name: "Environment: Set timestamp variable",
|
||||||
script: `\n\n// Set timestamp variable
|
script: `\n\n// Set timestamp variable
|
||||||
const cuttentTime = Date.now();
|
const currentTime = Date.now();
|
||||||
pw.env.set("timestamp", cuttentTime.toString());`,
|
pw.env.set("timestamp", currentTime.toString());`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Environment: Set random number variable",
|
name: "Environment: Set random number variable",
|
||||||
|
|||||||
@@ -42,16 +42,21 @@ const dispatchers = defineDispatchers({
|
|||||||
selectedEnvironmentIndex,
|
selectedEnvironmentIndex,
|
||||||
}: { selectedEnvironmentIndex: SelectedEnvironmentIndex }
|
}: { selectedEnvironmentIndex: SelectedEnvironmentIndex }
|
||||||
) {
|
) {
|
||||||
if (
|
if (selectedEnvironmentIndex.type === "MY_ENV") {
|
||||||
selectedEnvironmentIndex.type === "MY_ENV" &&
|
if (store.environments[selectedEnvironmentIndex.index]) {
|
||||||
!!store.environments[selectedEnvironmentIndex.index]
|
return {
|
||||||
) {
|
selectedEnvironmentIndex,
|
||||||
return {
|
}
|
||||||
selectedEnvironmentIndex,
|
} else {
|
||||||
|
return {
|
||||||
|
selectedEnvironmentIndex: {
|
||||||
|
type: "NO_ENV_SELECTED",
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
type: "NO_ENV_SELECTED",
|
selectedEnvironmentIndex,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
v-tippy="{ theme: 'tooltip', delay: [500, 20] }"
|
v-tippy="{ theme: 'tooltip', delay: [500, 20] }"
|
||||||
:title="tab.document.request.name"
|
:title="tab.document.request.name"
|
||||||
class="truncate px-2"
|
class="truncate px-2"
|
||||||
|
@dblclick="openReqRenameModal()"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="font-semibold text-tiny"
|
class="font-semibold text-tiny"
|
||||||
@@ -61,6 +62,12 @@
|
|||||||
<HttpSidebar />
|
<HttpSidebar />
|
||||||
</template>
|
</template>
|
||||||
</AppPaneLayout>
|
</AppPaneLayout>
|
||||||
|
<CollectionsEditRequest
|
||||||
|
:show="showRenamingReqNameModal"
|
||||||
|
v-model="reqName"
|
||||||
|
@submit="renameReqName"
|
||||||
|
@hide-modal="showRenamingReqNameModal = false"
|
||||||
|
/>
|
||||||
<HoppSmartConfirmModal
|
<HoppSmartConfirmModal
|
||||||
:show="confirmingCloseForTabID !== null"
|
:show="confirmingCloseForTabID !== null"
|
||||||
:confirm="t('modal.close_unsaved_tab')"
|
:confirm="t('modal.close_unsaved_tab')"
|
||||||
@@ -116,6 +123,8 @@ import { oauthRedirect } from "~/helpers/oauth"
|
|||||||
|
|
||||||
const savingRequest = ref(false)
|
const savingRequest = ref(false)
|
||||||
const confirmingCloseForTabID = ref<string | null>(null)
|
const confirmingCloseForTabID = ref<string | null>(null)
|
||||||
|
const showRenamingReqNameModal = ref(false)
|
||||||
|
const reqName = ref<string>("")
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
const toast = useToast()
|
const toast = useToast()
|
||||||
@@ -166,6 +175,20 @@ const removeTab = (tabID: string) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const openReqRenameModal = () => {
|
||||||
|
showRenamingReqNameModal.value = true
|
||||||
|
reqName.value = currentActiveTab.value.document.request.name
|
||||||
|
}
|
||||||
|
|
||||||
|
const renameReqName = () => {
|
||||||
|
const tab = getTabRef(currentTabID.value)
|
||||||
|
if (tab.value) {
|
||||||
|
tab.value.document.request.name = reqName.value
|
||||||
|
updateTab(tab.value)
|
||||||
|
}
|
||||||
|
showRenamingReqNameModal.value = false
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is closed when the confirm tab is closed by some means (even saving triggers close)
|
* This function is closed when the confirm tab is closed by some means (even saving triggers close)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>Hoppscotch - Open source API development ecosystem</title>
|
<title>Hoppscotch • Open source API development ecosystem</title>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<link rel="icon" href="/favicon.ico" />
|
<link rel="icon" href="/favicon.ico" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
|||||||
@@ -8,7 +8,9 @@ export const APP_INFO = {
|
|||||||
keywords:
|
keywords:
|
||||||
"hoppscotch, hopp scotch, hoppscotch online, hoppscotch app, postwoman, postwoman chrome, postwoman online, postwoman for mac, postwoman app, postwoman for windows, postwoman google chrome, postwoman chrome app, get postwoman, postwoman web, postwoman android, postwoman app for chrome, postwoman mobile app, postwoman web app, api, request, testing, tool, rest, websocket, sse, graphql, socketio",
|
"hoppscotch, hopp scotch, hoppscotch online, hoppscotch app, postwoman, postwoman chrome, postwoman online, postwoman for mac, postwoman app, postwoman for windows, postwoman google chrome, postwoman chrome app, get postwoman, postwoman web, postwoman android, postwoman app for chrome, postwoman mobile app, postwoman web app, api, request, testing, tool, rest, websocket, sse, graphql, socketio",
|
||||||
app: {
|
app: {
|
||||||
background: "#202124",
|
background: "#181818",
|
||||||
|
lightThemeColor: "#ffffff",
|
||||||
|
darkThemeColor: "#181818",
|
||||||
},
|
},
|
||||||
social: {
|
social: {
|
||||||
twitter: "@hoppscotch_io",
|
twitter: "@hoppscotch_io",
|
||||||
@@ -108,7 +110,17 @@ export const META_TAGS = (env: Record<string, string>): IHTMLTag[] => [
|
|||||||
// PWA
|
// PWA
|
||||||
{
|
{
|
||||||
name: "theme-color",
|
name: "theme-color",
|
||||||
content: APP_INFO.app.background,
|
content: APP_INFO.app.darkThemeColor,
|
||||||
|
media: "(prefers-color-scheme: dark)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "theme-color",
|
||||||
|
content: APP_INFO.app.lightThemeColor,
|
||||||
|
media: "(prefers-color-scheme: light)",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "supported-color-schemes",
|
||||||
|
content: "light dark",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "mask-icon",
|
name: "mask-icon",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@hoppscotch/selfhost-web",
|
"name": "@hoppscotch/selfhost-web",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2023.4.2",
|
"version": "2023.4.3",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev:vite": "vite",
|
"dev:vite": "vite",
|
||||||
|
|||||||
@@ -150,20 +150,54 @@ export default defineConfig({
|
|||||||
short_name: APP_INFO.name,
|
short_name: APP_INFO.name,
|
||||||
description: APP_INFO.shortDescription,
|
description: APP_INFO.shortDescription,
|
||||||
start_url: "/?source=pwa",
|
start_url: "/?source=pwa",
|
||||||
|
id: "/?source=pwa",
|
||||||
|
protocol_handlers: [
|
||||||
|
{
|
||||||
|
protocol: "web+hoppscotch",
|
||||||
|
url: "/%s",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
protocol: "web+hopp",
|
||||||
|
url: "/%s",
|
||||||
|
},
|
||||||
|
],
|
||||||
background_color: APP_INFO.app.background,
|
background_color: APP_INFO.app.background,
|
||||||
theme_color: APP_INFO.app.background,
|
theme_color: APP_INFO.app.background,
|
||||||
icons: [
|
icons: [
|
||||||
{
|
{
|
||||||
src: "/icon.png",
|
src: "/icons/pwa-16x16.png",
|
||||||
sizes: "512x512",
|
sizes: "16x16",
|
||||||
type: "image/png",
|
type: "image/png",
|
||||||
purpose: "any maskable",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src: "/logo.svg",
|
src: "/icons/pwa-32x32.png",
|
||||||
sizes: "48x48 72x72 96x96 128x128 256x256 512x512",
|
sizes: "32x32",
|
||||||
type: "image/svg+xml",
|
type: "image/png",
|
||||||
purpose: "any maskable",
|
},
|
||||||
|
{
|
||||||
|
src: "/icons/pwa-128x128.png",
|
||||||
|
sizes: "128x128",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: "/icons/pwa-192x192.png",
|
||||||
|
sizes: "192x192",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: "/icons/pwa-256x256.png",
|
||||||
|
sizes: "256x256",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: "/icons/pwa-512x512.png",
|
||||||
|
sizes: "512x512",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: "/icons/pwa-1024x1024.png",
|
||||||
|
sizes: "1024x1024",
|
||||||
|
type: "image/png",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ input::placeholder,
|
|||||||
textarea::placeholder,
|
textarea::placeholder,
|
||||||
.cm-placeholder {
|
.cm-placeholder {
|
||||||
@apply text-secondary;
|
@apply text-secondary;
|
||||||
@apply opacity-35;
|
@apply opacity-50;
|
||||||
}
|
}
|
||||||
|
|
||||||
input,
|
input,
|
||||||
@@ -323,9 +323,10 @@ pre.ace_editor {
|
|||||||
@apply after:justify-center;
|
@apply after:justify-center;
|
||||||
@apply after:pointer-events-none;
|
@apply after:pointer-events-none;
|
||||||
@apply after:font-icon;
|
@apply after:font-icon;
|
||||||
@apply after:text-secondaryLight;
|
@apply after:text-current;
|
||||||
@apply after:right-3;
|
@apply after:right-3;
|
||||||
@apply after:content-["\e313"];
|
@apply after:content-["\e313"];
|
||||||
|
@apply after:text-lg;
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-response {
|
.info-response {
|
||||||
@@ -416,7 +417,6 @@ pre.ace_editor {
|
|||||||
|
|
||||||
.smart-splitter .splitpanes__splitter {
|
.smart-splitter .splitpanes__splitter {
|
||||||
@apply relative;
|
@apply relative;
|
||||||
@apply bg-primaryLight;
|
|
||||||
@apply before:absolute;
|
@apply before:absolute;
|
||||||
@apply before:inset-0;
|
@apply before:inset-0;
|
||||||
@apply before:bg-accentLight;
|
@apply before:bg-accentLight;
|
||||||
@@ -424,48 +424,47 @@ pre.ace_editor {
|
|||||||
@apply before:z-20;
|
@apply before:z-20;
|
||||||
@apply before:transition;
|
@apply before:transition;
|
||||||
@apply before:content-DEFAULT;
|
@apply before:content-DEFAULT;
|
||||||
@apply after:absolute;
|
|
||||||
@apply after:inset-0;
|
|
||||||
@apply after:z-20;
|
|
||||||
@apply after:transition;
|
|
||||||
@apply after:flex;
|
|
||||||
@apply after:items-center;
|
|
||||||
@apply after:justify-center;
|
|
||||||
@apply after:text-dividerDark;
|
|
||||||
@apply after:font-icon;
|
|
||||||
@apply hover:before:opacity-100;
|
@apply hover:before:opacity-100;
|
||||||
@apply hover:after:text-accentDark;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.no-splitter .splitpanes__splitter {
|
.no-splitter .splitpanes__splitter {
|
||||||
@apply relative;
|
@apply relative;
|
||||||
@apply bg-primaryLight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.smart-splitter.splitpanes--vertical > .splitpanes__splitter {
|
.smart-splitter.splitpanes--vertical > .splitpanes__splitter {
|
||||||
@apply w-1;
|
@apply w-0;
|
||||||
@apply before:-left-0.5;
|
@apply before:-left-0.5;
|
||||||
@apply before:-right-0.5;
|
@apply before:-right-0.5;
|
||||||
@apply before:h-full;
|
@apply before:h-full;
|
||||||
@apply after:content-["\e5d4"];
|
@apply bg-divider;
|
||||||
}
|
}
|
||||||
|
|
||||||
.smart-splitter.splitpanes--horizontal > .splitpanes__splitter {
|
.smart-splitter.splitpanes--horizontal > .splitpanes__splitter {
|
||||||
@apply h-1;
|
@apply h-0;
|
||||||
@apply before:-top-0.5;
|
@apply before:-top-0.5;
|
||||||
@apply before:-bottom-0.5;
|
@apply before:-bottom-0.5;
|
||||||
@apply before:w-full;
|
@apply before:w-full;
|
||||||
@apply after:content-["\e5d3"];
|
@apply bg-divider;
|
||||||
}
|
}
|
||||||
|
|
||||||
.no-splitter.splitpanes--vertical > .splitpanes__splitter {
|
.no-splitter.splitpanes--vertical > .splitpanes__splitter {
|
||||||
@apply w-0.5;
|
@apply w-0;
|
||||||
@apply pointer-events-none;
|
@apply pointer-events-none;
|
||||||
|
@apply bg-dividerLight;
|
||||||
}
|
}
|
||||||
|
|
||||||
.no-splitter.splitpanes--horizontal > .splitpanes__splitter {
|
.no-splitter.splitpanes--horizontal > .splitpanes__splitter {
|
||||||
@apply h-0.5;
|
@apply h-0;
|
||||||
@apply pointer-events-none;
|
@apply pointer-events-none;
|
||||||
|
@apply bg-dividerLight;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitpanes--horizontal .splitpanes__pane {
|
||||||
|
@apply transition-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitpanes--vertical .splitpanes__pane {
|
||||||
|
@apply transition-none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cm-focused {
|
.cm-focused {
|
||||||
|
|||||||
@@ -6,16 +6,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@mixin dark-theme {
|
@mixin dark-theme {
|
||||||
--primary-color: theme('colors.neutral.900');
|
--primary-color: theme('colors.dark.800');
|
||||||
--primary-light-color: theme('colors.dark.600');
|
--primary-light-color: theme('colors.dark.600');
|
||||||
--primary-dark-color: theme('colors.neutral.800');
|
--primary-dark-color: theme('colors.neutral.800');
|
||||||
--primary-contrast-color: #161616;
|
--primary-contrast-color: theme('colors.neutral.900');
|
||||||
|
|
||||||
--secondary-color: theme('colors.neutral.400');
|
--secondary-color: theme('colors.neutral.400');
|
||||||
--secondary-light-color: theme('colors.neutral.500');
|
--secondary-light-color: theme('colors.neutral.500');
|
||||||
--secondary-dark-color: theme('colors.neutral.100');
|
--secondary-dark-color: theme('colors.neutral.50');
|
||||||
|
|
||||||
--divider-color: theme('colors.neutral.800');
|
--divider-color: theme('colors.neutral.800');
|
||||||
--divider-light-color: theme('colors.dark.500');
|
--divider-light-color: theme('colors.dark.500');
|
||||||
--divider-dark-color: theme('colors.dark.300');
|
--divider-dark-color: theme('colors.dark.300');
|
||||||
|
|
||||||
--error-color: theme('colors.stone.800');
|
--error-color: theme('colors.stone.800');
|
||||||
--tooltip-color: theme('colors.neutral.100');
|
--tooltip-color: theme('colors.neutral.100');
|
||||||
--popover-color: theme('colors.dark.700');
|
--popover-color: theme('colors.dark.700');
|
||||||
@@ -24,15 +27,18 @@
|
|||||||
|
|
||||||
@mixin light-theme {
|
@mixin light-theme {
|
||||||
--primary-color: theme('colors.white');
|
--primary-color: theme('colors.white');
|
||||||
--primary-light-color: theme('colors.neutral.50');
|
--primary-light-color: theme('colors.gray.50');
|
||||||
--primary-dark-color: theme('colors.neutral.100');
|
--primary-dark-color: theme('colors.gray.100');
|
||||||
--primary-contrast-color: #fefefe;
|
--primary-contrast-color: theme('colors.light.50');
|
||||||
--secondary-color: theme('colors.neutral.500');
|
|
||||||
--secondary-light-color: theme('colors.neutral.400');
|
--secondary-color: theme('colors.gray.500');
|
||||||
--secondary-dark-color: theme('colors.neutral.900');
|
--secondary-light-color: theme('colors.gray.400');
|
||||||
|
--secondary-dark-color: theme('colors.gray.900');
|
||||||
|
|
||||||
--divider-color: theme('colors.gray.100');
|
--divider-color: theme('colors.gray.100');
|
||||||
--divider-light-color: theme('colors.neutral.100');
|
--divider-light-color: theme('colors.gray.100');
|
||||||
--divider-dark-color: theme('colors.neutral.300');
|
--divider-dark-color: theme('colors.gray.300');
|
||||||
|
|
||||||
--error-color: theme('colors.yellow.100');
|
--error-color: theme('colors.yellow.100');
|
||||||
--tooltip-color: theme('colors.neutral.800');
|
--tooltip-color: theme('colors.neutral.800');
|
||||||
--popover-color: theme('colors.white');
|
--popover-color: theme('colors.white');
|
||||||
@@ -43,16 +49,19 @@
|
|||||||
--primary-color: theme('colors.dark.900');
|
--primary-color: theme('colors.dark.900');
|
||||||
--primary-light-color: theme('colors.neutral.900');
|
--primary-light-color: theme('colors.neutral.900');
|
||||||
--primary-dark-color: theme('colors.dark.800');
|
--primary-dark-color: theme('colors.dark.800');
|
||||||
--primary-contrast-color: #0e0e0e;
|
--primary-contrast-color: theme('colors.dark.900');
|
||||||
|
|
||||||
--secondary-color: theme('colors.neutral.400');
|
--secondary-color: theme('colors.neutral.400');
|
||||||
--secondary-light-color: theme('colors.neutral.500');
|
--secondary-light-color: theme('colors.neutral.500');
|
||||||
--secondary-dark-color: theme('colors.neutral.100');
|
--secondary-dark-color: theme('colors.neutral.100');
|
||||||
--divider-color: theme('colors.neutral.800');
|
|
||||||
|
--divider-color: theme('colors.dark.600');
|
||||||
--divider-light-color: theme('colors.dark.800');
|
--divider-light-color: theme('colors.dark.800');
|
||||||
--divider-dark-color: theme('colors.dark.300');
|
--divider-dark-color: theme('colors.dark.200');
|
||||||
|
|
||||||
--error-color: theme('colors.stone.900');
|
--error-color: theme('colors.stone.900');
|
||||||
--tooltip-color: theme('colors.neutral.100');
|
--tooltip-color: theme('colors.neutral.100');
|
||||||
--popover-color: theme('colors.dark.600');
|
--popover-color: theme('colors.dark.900');
|
||||||
--editor-theme: 'twilight';
|
--editor-theme: 'twilight';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,6 +197,67 @@
|
|||||||
--gradient-to-color: theme('colors.pink.600');
|
--gradient-to-color: theme('colors.pink.600');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
@include base-theme;
|
||||||
|
@include dark-theme;
|
||||||
|
@include green-theme;
|
||||||
|
@include dark-editor-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root.light {
|
||||||
|
@include light-theme;
|
||||||
|
@include light-editor-theme;
|
||||||
|
color-scheme: light;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root.dark {
|
||||||
|
@include dark-theme;
|
||||||
|
@include dark-editor-theme;
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root.black {
|
||||||
|
@include black-theme;
|
||||||
|
@include black-editor-theme;
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='blue'] {
|
||||||
|
@include blue-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='green'] {
|
||||||
|
@include green-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='teal'] {
|
||||||
|
@include teal-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='indigo'] {
|
||||||
|
@include indigo-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='purple'] {
|
||||||
|
@include purple-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='orange'] {
|
||||||
|
@include orange-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='pink'] {
|
||||||
|
@include pink-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='red'] {
|
||||||
|
@include red-theme;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root[data-accent='yellow'] {
|
||||||
|
@include yellow-theme;
|
||||||
|
}
|
||||||
|
|
||||||
@mixin font-small {
|
@mixin font-small {
|
||||||
--font-size-body: 0.75rem;
|
--font-size-body: 0.75rem;
|
||||||
--line-height-body: 1rem;
|
--line-height-body: 1rem;
|
||||||
@@ -236,65 +306,6 @@
|
|||||||
--sidebar-primary-sticky-fold: 2.5rem;
|
--sidebar-primary-sticky-fold: 2.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root {
|
|
||||||
@include base-theme;
|
|
||||||
@include dark-theme;
|
|
||||||
@include green-theme;
|
|
||||||
@include dark-editor-theme;
|
|
||||||
@include font-medium;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root.light {
|
|
||||||
@include light-theme;
|
|
||||||
@include light-editor-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root.dark {
|
|
||||||
@include dark-theme;
|
|
||||||
@include dark-editor-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root.black {
|
|
||||||
@include black-theme;
|
|
||||||
@include black-editor-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='blue'] {
|
|
||||||
@include blue-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='green'] {
|
|
||||||
@include green-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='teal'] {
|
|
||||||
@include teal-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='indigo'] {
|
|
||||||
@include indigo-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='purple'] {
|
|
||||||
@include purple-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='orange'] {
|
|
||||||
@include orange-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='pink'] {
|
|
||||||
@include pink-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='red'] {
|
|
||||||
@include red-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-accent='yellow'] {
|
|
||||||
@include yellow-theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root[data-font-size='small'] {
|
:root[data-font-size='small'] {
|
||||||
@include font-small;
|
@include font-small;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "hoppscotch-sh-admin",
|
"name": "hoppscotch-sh-admin",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2023.4.2",
|
"version": "2023.4.3",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
"dev": "pnpm exec npm-run-all -p -l dev:*",
|
||||||
|
|||||||
@@ -1,3 +1,64 @@
|
|||||||
|
* {
|
||||||
|
@apply backface-hidden;
|
||||||
|
@apply before:backface-hidden;
|
||||||
|
@apply after:backface-hidden;
|
||||||
|
@apply selection:bg-accentDark;
|
||||||
|
@apply selection:text-accentContrast;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
@apply antialiased;
|
||||||
|
accent-color: var(--accent-color);
|
||||||
|
font-variant-ligatures: common-ligatures;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track {
|
||||||
|
@apply bg-transparent;
|
||||||
|
@apply border-solid border-l border-dividerLight border-t-0 border-b-0 border-r-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
@apply bg-divider bg-clip-content;
|
||||||
|
@apply rounded-full;
|
||||||
|
@apply border-solid border-transparent border-4;
|
||||||
|
@apply hover:bg-dividerDark;
|
||||||
|
@apply hover:bg-clip-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
@apply w-4;
|
||||||
|
@apply h-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input::placeholder,
|
||||||
|
textarea::placeholder,
|
||||||
|
.cm-placeholder {
|
||||||
|
@apply text-secondary;
|
||||||
|
@apply opacity-50;
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
textarea {
|
||||||
|
@apply text-secondaryDark;
|
||||||
|
@apply font-medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
@apply bg-primary;
|
||||||
|
@apply text-secondary text-body;
|
||||||
|
@apply font-medium;
|
||||||
|
@apply select-none;
|
||||||
|
@apply overflow-x-hidden;
|
||||||
|
@apply leading-body;
|
||||||
|
animation: fade 300ms forwards;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
-webkit-touch-callout: none;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes fade {
|
@keyframes fade {
|
||||||
0% {
|
0% {
|
||||||
@apply opacity-0;
|
@apply opacity-0;
|
||||||
@@ -69,6 +130,89 @@ a {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cm-tooltip {
|
||||||
|
.tippy-box {
|
||||||
|
@apply shadow-none;
|
||||||
|
@apply fixed;
|
||||||
|
@apply inline-flex;
|
||||||
|
@apply -mt-8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tippy-box[data-theme~="tooltip"] {
|
||||||
|
@apply bg-tooltip;
|
||||||
|
@apply border-solid border-tooltip;
|
||||||
|
@apply rounded;
|
||||||
|
@apply shadow;
|
||||||
|
|
||||||
|
.tippy-content {
|
||||||
|
@apply flex;
|
||||||
|
@apply text-tiny text-primary;
|
||||||
|
@apply font-semibold;
|
||||||
|
@apply py-1 px-2;
|
||||||
|
@apply truncate;
|
||||||
|
@apply leading-normal;
|
||||||
|
@apply items-center;
|
||||||
|
|
||||||
|
kbd {
|
||||||
|
@apply hidden;
|
||||||
|
@apply font-sans;
|
||||||
|
@apply bg-gray-500/45;
|
||||||
|
@apply text-primaryLight;
|
||||||
|
@apply rounded-sm;
|
||||||
|
@apply px-1;
|
||||||
|
@apply my-0 ml-1;
|
||||||
|
@apply truncate;
|
||||||
|
@apply sm:inline-flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.env-icon {
|
||||||
|
@apply transition;
|
||||||
|
@apply inline-flex;
|
||||||
|
@apply items-center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tippy-svg-arrow {
|
||||||
|
svg:first-child {
|
||||||
|
@apply fill-tooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg:last-child {
|
||||||
|
@apply fill-tooltip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tippy-box[data-theme~="popover"] {
|
||||||
|
@apply bg-popover;
|
||||||
|
@apply border-solid border-dividerDark;
|
||||||
|
@apply rounded;
|
||||||
|
@apply shadow-lg;
|
||||||
|
|
||||||
|
.tippy-content {
|
||||||
|
@apply flex flex-col;
|
||||||
|
@apply max-h-56;
|
||||||
|
@apply items-stretch;
|
||||||
|
@apply overflow-y-auto;
|
||||||
|
@apply text-secondary text-body;
|
||||||
|
@apply p-2;
|
||||||
|
@apply leading-normal;
|
||||||
|
@apply focus:outline-none;
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tippy-svg-arrow {
|
||||||
|
svg:first-child {
|
||||||
|
@apply fill-dividerDark;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg:last-child {
|
||||||
|
@apply fill-popover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[data-v-tippy] {
|
[data-v-tippy] {
|
||||||
@apply flex flex-1;
|
@apply flex flex-1;
|
||||||
}
|
}
|
||||||
@@ -102,6 +246,252 @@ hr {
|
|||||||
@apply focus-visible:border-dividerDark;
|
@apply focus-visible:border-dividerDark;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
select,
|
||||||
|
textarea,
|
||||||
|
button {
|
||||||
|
@apply truncate;
|
||||||
|
@apply transition;
|
||||||
|
@apply text-body;
|
||||||
|
@apply leading-body;
|
||||||
|
@apply focus:outline-none;
|
||||||
|
@apply disabled:cursor-not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input[type="file"],
|
||||||
|
.input[type="radio"],
|
||||||
|
#installPWA {
|
||||||
|
@apply hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-input ~ label {
|
||||||
|
@apply absolute;
|
||||||
|
@apply px-2 py-0.5;
|
||||||
|
@apply m-2;
|
||||||
|
@apply rounded;
|
||||||
|
@apply transition;
|
||||||
|
@apply origin-top-left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-input:focus-within ~ label,
|
||||||
|
.floating-input:not(:placeholder-shown) ~ label {
|
||||||
|
@apply bg-primary;
|
||||||
|
@apply transform;
|
||||||
|
@apply origin-top-left;
|
||||||
|
@apply scale-75;
|
||||||
|
@apply translate-x-1 -translate-y-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-input:focus-within ~ label {
|
||||||
|
@apply text-secondaryDark;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-input ~ .end-actions {
|
||||||
|
@apply absolute;
|
||||||
|
@apply right-0.2;
|
||||||
|
@apply inset-y-0;
|
||||||
|
@apply flex;
|
||||||
|
@apply items-center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.floating-input:has(~ .end-actions) {
|
||||||
|
@apply pr-12;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.ace_editor {
|
||||||
|
@apply font-mono;
|
||||||
|
@apply resize-none;
|
||||||
|
@apply z-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select {
|
||||||
|
@apply appearance-none;
|
||||||
|
@apply cursor-pointer;
|
||||||
|
|
||||||
|
&::-ms-expand {
|
||||||
|
@apply hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.select-wrapper {
|
||||||
|
@apply flex flex-1;
|
||||||
|
@apply relative;
|
||||||
|
@apply after:absolute;
|
||||||
|
@apply after:flex;
|
||||||
|
@apply after:inset-y-0;
|
||||||
|
@apply after:items-center;
|
||||||
|
@apply after:justify-center;
|
||||||
|
@apply after:pointer-events-none;
|
||||||
|
@apply after:font-icon;
|
||||||
|
@apply after:text-current;
|
||||||
|
@apply after:right-3;
|
||||||
|
@apply after:content-["\e313"];
|
||||||
|
@apply after:text-lg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-response {
|
||||||
|
@apply text-pink-500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.success-response {
|
||||||
|
@apply text-green-500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.redir-response {
|
||||||
|
@apply text-yellow-500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cl-error-response {
|
||||||
|
@apply text-red-500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sv-error-response {
|
||||||
|
@apply text-red-600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.missing-data-response {
|
||||||
|
@apply text-secondaryLight;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toasted-container {
|
||||||
|
@apply max-w-md;
|
||||||
|
|
||||||
|
.toasted {
|
||||||
|
&.toasted-primary {
|
||||||
|
@apply px-4 py-2;
|
||||||
|
@apply bg-tooltip;
|
||||||
|
@apply border-secondaryDark;
|
||||||
|
@apply text-primary text-body;
|
||||||
|
@apply justify-between;
|
||||||
|
@apply shadow-lg;
|
||||||
|
@apply font-semibold;
|
||||||
|
@apply transition;
|
||||||
|
@apply leading-body;
|
||||||
|
@apply sm:rounded;
|
||||||
|
@apply sm:border;
|
||||||
|
|
||||||
|
.action {
|
||||||
|
@apply relative;
|
||||||
|
@apply flex flex-shrink-0;
|
||||||
|
@apply text-body;
|
||||||
|
@apply px-4;
|
||||||
|
@apply my-1;
|
||||||
|
@apply ml-auto;
|
||||||
|
@apply normal-case;
|
||||||
|
@apply font-semibold;
|
||||||
|
@apply leading-body;
|
||||||
|
@apply tracking-normal;
|
||||||
|
@apply rounded;
|
||||||
|
@apply last:ml-4;
|
||||||
|
@apply sm:ml-8;
|
||||||
|
@apply before:absolute;
|
||||||
|
@apply before:bg-current;
|
||||||
|
@apply before:opacity-10;
|
||||||
|
@apply before:inset-0;
|
||||||
|
@apply before:transition;
|
||||||
|
@apply before:content-DEFAULT;
|
||||||
|
@apply hover:no-underline;
|
||||||
|
@apply hover:before:opacity-20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.info {
|
||||||
|
@apply bg-accent;
|
||||||
|
@apply text-accentContrast;
|
||||||
|
@apply border-accentDark;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.error {
|
||||||
|
@apply bg-red-200;
|
||||||
|
@apply text-red-800;
|
||||||
|
@apply border-red-400;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.success {
|
||||||
|
@apply bg-green-200;
|
||||||
|
@apply text-green-800;
|
||||||
|
@apply border-green-400;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.smart-splitter .splitpanes__splitter {
|
||||||
|
@apply relative;
|
||||||
|
@apply before:absolute;
|
||||||
|
@apply before:inset-0;
|
||||||
|
@apply before:bg-accentLight;
|
||||||
|
@apply before:opacity-0;
|
||||||
|
@apply before:z-20;
|
||||||
|
@apply before:transition;
|
||||||
|
@apply before:content-DEFAULT;
|
||||||
|
@apply hover:before:opacity-100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-splitter .splitpanes__splitter {
|
||||||
|
@apply relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.smart-splitter.splitpanes--vertical > .splitpanes__splitter {
|
||||||
|
@apply w-0;
|
||||||
|
@apply before:-left-0.5;
|
||||||
|
@apply before:-right-0.5;
|
||||||
|
@apply before:h-full;
|
||||||
|
@apply bg-divider;
|
||||||
|
}
|
||||||
|
|
||||||
|
.smart-splitter.splitpanes--horizontal > .splitpanes__splitter {
|
||||||
|
@apply h-0;
|
||||||
|
@apply before:-top-0.5;
|
||||||
|
@apply before:-bottom-0.5;
|
||||||
|
@apply before:w-full;
|
||||||
|
@apply bg-divider;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-splitter.splitpanes--vertical > .splitpanes__splitter {
|
||||||
|
@apply w-0;
|
||||||
|
@apply pointer-events-none;
|
||||||
|
@apply bg-dividerLight;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-splitter.splitpanes--horizontal > .splitpanes__splitter {
|
||||||
|
@apply h-0;
|
||||||
|
@apply pointer-events-none;
|
||||||
|
@apply bg-dividerLight;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitpanes--horizontal .splitpanes__pane {
|
||||||
|
@apply transition-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitpanes--vertical .splitpanes__pane {
|
||||||
|
@apply transition-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-focused {
|
||||||
|
@apply select-auto;
|
||||||
|
@apply outline-none #{!important};
|
||||||
|
|
||||||
|
.cm-activeLine {
|
||||||
|
@apply bg-primaryLight;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-activeLineGutter {
|
||||||
|
@apply bg-primaryDark;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-editor {
|
||||||
|
.cm-line::selection {
|
||||||
|
@apply bg-accentDark #{!important};
|
||||||
|
@apply text-accentContrast #{!important};
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-line ::selection {
|
||||||
|
@apply bg-accentDark #{!important};
|
||||||
|
@apply text-accentContrast #{!important};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.shortcut-key {
|
.shortcut-key {
|
||||||
@apply inline-flex;
|
@apply inline-flex;
|
||||||
@apply font-sans;
|
@apply font-sans;
|
||||||
@@ -118,3 +508,62 @@ hr {
|
|||||||
@apply shadow-sm;
|
@apply shadow-sm;
|
||||||
@apply <sm:hidden;
|
@apply <sm:hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.capitalize-first {
|
||||||
|
@apply first-letter:capitalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
details {
|
||||||
|
@apply select-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
details summary::-webkit-details-marker {
|
||||||
|
@apply hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
details summary .indicator {
|
||||||
|
@apply transition;
|
||||||
|
}
|
||||||
|
|
||||||
|
details[open] summary .indicator {
|
||||||
|
@apply transform;
|
||||||
|
@apply rotate-90;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
main {
|
||||||
|
margin-bottom: env(safe-area-inset-bottom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.env-highlight {
|
||||||
|
@apply text-accentContrast;
|
||||||
|
|
||||||
|
&.env-found {
|
||||||
|
@apply bg-accentDark;
|
||||||
|
@apply hover:bg-accent;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.env-not-found {
|
||||||
|
@apply bg-red-500;
|
||||||
|
@apply hover:bg-red-600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#nprogress .bar {
|
||||||
|
@apply bg-accent #{!important};
|
||||||
|
}
|
||||||
|
|
||||||
|
.color-picker[type="color"] {
|
||||||
|
@apply appearance-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.color-picker[type="color"]::-webkit-color-swatch-wrapper {
|
||||||
|
@apply rounded;
|
||||||
|
@apply p-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.color-picker[type="color"]::-webkit-color-swatch {
|
||||||
|
@apply rounded;
|
||||||
|
@apply border-0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -207,16 +207,19 @@
|
|||||||
:root.light {
|
:root.light {
|
||||||
@include light-theme;
|
@include light-theme;
|
||||||
@include light-editor-theme;
|
@include light-editor-theme;
|
||||||
|
color-scheme: light;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root.dark {
|
:root.dark {
|
||||||
@include dark-theme;
|
@include dark-theme;
|
||||||
@include dark-editor-theme;
|
@include dark-editor-theme;
|
||||||
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root.black {
|
:root.black {
|
||||||
@include black-theme;
|
@include black-theme;
|
||||||
@include black-editor-theme;
|
@include black-editor-theme;
|
||||||
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root[data-accent="blue"] {
|
:root[data-accent="blue"] {
|
||||||
|
|||||||
@@ -1,13 +1,27 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="autocomplete-wrapper">
|
<div class="autocomplete-wrapper">
|
||||||
<input ref="acInput" v-model="text" type="text" autocomplete="off" :placeholder="placeholder" :spellcheck="spellcheck"
|
<input
|
||||||
:autocapitalize="autocapitalize" :class="styles" @input.stop="onInput" @keyup="updateSuggestions"
|
ref="acInput"
|
||||||
@click="updateSuggestions" @keydown="handleKeystroke" @change="emit('change', $event)" />
|
v-model="text"
|
||||||
|
type="text"
|
||||||
<ul v-if="suggestions.length > 0 && suggestionsVisible" class="suggestions"
|
autocomplete="off"
|
||||||
:style="{ transform: `translate(${suggestionsOffsetLeft}px, 0)` }">
|
:placeholder="placeholder"
|
||||||
<li v-for="(suggestion, index) in suggestions" :key="`suggestion-${index}`"
|
:spellcheck="spellcheck"
|
||||||
:class="{ active: currentSuggestionIndex === index }" @click.prevent="forceSuggestion(suggestion)">
|
:autocapitalize="autocapitalize"
|
||||||
|
:class="styles"
|
||||||
|
@input.stop="onInput"
|
||||||
|
@keyup="updateSuggestions"
|
||||||
|
@click="updateSuggestions"
|
||||||
|
@keydown="handleKeystroke"
|
||||||
|
@change="emit('change', $event)"
|
||||||
|
/>
|
||||||
|
<ul v-if="suggestions.length > 0 && suggestionsVisible" class="suggestions">
|
||||||
|
<li
|
||||||
|
v-for="(suggestion, index) in suggestions"
|
||||||
|
:key="`suggestion-${index}`"
|
||||||
|
:class="{ active: currentSuggestionIndex === index }"
|
||||||
|
@click.prevent="forceSuggestion(suggestion)"
|
||||||
|
>
|
||||||
{{ suggestion }}
|
{{ suggestion }}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -62,11 +76,9 @@ const emit = defineEmits<{
|
|||||||
|
|
||||||
const text = ref(props.value)
|
const text = ref(props.value)
|
||||||
const selectionStart = ref(0)
|
const selectionStart = ref(0)
|
||||||
const suggestionsOffsetLeft = ref(0)
|
|
||||||
const currentSuggestionIndex = ref(-1)
|
const currentSuggestionIndex = ref(-1)
|
||||||
const suggestionsVisible = ref(false)
|
const suggestionsVisible = ref(false)
|
||||||
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
updateSuggestions({
|
updateSuggestions({
|
||||||
target: acInput,
|
target: acInput,
|
||||||
@@ -82,14 +94,11 @@ const suggestions = computed(() => {
|
|||||||
entry.toLowerCase().startsWith(input.toLowerCase()) &&
|
entry.toLowerCase().startsWith(input.toLowerCase()) &&
|
||||||
input.toLowerCase() !== entry.toLowerCase()
|
input.toLowerCase() !== entry.toLowerCase()
|
||||||
)
|
)
|
||||||
// Cut off the part that's already been typed.
|
|
||||||
.map((entry) => entry.substring(selectionStart.value))
|
|
||||||
// We only want the top 10 suggestions.
|
// We only want the top 10 suggestions.
|
||||||
.slice(0, 10)
|
.slice(0, 10)
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
function updateSuggestions(event: any) {
|
function updateSuggestions(event: any) {
|
||||||
// Hide suggestions if ESC pressed.
|
// Hide suggestions if ESC pressed.
|
||||||
if (event.code && event.code === "Escape") {
|
if (event.code && event.code === "Escape") {
|
||||||
@@ -102,18 +111,16 @@ function updateSuggestions(event: any) {
|
|||||||
// As suggestions is a reactive property, this implicitly
|
// As suggestions is a reactive property, this implicitly
|
||||||
// causes suggestions to update.
|
// causes suggestions to update.
|
||||||
selectionStart.value = acInput.value?.selectionStart ?? -1
|
selectionStart.value = acInput.value?.selectionStart ?? -1
|
||||||
suggestionsOffsetLeft.value = 12 * selectionStart.value
|
|
||||||
suggestionsVisible.value = true
|
suggestionsVisible.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
const onInput = (e: Event) => {
|
const onInput = (e: Event) => {
|
||||||
emit('input', (e.target as HTMLInputElement).value)
|
emit("input", (e.target as HTMLInputElement).value)
|
||||||
updateSuggestions(e)
|
updateSuggestions(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
function forceSuggestion(str: string) {
|
function forceSuggestion(suggestion: string) {
|
||||||
const input = text.value.substring(0, selectionStart.value)
|
text.value = suggestion
|
||||||
text.value = input + str
|
|
||||||
|
|
||||||
selectionStart.value = text.value.length
|
selectionStart.value = text.value.length
|
||||||
suggestionsVisible.value = true
|
suggestionsVisible.value = true
|
||||||
@@ -124,18 +131,9 @@ function forceSuggestion(str: string) {
|
|||||||
|
|
||||||
function handleKeystroke(event: any) {
|
function handleKeystroke(event: any) {
|
||||||
switch (event.code) {
|
switch (event.code) {
|
||||||
case "Enter":
|
|
||||||
event.preventDefault()
|
|
||||||
if (currentSuggestionIndex.value > -1)
|
|
||||||
forceSuggestion(
|
|
||||||
suggestions.value.find(
|
|
||||||
(_item, index) => index === currentSuggestionIndex.value
|
|
||||||
)!
|
|
||||||
)
|
|
||||||
break
|
|
||||||
|
|
||||||
case "ArrowUp":
|
case "ArrowUp":
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
|
|
||||||
currentSuggestionIndex.value =
|
currentSuggestionIndex.value =
|
||||||
currentSuggestionIndex.value - 1 >= 0
|
currentSuggestionIndex.value - 1 >= 0
|
||||||
? currentSuggestionIndex.value - 1
|
? currentSuggestionIndex.value - 1
|
||||||
@@ -144,53 +142,63 @@ function handleKeystroke(event: any) {
|
|||||||
|
|
||||||
case "ArrowDown":
|
case "ArrowDown":
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
|
|
||||||
currentSuggestionIndex.value =
|
currentSuggestionIndex.value =
|
||||||
currentSuggestionIndex.value < suggestions.value.length - 1
|
currentSuggestionIndex.value < suggestions.value.length - 1
|
||||||
? currentSuggestionIndex.value + 1
|
? currentSuggestionIndex.value + 1
|
||||||
: suggestions.value.length - 1
|
: suggestions.value.length - 1
|
||||||
break
|
break
|
||||||
|
|
||||||
|
case "Enter":
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
if (currentSuggestionIndex.value > -1)
|
||||||
|
forceSuggestion(
|
||||||
|
suggestions.value.find(
|
||||||
|
(_item, index) => index === currentSuggestionIndex.value
|
||||||
|
)!
|
||||||
|
)
|
||||||
|
break
|
||||||
|
|
||||||
case "Tab": {
|
case "Tab": {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
const activeSuggestion =
|
const activeSuggestion =
|
||||||
suggestions.value[
|
suggestions.value[
|
||||||
currentSuggestionIndex.value >= 0 ? currentSuggestionIndex.value : 0
|
currentSuggestionIndex.value >= 0 ? currentSuggestionIndex.value : 0
|
||||||
]
|
]
|
||||||
|
|
||||||
if (!activeSuggestion) {
|
if (!activeSuggestion) return
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault()
|
forceSuggestion(activeSuggestion)
|
||||||
const input = text.value.substring(0, selectionStart.value)
|
|
||||||
text.value = input + activeSuggestion
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.autocomplete-wrapper {
|
.autocomplete-wrapper {
|
||||||
@apply relative;
|
@apply relative;
|
||||||
@apply contents;
|
@apply contents;
|
||||||
|
|
||||||
input:focus+ul.suggestions,
|
input:focus + ul.suggestions,
|
||||||
ul.suggestions:hover {
|
ul.suggestions:hover {
|
||||||
@apply block;
|
@apply block;
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.suggestions {
|
ul.suggestions {
|
||||||
|
@apply absolute;
|
||||||
@apply hidden;
|
@apply hidden;
|
||||||
@apply bg-popover;
|
@apply bg-popover;
|
||||||
@apply absolute;
|
@apply -left-px;
|
||||||
@apply mx-2;
|
|
||||||
@apply left-0;
|
|
||||||
@apply z-50;
|
@apply z-50;
|
||||||
@apply shadow-lg;
|
@apply shadow-lg;
|
||||||
@apply max-h-46;
|
@apply max-h-46;
|
||||||
@apply overflow-y-auto;
|
@apply overflow-y-auto;
|
||||||
top: calc(100% - 4px);
|
@apply border-b border-x border-divider;
|
||||||
|
|
||||||
|
top: calc(100% + 1px);
|
||||||
border-radius: 0 0 8px 8px;
|
border-radius: 0 0 8px 8px;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
@@ -198,15 +206,16 @@ function handleKeystroke(event: any) {
|
|||||||
@apply block;
|
@apply block;
|
||||||
@apply py-2 px-4;
|
@apply py-2 px-4;
|
||||||
@apply text-secondary;
|
@apply text-secondary;
|
||||||
|
@apply font-semibold;
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
border-radius: 0 0 8px 8px;
|
border-radius: 0 0 0 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover,
|
&:hover,
|
||||||
&.active {
|
&.active {
|
||||||
@apply bg-accentDark;
|
@apply bg-primaryDark;
|
||||||
@apply text-accentContrast;
|
@apply text-secondaryDark;
|
||||||
@apply cursor-pointer;
|
@apply cursor-pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
:src="url"
|
:src="url"
|
||||||
:alt="alt"
|
:alt="alt"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
|
referrerpolicy="no-referrer"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
v-else
|
v-else
|
||||||
@@ -21,8 +22,7 @@
|
|||||||
<template v-if="initial && initial.charAt(0).toUpperCase()">
|
<template v-if="initial && initial.charAt(0).toUpperCase()">
|
||||||
{{ initial.charAt(0).toUpperCase() }}
|
{{ initial.charAt(0).toUpperCase() }}
|
||||||
</template>
|
</template>
|
||||||
|
<icon-lucide-user v-else />
|
||||||
<icon-lucide-user v-else></icon-lucide-user>
|
|
||||||
</div>
|
</div>
|
||||||
<span
|
<span
|
||||||
v-if="indicator"
|
v-if="indicator"
|
||||||
|
|||||||
31
pnpm-lock.yaml
generated
@@ -574,6 +574,9 @@ importers:
|
|||||||
workbox-window:
|
workbox-window:
|
||||||
specifier: ^6.5.4
|
specifier: ^6.5.4
|
||||||
version: 6.5.4
|
version: 6.5.4
|
||||||
|
xml-formatter:
|
||||||
|
specifier: ^3.4.1
|
||||||
|
version: 3.4.1
|
||||||
yargs-parser:
|
yargs-parser:
|
||||||
specifier: ^21.1.1
|
specifier: ^21.1.1
|
||||||
version: 21.1.1
|
version: 21.1.1
|
||||||
@@ -8955,7 +8958,7 @@ packages:
|
|||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
/after@0.8.2:
|
/after@0.8.2:
|
||||||
resolution: {integrity: sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=}
|
resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/agent-base@6.0.2:
|
/agent-base@6.0.2:
|
||||||
@@ -9567,7 +9570,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
|
||||||
/base64-arraybuffer@0.1.4:
|
/base64-arraybuffer@0.1.4:
|
||||||
resolution: {integrity: sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=}
|
resolution: {integrity: sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==}
|
||||||
engines: {node: '>= 0.6.0'}
|
engines: {node: '>= 0.6.0'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
@@ -10214,14 +10217,14 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/component-bind@1.0.0:
|
/component-bind@1.0.0:
|
||||||
resolution: {integrity: sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=}
|
resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/component-emitter@1.3.0:
|
/component-emitter@1.3.0:
|
||||||
resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==}
|
resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==}
|
||||||
|
|
||||||
/component-inherit@0.0.3:
|
/component-inherit@0.0.3:
|
||||||
resolution: {integrity: sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=}
|
resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/concat-map@0.0.1:
|
/concat-map@0.0.1:
|
||||||
@@ -13392,7 +13395,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/has-cors@1.1.0:
|
/has-cors@1.1.0:
|
||||||
resolution: {integrity: sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=}
|
resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/has-flag@3.0.0:
|
/has-flag@3.0.0:
|
||||||
@@ -13785,7 +13788,7 @@ packages:
|
|||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
/indexof@0.0.1:
|
/indexof@0.0.1:
|
||||||
resolution: {integrity: sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=}
|
resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/inflight@1.0.6:
|
/inflight@1.0.6:
|
||||||
@@ -19486,7 +19489,7 @@ packages:
|
|||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/to-array@0.1.4:
|
/to-array@0.1.4:
|
||||||
resolution: {integrity: sha1-F+bBH3PdTz10zaek/zI46a2b+JA=}
|
resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/to-fast-properties@2.0.0:
|
/to-fast-properties@2.0.0:
|
||||||
@@ -21868,6 +21871,13 @@ packages:
|
|||||||
optional: true
|
optional: true
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/xml-formatter@3.4.1:
|
||||||
|
resolution: {integrity: sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==}
|
||||||
|
engines: {node: '>= 14'}
|
||||||
|
dependencies:
|
||||||
|
xml-parser-xo: 4.1.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/xml-name-validator@3.0.0:
|
/xml-name-validator@3.0.0:
|
||||||
resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
|
resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
|
||||||
dev: true
|
dev: true
|
||||||
@@ -21877,6 +21887,11 @@ packages:
|
|||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/xml-parser-xo@4.1.0:
|
||||||
|
resolution: {integrity: sha512-9mQMLmq8J++XlQH9WF57oQxFVbR3YM6dPPtTuV+++aMe2gRoRU/kj819/6IptUmfhC1d2DSFiYxEcpkoLabeJw==}
|
||||||
|
engines: {node: '>= 14'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/xml2js@0.4.23:
|
/xml2js@0.4.23:
|
||||||
resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==}
|
resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==}
|
||||||
engines: {node: '>=4.0.0'}
|
engines: {node: '>=4.0.0'}
|
||||||
@@ -22048,7 +22063,7 @@ packages:
|
|||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/yeast@0.1.2:
|
/yeast@0.1.2:
|
||||||
resolution: {integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=}
|
resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/yn@3.1.1:
|
/yn@3.1.1:
|
||||||
|
|||||||