diff --git a/.eslintrc.js b/.eslintrc.js index 47a3d33..4907d93 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,19 +1,8 @@ const config = require('@lobehub/lint').eslint; -config.rules['indent'] = ['off', 2]; +config.rules['linebreak-style'] = 0; +config.rules['no-undef'] = 0; +config.rules['object-curly-spacing'] = 0; +config.rules['unicorn/prefer-add-event-listener'] = 0; -module.exports = { - ...config, - overrides: [ - { - files: ['*.ts', '*.tsx'], - rules: { - 'linebreak-style': 0, - 'no-undef': 0, - 'object-curly-spacing': 0, - 'unicorn/prefer-add-event-listener': 0, - 'unused-imports/no-unused-imports': 0, - }, - }, - ], -}; +module.exports = config; diff --git a/.i18nrc.js b/.i18nrc.js index fb7fc10..ff52873 100644 --- a/.i18nrc.js +++ b/.i18nrc.js @@ -10,7 +10,6 @@ module.exports = { entryLocale: 'en_US', output: 'locales', outputLocales: outputLocales, - temperature: 0, modelName: 'gpt-3.5-turbo-1106', experimental: { jsonMode: true, diff --git a/locales/de_DE.json b/locales/de_DE.json new file mode 100644 index 0000000..3bc66d4 --- /dev/null +++ b/locales/de_DE.json @@ -0,0 +1,159 @@ +{ + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "Benutzerdefiniert" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme initialisiert, bitte warten..." + }, + "footer": { + "resources": "Ressourcen", + "community": "Gemeinschaft", + "help": "Hilfe", + "moreProducts": "Weitere Produkte" + }, + "header": { + "feedback": "Feedback", + "switchTheme": "Wechseln Sie das Licht-/Dunkel-Thema", + "setting": "Einstellung" + }, + "modal": { + "themeFeedback": { + "title": "Themenfeedback" + }, + "themeSetting": { + "title": "Themen-Einstellungen" + } + }, + "prompt": { + "load": "Lade-Prompt", + "set": "Setze-Prompt", + "negative": "Negativ", + "positive": "Positiv" + }, + "setting": { + "button": { + "reset": "Zurücksetzen", + "submit": "Anwenden und Schnittstelle neu starten" + }, + "confirmPageUnload": { + "title": "Bestätigung beim Verlassen der Seite", + "desc": "Hilft, den Verlust von ungespeicherten Daten zu verhindern" + }, + "customFont": { + "title": "Benutzerdefinierte Schriftart", + "desc": "Wenn aktiviert, wird automatisch eine Webfont geladen, um die Anzeige von Text in Chinesisch, Englisch und Code zu verbessern" + }, + "customLogo": { + "title": "Benutzerdefiniertes Logo", + "desc": "Unterstützt URL / Base64 / Emoji-Symbole" + }, + "customTitle": { + "title": "Benutzerdefinierter Titel", + "desc": "Benutzerdefinierter Logotitel" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "Modell-Cover-Größe", + "desc": "Standardwert der Modell-Cover-Größe beim Starten" + }, + "defaultExpand": { + "title": "Standardmäßig erweitern", + "desc": "Ob die Seitenleiste beim Starten standardmäßig erweitert werden soll" + }, + "defaultWidth": { + "title": "Standardbreite", + "desc": "Standardbreite der Seitenleiste beim Starten" + }, + "displayMode": { + "title": "Anzeigemodus", + "desc": "Festgelegt als Rastermodus für konstante Anzeige, automatische Erweiterung, wenn die Maus an den Rand im schwebenden Modus bewegt wird" + }, + "enable": { + "title": "Aktivieren", + "desc": "Aktivieren Sie die zusätzliche Netzwerkseitenleiste auf der rechten Seite" + } + }, + "group": { + "extraNetworkSidebar": "Zusätzliche Netzwerkseitenleiste", + "layout": "Layout-Einstellungen", + "promptTextarea": "Prompt-Textfeld", + "quickSettingSidebar": "Schnelle Einstellungsseitenleiste", + "theme": "Themen-Einstellungen" + }, + "hideFooter": { + "title": "Fußzeile ausblenden", + "desc": "Blenden Sie die Themenfußzeile aus und zeigen Sie nur die Standardfußzeile von Stable Diffusion WebUI an" + }, + "language": { + "title": "Sprache", + "desc": "Lappen-Themensprache" + }, + "logoType": { + "title": "Logo-Typ", + "desc": "Logo-Typ", + "preview": "Vorschau" + }, + "neutralColor": { + "title": "Neutrale Farbe", + "desc": "Passen Sie verschiedene Grautöne mit unterschiedlichen Farbtendenzen an, der zweite ist die originale neutrale Farbe der Küche" + }, + "primaryColor": { + "title": "Primärfarbe", + "desc": "Benutzerdefinierte Primärfarbe, die zweite ist die originale Farbe des Küchenthemas" + }, + "promptDisplayMode": { + "title": "Prompt-Anzeigemodus", + "desc": "Feste Höhe oder automatische Höhe mit ziehbarer Größenänderungsunterstützung", + "resizable": "Größenänderbar", + "scroll": "Scrollen" + }, + "promptEditor": { + "title": "Prompt-Editor", + "desc": "Bietet einen einfachen Prompt-Editor oben in der Schnelleinstellungsseitenleiste" + }, + "promptHighlight": { + "title": "Prompt-Syntaxhervorhebung", + "desc": "Färbt die Prompt-Anzeige automatisch gemäß den Stable Diffusion-Syntaxregeln ein" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "Standardmäßig erweitern", + "desc": "Ob die Seitenleiste beim Starten standardmäßig erweitert werden soll" + }, + "defaultWidth": { + "title": "Standardbreite", + "desc": "Standardbreite der Seitenleiste beim Starten" + }, + "displayMode": { + "title": "Anzeigemodus", + "desc": "Festgelegt als Rastermodus für konstante Anzeige, automatische Erweiterung, wenn die Maus an den Rand im schwebenden Modus bewegt wird" + }, + "enable": { + "title": "Aktivieren", + "desc": "Aktivieren Sie die Schnelleinstellungsseitenleiste auf der linken Seite" + } + }, + "reduceAnimation": { + "title": "Animation reduzieren", + "desc": "Reduzieren Sie den Unschärfeeffekt und die Hintergrundflussfarbe, um die Geschmeidigkeit zu verbessern und die CPU-Auslastung zu reduzieren" + }, + "splitPreviewer": { + "title": "Split-Previewer", + "desc": "Platzieren Sie das Prompt-Eingabefeld links und die Generierungsschaltfläche rechts, um sicherzustellen, dass das generierte Bild beim Scrollen immer oben angezeigt wird (experimentell)" + }, + "svgIcons": { + "title": "SVG-Symbole", + "desc": "Ersetzen Sie alle Emoji-Symbole in Stable Diffusion WebUI global durch SVG-Symbole" + } + }, + "sidebar": { + "extraNetwork": "Zusätzliches Netzwerk", + "quickSetting": "Schnelleinstellung", + "mode": { + "fixed": "Fixiert", + "float": "Schwebend" + } + } +} diff --git a/locales/en_US.json b/locales/en_US.json index f320bdb..cbb42fa 100644 --- a/locales/en_US.json +++ b/locales/en_US.json @@ -1,82 +1,159 @@ { - "appInitializing": "StableDiffusion / LobeTheme is initializing, please wait...", - "community": "Community", - "custom": "Custom", - "extraNetwork": "Extra Network", - "feedback": "Feedback", - "fixed": "Fixed", - "float": "Float", - "help": "Help", - "kitchen": "Kitchen", - "loadPrompt": "Load Prompt", - "lobe": "Lobe", - "moreProducts": "More Products", - "negative": "Negative", - "positive": "Positive", - "quickSetting": "Quick Setting", - "resizable": "Resizable", - "resources": "Resources", - "scroll": "Scroll", - "setPrompt": "Set Prompt", - "setting": "Setting", - "settingButtonReset": "Reset", - "settingButtonSubmit": "Apply and Restart Interface", - "settingConfirmPageUnload": "Confirmation on page leaving", - "settingConfirmPageUnloadDesc": "Helps prevent loss of unsaved data", - "settingCustomFont": "Load Custom Font", - "settingCustomFontDesc": "When enabled, it will automatically load a webfont to enhance the display of text in Chinese, English, and code", - "settingCustomLogo": "Custom Logo", - "settingCustomLogoDesc": "Support URL / Base64 / Emoji symbols", - "settingCustomTitle": "Custom Title", - "settingCustomTitleDesc": "Custom Logo Title", - "settingExtraNetworkSidebarDefaultCardSize": "Model Cover Size", - "settingExtraNetworkSidebarDefaultCardSizeDesc": "Default value of model cover size when starting", - "settingExtraNetworkSidebarDefaultExpand": "Default Expand", - "settingExtraNetworkSidebarDefaultExpandDesc": "Whether to expand the sidebar by default when starting", - "settingExtraNetworkSidebarDefaultWidth": "Default Width", - "settingExtraNetworkSidebarDefaultWidthDesc": "Default width of the sidebar when starting", - "settingExtraNetworkSidebarDisplayMode": "Display Mode", - "settingExtraNetworkSidebarDisplayModeDesc": "Fixed as grid mode for constant display, auto-expand when the mouse moves to the side in floating mode", - "settingExtraNetworkSidebarEnable": "Enable", - "settingExtraNetworkSidebarEnableDesc": "Enable the extra network sidebar on the right side", - "settingGroupExtraNetworkSidebar": "Extra Network Sidebar", - "settingGroupLayout": "Layout Settings", - "settingGroupPromptTextarea": "Prompt Textbox", - "settingGroupQuickSettingSidebar": "Quick Setting Sidebar", - "settingGroupTheme": "Theme Settings", - "settingHideFooter": "Hide Footer", - "settingHideFooterDesc": "Hide the theme footer and only display the default footer of stable diffusion webui", - "settingLanguage": "Language", - "settingLanguageDesc": "Lobe Theme language", - "settingLogoPreview": "Preview", - "settingLogoType": "Logo Type", - "settingLogoTypeDesc": "Logo Type", - "settingNeutralColor": "Neutral Color", - "settingNeutralColorDesc": "Customize different shades of gray with different color tendencies, the second one is the original Kitchen neutral color", - "settingPrimaryColor": "Primary Color", - "settingPrimaryColorDesc": "Custom primary color, the second one is the original Kitchen theme color", - "settingPromptDisplayMode": "Display Mode", - "settingPromptDisplayModeDesc": "Fixed height or auto height with draggable resize support", - "settingPromptEditor": "Prompt Editor", - "settingPromptEditorDesc": "Provide a simple prompt editor at the top of the quick setting sidebar", - "settingPromptHighlight": "Prompt Syntax Highlighting", - "settingPromptHighlightDesc": "Automatically colorize prompt display according to the Stable Diffusion syntax rules", - "settingQuickSettingSidebarDefaultExpand": "Default Expand", - "settingQuickSettingSidebarDefaultExpandDesc": "Whether to expand the sidebar by default when starting", - "settingQuickSettingSidebarDefaultWidth": "Default Width", - "settingQuickSettingSidebarDefaultWidthDesc": "Default width of the sidebar when starting", - "settingQuickSettingSidebarDisplayMode": "Display Mode", - "settingQuickSettingSidebarDisplayModeDesc": "Fixed as grid mode for constant display, auto-expand when the mouse moves to the side in floating mode", - "settingQuickSettingSidebarEnable": "Enable", - "settingQuickSettingSidebarEnableDesc": "Enable the quick setting sidebar on the left side", - "settingReduceAnimation": "Reduce Animation", - "settingReduceAnimationDesc": "Reduce the blur effect and background flow color, which can improve smoothness and save CPU usage", - "settingSplitPreviewer": "Split Previewer", - "settingSplitPreviewerDesc": "Put the prompt input box on the left and the generate button on the right, ensuring that the generated image is always displayed at the top when scrolling (experimental)", - "settingSvgIcons": "Use SVG Icons", - "settingSvgIconsDesc": "Replace all Emoji icons in stable diffusion webui with SVG icons globally", - "switchTheme": "Switch Light/Dark Theme", - "sync": "Sync with webui setting", - "themeFeedback": "Theme Feedback", - "themeSetting": "Theme Settings" + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "Custom" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme is initializing, please wait..." + }, + "footer": { + "resources": "Resources", + "community": "Community", + "help": "Help", + "moreProducts": "More Products" + }, + "header": { + "feedback": "Feedback", + "switchTheme": "Switch Light/Dark Theme", + "setting": "Setting" + }, + "modal": { + "themeFeedback": { + "title": "Theme Feedback" + }, + "themeSetting": { + "title": "Theme Settings" + } + }, + "prompt": { + "load": "Load Prompt", + "set": "Set Prompt", + "negative": "Negative", + "positive": "Positive" + }, + "setting": { + "button": { + "reset": "Reset", + "submit": "Apply and Restart Interface" + }, + "confirmPageUnload": { + "title": "Confirmation on page leaving", + "desc": "Helps prevent loss of unsaved data" + }, + "customFont": { + "title": "Custom Font", + "desc": "When enabled, it will automatically load a webfont to enhance the display of text in Chinese, English, and code" + }, + "customLogo": { + "title": "Custom Logo", + "desc": "Support URL / Base64 / Emoji symbols" + }, + "customTitle": { + "title": "Custom Title", + "desc": "Custom Logo Title" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "Model Cover Size", + "desc": "Default value of model cover size when starting" + }, + "defaultExpand": { + "title": "Default Expand", + "desc": "Whether to expand the sidebar by default when starting" + }, + "defaultWidth": { + "title": "Default Width", + "desc": "Default width of the sidebar when starting" + }, + "displayMode": { + "title": "Display Mode", + "desc": "Fixed as grid mode for constant display, auto-expand when the mouse moves to the side in floating mode" + }, + "enable": { + "title": "Enable", + "desc": "Enable the extra network sidebar on the right side" + } + }, + "group": { + "extraNetworkSidebar": "Extra Network Sidebar", + "layout": "Layout Settings", + "promptTextarea": "Prompt Textbox", + "quickSettingSidebar": "Quick Setting Sidebar", + "theme": "Theme Settings" + }, + "hideFooter": { + "title": "Hide Footer", + "desc": "Hide the theme footer and only display the default footer of stable diffusion webui" + }, + "language": { + "title": "Language", + "desc": "Lobe Theme language" + }, + "logoType": { + "title": "Logo Type", + "desc": "Logo Type", + "preview": "Preview" + }, + "neutralColor": { + "title": "Neutral Color", + "desc": "Customize different shades of gray with different color tendencies, the second one is the original Kitchen neutral color" + }, + "primaryColor": { + "title": "Primary Color", + "desc": "Custom primary color, the second one is the original Kitchen theme color" + }, + "promptDisplayMode": { + "title": "Prompt Display Mode", + "desc": "Fixed height or auto height with draggable resize support", + "resizable": "Resizable", + "scroll": "Scroll" + }, + "promptEditor": { + "title": "Prompt Editor", + "desc": "Provide a simple prompt editor at the top of the quick setting sidebar" + }, + "promptHighlight": { + "title": "Prompt Syntax Highlighting", + "desc": "Automatically colorize prompt display according to the Stable Diffusion syntax rules" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "Default Expand", + "desc": "Whether to expand the sidebar by default when starting" + }, + "defaultWidth": { + "title": "Default Width", + "desc": "Default width of the sidebar when starting" + }, + "displayMode": { + "title": "Display Mode", + "desc": "Fixed as grid mode for constant display, auto-expand when the mouse moves to the side in floating mode" + }, + "enable": { + "title": "Enable", + "desc": "Enable the quick setting sidebar on the left side" + } + }, + "reduceAnimation": { + "title": "Reduce Animation", + "desc": "Reduce the blur effect and background flow color, which can improve smoothness and save CPU usage" + }, + "splitPreviewer": { + "title": "Split Previewer", + "desc": "Put the prompt input box on the left and the generate button on the right, ensuring that the generated image is always displayed at the top when scrolling (experimental)" + }, + "svgIcons": { + "title": "SVG Icons", + "desc": "Replace all Emoji icons in stable diffusion webui with SVG icons globally" + } + }, + "sidebar": { + "extraNetwork": "Extra Network", + "quickSetting": "Quick Setting", + "mode": { + "fixed": "Fixed", + "float": "Float" + } + } } diff --git a/locales/es_ES.json b/locales/es_ES.json index 942759b..a8f4404 100644 --- a/locales/es_ES.json +++ b/locales/es_ES.json @@ -1,82 +1,159 @@ { - "appInitializing": "StableDiffusion/LobeTheme se está inicializando, espere...", - "community": "Comunidad", - "custom": "Personalizado", - "extraNetwork": "Red Adicional", - "feedback": "Comentarios", - "fixed": "Fijado", - "float": "Flotante", - "help": "Ayuda", - "kitchen": "Kitchen", - "loadPrompt": "Cargar Prompt", - "lobe": "Lobe", - "moreProducts": "Más Productos", - "negative": "Negativo", - "positive": "Positivo", - "quickSetting": "Configuración Rápida", - "resizable": "Redimensionable", - "resources": "Recursos", - "scroll": "Desplazarse", - "setPrompt": "Establecer Prompt", - "setting": "Configuración", - "settingButtonReset": "Reiniciar", - "settingButtonSubmit": "Aplicar y reiniciar la interfaz", - "settingConfirmPageUnload": "Confirma el cierre de la página", - "settingConfirmPageUnloadDesc": "Ayuda a evitar la pérdida de datos no guardados", - "settingCustomFont": "Cargar fuente personalizada", - "settingCustomFontDesc": "Cuando esté habilitado, cargará automáticamente una fuente web para mejorar la visualización del texto en chino, inglés y código", - "settingCustomLogo": "Logo personalizado", - "settingCustomLogoDesc": "URL de soporte/Base64/símbolos Emoji", - "settingCustomTitle": "Título personalizado", - "settingCustomTitleDesc": "Título del logo personalizado", - "settingExtraNetworkSidebarDefaultCardSize": "Tamaño de portada del modelo", - "settingExtraNetworkSidebarDefaultCardSizeDesc": "Valor predeterminado del tamaño de la cubierta del modelo al iniciar", - "settingExtraNetworkSidebarDefaultExpand": "Expansión predeterminada", - "settingExtraNetworkSidebarDefaultExpandDesc": "Si se expande la barra lateral de forma predeterminada al iniciar", - "settingExtraNetworkSidebarDefaultWidth": "Ancho predeterminado", - "settingExtraNetworkSidebarDefaultWidthDesc": "Ancho predeterminado de la barra lateral al iniciar", - "settingExtraNetworkSidebarDisplayMode": "Modo de visualización", - "settingExtraNetworkSidebarDisplayModeDesc": "Fijo a modo de cuadrícula para visualización constante, se expande automáticamente cuando el mouse se mueve hacia un lado en modo flotante", - "settingExtraNetworkSidebarEnable": "Habilitar", - "settingExtraNetworkSidebarEnableDesc": "Habilita la barra lateral de red adicional en el lado derecho", - "settingGroupExtraNetworkSidebar": "Barra lateral de red adicional", - "settingGroupLayout": "Ajustes de diseño", - "settingGroupPromptTextarea": "Cuadro de texto del Prompt", - "settingGroupQuickSettingSidebar": "Barra lateral de configuración rápida", - "settingGroupTheme": "Configuración del tema", - "settingHideFooter": "Ocultar pie de página", - "settingHideFooterDesc": "Ocultar el pie de página del tema y mostrar solo el pie de página predeterminado de la webui de stable diffusion webui", - "settingLanguage": "Idioma", - "settingLanguageDesc": "Idioma del tema Lobe", - "settingLogoPreview": "Vista previa", - "settingLogoType": "Tipo de Logo", - "settingLogoTypeDesc": "Tipo de logo", - "settingNeutralColor": "Color Neutro", - "settingNeutralColorDesc": "Personaliza diferentes tonos de gris con diferentes tendencias de color, el segundo es el color neutro original del tema Kitchen", - "settingPrimaryColor": "Color primario", - "settingPrimaryColorDesc": "Color primario personalizado, el segundo es el color original del tema Kitchen", - "settingPromptDisplayMode": "Modo de Visualización", - "settingPromptDisplayModeDesc": "Altura fija o altura automática con soporte para cambio de tamaño arrastrable", - "settingPromptEditor": "Editor de Prompts", - "settingPromptEditorDesc": "Proporciona un editor de Prompts sencillo en la parte superior de la barra lateral de configuración rápida", - "settingPromptHighlight": "Resaltar sintaxis del Prompt", - "settingPromptHighlightDesc": "Colorear automáticamente la visualización del prompt de acuerdo con las reglas de sintaxis de Stable Diffusion", - "settingQuickSettingSidebarDefaultExpand": "Expansión predeterminada", - "settingQuickSettingSidebarDefaultExpandDesc": "Si se expande la barra lateral de forma predeterminada al iniciar", - "settingQuickSettingSidebarDefaultWidth": "Ancho predeterminado", - "settingQuickSettingSidebarDefaultWidthDesc": "Ancho predeterminado de la barra lateral al iniciar", - "settingQuickSettingSidebarDisplayMode": "Modo de Visualización", - "settingQuickSettingSidebarDisplayModeDesc": "Fijo como modo de cuadrícula para visualización constante, se expande automáticamente cuando el mouse se mueve hacia un lado en el modo flotante", - "settingQuickSettingSidebarEnable": "Habilitar", - "settingQuickSettingSidebarEnableDesc": "Habilita la barra lateral de configuración rápida en el lado izquierdo", - "settingReduceAnimation": "Reducir animación", - "settingReduceAnimationDesc": "Reduce el efecto de desenfoque y el color del flujo de fondo, lo que puede mejorar la suavidad y ahorrar uso de CPU", - "settingSplitPreviewer": "Vista Previa Dividida", - "settingSplitPreviewerDesc": "Coloque el cuadro de entrada de solicitud a la izquierda y el botón generar a la derecha, asegurándose de que la imagen generada siempre se muestre en la parte superior al desplazarse (experimental)", - "settingSvgIcons": "Usar Iconos SVG", - "settingSvgIconsDesc": "Reemplazar globalmente todos los íconos Emoji en la interfaz de Stable Diffusion con íconos SVG", - "switchTheme": "Cambiar Tema Claro/Oscuro", - "sync": "Sincronizar con la configuración Webui", - "themeFeedback": "Comentarios del Tema", - "themeSetting": "Configuración del Tema" + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "Personalizado" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme se está inicializando, por favor espere..." + }, + "footer": { + "resources": "Recursos", + "community": "Comunidad", + "help": "Ayuda", + "moreProducts": "Más productos" + }, + "header": { + "feedback": "Comentarios", + "switchTheme": "Cambiar tema claro/oscuro", + "setting": "Configuración" + }, + "modal": { + "themeFeedback": { + "title": "Comentarios sobre el tema" + }, + "themeSetting": { + "title": "Configuración del tema" + } + }, + "prompt": { + "load": "Cargar aviso", + "set": "Establecer aviso", + "negative": "Negativo", + "positive": "Positivo" + }, + "setting": { + "button": { + "reset": "Restablecer", + "submit": "Aplicar y reiniciar interfaz" + }, + "confirmPageUnload": { + "title": "Confirmación al abandonar la página", + "desc": "Ayuda a prevenir la pérdida de datos no guardados" + }, + "customFont": { + "title": "Fuente personalizada", + "desc": "Cuando está habilitada, cargará automáticamente una webfont para mejorar la visualización del texto en chino, inglés y código" + }, + "customLogo": { + "title": "Logotipo personalizado", + "desc": "Soporta URL / Base64 / Símbolos Emoji" + }, + "customTitle": { + "title": "Título personalizado", + "desc": "Título del logotipo personalizado" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "Tamaño de portada del modelo", + "desc": "Valor predeterminado del tamaño de portada del modelo al iniciar" + }, + "defaultExpand": { + "title": "Expansión predeterminada", + "desc": "Si expandir la barra lateral de forma predeterminada al iniciar" + }, + "defaultWidth": { + "title": "Ancho predeterminado", + "desc": "Ancho predeterminado de la barra lateral al iniciar" + }, + "displayMode": { + "title": "Modo de visualización", + "desc": "Fijo como modo de cuadrícula para visualización constante, autoexpandible cuando el mouse se mueve hacia el lado en modo flotante" + }, + "enable": { + "title": "Habilitar", + "desc": "Habilitar la barra lateral de red adicional en el lado derecho" + } + }, + "group": { + "extraNetworkSidebar": "Barra lateral de red adicional", + "layout": "Configuración de diseño", + "promptTextarea": "Cuadro de texto de aviso", + "quickSettingSidebar": "Barra lateral de configuración rápida", + "theme": "Configuración del tema" + }, + "hideFooter": { + "title": "Ocultar pie de página", + "desc": "Ocultar el pie de página del tema y solo mostrar el pie de página predeterminado de stable diffusion webui" + }, + "language": { + "title": "Idioma", + "desc": "Idioma del tema Lóbulo" + }, + "logoType": { + "title": "Tipo de logotipo", + "desc": "Tipo de logotipo", + "preview": "Vista previa" + }, + "neutralColor": { + "title": "Color neutral", + "desc": "Personalizar diferentes tonos de gris con diferentes tendencias de color, el segundo es el color neutral original de Cocina" + }, + "primaryColor": { + "title": "Color primario", + "desc": "Color primario personalizado, el segundo es el color del tema original de Cocina" + }, + "promptDisplayMode": { + "title": "Modo de visualización de aviso", + "desc": "Altura fija o altura automática con soporte de redimensionamiento arrastrable", + "resizable": "Redimensionable", + "scroll": "Desplazamiento" + }, + "promptEditor": { + "title": "Editor de aviso", + "desc": "Proporcionar un editor de aviso simple en la parte superior de la barra lateral de configuración rápida" + }, + "promptHighlight": { + "title": "Resaltado de sintaxis de aviso", + "desc": "Colorear automáticamente la visualización del aviso según las reglas de sintaxis de Stable Diffusion" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "Expansión predeterminada", + "desc": "Si expandir la barra lateral de forma predeterminada al iniciar" + }, + "defaultWidth": { + "title": "Ancho predeterminado", + "desc": "Ancho predeterminado de la barra lateral al iniciar" + }, + "displayMode": { + "title": "Modo de visualización", + "desc": "Fijo como modo de cuadrícula para visualización constante, autoexpandible cuando el mouse se mueve hacia el lado en modo flotante" + }, + "enable": { + "title": "Habilitar", + "desc": "Habilitar la barra lateral de configuración rápida en el lado izquierdo" + } + }, + "reduceAnimation": { + "title": "Reducir animación", + "desc": "Reducir el efecto de desenfoque y el color de flujo de fondo, lo que puede mejorar la suavidad y ahorrar uso de CPU" + }, + "splitPreviewer": { + "title": "Dividir previsualización", + "desc": "Colocar el cuadro de entrada de aviso a la izquierda y el botón de generación a la derecha, asegurando que la imagen generada se muestre siempre en la parte superior al desplazarse (experimental)" + }, + "svgIcons": { + "title": "Iconos SVG", + "desc": "Reemplazar todos los iconos Emoji en stable diffusion webui con iconos SVG globalmente" + } + }, + "sidebar": { + "extraNetwork": "Red adicional", + "quickSetting": "Configuración rápida", + "mode": { + "fixed": "Fijo", + "float": "Flotante" + } + } } diff --git a/locales/fr_FR.json b/locales/fr_FR.json new file mode 100644 index 0000000..3001a9c --- /dev/null +++ b/locales/fr_FR.json @@ -0,0 +1,159 @@ +{ + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "Personnalisé" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme est en cours d'initialisation, veuillez patienter..." + }, + "footer": { + "resources": "Ressources", + "community": "Communauté", + "help": "Aide", + "moreProducts": "Plus de Produits" + }, + "header": { + "feedback": "Retour", + "switchTheme": "Changer de thème clair/sombre", + "setting": "Réglage" + }, + "modal": { + "themeFeedback": { + "title": "Retour sur le thème" + }, + "themeSetting": { + "title": "Paramètres du thème" + } + }, + "prompt": { + "load": "Charger la demande", + "set": "Définir la demande", + "negative": "Négatif", + "positive": "Positif" + }, + "setting": { + "button": { + "reset": "Réinitialiser", + "submit": "Appliquer et redémarrer l'interface" + }, + "confirmPageUnload": { + "title": "Confirmation de quitter la page", + "desc": "Aide à éviter la perte de données non enregistrées" + }, + "customFont": { + "title": "Police personnalisée", + "desc": "Lorsqu'activée, elle chargera automatiquement une web police pour améliorer l'affichage du texte en chinois, anglais et code" + }, + "customLogo": { + "title": "Logo personnalisé", + "desc": "Support URL / Base64 / Symboles Emoji" + }, + "customTitle": { + "title": "Titre personnalisé", + "desc": "Titre du logo personnalisé" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "Taille de la couverture du modèle", + "desc": "Valeur par défaut de la taille de la couverture du modèle au démarrage" + }, + "defaultExpand": { + "title": "Développement par défaut", + "desc": "S'il faut développer la barre latérale par défaut au démarrage" + }, + "defaultWidth": { + "title": "Largeur par défaut", + "desc": "Largeur par défaut de la barre latérale au démarrage" + }, + "displayMode": { + "title": "Mode d'affichage", + "desc": "Fixé en mode grille pour un affichage constant, auto-développement lorsque la souris se déplace sur le côté en mode flottant" + }, + "enable": { + "title": "Activer", + "desc": "Activer la barre latérale réseau supplémentaire sur le côté droit" + } + }, + "group": { + "extraNetworkSidebar": "Barre latérale réseau supplémentaire", + "layout": "Réglages de mise en page", + "promptTextarea": "Zone de texte de la demande", + "quickSettingSidebar": "Barre latérale de réglage rapide", + "theme": "Paramètres du thème" + }, + "hideFooter": { + "title": "Masquer le pied de page", + "desc": "Masquer le pied de page du thème et afficher uniquement le pied de page par défaut de stable diffusion webui" + }, + "language": { + "title": "Langue", + "desc": "Langue du thème Lobe" + }, + "logoType": { + "title": "Type de logo", + "desc": "Type de logo", + "preview": "Aperçu" + }, + "neutralColor": { + "title": "Couleur neutre", + "desc": "Personnaliser différentes nuances de gris avec différentes tendances de couleur, la deuxième est la couleur neutre d'origine de Kitchen" + }, + "primaryColor": { + "title": "Couleur primaire", + "desc": "Couleur primaire personnalisée, la deuxième est la couleur de thème d'origine de Kitchen" + }, + "promptDisplayMode": { + "title": "Mode d'affichage de la demande", + "desc": "Hauteur fixe ou hauteur automatique avec prise en charge redimensionnable", + "resizable": "Redimensionnable", + "scroll": "Faire défiler" + }, + "promptEditor": { + "title": "Éditeur de demande", + "desc": "Fournir un éditeur de demande simple en haut de la barre latérale de réglage rapide" + }, + "promptHighlight": { + "title": "Mise en évidence de la syntaxe de la demande", + "desc": "Coloriser automatiquement l'affichage de la demande selon les règles de syntaxe de Stable Diffusion" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "Développement par défaut", + "desc": "S'il faut développer la barre latérale par défaut au démarrage" + }, + "defaultWidth": { + "title": "Largeur par défaut", + "desc": "Largeur par défaut de la barre latérale au démarrage" + }, + "displayMode": { + "title": "Mode d'affichage", + "desc": "Fixé en mode grille pour un affichage constant, auto-développement lorsque la souris se déplace sur le côté en mode flottant" + }, + "enable": { + "title": "Activer", + "desc": "Activer la barre latérale de réglage rapide sur le côté gauche" + } + }, + "reduceAnimation": { + "title": "Réduire l'animation", + "desc": "Réduire l'effet de flou et la couleur de fond en mouvement, ce qui peut améliorer la fluidité et économiser l'utilisation du processeur" + }, + "splitPreviewer": { + "title": "Diviser le visualiseur", + "desc": "Placer la zone de saisie de la demande à gauche et le bouton de génération à droite, en veillant à ce que l'image générée soit toujours affichée en haut lors du défilement (expérimental)" + }, + "svgIcons": { + "title": "Icônes SVG", + "desc": "Remplacer tous les icônes Emoji dans stable diffusion webui par des icônes SVG globalement" + } + }, + "sidebar": { + "extraNetwork": "Réseau supplémentaire", + "quickSetting": "Réglage rapide", + "mode": { + "fixed": "Fixe", + "float": "Flottant" + } + } +} diff --git a/locales/ja_JP.json b/locales/ja_JP.json index af32437..8402dd5 100644 --- a/locales/ja_JP.json +++ b/locales/ja_JP.json @@ -1,82 +1,159 @@ { - "appInitializing": "StableDiffusion / LobeThemeが初期化中です。お待ちください...", - "community": "コミュニティ", - "custom": "カスタム", - "extraNetwork": "追加ネットワーク", - "feedback": "フィードバック", - "fixed": "固定", - "float": "フロート", - "help": "ヘルプ", - "kitchen": "キッチン", - "loadPrompt": "プロンプトをロード", - "lobe": "ローブ", - "moreProducts": "その他の製品", - "negative": "ネガティブなヒント", - "positive": "ポジティブなヒント", - "quickSetting": "クイック設定", - "resizable": "リサイズ可能", - "resources": "関連リソース", - "scroll": "スクロール", - "setPrompt": "プロンプトを設定", - "setting": "設定", - "settingButtonReset": "リセット", - "settingButtonSubmit": "適用して再起動", - "settingConfirmPageUnload": "ページのクローズ確認", - "settingConfirmPageUnloadDesc": "未保存のデータの損失を防ぐ", - "settingCustomFont": "カスタムフォントの読み込み", - "settingCustomFontDesc": "有効にすると、Webフォントを自動的に読み込んで、英語、中国語、およびコードの表示効果を最適化します", - "settingCustomLogo": "カスタムロゴ", - "settingCustomLogoDesc": "URL / Base64 / 絵文字をサポート", - "settingCustomTitle": "カスタムタイトル", - "settingCustomTitleDesc": "カスタムロゴのタイトル名", - "settingExtraNetworkSidebarDefaultCardSize": "モデルカバーサイズ", - "settingExtraNetworkSidebarDefaultCardSizeDesc": "起動時のモデルカバーサイズのデフォルト値", - "settingExtraNetworkSidebarDefaultExpand": "デフォルトで展開", - "settingExtraNetworkSidebarDefaultExpandDesc": "起動時にサイドバーをデフォルトで展開しますか?", - "settingExtraNetworkSidebarDefaultWidth": "デフォルト幅", - "settingExtraNetworkSidebarDefaultWidthDesc": "起動時のサイドバーのデフォルト幅", - "settingExtraNetworkSidebarDisplayMode": "表示モード", - "settingExtraNetworkSidebarDisplayModeDesc": "グリッドモードで常に表示するか、ホバー時に自動的に展開するフロートモードで表示するか", - "settingExtraNetworkSidebarEnable": "有効にする", - "settingExtraNetworkSidebarEnableDesc": "右側の追加ネットワークサイドバーを有効にする", - "settingGroupExtraNetworkSidebar": "追加ネットワークサイドバー", - "settingGroupLayout": "レイアウト設定", - "settingGroupPromptTextarea": "プロンプトテキストエリア", - "settingGroupQuickSettingSidebar": "クイック設定サイドバー", - "settingGroupTheme": "テーマ設定", - "settingHideFooter": "フッターを非表示にする", - "settingHideFooterDesc": "テーマのフッターを非表示にし、stable diffusion webui のデフォルトフッターのみ表示します", - "settingLanguage": "言語", - "settingLanguageDesc": "Lobe Themeの言語", - "settingLogoPreview": "プレビュー", - "settingLogoType": "ロゴタイプ", - "settingLogoTypeDesc": "ロゴタイプ", - "settingNeutralColor": "中立色", - "settingNeutralColorDesc": "異なる色相のグレースケールのカスタマイズ。2番目は元のKitchenの中立色です", - "settingPrimaryColor": "プライマリカラー", - "settingPrimaryColorDesc": "カスタムプライマリカラー。2番目は元のKitchenのプライマリカラーです", - "settingPromptDisplayMode": "表示モード", - "settingPromptDisplayModeDesc": "固定の高さまたはドラッグリサイズをサポートする自動の高さ", - "settingPromptEditor": "プロンプトエディタ", - "settingPromptEditorDesc": "クイック設定サイドバーの上部に簡単なプロンプトエディタを提供します", - "settingPromptHighlight": "Promptのシンタックスハイライト", - "settingPromptHighlightDesc": "Stable Diffusionのシンタックスルールに基づいて、promptの表示を自動的にハイライトします", - "settingQuickSettingSidebarDefaultExpand": "デフォルトで展開", - "settingQuickSettingSidebarDefaultExpandDesc": "起動時にサイドバーをデフォルトで展開しますか?", - "settingQuickSettingSidebarDefaultWidth": "デフォルト幅", - "settingQuickSettingSidebarDefaultWidthDesc": "起動時のサイドバーのデフォルト幅", - "settingQuickSettingSidebarDisplayMode": "表示モード", - "settingQuickSettingSidebarDisplayModeDesc": "グリッドモードで常に表示するか、ホバー時に自動的に展開するフロートモードで表示するか", - "settingQuickSettingSidebarEnable": "有効にする", - "settingQuickSettingSidebarEnableDesc": "左側のクイック設定サイドバーを有効にする", - "settingReduceAnimation": "アニメーションを削減", - "settingReduceAnimationDesc": "ガラスのエフェクトと背景の流れる色を削減し、スムーズさを向上させ、CPUの使用量を節約できます", - "settingSplitPreviewer": "2列モード", - "settingSplitPreviewerDesc": "プロンプト入力ボックスを左側に配置し、生成ボタンを右側に配置し、スクロール時に生成された画像が常にトップに表示されるようにします(実験的)", - "settingSvgIcons": "SVGアイコンを使用", - "settingSvgIconsDesc": "stable diffusion webuiの絵文字アイコンをすべてSVGアイコンに置き換えます", - "switchTheme": "明暗テーマを切り替える", - "sync": "WebUIの設定と同期する", - "themeFeedback": "テーマのフィードバック", - "themeSetting": "テーマ設定" + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "カスタム" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme が初期化中です。お待ちください..." + }, + "footer": { + "resources": "リソース", + "community": "コミュニティ", + "help": "ヘルプ", + "moreProducts": "その他の製品" + }, + "header": { + "feedback": "フィードバック", + "switchTheme": "ライト/ダークテーマの切り替え", + "setting": "設定" + }, + "modal": { + "themeFeedback": { + "title": "テーマフィードバック" + }, + "themeSetting": { + "title": "テーマ設定" + } + }, + "prompt": { + "load": "プロンプトの読み込み", + "set": "プロンプトの設定", + "negative": "ネガティブ", + "positive": "ポジティブ" + }, + "setting": { + "button": { + "reset": "リセット", + "submit": "適用してインターフェースを再起動" + }, + "confirmPageUnload": { + "title": "ページ離脱の確認", + "desc": "未保存のデータの損失を防ぐのに役立ちます" + }, + "customFont": { + "title": "カスタムフォント", + "desc": "有効にすると、中国語、英語、コードのテキストの表示を向上させるために自動的にWebフォントを読み込みます" + }, + "customLogo": { + "title": "カスタムロゴ", + "desc": "URL / Base64 / 絵文字シンボルをサポート" + }, + "customTitle": { + "title": "カスタムタイトル", + "desc": "カスタムロゴのタイトル" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "モデルカバーサイズ", + "desc": "開始時のモデルカバーサイズのデフォルト値" + }, + "defaultExpand": { + "title": "デフォルト展開", + "desc": "開始時にサイドバーをデフォルトで展開するかどうか" + }, + "defaultWidth": { + "title": "デフォルト幅", + "desc": "開始時のサイドバーのデフォルト幅" + }, + "displayMode": { + "title": "表示モード", + "desc": "固定表示のグリッドモードまたは浮動モードでサイドにマウスを移動すると自動的に展開" + }, + "enable": { + "title": "有効にする", + "desc": "右側に追加のネットワークサイドバーを有効にする" + } + }, + "group": { + "extraNetworkSidebar": "追加のネットワークサイドバー", + "layout": "レイアウト設定", + "promptTextarea": "プロンプトテキストボックス", + "quickSettingSidebar": "クイック設定サイドバー", + "theme": "テーマ設定" + }, + "hideFooter": { + "title": "フッターを非表示", + "desc": "テーマのフッターを非表示にし、Stable Diffusion WebUI のデフォルトフッターのみを表示" + }, + "language": { + "title": "言語", + "desc": "Lobeテーマの言語" + }, + "logoType": { + "title": "ロゴタイプ", + "desc": "ロゴタイプ", + "preview": "プレビュー" + }, + "neutralColor": { + "title": "ニュートラルカラー", + "desc": "異なる色傾向のグレーの異なるシェードをカスタマイズします。2番目は元のキッチンのニュートラルカラーです" + }, + "primaryColor": { + "title": "プライマリカラー", + "desc": "カスタムプライマリカラー。2番目は元のキッチンのテーマカラーです" + }, + "promptDisplayMode": { + "title": "プロンプト表示モード", + "desc": "固定高さまたはドラッグ可能なリサイズサポート付きの自動高さ", + "resizable": "リサイズ可能", + "scroll": "スクロール" + }, + "promptEditor": { + "title": "プロンプトエディタ", + "desc": "クイック設定サイドバーの上部にシンプルなプロンプトエディタを提供" + }, + "promptHighlight": { + "title": "プロンプトシンタックスハイライト", + "desc": "Stable Diffusionの構文ルールに従ってプロンプト表示を自動的にカラーリング" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "デフォルト展開", + "desc": "開始時にサイドバーをデフォルトで展開するかどうか" + }, + "defaultWidth": { + "title": "デフォルト幅", + "desc": "開始時のサイドバーのデフォルト幅" + }, + "displayMode": { + "title": "表示モード", + "desc": "固定表示のグリッドモードまたは浮動モードでサイドにマウスを移動すると自動的に展開" + }, + "enable": { + "title": "有効にする", + "desc": "左側にクイック設定サイドバーを有効にする" + } + }, + "reduceAnimation": { + "title": "アニメーションを削減", + "desc": "ぼかし効果と背景フローカラーを削減し、滑らかさを向上させCPU使用量を節約" + }, + "splitPreviewer": { + "title": "分割プレビューア", + "desc": "プロンプト入力ボックスを左側に配置し、生成ボタンを右側に配置し、スクロール時に常に生成された画像が上部に表示されるようにします(実験的)" + }, + "svgIcons": { + "title": "SVGアイコン", + "desc": "Stable Diffusion WebUI のすべての絵文字アイコンをグローバルにSVGアイコンで置き換えます" + } + }, + "sidebar": { + "extraNetwork": "追加のネットワーク", + "quickSetting": "クイック設定", + "mode": { + "fixed": "固定", + "float": "フロート" + } + } } diff --git a/locales/ko_KR.json b/locales/ko_KR.json index 9c51ef7..070bad7 100644 --- a/locales/ko_KR.json +++ b/locales/ko_KR.json @@ -1,82 +1,159 @@ { - "appInitializing": "StableDiffusion / LobeTheme가 초기화 중입니다. 잠시 기다려주세요...", - "community": "커뮤니티", - "custom": "사용자 정의", - "extraNetwork": "추가 네트워크", - "feedback": "피드백", - "fixed": "고정", - "float": "부유", - "help": "도움말", - "kitchen": "Kitchen", - "loadPrompt": "로드 프롬프트", - "lobe": "Lobe", - "moreProducts": "더 많은 제품", - "negative": "부정적인", - "positive": "긍정적인", - "quickSetting": "빠른 설정", - "resizable": "크기 조절 가능", - "resources": "관련 자료", - "scroll": "스크롤", - "setPrompt": "프롬프트 설정", - "setting": "설정", - "settingButtonReset": "재설정", - "settingButtonSubmit": "적용 및 인터페이스 재시작", - "settingConfirmPageUnload": "페이지 닫기 확인", - "settingConfirmPageUnloadDesc": "저장되지 않은 데이터 손실 방지", - "settingCustomFont": "폰트 로드", - "settingCustomFontDesc": "이 기능을 사용하면 웹 폰트를 자동으로 로드하여 영문, 한글 및 코드 표시 효과를 최적화합니다", - "settingCustomLogo": "사용자 정의 로고", - "settingCustomLogoDesc": "URL / Base64 / 이모지 표정을 지원합니다.", - "settingCustomTitle": "사용자 정의 제목", - "settingCustomTitleDesc": "사용자 정의 로고 제목", - "settingExtraNetworkSidebarDefaultCardSize": "모델 커버 크기", - "settingExtraNetworkSidebarDefaultCardSizeDesc": "시작시 모델 커버 크기 기본값", - "settingExtraNetworkSidebarDefaultExpand": "기본 확장", - "settingExtraNetworkSidebarDefaultExpandDesc": "시작시 사이드바 기본 확장 여부", - "settingExtraNetworkSidebarDefaultWidth": "기본 너비", - "settingExtraNetworkSidebarDefaultWidthDesc": "시작시 사이드바 기본 너비", - "settingExtraNetworkSidebarDisplayMode": "표시 모드", - "settingExtraNetworkSidebarDisplayModeDesc": "그리드 모드로 고정하여 항상 표시하거나, 부유 모드로 설정하여 사이드바에 마우스를 가져가면 자동으로 확장", - "settingExtraNetworkSidebarEnable": "사용", - "settingExtraNetworkSidebarEnableDesc": "오른쪽에 추가 네트워크 사이드바 활성화", - "settingGroupExtraNetworkSidebar": "추가 네트워크 사이드바", - "settingGroupLayout": "레이아웃 설정", - "settingGroupPromptTextarea": "프롬프트 텍스트 영역", - "settingGroupQuickSettingSidebar": "빠른 설정 사이드바", - "settingGroupTheme": "테마 설정", - "settingHideFooter": "푸터 숨기기", - "settingHideFooterDesc": "테마 푸터를 숨기고 stable diffusion webui의 기본 푸터만 표시", - "settingLanguage": "언어", - "settingLanguageDesc": "Lobe Theme 테마 언어", - "settingLogoPreview": "미리보기", - "settingLogoType": "로고 유형", - "settingLogoTypeDesc": "로고 유형", - "settingNeutralColor": "중립색", - "settingNeutralColorDesc": "다른 색상 경향의 그레이 스케일 사용자 정의, 두 번째는 원래 Kitchen의 중립색", - "settingPrimaryColor": "기본 색상", - "settingPrimaryColorDesc": "사용자 정의 기본 색상, 두 번째는 원래 Kitchen의 기본 색상", - "settingPromptDisplayMode": "표시 모드", - "settingPromptDisplayModeDesc": "고정 높이 또는 자동 높이 및 드래그 조절 지원", - "settingPromptEditor": "프롬프트 편집기", - "settingPromptEditorDesc": "빠른 설정 사이드바 상단에 간단한 프롬프트 편집기 제공", - "settingPromptHighlight": "Prompt 구문 강조", - "settingPromptHighlightDesc": "Stable Diffusion 구문 규칙에 따라 자동으로 prompt를 강조하여 표시합니다", - "settingQuickSettingSidebarDefaultExpand": "기본 확장", - "settingQuickSettingSidebarDefaultExpandDesc": "시작시 사이드바 기본 확장 여부", - "settingQuickSettingSidebarDefaultWidth": "기본 너비", - "settingQuickSettingSidebarDefaultWidthDesc": "시작시 사이드바 기본 너비", - "settingQuickSettingSidebarDisplayMode": "표시 모드", - "settingQuickSettingSidebarDisplayModeDesc": "그리드 모드로 고정하여 항상 표시하거나, 부유 모드로 설정하여 사이드바에 마우스를 가져가면 자동으로 확장", - "settingQuickSettingSidebarEnable": "사용", - "settingQuickSettingSidebarEnableDesc": "왼쪽에 빠른 설정 사이드바 활성화", - "settingReduceAnimation": "애니메이션 줄이기", - "settingReduceAnimationDesc": "유리 효과와 배경 흐름 색상을 줄여서 부드러움을 향상시키고 CPU 사용량을 줄일 수 있습니다.", - "settingSplitPreviewer": "이중 열 모드", - "settingSplitPreviewerDesc": "프롬프트 입력 상자를 왼쪽에 배치하고, 우측에 생성 버튼을 두어 스크롤 시 생성된 이미지가 항상 위에 표시되도록 합니다 (실험적)", - "settingSvgIcons": "SVG 아이콘 사용", - "settingSvgIconsDesc": "stable diffusion webui의 이모지 아이콘을 전역적으로 SVG 아이콘으로 교체합니다.", - "switchTheme": "밝기 테마 전환", - "sync": "웹 UI 설정과 동기화", - "themeFeedback": "테마 피드백", - "themeSetting": "테마 설정" + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "사용자 정의" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme이 초기화 중입니다. 잠시 기다려주세요..." + }, + "footer": { + "resources": "자료", + "community": "커뮤니티", + "help": "도움말", + "moreProducts": "더 많은 제품" + }, + "header": { + "feedback": "피드백", + "switchTheme": "밝은/어두운 테마 전환", + "setting": "설정" + }, + "modal": { + "themeFeedback": { + "title": "테마 피드백" + }, + "themeSetting": { + "title": "테마 설정" + } + }, + "prompt": { + "load": "로드 프롬프트", + "set": "설정 프롬프트", + "negative": "부정적", + "positive": "긍정적" + }, + "setting": { + "button": { + "reset": "재설정", + "submit": "적용 및 인터페이스 재시작" + }, + "confirmPageUnload": { + "title": "페이지 이탈 확인", + "desc": "저장되지 않은 데이터 손실을 방지하는 데 도움이 됩니다." + }, + "customFont": { + "title": "사용자 정의 글꼴", + "desc": "활성화되면 중국어, 영어 및 코드의 텍스트 표시를 향상시키기 위해 자동으로 웹 글꼴을 로드합니다." + }, + "customLogo": { + "title": "사용자 정의 로고", + "desc": "URL / Base64 / 이모지 심볼 지원" + }, + "customTitle": { + "title": "사용자 정의 제목", + "desc": "사용자 정의 로고 제목" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "모델 커버 크기", + "desc": "시작할 때 모델 커버 크기의 기본값" + }, + "defaultExpand": { + "title": "기본 확장", + "desc": "시작할 때 사이드바를 기본적으로 확장할지 여부" + }, + "defaultWidth": { + "title": "기본 너비", + "desc": "시작할 때 사이드바의 기본 너비" + }, + "displayMode": { + "title": "표시 모드", + "desc": "고정된 그리드 모드로 상시 표시하거나 부유 모드에서 측면으로 마우스를 이동할 때 자동으로 확장" + }, + "enable": { + "title": "활성화", + "desc": "오른쪽에 추가 네트워크 사이드바 활성화" + } + }, + "group": { + "extraNetworkSidebar": "추가 네트워크 사이드바", + "layout": "레이아웃 설정", + "promptTextarea": "프롬프트 텍스트 상자", + "quickSettingSidebar": "빠른 설정 사이드바", + "theme": "테마 설정" + }, + "hideFooter": { + "title": "푸터 숨기기", + "desc": "테마 푸터를 숨기고 Stable Diffusion 웹UI의 기본 푸터만 표시" + }, + "language": { + "title": "언어", + "desc": "로브 테마 언어" + }, + "logoType": { + "title": "로고 유형", + "desc": "로고 유형", + "preview": "미리보기" + }, + "neutralColor": { + "title": "중립 색상", + "desc": "다른 색상 경향을 가진 다양한 회색 음영을 사용자 정의합니다. 두 번째는 원래 주방의 중립 색상입니다." + }, + "primaryColor": { + "title": "기본 색상", + "desc": "사용자 정의 기본 색상, 두 번째는 원래 주방 테마 색상입니다." + }, + "promptDisplayMode": { + "title": "프롬프트 표시 모드", + "desc": "고정 높이 또는 드래그 가능한 크기 조정 지원을 통한 자동 높이", + "resizable": "크기 조절 가능", + "scroll": "스크롤" + }, + "promptEditor": { + "title": "프롬프트 편집기", + "desc": "빠른 설정 사이드바 상단에 간단한 프롬프트 편집기 제공" + }, + "promptHighlight": { + "title": "프롬프트 구문 강조", + "desc": "Stable Diffusion 구문 규칙에 따라 프롬프트 표시를 자동으로 색상화" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "기본 확장", + "desc": "시작할 때 사이드바를 기본적으로 확장할지 여부" + }, + "defaultWidth": { + "title": "기본 너비", + "desc": "시작할 때 사이드바의 기본 너비" + }, + "displayMode": { + "title": "표시 모드", + "desc": "고정된 그리드 모드로 상시 표시하거나 부유 모드에서 측면으로 마우스를 이동할 때 자동으로 확장" + }, + "enable": { + "title": "활성화", + "desc": "왼쪽에 빠른 설정 사이드바 활성화" + } + }, + "reduceAnimation": { + "title": "애니메이션 줄이기", + "desc": "부드러움을 향상시키고 CPU 사용량을 줄일 수 있는 흐림 효과와 배경 흐름 색상을 줄입니다." + }, + "splitPreviewer": { + "title": "분할 미리보기", + "desc": "프롬프트 입력 상자를 왼쪽에 놓고 생성 버튼을 오른쪽에 놓아 스크롤할 때 항상 생성된 이미지가 위에 표시되도록 합니다 (실험적)" + }, + "svgIcons": { + "title": "SVG 아이콘", + "desc": "Stable Diffusion 웹UI의 모든 이모지 아이콘을 전역적으로 SVG 아이콘으로 대체" + } + }, + "sidebar": { + "extraNetwork": "추가 네트워크", + "quickSetting": "빠른 설정", + "mode": { + "fixed": "고정", + "float": "부유" + } + } } diff --git a/locales/options.json b/locales/options.json index 7825554..77a73ea 100644 --- a/locales/options.json +++ b/locales/options.json @@ -15,16 +15,28 @@ "label": "日本語", "value": "ja_JP" }, - { - "label": "Русский", - "value": "ru_RU" - }, { "label": "한국어", "value": "ko_KR" }, + { + "label": "Français", + "value": "fr_FR" + }, + { + "label": "Deutsch", + "value": "de_DE" + }, + { + "label": "Русский", + "value": "ru_RU" + }, { "label": "Español", "value": "es_ES" + }, + { + "label": "Português", + "value": "pt_BR" } ] diff --git a/locales/pt_BR.json b/locales/pt_BR.json new file mode 100644 index 0000000..9defd1c --- /dev/null +++ b/locales/pt_BR.json @@ -0,0 +1,159 @@ +{ + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "Personalizado" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme está inicializando, por favor aguarde..." + }, + "footer": { + "resources": "Recursos", + "community": "Comunidade", + "help": "Ajuda", + "moreProducts": "Mais Produtos" + }, + "header": { + "feedback": "Feedback", + "switchTheme": "Alternar Tema Claro/Escuro", + "setting": "Configuração" + }, + "modal": { + "themeFeedback": { + "title": "Feedback do Tema" + }, + "themeSetting": { + "title": "Configurações do Tema" + } + }, + "prompt": { + "load": "Carregar Prompt", + "set": "Definir Prompt", + "negative": "Negativo", + "positive": "Positivo" + }, + "setting": { + "button": { + "reset": "Redefinir", + "submit": "Aplicar e Reiniciar Interface" + }, + "confirmPageUnload": { + "title": "Confirmação ao sair da página", + "desc": "Ajuda a evitar a perda de dados não salvos" + }, + "customFont": { + "title": "Fonte Personalizada", + "desc": "Quando ativado, carregará automaticamente uma webfont para aprimorar a exibição de texto em chinês, inglês e código" + }, + "customLogo": { + "title": "Logotipo Personalizado", + "desc": "Suporte URL / Base64 / Símbolos de Emoji" + }, + "customTitle": { + "title": "Título Personalizado", + "desc": "Título do Logotipo Personalizado" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "Tamanho da Capa do Modelo", + "desc": "Valor padrão do tamanho da capa do modelo ao iniciar" + }, + "defaultExpand": { + "title": "Expansão Padrão", + "desc": "Se deve expandir a barra lateral por padrão ao iniciar" + }, + "defaultWidth": { + "title": "Largura Padrão", + "desc": "Largura padrão da barra lateral ao iniciar" + }, + "displayMode": { + "title": "Modo de Exibição", + "desc": "Fixo como modo de grade para exibição constante, auto-expandir quando o mouse se move para o lado no modo flutuante" + }, + "enable": { + "title": "Habilitar", + "desc": "Habilitar a barra lateral de rede extra no lado direito" + } + }, + "group": { + "extraNetworkSidebar": "Barra Lateral de Rede Extra", + "layout": "Configurações de Layout", + "promptTextarea": "Caixa de Texto do Prompt", + "quickSettingSidebar": "Barra Lateral de Configuração Rápida", + "theme": "Configurações do Tema" + }, + "hideFooter": { + "title": "Ocultar Rodapé", + "desc": "Ocultar o rodapé do tema e exibir apenas o rodapé padrão do stable diffusion webui" + }, + "language": { + "title": "Idioma", + "desc": "Idioma do Tema Lobe" + }, + "logoType": { + "title": "Tipo de Logotipo", + "desc": "Tipo de Logotipo", + "preview": "Visualização" + }, + "neutralColor": { + "title": "Cor Neutra", + "desc": "Personalize diferentes tons de cinza com diferentes tendências de cor, o segundo é a cor neutra original da Cozinha" + }, + "primaryColor": { + "title": "Cor Primária", + "desc": "Cor primária personalizada, o segundo é a cor do tema original da Cozinha" + }, + "promptDisplayMode": { + "title": "Modo de Exibição do Prompt", + "desc": "Altura fixa ou altura automática com suporte para redimensionamento arrastável", + "resizable": "Redimensionável", + "scroll": "Rolagem" + }, + "promptEditor": { + "title": "Editor de Prompt", + "desc": "Fornece um editor de prompt simples no topo da barra lateral de configuração rápida" + }, + "promptHighlight": { + "title": "Realce de Sintaxe do Prompt", + "desc": "Colorize automaticamente a exibição do prompt de acordo com as regras de sintaxe do Stable Diffusion" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "Expansão Padrão", + "desc": "Se deve expandir a barra lateral por padrão ao iniciar" + }, + "defaultWidth": { + "title": "Largura Padrão", + "desc": "Largura padrão da barra lateral ao iniciar" + }, + "displayMode": { + "title": "Modo de Exibição", + "desc": "Fixo como modo de grade para exibição constante, auto-expandir quando o mouse se move para o lado no modo flutuante" + }, + "enable": { + "title": "Habilitar", + "desc": "Habilitar a barra lateral de configuração rápida no lado esquerdo" + } + }, + "reduceAnimation": { + "title": "Reduzir Animação", + "desc": "Reduzir o efeito de desfoque e cor de fundo, o que pode melhorar a suavidade e economizar o uso da CPU" + }, + "splitPreviewer": { + "title": "Dividir Visualizador", + "desc": "Coloque a caixa de entrada do prompt à esquerda e o botão de geração à direita, garantindo que a imagem gerada seja sempre exibida no topo ao rolar (experimental)" + }, + "svgIcons": { + "title": "Ícones SVG", + "desc": "Substituir todos os ícones de Emoji no stable diffusion webui por ícones SVG globalmente" + } + }, + "sidebar": { + "extraNetwork": "Rede Extra", + "quickSetting": "Configuração Rápida", + "mode": { + "fixed": "Fixo", + "float": "Flutuante" + } + } +} diff --git a/locales/ru_RU.json b/locales/ru_RU.json index 05933cd..e1a7051 100644 --- a/locales/ru_RU.json +++ b/locales/ru_RU.json @@ -1,82 +1,159 @@ { - "appInitializing": "StableDiffusion / LobeTheme инициализируется, пожалуйста, подождите...", - "community": "Сообщество", - "custom": "Кастомный", - "extraNetwork": "Доп. Сети", - "feedback": "Отзыв", - "fixed": "Фиксированный", - "float": "Плавающий", - "help": "Помощь", - "kitchen": "Kitchen", - "loadPrompt": "Подгрузить промт", - "lobe": "Lobe", - "moreProducts": "Другие проекты", - "negative": "Отрицательные", - "positive": "Положительные", - "quickSetting": "Быстрые настройки", - "resizable": "Растягиваемый", - "resources": "Ресурсы", - "scroll": "Скрол", - "setPrompt": "Вставить промт", - "setting": "Настройки", - "settingButtonReset": "Сбросить", - "settingButtonSubmit": "Применить и перезапустить интерфейс", - "settingConfirmPageUnload": "Подтверждать закрытие страницы", - "settingConfirmPageUnloadDesc": "Помогает предотвратить потерю несохраненных данных", - "settingCustomFont": "Загружать спец. шрифт", - "settingCustomFontDesc": "Когда он включен, он автоматически загружает веб-шрифт для улучшения отображения текста на китайском, английском и кодовом языках.", - "settingCustomLogo": "Пользовательский логотип", - "settingCustomLogoDesc": "Поддержка символов URL/Base64/Emoji", - "settingCustomTitle": "Пользовательское название", - "settingCustomTitleDesc": "Название пользовательского логотипа", - "settingExtraNetworkSidebarDefaultCardSize": "Размер превью модели", - "settingExtraNetworkSidebarDefaultCardSizeDesc": "Значение по умолчанию размера обложки модели при запуске", - "settingExtraNetworkSidebarDefaultExpand": "Состояние разворота по умолчанию", - "settingExtraNetworkSidebarDefaultExpandDesc": "Нужно ли по умолчанию разворачивать боковую панель при запуске?", - "settingExtraNetworkSidebarDefaultWidth": "Ширина по умолчанию", - "settingExtraNetworkSidebarDefaultWidthDesc": "Ширина боковой панели по умолчанию при запуске", - "settingExtraNetworkSidebarDisplayMode": "Режим отображения", - "settingExtraNetworkSidebarDisplayModeDesc": "Фиксирован постоянно или появляется при наведении на боковую панель", - "settingExtraNetworkSidebarEnable": "Включено", - "settingExtraNetworkSidebarEnableDesc": "Включить Панель Доп. моделей справа", - "settingGroupExtraNetworkSidebar": "Боковая панель с доп сетями", - "settingGroupLayout": "Настройки макета", - "settingGroupPromptTextarea": "Промт(подсказка)", - "settingGroupQuickSettingSidebar": "Боковая панель быстрых настроек", - "settingGroupTheme": "Настройка темы", - "settingHideFooter": "Скрыть футтер", - "settingHideFooterDesc": "Скрыть футтер темы и отображать только футтер дефолтного веб-интерфейса.", - "settingLanguage": "Язык", - "settingLanguageDesc": "Язык Lobe темы", - "settingLogoPreview": "Предпросмотр", - "settingLogoType": "Стиль лого", - "settingLogoTypeDesc": "Стиль лого", - "settingNeutralColor": "Нейтральный цвет", - "settingNeutralColorDesc": "Настройте различные оттенки серого с различными цветовыми тенденциями, второй - оригинальный нейтральный цвет темы Kitchen.", - "settingPrimaryColor": "Основной цвет", - "settingPrimaryColorDesc": "Основной цвет - пользовательский, второй - оригинальный цвет темы Kitchen", - "settingPromptDisplayMode": "Режим отображения", - "settingPromptDisplayModeDesc": "Фиксированная высота или автоматическая высота с поддержкой перетаскиваемого изменения размера", - "settingPromptEditor": "Редактор промта", - "settingPromptEditorDesc": "Включить простой редактор подсказок в верхней части боковой панели быстрых настроек", - "settingPromptHighlight": "Подсветка синтаксиса промта", - "settingPromptHighlightDesc": "Автоматическое изменение цвета отображения подсказок в соответствии с правилами синтаксиса Stable Diffusion", - "settingQuickSettingSidebarDefaultExpand": "Состояние разворота по умолчанию", - "settingQuickSettingSidebarDefaultExpandDesc": "Нужно ли по умолчанию разворачивать боковую панель при запуске?", - "settingQuickSettingSidebarDefaultWidth": "Ширина по умолчанию", - "settingQuickSettingSidebarDefaultWidthDesc": "Ширина боковой панели по умолчанию при запуске", - "settingQuickSettingSidebarDisplayMode": "Режим отображения", - "settingQuickSettingSidebarDisplayModeDesc": "Фиксирован постоянно или появляется при наведении на боковую панель", - "settingQuickSettingSidebarEnable": "Включено", - "settingQuickSettingSidebarEnableDesc": "Включить боковую панель быстрых настроек в левой части экрана", - "settingReduceAnimation": "Уменьшить анимации", - "settingReduceAnimationDesc": "Уменьшить эффект размытия и цвет фоновой подсветки, что позволит повысить плавность работы и снизить нагрузку на процессор", - "settingSplitPreviewer": "Рзделенный просмоторщик", - "settingSplitPreviewerDesc": "Разделяет страницу на настройки генрации и поле ввода промта, а на второй половине остается окно сгенерированной картинки и кнопка генерации ", - "settingSvgIcons": "Использование SVG-значков", - "settingSvgIconsDesc": "Заменить все иконки Emoji в стабильном diffusion webui на SVG-иконки в глобальном масштабе", - "switchTheme": "Переключатель светлой/темной темы", - "sync": "Синхронизация с настройками webui", - "themeFeedback": "Отзыв о теме", - "themeSetting": "Настройки темы" + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "Пользовательский" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme инициализируется, пожалуйста, подождите..." + }, + "footer": { + "resources": "Ресурсы", + "community": "Сообщество", + "help": "Помощь", + "moreProducts": "Дополнительные продукты" + }, + "header": { + "feedback": "Обратная связь", + "switchTheme": "Переключить светлую/темную тему", + "setting": "Настройка" + }, + "modal": { + "themeFeedback": { + "title": "Обратная связь по теме" + }, + "themeSetting": { + "title": "Настройки темы" + } + }, + "prompt": { + "load": "Загрузить подсказку", + "set": "Установить подсказку", + "negative": "Негативный", + "positive": "Позитивный" + }, + "setting": { + "button": { + "reset": "Сброс", + "submit": "Применить и перезапустить интерфейс" + }, + "confirmPageUnload": { + "title": "Подтверждение покидания страницы", + "desc": "Помогает предотвратить потерю несохраненных данных" + }, + "customFont": { + "title": "Пользовательский шрифт", + "desc": "При включении автоматически загружает веб-шрифт для улучшения отображения текста на китайском, английском и коде" + }, + "customLogo": { + "title": "Пользовательский логотип", + "desc": "Поддерживает URL / Base64 / символы Emoji" + }, + "customTitle": { + "title": "Пользовательское название", + "desc": "Пользовательское название логотипа" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "Размер обложки модели", + "desc": "Значение по умолчанию размера обложки модели при запуске" + }, + "defaultExpand": { + "title": "Раскрыть по умолчанию", + "desc": "Развернуть боковую панель по умолчанию при запуске" + }, + "defaultWidth": { + "title": "Ширина по умолчанию", + "desc": "Ширина боковой панели по умолчанию при запуске" + }, + "displayMode": { + "title": "Режим отображения", + "desc": "Фиксированный режим сетки для постоянного отображения, автоматическое развертывание при перемещении мыши к боковой стороне в плавающем режиме" + }, + "enable": { + "title": "Включить", + "desc": "Включить дополнительную боковую панель сети справа" + } + }, + "group": { + "extraNetworkSidebar": "Дополнительная боковая панель сети", + "layout": "Настройки макета", + "promptTextarea": "Текстовое поле подсказки", + "quickSettingSidebar": "Быстрая боковая панель настроек", + "theme": "Настройки темы" + }, + "hideFooter": { + "title": "Скрыть нижний колонтитул", + "desc": "Скрыть нижний колонтитул темы и отобразить только стандартный колонтитул стабильного веб-интерфейса диффузии" + }, + "language": { + "title": "Язык", + "desc": "Язык темы Lobe" + }, + "logoType": { + "title": "Тип логотипа", + "desc": "Тип логотипа", + "preview": "Предварительный просмотр" + }, + "neutralColor": { + "title": "Нейтральный цвет", + "desc": "Настроить различные оттенки серого с различными цветовыми тенденциями, второй - это оригинальный нейтральный цвет кухни" + }, + "primaryColor": { + "title": "Основной цвет", + "desc": "Пользовательский основной цвет, второй - это оригинальный цвет темы кухни" + }, + "promptDisplayMode": { + "title": "Режим отображения подсказки", + "desc": "Фиксированная высота или автоматическая высота с поддержкой изменения размера", + "resizable": "Изменяемый размер", + "scroll": "Прокрутка" + }, + "promptEditor": { + "title": "Редактор подсказки", + "desc": "Предоставляет простой редактор подсказок в верхней части быстрой боковой панели настроек" + }, + "promptHighlight": { + "title": "Подсветка синтаксиса подсказки", + "desc": "Автоматическое окрашивание отображения подсказок в соответствии с правилами синтаксиса Stable Diffusion" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "Раскрыть по умолчанию", + "desc": "Развернуть боковую панель по умолчанию при запуске" + }, + "defaultWidth": { + "title": "Ширина по умолчанию", + "desc": "Ширина боковой панели по умолчанию при запуске" + }, + "displayMode": { + "title": "Режим отображения", + "desc": "Фиксированный режим сетки для постоянного отображения, автоматическое развертывание при перемещении мыши к боковой стороне в плавающем режиме" + }, + "enable": { + "title": "Включить", + "desc": "Включить быструю боковую панель настроек слева" + } + }, + "reduceAnimation": { + "title": "Уменьшить анимацию", + "desc": "Уменьшить эффект размытия и цвет фона, что может улучшить плавность и экономить использование ЦП" + }, + "splitPreviewer": { + "title": "Разделить предварительный просмотр", + "desc": "Разместить поле ввода подсказки слева и кнопку генерации справа, обеспечивая отображение сгенерированного изображения всегда вверху при прокрутке (экспериментально)" + }, + "svgIcons": { + "title": "SVG-иконы", + "desc": "Заменить все иконки Emoji в стабильном веб-интерфейсе диффузии на глобальные SVG-иконы" + } + }, + "sidebar": { + "extraNetwork": "Дополнительная сеть", + "quickSetting": "Быстрая настройка", + "mode": { + "fixed": "Фиксированный", + "float": "Плавающий" + } + } } diff --git a/locales/zh_CN.json b/locales/zh_CN.json index 8286073..6d9ea7f 100644 --- a/locales/zh_CN.json +++ b/locales/zh_CN.json @@ -1,82 +1,159 @@ { - "appInitializing": "StableDiffusion / LobeTheme 启动中,请耐心等待...", - "community": "社区", - "custom": "自定义", - "extraNetwork": "附加网络", - "feedback": "反馈", - "fixed": "固定", - "float": "悬浮", - "help": "帮助", - "kitchen": "Kitchen", - "loadPrompt": "加载提示", - "lobe": "Lobe", - "moreProducts": "更多产品", - "negative": "反向提示词", - "positive": "正面提示词", - "quickSetting": "快捷设置", - "resizable": "缩放", - "resources": "相关资源", - "scroll": "滚动", - "setPrompt": "发送提示词", - "setting": "设置", - "settingButtonReset": "重置", - "settingButtonSubmit": "应用并重启界面", - "settingConfirmPageUnload": "确认离开页面", - "settingConfirmPageUnloadDesc": "有助于防止丢失未保存的数据", - "settingCustomFont": "加载字体美化", - "settingCustomFontDesc": "开启后会自动加载 Webfont 美化字体,优化中英文和代码显示效果", - "settingCustomLogo": "自定义 Logo", - "settingCustomLogoDesc": "支持 URL / Base64 / Emoji 表情符号", - "settingCustomTitle": "自定义标题", - "settingCustomTitleDesc": "自定义 Logo 标题名称", - "settingExtraNetworkSidebarDefaultCardSize": "模型封面尺寸", - "settingExtraNetworkSidebarDefaultCardSizeDesc": "启动时模型封面尺寸默认值", - "settingExtraNetworkSidebarDefaultExpand": "默认展开", - "settingExtraNetworkSidebarDefaultExpandDesc": "是否在启动时将侧边栏默认展开", - "settingExtraNetworkSidebarDefaultWidth": "默认宽度", - "settingExtraNetworkSidebarDefaultWidthDesc": "侧边栏在启动时的默认宽度", - "settingExtraNetworkSidebarDisplayMode": "显示模式", - "settingExtraNetworkSidebarDisplayModeDesc": "固定为栅格模式常驻显示,悬浮模式时当鼠标移到侧边时自动展开", - "settingExtraNetworkSidebarEnable": "启用", - "settingExtraNetworkSidebarEnableDesc": "启用位于右侧的附加网络侧边栏", - "settingGroupExtraNetworkSidebar": "附加网络侧边栏", - "settingGroupLayout": "布局设置", - "settingGroupPromptTextarea": "提示词文本框", - "settingGroupQuickSettingSidebar": "快捷设置侧边栏", - "settingGroupTheme": "主题设置", - "settingHideFooter": "隐藏页脚", - "settingHideFooterDesc": "隐藏主题页脚,只显示 stable diffusion webui 默认页脚", - "settingLanguage": "语言", - "settingLanguageDesc": "Lobe Theme 主题语言", - "settingLogoPreview": "预览", - "settingLogoType": "Logo 类型", - "settingLogoTypeDesc": "Logo 类型", - "settingNeutralColor": "中性色", - "settingNeutralColorDesc": "不同色彩倾向的灰阶自定义,第二个为原始 Kitchen 中性色", - "settingPrimaryColor": "主题色", - "settingPrimaryColorDesc": "自定义主题色,第二个为原始 Kitchen 主题色", - "settingPromptDisplayMode": "显示模式", - "settingPromptDisplayModeDesc": "固定高度或自动高度并支持拖拽拉伸", - "settingPromptEditor": "提示词编辑器", - "settingPromptEditorDesc": "提供简易的提示词编辑器位于快捷设置侧边栏顶部", - "settingPromptHighlight": "Prompt 语法高亮", - "settingPromptHighlightDesc": "按 Stable Diffusion 语法规则,自动染色 prompt 显示", - "settingQuickSettingSidebarDefaultExpand": "默认展开", - "settingQuickSettingSidebarDefaultExpandDesc": "是否在启动时将侧边栏默认展开", - "settingQuickSettingSidebarDefaultWidth": "默认宽度", - "settingQuickSettingSidebarDefaultWidthDesc": "侧边栏在启动时的默认宽度", - "settingQuickSettingSidebarDisplayMode": "显示模式", - "settingQuickSettingSidebarDisplayModeDesc": "固定为栅格模式常驻显示,悬浮模式时当鼠标移到侧边时自动展开", - "settingQuickSettingSidebarEnable": "启用", - "settingQuickSettingSidebarEnableDesc": "启用位于左侧的快捷设置侧边栏", - "settingReduceAnimation": "减少动画效果", - "settingReduceAnimationDesc": "减少毛玻璃效果和背景流动色,可以提升流畅度并节省 CPU 使用", - "settingSplitPreviewer": "双列模式", - "settingSplitPreviewerDesc": "将提示词输入框放在左侧,生成按钮于右侧,确保在滚动时生成的图像始终显示在顶部 (实验性)", - "settingSvgIcons": "使用 SVG 图标", - "settingSvgIconsDesc": "将 stable diffusion webui 中的 Emoji 图标全局替换为 SVG 图标", - "switchTheme": "切换亮暗色主题", - "sync": "与 WebUI 设置同步", - "themeFeedback": "主题反馈", - "themeSetting": "主题设置" + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "自定义" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme 正在初始化,请稍候..." + }, + "footer": { + "resources": "资源", + "community": "社区", + "help": "帮助", + "moreProducts": "更多产品" + }, + "header": { + "feedback": "反馈", + "switchTheme": "切换浅色/深色主题", + "setting": "设置" + }, + "modal": { + "themeFeedback": { + "title": "主题反馈" + }, + "themeSetting": { + "title": "主题设置" + } + }, + "prompt": { + "load": "加载提示", + "set": "设置提示", + "negative": "否定", + "positive": "肯定" + }, + "setting": { + "button": { + "reset": "重置", + "submit": "应用并重新启动界面" + }, + "confirmPageUnload": { + "title": "确认离开页面", + "desc": "帮助防止未保存数据的丢失" + }, + "customFont": { + "title": "自定义字体", + "desc": "启用后,将自动加载网页字体以增强中文、英文和代码的显示" + }, + "customLogo": { + "title": "自定义标志", + "desc": "支持 URL / Base64 / 表情符号" + }, + "customTitle": { + "title": "自定义标题", + "desc": "自定义标志标题" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "模型封面大小", + "desc": "启动时模型封面大小的默认值" + }, + "defaultExpand": { + "title": "默认展开", + "desc": "启动时默认是否展开侧边栏" + }, + "defaultWidth": { + "title": "默认宽度", + "desc": "启动时侧边栏的默认宽度" + }, + "displayMode": { + "title": "显示模式", + "desc": "固定网格模式以保持恒定显示,在浮动模式下鼠标移至侧边时自动展开" + }, + "enable": { + "title": "启用", + "desc": "在右侧启用额外的网络侧边栏" + } + }, + "group": { + "extraNetworkSidebar": "额外网络侧边栏", + "layout": "布局设置", + "promptTextarea": "提示文本框", + "quickSettingSidebar": "快速设置侧边栏", + "theme": "主题设置" + }, + "hideFooter": { + "title": "隐藏页脚", + "desc": "隐藏主题页脚,仅显示 Stable Diffusion webui 的默认页脚" + }, + "language": { + "title": "语言", + "desc": "叶片主题语言" + }, + "logoType": { + "title": "标志类型", + "desc": "标志类型", + "preview": "预览" + }, + "neutralColor": { + "title": "中性颜色", + "desc": "定制不同色调的灰色,第二个是原始厨房中性颜色" + }, + "primaryColor": { + "title": "主色", + "desc": "自定义主色,第二个是原始厨房主题颜色" + }, + "promptDisplayMode": { + "title": "提示显示模式", + "desc": "固定高度或可拖动调整大小的自动高度", + "resizable": "可调整大小", + "scroll": "滚动" + }, + "promptEditor": { + "title": "提示编辑器", + "desc": "在快速设置侧边栏顶部提供简单的提示编辑器" + }, + "promptHighlight": { + "title": "提示语法高亮", + "desc": "根据 Stable Diffusion 语法规则自动着色提示显示" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "默认展开", + "desc": "启动时默认是否展开侧边栏" + }, + "defaultWidth": { + "title": "默认宽度", + "desc": "启动时侧边栏的默认宽度" + }, + "displayMode": { + "title": "显示模式", + "desc": "固定网格模式以保持恒定显示,在浮动模式下鼠标移至侧边时自动展开" + }, + "enable": { + "title": "启用", + "desc": "在左侧启用快速设置侧边栏" + } + }, + "reduceAnimation": { + "title": "减少动画", + "desc": "减少模糊效果和背景流动颜色,可提高流畅度并节省 CPU 使用率" + }, + "splitPreviewer": { + "title": "分割预览器", + "desc": "将提示输入框放在左侧,生成按钮放在右侧,确保滚动时生成的图像始终显示在顶部(实验性)" + }, + "svgIcons": { + "title": "SVG 图标", + "desc": "全局替换 Stable Diffusion webui 中的所有表情符号为 SVG 图标" + } + }, + "sidebar": { + "extraNetwork": "额外网络", + "quickSetting": "快速设置", + "mode": { + "fixed": "固定", + "float": "浮动" + } + } } diff --git a/locales/zh_HK.json b/locales/zh_HK.json index 8f2aebf..dfc3d8e 100644 --- a/locales/zh_HK.json +++ b/locales/zh_HK.json @@ -1,82 +1,159 @@ { - "appInitializing": "StableDiffusion / LobeTheme 正在初始化,请稍候...", - "community": "社區", - "custom": "自訂", - "extraNetwork": "附加網絡", - "feedback": "反饋", - "fixed": "固定", - "float": "懸浮", - "help": "幫助", - "kitchen": "Kitchen", - "loadPrompt": "加載提示", - "lobe": "Lobe", - "moreProducts": "更多產品", - "negative": "反向提示詞", - "positive": "正面提示詞", - "quickSetting": "快捷設置", - "resizable": "縮放", - "resources": "相關資源", - "scroll": "滾動", - "setPrompt": "發送提示詞", - "setting": "設置", - "settingButtonReset": "重置", - "settingButtonSubmit": "應用並重啟界面", - "settingConfirmPageUnload": "確認離開頁面", - "settingConfirmPageUnloadDesc": "有助於防止遺失未保存的數據", - "settingCustomFont": "載入字型美化", - "settingCustomFontDesc": "開啟後會自動載入 Webfont 美化字型,優化中英文和程式碼顯示效果", - "settingCustomLogo": "自定義 Logo", - "settingCustomLogoDesc": "支持 URL / Base64 / Emoji 表情符號", - "settingCustomTitle": "自定義標題", - "settingCustomTitleDesc": "自定義 Logo 標題名稱", - "settingExtraNetworkSidebarDefaultCardSize": "模型封面尺寸", - "settingExtraNetworkSidebarDefaultCardSizeDesc": "啟動時模型封面尺寸默認值", - "settingExtraNetworkSidebarDefaultExpand": "默認展開", - "settingExtraNetworkSidebarDefaultExpandDesc": "是否在啟動時將側邊欄默認展開", - "settingExtraNetworkSidebarDefaultWidth": "默認寬度", - "settingExtraNetworkSidebarDefaultWidthDesc": "側邊欄在啟動時的默認寬度", - "settingExtraNetworkSidebarDisplayMode": "顯示模式", - "settingExtraNetworkSidebarDisplayModeDesc": "固定為格模式常駐顯示,懸浮模式時當鼠標移到側邊時自動展開", - "settingExtraNetworkSidebarEnable": "啟用", - "settingExtraNetworkSidebarEnableDesc": "啟用位於右側的附加網絡側邊欄", - "settingGroupExtraNetworkSidebar": "附加網絡側邊欄", - "settingGroupLayout": "佈局設置", - "settingGroupPromptTextarea": "提示詞文本框", - "settingGroupQuickSettingSidebar": "快捷設置側邊欄", - "settingGroupTheme": "主題設置", - "settingHideFooter": "隱藏頁腳", - "settingHideFooterDesc": "隱藏主題頁腳,只顯示 stable diffusion webui 默認頁腳", - "settingLanguage": "語言", - "settingLanguageDesc": "Lobe Theme 主題語言", - "settingLogoPreview": "預覽", - "settingLogoType": "Logo 類型", - "settingLogoTypeDesc": "Logo 類型", - "settingNeutralColor": "中性色", - "settingNeutralColorDesc": "不同色彩傾向的灰階自定義,第二個為原始 Kitchen 中性色", - "settingPrimaryColor": "主題色", - "settingPrimaryColorDesc": "自定義主題色,第二個為原始 Kitchen 主題色", - "settingPromptDisplayMode": "顯示模式", - "settingPromptDisplayModeDesc": "固定高度或自動高度並支持拖拽拉伸", - "settingPromptEditor": "提示詞編輯器", - "settingPromptEditorDesc": "提供簡易的提示詞編輯器位於快捷設置側邊欄頂部", - "settingPromptHighlight": "Prompt 語法高亮", - "settingPromptHighlightDesc": "按照 Stable Diffusion 語法規則,自動著色 prompt 顯示", - "settingQuickSettingSidebarDefaultExpand": "默認展開", - "settingQuickSettingSidebarDefaultExpandDesc": "是否在啟動時將側邊欄默認展開", - "settingQuickSettingSidebarDefaultWidth": "默認寬度", - "settingQuickSettingSidebarDefaultWidthDesc": "側邊欄在啟動時的默認寬度", - "settingQuickSettingSidebarDisplayMode": "顯示模式", - "settingQuickSettingSidebarDisplayModeDesc": "固定為格模式常駐顯示,懸浮模式時當鼠標移到側邊時自動展開", - "settingQuickSettingSidebarEnable": "啟用", - "settingQuickSettingSidebarEnableDesc": "啟用位於左側的快捷設置側邊欄", - "settingReduceAnimation": "減少動畫效果", - "settingReduceAnimationDesc": "減少毛玻璃效果和背景流動色,可以提升流暢度並節省 CPU 使用", - "settingSplitPreviewer": "雙列模式", - "settingSplitPreviewerDesc": "將提示詞輸入框放在左側,生成按鈕於右側,確保在滾動時生成的圖像始終顯示在頂部 (實驗性)", - "settingSvgIcons": "使用 SVG 圖標", - "settingSvgIconsDesc": "將 stable diffusion webui 中的 Emoji 圖標全局替換為 SVG 圖標", - "switchTheme": "切換亮暗色主題", - "sync": "與 WebUI 設置同步", - "themeFeedback": "主題反饋", - "themeSetting": "主題設置" + "brand": { + "kitchen": "Kitchen", + "lobe": "LobeHub", + "custom": "自定義" + }, + "custom": { + "initializing": "StableDiffusion / LobeTheme 正在初始化,請稍候..." + }, + "footer": { + "resources": "資源", + "community": "社區", + "help": "幫助", + "moreProducts": "更多產品" + }, + "header": { + "feedback": "反饋", + "switchTheme": "切換明/暗主題", + "setting": "設置" + }, + "modal": { + "themeFeedback": { + "title": "主題反饋" + }, + "themeSetting": { + "title": "主題設置" + } + }, + "prompt": { + "load": "載入提示", + "set": "設置提示", + "negative": "否定", + "positive": "肯定" + }, + "setting": { + "button": { + "reset": "重置", + "submit": "應用並重新啟動界面" + }, + "confirmPageUnload": { + "title": "離開頁面確認", + "desc": "幫助防止未保存數據的丟失" + }, + "customFont": { + "title": "自定義字體", + "desc": "啟用後,將自動加載網頁字體,以增強中文、英文和代碼的顯示效果" + }, + "customLogo": { + "title": "自定義標誌", + "desc": "支援 URL / Base64 / 表情符號" + }, + "customTitle": { + "title": "自定義標題", + "desc": "自定義標誌標題" + }, + "extraNetworkSidebar": { + "defaultCardSize": { + "title": "模型封面大小", + "desc": "啟動時的模型封面大小的默認值" + }, + "defaultExpand": { + "title": "默認展開", + "desc": "啟動時是否默認展開側邊欄" + }, + "defaultWidth": { + "title": "默認寬度", + "desc": "啟動時側邊欄的默認寬度" + }, + "displayMode": { + "title": "顯示模式", + "desc": "固定為網格模式以保持恆定顯示,在浮動模式下當滑鼠移至側邊時自動展開" + }, + "enable": { + "title": "啟用", + "desc": "在右側啟用額外的網絡側邊欄" + } + }, + "group": { + "extraNetworkSidebar": "額外網絡側邊欄", + "layout": "佈局設置", + "promptTextarea": "提示文本框", + "quickSettingSidebar": "快速設置側邊欄", + "theme": "主題設置" + }, + "hideFooter": { + "title": "隱藏頁腳", + "desc": "隱藏主題頁腳,僅顯示 Stable Diffusion webui 的默認頁腳" + }, + "language": { + "title": "語言", + "desc": "Lobe 主題語言" + }, + "logoType": { + "title": "標誌類型", + "desc": "標誌類型", + "preview": "預覽" + }, + "neutralColor": { + "title": "中性顏色", + "desc": "使用不同的色調自定義不同的灰色,第二個是原始 Kitchen 中性顏色" + }, + "primaryColor": { + "title": "主要顏色", + "desc": "自定義主要顏色,第二個是原始 Kitchen 主題顏色" + }, + "promptDisplayMode": { + "title": "提示顯示模式", + "desc": "固定高度或可拖動調整大小的自動高度", + "resizable": "可調整大小", + "scroll": "滾動" + }, + "promptEditor": { + "title": "提示編輯器", + "desc": "在快速設置側邊欄頂部提供簡單的提示編輯器" + }, + "promptHighlight": { + "title": "提示語法高亮", + "desc": "根據 Stable Diffusion 語法規則自動著色提示顯示" + }, + "quickSettingSidebar": { + "defaultExpand": { + "title": "默認展開", + "desc": "啟動時是否默認展開側邊欄" + }, + "defaultWidth": { + "title": "默認寬度", + "desc": "啟動時側邊欄的默認寬度" + }, + "displayMode": { + "title": "顯示模式", + "desc": "固定為網格模式以保持恆定顯示,在浮動模式下當滑鼠移至側邊時自動展開" + }, + "enable": { + "title": "啟用", + "desc": "在左側啟用快速設置側邊欄" + } + }, + "reduceAnimation": { + "title": "減少動畫", + "desc": "減少模糊效果和背景流動顏色,可提高流暢度並節省 CPU 使用率" + }, + "splitPreviewer": { + "title": "分割預覽器", + "desc": "將提示輸入框放在左側,生成按鈕放在右側,確保滾動時始終在頂部顯示生成的圖像(實驗性)" + }, + "svgIcons": { + "title": "SVG 圖示", + "desc": "全局替換 Stable Diffusion webui 中的所有表情符號為 SVG 圖示" + } + }, + "sidebar": { + "extraNetwork": "額外網絡", + "quickSetting": "快速設置", + "mode": { + "fixed": "固定", + "float": "浮動" + } + } } diff --git a/package.json b/package.json index 0dc922d..2c1cdd9 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "ahooks": "^3", "antd": "^5", "antd-style": "latest", + "consola": "^3.2.3", "i18next": "^23", "i18next-http-backend": "^2", "lodash-es": "^4", diff --git a/src/_react_refresh.js b/src/_react_refresh.js index 0343dd9..d29bc59 100644 --- a/src/_react_refresh.js +++ b/src/_react_refresh.js @@ -1,3 +1,5 @@ +import { consola } from 'consola'; + import RefreshRuntime from '/@react-refresh'; const RefreshSig = (type) => type; @@ -7,4 +9,4 @@ window.$RefreshReg$ = () => {}; window.$RefreshSig$ = () => RefreshSig; window.__vite_plugin_react_preamble_installed__ = true; -console.debug('🤯 Injecting React Refresh'); +consola.success('🤯 Injecting React Refresh'); diff --git a/src/app/index.tsx b/src/app/index.tsx index 1c31763..975e665 100644 --- a/src/app/index.tsx +++ b/src/app/index.tsx @@ -18,51 +18,51 @@ import { useStyles } from './style'; const HEADER_HEIGHT = 64; const Index = memo(() => { - const setting = useAppStore(selectors.currentSetting, isEqual); - const { cx, styles } = useStyles({ - headerHeight: HEADER_HEIGHT, - isPrimaryColor: Boolean(setting.primaryColor), - }); + const setting = useAppStore(selectors.currentSetting, isEqual); + const { cx, styles } = useStyles({ + headerHeight: HEADER_HEIGHT, + isPrimaryColor: Boolean(setting.primaryColor), + }); - useEffect(() => { - if (setting.enableHighlight) { - PromptHighlight('#txt2img_prompt', '#lobe_txt2img_prompt'); - PromptHighlight('#img2img_prompt', '#lobe_img2img_prompt'); - } - if (setting.svgIcon) replaceIcon(); - }, []); + useEffect(() => { + if (setting.enableHighlight) { + PromptHighlight('#txt2img_prompt', '#lobe_txt2img_prompt'); + PromptHighlight('#img2img_prompt', '#lobe_img2img_prompt'); + } + if (setting.svgIcon) replaceIcon(); + }, []); - return ( - <> - - -
- - - {
} - {setting.enableSidebar && ( - - - - )} - - {setting?.enableExtraNetworkSidebar && ( - - - - )} - -
- - ); + return ( + <> + + +
+ + + {
} + {setting.enableSidebar && ( + + + + )} + + {setting?.enableExtraNetworkSidebar && ( + + + + )} + +
+ + ); }); export default Index; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9d6e349..6a1265f 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,3 +1,4 @@ +import { consola } from 'consola'; import { PropsWithChildren, Suspense, memo, useEffect, useState } from 'react'; import { Helmet } from 'react-helmet'; import { shallow } from 'zustand/shallow'; @@ -9,61 +10,60 @@ import { useAppStore } from '@/store'; import manifest from './manifest'; export const Layouts = memo(({ children }) => { - const [loading, setLoading] = useState(true); - const { setCurrentTab, onInit, storeLoading } = useAppStore( - (st) => ({ - onInit: st.onInit, - setCurrentTab: st.setCurrentTab, - storeLoading: st.loading, - }), - shallow, - ); + const [loading, setLoading] = useState(true); + const { setCurrentTab, onInit, storeLoading } = useAppStore( + (st) => ({ + onInit: st.onInit, + setCurrentTab: st.setCurrentTab, + storeLoading: st.loading, + }), + shallow, + ); - useEffect(() => { - console.time('🤯 Lobe Theme loading'); - onInit(); - onUiLoaded(() => { - setLoading(false); - console.timeEnd('🤯 Lobe Theme loading'); - }); - onUiTabChange(() => { - setCurrentTab(); - }); - }, []); + useEffect(() => { + onInit(); + onUiLoaded(() => { + setLoading(false); + consola.success('🤯 Lobe Theme loading'); + }); + onUiTabChange(() => { + setCurrentTab(); + }); + }, []); - return ( - - - - - - - - - - - - - {storeLoading === false && loading === false ? children : } - - ); + return ( + + + + + + + + + + + + + {storeLoading === false && loading === false ? children : } + + ); }); export default Layouts; diff --git a/src/app/manifest.ts b/src/app/manifest.ts index 56333c9..199470e 100644 --- a/src/app/manifest.ts +++ b/src/app/manifest.ts @@ -1,28 +1,28 @@ const manifest = { - background_color: '#000000', - description: + background_color: '#000000', + description: 'The modern theme for stable diffusion webui, exquisite interface design, highly customizable UI, and efficiency boosting features.', - display: 'standalone', - icons: [ - { - sizes: '192x192', - src: 'https://registry.npmmirror.com/@lobehub/assets-favicons/1.1.0/files/assets/android-chrome-192x192.png', - type: 'image/png', - }, - { - sizes: '512x512', - src: 'https://registry.npmmirror.com/@lobehub/assets-favicons/1.1.0/files/assets/android-chrome-512x512.png', - type: 'image/png', - }, - ], - id: '/', - name: 'Stable Diffusion', - orientation: 'portrait', - scope: '/', - short_name: 'Stable Diffusion', - splash_pages: null, - start_url: location.origin, - theme_color: '#000000', + display: 'standalone', + icons: [ + { + sizes: '192x192', + src: 'https://registry.npmmirror.com/@lobehub/assets-favicons/1.1.0/files/assets/android-chrome-192x192.png', + type: 'image/png', + }, + { + sizes: '512x512', + src: 'https://registry.npmmirror.com/@lobehub/assets-favicons/1.1.0/files/assets/android-chrome-512x512.png', + type: 'image/png', + }, + ], + id: '/', + name: 'Stable Diffusion', + orientation: 'portrait', + scope: '/', + short_name: 'Stable Diffusion', + splash_pages: null, + start_url: location.origin, + theme_color: '#000000', }; export default `data:application/manifest+json;base64,${btoa(JSON.stringify(manifest))}`; diff --git a/src/app/page.tsx b/src/app/page.tsx index c383912..bdc6b68 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -2,9 +2,9 @@ import Index from './index'; import Layout from './layout'; export default () => { - return ( - - - - ); + return ( + + + + ); }; diff --git a/src/app/style.ts b/src/app/style.ts index a450b80..793442e 100644 --- a/src/app/style.ts +++ b/src/app/style.ts @@ -2,13 +2,13 @@ import { createStyles } from 'antd-style'; import { adjustHue } from 'polished'; export const useStyles = createStyles( - ( - { cx, css, stylish, token, isDarkMode }, - { headerHeight, isPrimaryColor }: { headerHeight: number; isPrimaryColor: boolean }, - ) => ({ - background: cx( - stylish.gradientAnimation, - isPrimaryColor && + ( + { cx, css, stylish, token, isDarkMode }, + { headerHeight, isPrimaryColor }: { headerHeight: number; isPrimaryColor: boolean }, + ) => ({ + background: cx( + stylish.gradientAnimation, + isPrimaryColor && css` background-image: linear-gradient( -45deg, @@ -18,7 +18,7 @@ export const useStyles = createStyles( ${adjustHue(-45, token.colorPrimary)} ); `, - css` + css` pointer-events: none; position: absolute !important; @@ -32,8 +32,8 @@ export const useStyles = createStyles( opacity: 0.2; filter: blur(100px); `, - ), - backgroundLite: css` + ), + backgroundLite: css` pointer-events: none; position: absolute !important; @@ -50,19 +50,19 @@ export const useStyles = createStyles( transparent ); `, - panel: css` + panel: css` .draggable-panel { border-style: dashed; } `, - quicksettings: css` + quicksettings: css` #quicksettings { align-items: start; padding: 16px !important; } `, - sidebar: css` + sidebar: css` height: calc(100vh - ${headerHeight}px); `, - }), + }), ); diff --git a/src/components/Giscus/index.tsx b/src/components/Giscus/index.tsx index 57426f1..2d3783b 100644 --- a/src/components/Giscus/index.tsx +++ b/src/components/Giscus/index.tsx @@ -1,11 +1,11 @@ import { - ActionIcon, - DiscordIcon, - Giscus as G, - GradientButton, - Icon, - Modal, - type ModalProps, + ActionIcon, + DiscordIcon, + Giscus as G, + GradientButton, + Icon, + Modal, + type ModalProps, } from '@lobehub/ui'; import { Button, Space } from 'antd'; import { useTheme } from 'antd-style'; @@ -27,49 +27,49 @@ export interface GiscusProps { const repoName = homepage.replace('https://github.com/', '') as `${string}/${string}`; const Giscus = memo(({ open, onCancel }) => { - const setting = useAppStore(selectors.currentSetting, isEqual); - const theme = useTheme(); - const { t } = useTranslation(); - return ( - - - - - - - - - {t('themeFeedback')} - - - - } - > - -
+ + + + + + + + {t('modal.themeFeedback.title')} + + + + } > - - }>LobeTheme Github -
- -
-
- ); + + }>LobeTheme Github + + + + + ); }); export default Giscus; diff --git a/src/components/Loading/index.tsx b/src/components/Loading/index.tsx index 3c6fe41..38b926e 100644 --- a/src/components/Loading/index.tsx +++ b/src/components/Loading/index.tsx @@ -5,19 +5,19 @@ import { useTranslation } from 'react-i18next'; import { Center, Flexbox } from 'react-layout-kit'; const Loading = memo(() => { - const { t } = useTranslation(); + const { t } = useTranslation(); - return ( - -
- -
- - {t('appInitializing')} -
-
-
- ); + return ( + +
+ +
+ + {t('custom.initializing')} +
+
+
+ ); }); export default Loading; diff --git a/src/components/Loading/style.ts b/src/components/Loading/style.ts index 47401f3..f697baf 100644 --- a/src/components/Loading/style.ts +++ b/src/components/Loading/style.ts @@ -2,13 +2,13 @@ import { createStyles } from 'antd-style'; import { adjustHue, rgba } from 'polished'; export const useStyles = createStyles( - ( - { css, stylish, cx, token }, - { isPrimaryColor, liteAnimation }: { isPrimaryColor?: boolean; liteAnimation?: boolean }, - ) => ({ - canvas: cx( - stylish.gradientAnimation, - isPrimaryColor && + ( + { css, stylish, cx, token }, + { isPrimaryColor, liteAnimation }: { isPrimaryColor?: boolean; liteAnimation?: boolean }, + ) => ({ + canvas: cx( + stylish.gradientAnimation, + isPrimaryColor && css` background-image: linear-gradient( -45deg, @@ -18,7 +18,7 @@ export const useStyles = createStyles( ${adjustHue(-45, token.colorPrimary)} ); `, - css` + css` pointer-events: none; position: absolute; @@ -33,10 +33,10 @@ export const useStyles = createStyles( opacity: 0.2; filter: blur(100px); `, - ), - container: cx( - !liteAnimation && stylish.blur, - css` + ), + container: cx( + !liteAnimation && stylish.blur, + css` position: fixed; z-index: 9999; inset: 0; @@ -50,11 +50,11 @@ export const useStyles = createStyles( background: ${liteAnimation ? token.colorBgLayout : rgba(token.colorBgLayout, 0.5)}; `, - ), - icon: css` + ), + icon: css` color: ${token.colorPrimary}; `, - inner: css` + inner: css` display: flex; flex-direction: column; gap: 16px; @@ -63,5 +63,5 @@ export const useStyles = createStyles( width: min(50%, 580px); `, - }), + }), ); diff --git a/src/components/Logo/CustomLogo.tsx b/src/components/Logo/CustomLogo.tsx index 196b05d..ff5c4ce 100644 --- a/src/components/Logo/CustomLogo.tsx +++ b/src/components/Logo/CustomLogo.tsx @@ -10,25 +10,25 @@ export interface CustomLogoProps { } const CustomLogo = memo(({ size = 32, style, logoCustomUrl, logoCustomTitle }) => { - let customLogo = ; + let customLogo = ; - if (logoCustomUrl) { - if (logoCustomUrl.includes('http') || logoCustomUrl.includes('data')) { - customLogo = logo; - } else { - const pureEmoji = getEmoji(logoCustomUrl); - if (pureEmoji) { - customLogo = ; - } + if (logoCustomUrl) { + if (logoCustomUrl.includes('http') || logoCustomUrl.includes('data')) { + customLogo = logo; + } else { + const pureEmoji = getEmoji(logoCustomUrl); + if (pureEmoji) { + customLogo = ; + } + } } - } - return ( - - {customLogo} - {logoCustomTitle} - - ); + return ( + + {customLogo} + {logoCustomTitle} + + ); }); export default CustomLogo; diff --git a/src/components/Logo/KitchenLogo.tsx b/src/components/Logo/KitchenLogo.tsx index 5be98bb..ab7ef83 100644 --- a/src/components/Logo/KitchenLogo.tsx +++ b/src/components/Logo/KitchenLogo.tsx @@ -9,13 +9,13 @@ export interface KitchenLogoProps { } const KitchenLogo = memo(({ size = 32, style, themeMode }) => { - return ( - logo - ); + return ( + logo + ); }); export default KitchenLogo; diff --git a/src/components/Logo/index.tsx b/src/components/Logo/index.tsx index a5a8939..a3912cf 100644 --- a/src/components/Logo/index.tsx +++ b/src/components/Logo/index.tsx @@ -1,7 +1,6 @@ import { Logo as LobeLogo } from '@lobehub/ui'; import isEqual from 'fast-deep-equal'; import { type CSSProperties, memo } from 'react'; -import { shallow } from 'zustand/shallow'; import { selectors, useAppStore } from '@/store'; @@ -14,25 +13,25 @@ export interface LogoProps { } const Logo = memo(({ size = 32, style }) => { - const setting = useAppStore(selectors.currentSetting, isEqual); - const themeMode = useAppStore(selectors.themeMode, shallow); + const setting = useAppStore(selectors.currentSetting, isEqual); + const themeMode = useAppStore(selectors.themeMode); - if (setting.logoType === 'kitchen') { - return ; - } + if (setting.logoType === 'kitchen') { + return ; + } - if (setting.logoType === 'custom') { - return ( - - ); - } + if (setting.logoType === 'custom') { + return ( + + ); + } - return ; + return ; }); export default Logo; diff --git a/src/components/PromptEditor/Prompt.tsx b/src/components/PromptEditor/Prompt.tsx index 6c3af10..ccbc0c0 100644 --- a/src/components/PromptEditor/Prompt.tsx +++ b/src/components/PromptEditor/Prompt.tsx @@ -1,3 +1,4 @@ +import { consola } from 'consola'; import { memo, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; @@ -10,66 +11,66 @@ interface PromptProps { } const Prompt = memo(({ type }) => { - const [tags, setTags] = useState([]); - const { styles } = useStyles(); - const { t } = useTranslation(); + const [tags, setTags] = useState([]); + const { styles } = useStyles(); + const { t } = useTranslation(); - const id = + const id = type === 'positive' ? "[id$='2img_prompt'] textarea" : "[id$='2img_neg_prompt'] textarea"; - const getValue = useCallback(() => { - try { - const textarea = get_uiCurrentTabContent().querySelector(id) as HTMLTextAreaElement; - if (textarea) setTags(formatPrompt(textarea.value)); - } catch (error) { - console.debug(error); - } - }, []); + const getValue = useCallback(() => { + try { + const textarea = get_uiCurrentTabContent().querySelector(id) as HTMLTextAreaElement; + if (textarea) setTags(formatPrompt(textarea.value)); + } catch (error) { + consola.error('🤯 [prompt]', error); + } + }, []); - const setValue = useCallback(() => { - try { - const newValue = tags.map((t) => t.text).join(', '); - const textarea = get_uiCurrentTabContent().querySelector(id) as HTMLTextAreaElement; - if (textarea) textarea.value = newValue; - updateInput(textarea); - } catch (error) { - console.debug(error); - } - }, [tags, type]); + const setValue = useCallback(() => { + try { + const newValue = tags.map((t) => t.text).join(', '); + const textarea = get_uiCurrentTabContent().querySelector(id) as HTMLTextAreaElement; + if (textarea) textarea.value = newValue; + updateInput(textarea); + } catch (error) { + consola.error('🤯 [prompt]', error); + } + }, [tags, type]); - const setCurrentValue = useCallback((currentTags: TagItem[]) => { - try { - const textarea = get_uiCurrentTabContent().querySelector(id) as HTMLTextAreaElement; - if (textarea) textarea.value = currentTags.map((t) => t.text).join(', '); - updateInput(textarea); - } catch (error) { - console.debug(error); - } - }, []); + const setCurrentValue = useCallback((currentTags: TagItem[]) => { + try { + const textarea = get_uiCurrentTabContent().querySelector(id) as HTMLTextAreaElement; + if (textarea) textarea.value = currentTags.map((t) => t.text).join(', '); + updateInput(textarea); + } catch (error) { + consola.error('🤯 [prompt]', error); + } + }, []); - return ( -
- -
- - + -
-
- ); + +
+
+ ); }); export default Prompt; diff --git a/src/components/PromptEditor/TagList/index.tsx b/src/components/PromptEditor/TagList/index.tsx index 2c7c587..a2c16d1 100644 --- a/src/components/PromptEditor/TagList/index.tsx +++ b/src/components/PromptEditor/TagList/index.tsx @@ -1,3 +1,4 @@ +import { consola } from 'consola'; import { type FC, memo, useCallback, useEffect, useState } from 'react'; import { WithContext, ReactTagsProps as WithContextProps } from 'react-tag-input'; @@ -21,8 +22,8 @@ interface ReactTagsProps extends WithContextProps { const ReactTags: FC = WithContext; const KeyCodes = { - comma: 188, - enter: 13, + comma: 188, + enter: 13, }; const delimiters = [KeyCodes.comma, KeyCodes.enter]; @@ -35,86 +36,85 @@ interface TagListProps { } const TagList = memo(({ tags, setTags, type, setValue }) => { - const id = `${type}_tag_editor`; - const [bind, setBind] = useState(false); - const { styles } = useStyles(type); - const handleDelete = useCallback( - (index_: number) => { - const newTags = tags.filter((tag, index) => index !== index_); - setTags(newTags); - setValue(newTags); - }, - [tags], - ); + const id = `${type}_tag_editor`; + const [bind, setBind] = useState(false); + const { styles } = useStyles(type); + const handleDelete = useCallback( + (index_: number) => { + const newTags = tags.filter((tag, index) => index !== index_); + setTags(newTags); + setValue(newTags); + }, + [tags], + ); - const handleAddition = useCallback( - (tag: TagItem) => { - const newTags = [...tags, genTagType(tag)]; - setTags(newTags); - setValue(newTags); - }, - [tags], - ); + const handleAddition = useCallback( + (tag: TagItem) => { + const newTags = [...tags, genTagType(tag)]; + setTags(newTags); + setValue(newTags); + }, + [tags], + ); - const handleDrag = useCallback( - (tag: TagItem, currentPos: number, newPos: number) => { - const newTags = [...tags]; - newTags.splice(currentPos, 1); - newTags.splice(newPos, 0, genTagType(tag)); - setTags(newTags); - setValue(newTags); - }, - [tags], - ); + const handleDrag = useCallback( + (tag: TagItem, currentPos: number, newPos: number) => { + const newTags = [...tags]; + newTags.splice(currentPos, 1); + newTags.splice(newPos, 0, genTagType(tag)); + setTags(newTags); + setValue(newTags); + }, + [tags], + ); - const handleTagUpdate = useCallback( - (index: number, tag: TagItem) => { - const newTags = [...tags]; - newTags[index] = genTagType(tag); - setTags(newTags); - setValue(newTags); - }, - [tags], - ); + const handleTagUpdate = useCallback( + (index: number, tag: TagItem) => { + const newTags = [...tags]; + newTags[index] = genTagType(tag); + setTags(newTags); + setValue(newTags); + }, + [tags], + ); - useEffect(() => { - try { - if (!addAutocompleteToArea || bind) return; - let retryTimes = 0; - const bindInterval = setInterval(() => { - console.time('🤯 [promptTagEditor] inject'); - if (bind || retryTimes > 10) { - const inputDom = document.querySelector(`#${id}`) as HTMLInputElement; - if (inputDom) { - setBind(true); - addAutocompleteToArea(inputDom); - clearInterval(bindInterval); - console.timeEnd('🤯 [promptTagEditor] inject'); - } + useEffect(() => { + try { + if (!addAutocompleteToArea || bind) return; + let retryTimes = 0; + const bindInterval = setInterval(() => { + if (bind || retryTimes > 10) { + const inputDom = document.querySelector(`#${id}`) as HTMLInputElement; + if (inputDom) { + setBind(true); + addAutocompleteToArea(inputDom); + clearInterval(bindInterval); + consola.success('🤯 [promptTagEditor] inject'); + } + } + retryTimes++; + }, 1000); + } catch (error) { + consola.error('🤯 [promptTagEditor]', error); } - retryTimes++; - }, 1000); - } catch (error) { - console.error(error); - } - }, [bind]); + }, [bind]); - return ( -
- -
- ); + return ( +
+ +
+ ); }); export default TagList; diff --git a/src/components/PromptEditor/TagList/style.ts b/src/components/PromptEditor/TagList/style.ts index 3e56e9f..eeaef09 100644 --- a/src/components/PromptEditor/TagList/style.ts +++ b/src/components/PromptEditor/TagList/style.ts @@ -1,7 +1,7 @@ import { createStyles } from 'antd-style'; export const useStyles = createStyles( - ({ css, token }, type: 'positive' | 'negative') => css` + ({ css, token }, type: 'positive' | 'negative') => css` .autocompleteResults { left: 16px !important; min-width: 200px !important; diff --git a/src/components/PromptEditor/index.tsx b/src/components/PromptEditor/index.tsx index 8459e86..0b19d86 100644 --- a/src/components/PromptEditor/index.tsx +++ b/src/components/PromptEditor/index.tsx @@ -6,16 +6,16 @@ import { useStyles } from '@/components/PromptEditor/style'; import Prompt from './Prompt'; const PromptEditor = memo(() => { - const { styles } = useStyles(); - const { t } = useTranslation(); - return ( -
- {t('positive')} - - {t('negative')} - -
- ); + const { styles } = useStyles(); + const { t } = useTranslation(); + return ( +
+ {t('prompt.positive')} + + {t('prompt.negative')} + +
+ ); }); export default PromptEditor; diff --git a/src/components/PromptEditor/style.ts b/src/components/PromptEditor/style.ts index 5b99160..ae8dbf0 100644 --- a/src/components/PromptEditor/style.ts +++ b/src/components/PromptEditor/style.ts @@ -1,16 +1,16 @@ import { createStyles } from 'antd-style'; export const useStyles = createStyles(({ css }) => ({ - buttonGroup: css` + buttonGroup: css` display: flex; gap: 8px; `, - promptView: css` + promptView: css` display: flex; flex-direction: column; gap: 8px; `, - view: css` + view: css` display: flex; flex-direction: column; gap: 1em; diff --git a/src/components/PromptEditor/utils.ts b/src/components/PromptEditor/utils.ts index 5c7b395..19e613b 100644 --- a/src/components/PromptEditor/utils.ts +++ b/src/components/PromptEditor/utils.ts @@ -3,31 +3,31 @@ import { Converter } from '@/scripts/formatPrompt'; import { TagItem } from './TagList'; export const genTagType = (tag: TagItem): TagItem => { - const newTag = tag; - if (newTag.text.includes(' { - const text = Converter.convertStr(value); - const textArray = Converter.convertStr2Array(text).map((item) => { - if (item.includes('<')) return item; - const newItem = item - .replaceAll(/\s+/g, ' ') - .replaceAll(/,|\.\|。/g, ',') - .replaceAll(/“|‘|”|"|\/'/g, '') - .replaceAll(', ', ',') - .replaceAll(',,', ',') - .replaceAll(',', ', '); - return Converter.convertStr2Array(newItem).join(', '); - }); - return textArray.map((tag) => genTagType({ id: tag, text: tag })); + const text = Converter.convertStr(value); + const textArray = Converter.convertStr2Array(text).map((item) => { + if (item.includes('<')) return item; + const newItem = item + .replaceAll(/\s+/g, ' ') + .replaceAll(/,|\.\|。/g, ',') + .replaceAll(/“|‘|”|"|\/'/g, '') + .replaceAll(', ', ',') + .replaceAll(',,', ',') + .replaceAll(',', ', '); + return Converter.convertStr2Array(newItem).join(', '); + }); + return textArray.map((tag) => genTagType({ id: tag, text: tag })); }; diff --git a/src/components/VersionTag/index.tsx b/src/components/VersionTag/index.tsx index 62dd80f..36bfee3 100644 --- a/src/components/VersionTag/index.tsx +++ b/src/components/VersionTag/index.tsx @@ -7,26 +7,26 @@ import { homepage } from '@/../package.json'; import { useAppStore } from '@/store'; const VersionTag = memo((props) => { - const { version, latestVersion } = useAppStore( - (st) => ({ latestVersion: st.latestVersion, version: st.version }), - shallow, - ); + const { version, latestVersion } = useAppStore( + (st) => ({ latestVersion: st.latestVersion, version: st.version }), + shallow, + ); - const isLatest = semver.gte(version, latestVersion); + const isLatest = semver.gte(version, latestVersion); - return ( - - {isLatest ? ( - + return ( + + {isLatest ? ( + v{version} - - ) : ( - + + ) : ( + v{version} / latest v{latestVersion} - - )} - - ); + + )} + + ); }); export default VersionTag; diff --git a/src/features/Content/SplitView.tsx b/src/features/Content/SplitView.tsx index 44b021e..20b982f 100644 --- a/src/features/Content/SplitView.tsx +++ b/src/features/Content/SplitView.tsx @@ -1,43 +1,47 @@ +import { consola } from 'consola'; import { memo, useEffect } from 'react'; const Preview = memo(() => { - useEffect(() => { - console.time('🤯 [layout] inject - Split Previewer'); - // tab_txt2img - const txt2imgToprow = gradioApp().querySelector('#txt2img_toprow') as HTMLDivElement; - const txt2imgSettings = gradioApp().querySelector('#txt2img_settings') as HTMLDivElement; - const txt2imgGenerate = gradioApp().querySelector('#txt2img_generate_box') as HTMLDivElement; - const txt2imgPreview = gradioApp().querySelector( - '#txt2img_gallery_container', - ) as HTMLDivElement; - if (txt2imgToprow && txt2imgSettings && txt2imgGenerate && txt2imgPreview) { - txt2imgSettings.prepend(txt2imgToprow); - txt2imgPreview.prepend(txt2imgGenerate); - } - // tab_img2img - const img2imgToprow = gradioApp().querySelector('#img2img_toprow') as HTMLDivElement; - const img2imgSettings = gradioApp().querySelector('#img2img_settings') as HTMLDivElement; - const img2imgGenerate = gradioApp().querySelector('#img2img_generate_box') as HTMLDivElement; - const img2imgPreview = gradioApp().querySelector( - '#img2img_gallery_container', - ) as HTMLDivElement; - if (img2imgSettings && img2imgToprow && img2imgGenerate && img2imgPreview) { - img2imgSettings.prepend(img2imgToprow); - img2imgPreview.prepend(img2imgGenerate); - } + useEffect(() => { + try { + // tab_txt2img + const txt2imgToprow = gradioApp().querySelector('#txt2img_toprow') as HTMLDivElement; + const txt2imgSettings = gradioApp().querySelector('#txt2img_settings') as HTMLDivElement; + const txt2imgGenerate = gradioApp().querySelector('#txt2img_generate_box') as HTMLDivElement; + const txt2imgPreview = gradioApp().querySelector( + '#txt2img_gallery_container', + ) as HTMLDivElement; + if (txt2imgToprow && txt2imgSettings && txt2imgGenerate && txt2imgPreview) { + txt2imgSettings.prepend(txt2imgToprow); + txt2imgPreview.prepend(txt2imgGenerate); + } + // tab_img2img + const img2imgToprow = gradioApp().querySelector('#img2img_toprow') as HTMLDivElement; + const img2imgSettings = gradioApp().querySelector('#img2img_settings') as HTMLDivElement; + const img2imgGenerate = gradioApp().querySelector('#img2img_generate_box') as HTMLDivElement; + const img2imgPreview = gradioApp().querySelector( + '#img2img_gallery_container', + ) as HTMLDivElement; + if (img2imgSettings && img2imgToprow && img2imgGenerate && img2imgPreview) { + img2imgSettings.prepend(img2imgToprow); + img2imgPreview.prepend(img2imgGenerate); + } - // extras_img2img - const extrasGenerate = gradioApp().querySelector('#extras_generate') as HTMLDivElement; - const extrasPreview = gradioApp().querySelector('#extras_results') as HTMLDivElement; - if (extrasGenerate && extrasPreview) { - (extrasPreview?.parentNode as HTMLDivElement).id = '#extras_gallery_container'; - extrasPreview.prepend(extrasGenerate); - } + // extras_img2img + const extrasGenerate = gradioApp().querySelector('#extras_generate') as HTMLDivElement; + const extrasPreview = gradioApp().querySelector('#extras_results') as HTMLDivElement; + if (extrasGenerate && extrasPreview) { + (extrasPreview?.parentNode as HTMLDivElement).id = '#extras_gallery_container'; + extrasPreview.prepend(extrasGenerate); + } - console.timeEnd('🤯 [layout] inject - Split Previewer'); - }, []); + consola.success('🤯 [layout] inject - Split Previewer'); + } catch (error) { + consola.error('🤯 [layout] inject - Split Previewer', error); + } + }, []); - return null; + return null; }); export default Preview; diff --git a/src/features/Content/index.tsx b/src/features/Content/index.tsx index 64f4fc9..f391a44 100644 --- a/src/features/Content/index.tsx +++ b/src/features/Content/index.tsx @@ -1,4 +1,5 @@ import { useResponsive } from 'antd-style'; +import { consola } from 'consola'; import isEqual from 'fast-deep-equal'; import { memo, useEffect, useRef } from 'react'; @@ -10,63 +11,66 @@ import SplitView from './SplitView'; import { useStyles } from './style'; const Content = memo(({ className, ...props }) => { - const mainReference = useRef(null); - const { mobile } = useResponsive(); - const setting = useAppStore(selectors.currentSetting, isEqual); + const mainReference = useRef(null); + const { mobile } = useResponsive(); + const setting = useAppStore(selectors.currentSetting, isEqual); - const { cx, styles } = useStyles({ - isPromptResizable: setting.promptTextareaType === 'resizable', - layoutSplitPreview: setting.layoutSplitPreview, - }); + const { cx, styles } = useStyles({ + isPromptResizable: setting.promptTextareaType === 'resizable', + layoutSplitPreview: setting.layoutSplitPreview, + }); - useEffect(() => { - console.time('🤯 [layout] inject - Content'); - // Content - const main = gradioApp().querySelector('.app'); - if (main) { - mainReference.current?.append(main); - } + useEffect(() => { + try { + // Content + const main = gradioApp().querySelector('.app'); + if (main) { + mainReference.current?.append(main); + } - // remove prompt scroll-hide - const textares = gradioApp().querySelectorAll( - `[id$="_prompt_container"] textarea`, - ) as NodeListOf; - if (textares) { - for (const textarea of textares) { - textarea.classList.remove('scroll-hide'); - textarea.style.height = 'auto'; - } - } + // remove prompt scroll-hide + const textares = gradioApp().querySelectorAll( + `[id$="_prompt_container"] textarea`, + ) as NodeListOf; + if (textares) { + for (const textarea of textares) { + textarea.classList.remove('scroll-hide'); + textarea.style.height = 'auto'; + } + } - // textarea - const interrogate = gradioApp().querySelector( - '#img2img_toprow .interrogate-col', - ) as HTMLDivElement; - const actions = gradioApp().querySelector('#img2img_actions_column') as HTMLDivElement; - if (interrogate && actions) { - actions.append(interrogate); - } + // textarea + const interrogate = gradioApp().querySelector( + '#img2img_toprow .interrogate-col', + ) as HTMLDivElement; + const actions = gradioApp().querySelector('#img2img_actions_column') as HTMLDivElement; + if (interrogate && actions) { + actions.append(interrogate); + } - formatPrompt(); - console.timeEnd('🤯 [layout] inject - Content'); - }, []); + formatPrompt(); + consola.success('🤯 [layout] inject - Content'); + } catch (error) { + consola.error('🤯 [layout] inject - Content', error); + } + }, []); - return ( - <> -
- {setting.layoutSplitPreview && mobile === false && } - - ); + return ( + <> +
+ {setting.layoutSplitPreview && mobile === false && } + + ); }); export default Content; diff --git a/src/features/Content/style.ts b/src/features/Content/style.ts index ab6cd90..9790f5a 100644 --- a/src/features/Content/style.ts +++ b/src/features/Content/style.ts @@ -3,15 +3,15 @@ import { createStyles } from 'antd-style'; const TEXT2IMG_PROMPT_HEIGHT = 74; const IMG2IMG_PROMPT_HEIGHT = 98; export const useStyles = createStyles( - ( - { css, token, stylish, isDarkMode, responsive }, - { - isPromptResizable, - layoutSplitPreview, - }: { isPromptResizable: boolean; layoutSplitPreview: boolean }, - ) => { - return { - container: css` + ( + { css, token, stylish, isDarkMode, responsive }, + { + isPromptResizable, + layoutSplitPreview, + }: { isPromptResizable: boolean; layoutSplitPreview: boolean }, + ) => { + return { + container: css` position: relative; flex: 1; min-width: ${layoutSplitPreview ? '200px' : '0'}; @@ -191,7 +191,7 @@ export const useStyles = createStyles( } } `, - splitView: css` + splitView: css` #txt2img_toprow, #img2img_toprow { flex-direction: column !important; @@ -199,7 +199,7 @@ export const useStyles = createStyles( background: transparent !important; } `, - text2img: css` + text2img: css` button[id$='_generate'] { height: var(--button-lg-height) !important; min-height: var(--button-lg-height) !important; @@ -364,7 +364,7 @@ export const useStyles = createStyles( box-shadow: none; } `, - textares: css` + textares: css` [id$='2img_prompt'], [id$='2img_neg_prompt'] { textarea { @@ -452,6 +452,6 @@ export const useStyles = createStyles( } } `, - }; - }, + }; + }, ); diff --git a/src/features/ExtraNetworkSidebar/Inner.tsx b/src/features/ExtraNetworkSidebar/Inner.tsx index cd18740..11d6ebf 100644 --- a/src/features/ExtraNetworkSidebar/Inner.tsx +++ b/src/features/ExtraNetworkSidebar/Inner.tsx @@ -1,136 +1,141 @@ import { ActionIcon, DraggablePanelBody, DraggablePanelFooter } from '@lobehub/ui'; import { useTimeout } from 'ahooks'; import { Skeleton, Slider } from 'antd'; +import { consola } from 'consola'; import isEqual from 'fast-deep-equal'; import { ZoomIn, ZoomOut } from 'lucide-react'; import { memo, useEffect, useRef, useState } from 'react'; -import { shallow } from 'zustand/shallow'; import { useStyles } from '@/features/ExtraNetworkSidebar/style'; import civitaiHelperFix from '@/scripts/civitaiHelperFix'; import { selectors, useAppStore } from '@/store'; const Inner = memo(() => { - const txt2imgExtraNetworkSidebarReference = useRef(null); - const img2imgExtraNetworkSidebarReference = useRef(null); - const [extraLoading, setExtraLoading] = useState(true); - const setting = useAppStore(selectors.currentSetting, isEqual); - const currentTab = useAppStore(selectors.currentTab, shallow); - const [size, setSize] = useState(setting.extraNetworkCardSize || 86); - const { styles } = useStyles({ size }); + const txt2imgExtraNetworkSidebarReference = useRef(null); + const img2imgExtraNetworkSidebarReference = useRef(null); + const [extraLoading, setExtraLoading] = useState(true); + const setting = useAppStore(selectors.currentSetting, isEqual); + const currentTab = useAppStore(selectors.currentTab); + const [size, setSize] = useState(setting.extraNetworkCardSize || 86); + const { styles } = useStyles({ size }); - useEffect(() => { - console.time('🤯 [layout] inject - ExtraNetworkSidebar'); - if (setting.enableExtraNetworkSidebar) { - const image2imageExtraNetworkButton = gradioApp().querySelectorAll( - '#txt2img_extra_tabs > .tab-nav > button', - )[1] as HTMLButtonElement; - const text2imageExtraNetworkButton = gradioApp().querySelectorAll( - '#img2img_extra_tabs > .tab-nav > button', - )[1] as HTMLButtonElement; + useEffect(() => { + try { + if (setting.enableExtraNetworkSidebar) { + const image2imageExtraNetworkButton = gradioApp().querySelectorAll( + '#txt2img_extra_tabs > .tab-nav > button', + )[1] as HTMLButtonElement; + const text2imageExtraNetworkButton = gradioApp().querySelectorAll( + '#img2img_extra_tabs > .tab-nav > button', + )[1] as HTMLButtonElement; - if (image2imageExtraNetworkButton) { - image2imageExtraNetworkButton.click(); - } - if (text2imageExtraNetworkButton) { - text2imageExtraNetworkButton.click(); - } + if (image2imageExtraNetworkButton) { + image2imageExtraNetworkButton.click(); + } + if (text2imageExtraNetworkButton) { + text2imageExtraNetworkButton.click(); + } - const txt2imgTab = gradioApp().querySelector('div#tab_txt2img') as HTMLDivElement; - const txt2imgExtraNetworks = gradioApp().querySelector( - 'div#txt2img_extra_tabs', - ) as HTMLDivElement; - const txt2imgRender = txt2imgExtraNetworks.querySelectorAll( - 'div.tabitem.gradio-tabitem', - )[0] as HTMLDivElement; + const txt2imgTab = gradioApp().querySelector('div#tab_txt2img') as HTMLDivElement; + const txt2imgExtraNetworks = gradioApp().querySelector( + 'div#txt2img_extra_tabs', + ) as HTMLDivElement; + const txt2imgRender = txt2imgExtraNetworks.querySelectorAll( + 'div.tabitem.gradio-tabitem', + )[0] as HTMLDivElement; - const img2imgTab = gradioApp().querySelector('div#tab_img2img'); - const img2imgExtraNetworks = gradioApp().querySelector( - 'div#img2img_extra_tabs', - ) as HTMLDivElement; - const img2imgRender = img2imgExtraNetworks.querySelectorAll( - 'div.tabitem.gradio-tabitem', - )[0] as HTMLDivElement; + const img2imgTab = gradioApp().querySelector('div#tab_img2img'); + const img2imgExtraNetworks = gradioApp().querySelector( + 'div#img2img_extra_tabs', + ) as HTMLDivElement; + const img2imgRender = img2imgExtraNetworks.querySelectorAll( + 'div.tabitem.gradio-tabitem', + )[0] as HTMLDivElement; - if (txt2imgExtraNetworks && img2imgExtraNetworks) { - txt2imgExtraNetworkSidebarReference.current?.append(txt2imgExtraNetworks); - txt2imgRender.id = 'txt2img_render'; - txt2imgTab?.append(txt2imgRender); + if (txt2imgExtraNetworks && img2imgExtraNetworks) { + txt2imgExtraNetworkSidebarReference.current?.append(txt2imgExtraNetworks); + txt2imgRender.id = 'txt2img_render'; + txt2imgTab?.append(txt2imgRender); - img2imgExtraNetworkSidebarReference.current?.append(img2imgExtraNetworks); - img2imgRender.id = 'img2img_render'; - img2imgTab?.append(img2imgRender); - } - if (document.querySelector('.extra-network-cards')) { - civitaiHelperFix(); - setExtraLoading(false); - return; - } - } - console.timeEnd('🤯 [layout] inject - ExtraNetworkSidebar'); - }, []); + img2imgExtraNetworkSidebarReference.current?.append(img2imgExtraNetworks); + img2imgRender.id = 'img2img_render'; + img2imgTab?.append(img2imgRender); + } + if (document.querySelector('.extra-network-cards')) { + civitaiHelperFix(); + setExtraLoading(false); + return; + } + } + consola.success('🤯 [layout] inject - ExtraNetworkSidebar'); + } catch (error) { + consola.error('🤯 [layout] inject - ExtraNetworkSidebar', error); + } + }, []); - useTimeout(() => { - console.time('🤯 [extranetwork] force reload'); - const t2indexButton = document.querySelector('#txt2img_extra_refresh') as HTMLButtonElement; - const index2indexButton = document.querySelector('#img2img_extra_refresh') as HTMLButtonElement; - t2indexButton.click(); - index2indexButton.click(); - setExtraLoading(false); - try { - const civitaiText2ImgButton = document.querySelector('#txt2img_extra_refresh') - ?.nextSibling as HTMLButtonElement; - if (civitaiText2ImgButton) { - civitaiText2ImgButton.onclick = civitaiHelperFix; - } - const civitaiImg2ImgButton = document.querySelector('#img2img_extra_refresh') - ?.nextSibling as HTMLButtonElement; - if (civitaiImg2ImgButton) { - civitaiImg2ImgButton.onclick = civitaiHelperFix; - } + useTimeout(() => { + try { + const t2indexButton = document.querySelector('#txt2img_extra_refresh') as HTMLButtonElement; + const index2indexButton = document.querySelector( + '#img2img_extra_refresh', + ) as HTMLButtonElement; + t2indexButton.click(); + index2indexButton.click(); + setExtraLoading(false); - civitaiHelperFix(); - } catch (error) { - console.debug(error); - } - console.timeEnd('🤯 [extranetwork] force reload'); - }, 2000); + const civitaiText2ImgButton = document.querySelector('#txt2img_extra_refresh') + ?.nextSibling as HTMLButtonElement; + if (civitaiText2ImgButton) { + civitaiText2ImgButton.onclick = civitaiHelperFix; + } + const civitaiImg2ImgButton = document.querySelector('#img2img_extra_refresh') + ?.nextSibling as HTMLButtonElement; + if (civitaiImg2ImgButton) { + civitaiImg2ImgButton.onclick = civitaiHelperFix; + } - return ( - <> - - {extraLoading && } -
-
-
-
- - - setSize(setting.extraNetworkCardSize)} - size={{ blockSize: 24, fontSize: 16 }} - /> - - - - ); + civitaiHelperFix(); + consola.success('🤯 [extranetwork] force reload'); + } catch (error) { + consola.error('🤯 [extranetwork] force reload', error); + } + }, 2000); + + return ( + <> + + {extraLoading && } +
+
+
+
+ + + setSize(setting.extraNetworkCardSize)} + size={{ blockSize: 24, fontSize: 16 }} + /> + + + + ); }); export default Inner; diff --git a/src/features/ExtraNetworkSidebar/index.tsx b/src/features/ExtraNetworkSidebar/index.tsx index ca831d3..2bef085 100644 --- a/src/features/ExtraNetworkSidebar/index.tsx +++ b/src/features/ExtraNetworkSidebar/index.tsx @@ -1,8 +1,8 @@ import { - DraggablePanel, - DraggablePanelContainer, - DraggablePanelHeader, - LayoutSidebarInner, + DraggablePanel, + DraggablePanelContainer, + DraggablePanelHeader, + LayoutSidebarInner, } from '@lobehub/ui'; import { useResponsive } from 'antd-style'; import isEqual from 'fast-deep-equal'; @@ -20,50 +20,50 @@ export interface ExtraNetworkSidebarProps extends DivProps { } const ExtraNetworkSidebar = memo(({ headerHeight }) => { - const { mobile } = useResponsive(); - const setting = useAppStore(selectors.currentSetting, isEqual); - const [expand, setExpand] = useState(mobile ? false : setting.extraNetworkSidebarExpand); - const [pin, setPin] = useState(setting.extraNetworkFixedMode === 'fixed'); - const { styles, theme } = useStyles({ headerHeight }); - const { t } = useTranslation(); + const { mobile } = useResponsive(); + const setting = useAppStore(selectors.currentSetting, isEqual); + const [expand, setExpand] = useState(mobile ? false : setting.extraNetworkSidebarExpand); + const [pin, setPin] = useState(setting.extraNetworkFixedMode === 'fixed'); + const { styles, theme } = useStyles({ headerHeight }); + const { t } = useTranslation(); - useEffect(() => { - if (mobile) setExpand(false); - }, [mobile]); + useEffect(() => { + if (mobile) setExpand(false); + }, [mobile]); - const mode = mobile ? 'fixed' : pin ? 'fixed' : 'float'; + const mode = mobile ? 'fixed' : pin ? 'fixed' : 'float'; - return ( - - - - - - - - - ); + placement="right" + > + + + + + + + + ); }); export default ExtraNetworkSidebar; diff --git a/src/features/ExtraNetworkSidebar/style.ts b/src/features/ExtraNetworkSidebar/style.ts index 26da579..fd5828b 100644 --- a/src/features/ExtraNetworkSidebar/style.ts +++ b/src/features/ExtraNetworkSidebar/style.ts @@ -1,8 +1,8 @@ import { createStyles } from 'antd-style'; export const useStyles = createStyles( - ({ css, token }, { headerHeight = 64, size = 86 }: { headerHeight?: number; size?: number }) => ({ - body: css` + ({ css, token }, { headerHeight = 64, size = 86 }: { headerHeight?: number; size?: number }) => ({ + body: css` .hide { display: none; } @@ -222,8 +222,8 @@ export const useStyles = createStyles( font-family: ${token.fontFamily}; } `, - container: css` + container: css` height: calc(100vh - ${headerHeight}px); `, - }), + }), ); diff --git a/src/features/Footer/data.tsx b/src/features/Footer/data.tsx index 1cb245c..a413393 100644 --- a/src/features/Footer/data.tsx +++ b/src/features/Footer/data.tsx @@ -4,91 +4,91 @@ import { Bug, FileClock, GitFork, Github } from 'lucide-react'; import { homepage } from '../../../package.json'; export const Resources = [ - { - description: 'AUTOMATIC111', - openExternal: true, - title: 'Stable Diffusion Webui', - url: 'https://github.com/AUTOMATIC1111/stable-diffusion-webui', - }, - { - description: 'WebUI extension', - openExternal: true, - title: 'Controlnet', - url: 'https://github.com/Mikubill/sd-webui-controlnet', - }, - { - description: 'Art models', - openExternal: true, - title: 'Civitai', - url: 'https://civitai.com/', - }, - { - description: 'Artist Inspired Styles', - openExternal: true, - title: 'Cheat Sheet', - url: 'https://supagruen.github.io/StableDiffusion-CheatSheet', - }, - { - description: 'Image Resizing', - openExternal: true, - title: 'Birme', - url: 'https://www.birme.net/?target_width=512&target_height=512', - }, + { + description: 'AUTOMATIC111', + openExternal: true, + title: 'Stable Diffusion Webui', + url: 'https://github.com/AUTOMATIC1111/stable-diffusion-webui', + }, + { + description: 'WebUI extension', + openExternal: true, + title: 'Controlnet', + url: 'https://github.com/Mikubill/sd-webui-controlnet', + }, + { + description: 'Art models', + openExternal: true, + title: 'Civitai', + url: 'https://civitai.com/', + }, + { + description: 'Artist Inspired Styles', + openExternal: true, + title: 'Cheat Sheet', + url: 'https://supagruen.github.io/StableDiffusion-CheatSheet', + }, + { + description: 'Image Resizing', + openExternal: true, + title: 'Birme', + url: 'https://www.birme.net/?target_width=512&target_height=512', + }, ]; export const Community = [ - { - icon: , - openExternal: true, - title: 'Report Bug', - url: `${homepage}/issues/new/choose`, - }, - { - icon: , - openExternal: true, - title: 'Request Feature', - url: `${homepage}/issues/new/choose`, - }, + { + icon: , + openExternal: true, + title: 'Report Bug', + url: `${homepage}/issues/new/choose`, + }, + { + icon: , + openExternal: true, + title: 'Request Feature', + url: `${homepage}/issues/new/choose`, + }, ]; export const Help = [ - { - icon: , - openExternal: true, - title: 'GitHub', - url: homepage, - }, - { - icon: , - openExternal: true, - title: 'Changelog', - url: `${homepage}/blob/main/CHANGELOG.md`, - }, + { + icon: , + openExternal: true, + title: 'GitHub', + url: homepage, + }, + { + icon: , + openExternal: true, + title: 'Changelog', + url: `${homepage}/blob/main/CHANGELOG.md`, + }, ]; export const MoreProducts = [ - { - description: 'Minifier ExtraNetwrok Covers', - openExternal: true, - title: '✂️ Cover Minifier', - url: 'https://github.com/canisminor1990/sd-webui-cover-minifier', - }, - { - description: 'OpenAI Chat Bot', - openExternal: true, - title: '🤖 Lobe Chat', - url: 'https://chat.lobehub.com', - }, - { - description: 'AIGC Components', - openExternal: true, - title: '🍭 Lobe UI', - url: 'https://ui.lobehub.com', - }, - { - description: 'AI Commit CLI', - openExternal: true, - title: '💌 Lobe Commit', - url: 'https://github.com/lobehub/lobe-commit', - }, + { + description: 'Minifier ExtraNetwrok Covers', + openExternal: true, + title: '✂️ Cover Minifier', + url: 'https://github.com/canisminor1990/sd-webui-cover-minifier', + }, + { + description: 'OpenAI Chat Bot', + openExternal: true, + title: '🤖 Lobe Chat', + url: 'https://chat.lobehub.com', + }, + { + description: 'AIGC Components', + openExternal: true, + title: '🍭 Lobe UI', + url: 'https://ui.lobehub.com', + }, + { + description: 'AI Commit CLI', + openExternal: true, + title: '💌 Lobe Commit', + url: 'https://github.com/lobehub/lobe-commit', + }, ]; diff --git a/src/features/Footer/index.tsx b/src/features/Footer/index.tsx index 34e69e6..c543aec 100644 --- a/src/features/Footer/index.tsx +++ b/src/features/Footer/index.tsx @@ -1,4 +1,5 @@ import { Footer as F } from '@lobehub/ui'; +import { consola } from 'consola'; import isEqual from 'fast-deep-equal'; import { memo, useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; @@ -10,54 +11,57 @@ import { Community, Help, MoreProducts, Resources } from './data'; import { useStyles } from './style'; const Footer = memo(({ className, ...props }) => { - const setting = useAppStore(selectors.currentSetting, isEqual); - const { cx, styles } = useStyles(); - const { t } = useTranslation(); - const footerReference = useRef(null); + const setting = useAppStore(selectors.currentSetting, isEqual); + const { cx, styles } = useStyles(); + const { t } = useTranslation(); + const footerReference = useRef(null); - useEffect(() => { - console.time('🤯 [layout] inject - Footer'); - const footer = gradioApp().querySelector('#footer'); - if (footer) footerReference.current?.append(footer); - if (setting.confirmPageUnload) { - window.addEventListener('beforeunload', (event) => { - if (footer?.isConnected) { - event.preventDefault(); - return (event.returnValue = ''); + useEffect(() => { + try { + const footer = gradioApp().querySelector('#footer'); + if (footer) footerReference.current?.append(footer); + if (setting.confirmPageUnload) { + window.addEventListener('beforeunload', (event) => { + if (footer?.isConnected) { + event.preventDefault(); + return (event.returnValue = ''); + } + }); + } + consola.success('🤯 [layout] inject - Footer'); + } catch (error) { + consola.error('🤯 [layout] inject - Footer', error); } - }); - } - console.timeEnd('🤯 [layout] inject - Footer'); - }, []); - return ( -
- } - columns={ - setting.layoutHideFooter ? - [] : - [ - { - items: Resources, - title: t('resources'), - }, - { - items: Community, - title: t('community'), - }, - { - items: Help, - title: t('help'), - }, - { - items: MoreProducts, - title: t('moreProducts'), - }, - ] - } - /> -
- ); + }, []); + return ( +
+ } + columns={ + setting.layoutHideFooter ? + [] : + [ + { + items: Resources, + title: t('footer.resources'), + }, + { + items: Community, + title: t('footer.community'), + }, + { + items: Help, + title: t('footer.help'), + }, + { + items: MoreProducts, + title: t('footer.moreProducts'), + }, + ] + } + /> +
+ ); }); export default Footer; diff --git a/src/features/Footer/style.ts b/src/features/Footer/style.ts index ad8a24f..4e41932 100644 --- a/src/features/Footer/style.ts +++ b/src/features/Footer/style.ts @@ -1,7 +1,7 @@ import { createStyles } from 'antd-style'; export const useStyles = createStyles(({ css }) => ({ - footer: css` + footer: css` footer { display: block !important; } diff --git a/src/features/Header/Actions.tsx b/src/features/Header/Actions.tsx index ca7c6dc..0e1ebdd 100644 --- a/src/features/Header/Actions.tsx +++ b/src/features/Header/Actions.tsx @@ -5,16 +5,15 @@ import { Github, LayoutGrid, LucideIcon, Moon, Settings, Sun } from 'lucide-reac import qs from 'query-string'; import { memo, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { shallow } from 'zustand/shallow'; import { Giscus } from '@/components'; import Setting from '@/features/Setting'; import { selectors, useAppStore } from '@/store'; const CivitaiLogo: LucideIcon | any = ({ size }: any) => ( - - - + + + ); interface ActionsProps { @@ -22,48 +21,56 @@ interface ActionsProps { } const Actions = memo(() => { - const [isSettingOpen, setIsSettingOpen] = useState(false); - const [isModalOpen, setIsModalOpen] = useState(false); - const themeMode = useAppStore(selectors.themeMode, shallow); - const { mobile } = useResponsive(); - const { t } = useTranslation(); + const [isSettingOpen, setIsSettingOpen] = useState(false); + const [isModalOpen, setIsModalOpen] = useState(false); + const themeMode = useAppStore(selectors.themeMode); + const { mobile } = useResponsive(); + const { t } = useTranslation(); - const handleSetTheme = useCallback(() => { - const theme = themeMode === 'light' ? 'dark' : 'light'; - const gradioURL = qs.parseUrl(window.location.href); - gradioURL.query.__theme = theme; - window.location.replace(qs.stringifyUrl(gradioURL)); - }, [themeMode]); + const handleSetTheme = useCallback(() => { + const theme = themeMode === 'light' ? 'dark' : 'light'; + const gradioURL = qs.parseUrl(window.location.href); + gradioURL.query.__theme = theme; + window.location.replace(qs.stringifyUrl(gradioURL)); + }, [themeMode]); - return ( - <> - - {!mobile && ( - <> - - - - - - - setIsModalOpen(true)} title={t('feedback')} /> - - )} - - setIsSettingOpen(true)} title={t('setting')} /> - - setIsSettingOpen(false)} open={isSettingOpen} /> - setIsModalOpen(false)} open={isModalOpen} /> - - ); + return ( + <> + + {!mobile && ( + <> + + + + + + + setIsModalOpen(true)} + title={t('header.feedback')} + /> + + )} + + setIsSettingOpen(true)} + title={t('header.setting')} + /> + + setIsSettingOpen(false)} open={isSettingOpen} /> + setIsModalOpen(false)} open={isModalOpen} /> + + ); }); export default Actions; diff --git a/src/features/Header/Nav.tsx b/src/features/Header/Nav.tsx index f8cabcb..d873a46 100644 --- a/src/features/Header/Nav.tsx +++ b/src/features/Header/Nav.tsx @@ -1,26 +1,26 @@ import { Burger, TabsNav, type TabsNavProps } from '@lobehub/ui'; import { useResponsive } from 'antd-style'; +import { consola } from 'consola'; import { startCase } from 'lodash-es'; import { memo, useCallback, useEffect, useMemo, useState } from 'react'; -import { shallow } from 'zustand/shallow'; import { selectors, useAppStore } from '@/store'; const hideOriganlNav = () => { - (gradioApp().querySelector('#tabs > .tab-nav:first-of-type') as HTMLDivElement).style.display = + (gradioApp().querySelector('#tabs > .tab-nav:first-of-type') as HTMLDivElement).style.display = 'none'; }; const getNavTabs = (): HTMLDivElement[] => - Array.prototype.slice.call( + Array.prototype.slice.call( gradioApp().querySelectorAll('#tabs > [id^="tab_"]') as NodeListOf, - ); + ); const getNavButtons = (): HTMLButtonElement[] => - Array.prototype.slice.call( + Array.prototype.slice.call( gradioApp().querySelectorAll( - '#tabs > .tab-nav:first-of-type button', + '#tabs > .tab-nav:first-of-type button', ) as NodeListOf, - ); + ); interface NavItem { id: string; @@ -28,53 +28,56 @@ interface NavItem { label: string; } const genNavList = (): NavItem[] => { - console.debug('🤯 [nav] generate nav list'); - const navList = getNavTabs(); - const buttons = getNavButtons(); - return buttons.map((button, index) => { - const id = navList[index].id; - return { - id, - index, - label: startCase(String(button.textContent)), - }; - }); + const navList = getNavTabs(); + const buttons = getNavButtons(); + consola.debug('🤯 [nav] generate nav list'); + return buttons.map((button, index) => { + const id = navList[index].id; + return { + id, + index, + label: startCase(String(button.textContent)), + }; + }); }; const Nav = memo(() => { - const currentTab = useAppStore(selectors.currentTab, shallow); - const { mobile } = useResponsive(); - const [opened, setOpened] = useState(false); - const [items, setItems] = useState([]); + const currentTab = useAppStore(selectors.currentTab); + const { mobile } = useResponsive(); + const [opened, setOpened] = useState(false); + const [items, setItems] = useState([]); - const navList = useMemo(() => genNavList(), []); + const navList = useMemo(() => genNavList(), []); - const onChange: TabsNavProps['onChange'] = useCallback( - (id: string) => { - console.debug('🤯 [nav] onClick', id); - const index = navList.find((nav) => nav.id === id)?.index || 0; - const buttonList = getNavButtons(); - buttonList[index].click(); - }, - [navList], - ); + const onChange: TabsNavProps['onChange'] = useCallback( + (id: string) => { + consola.debug('🤯 [nav] onClick', id); + const index = navList.find((nav) => nav.id === id)?.index || 0; + const buttonList = getNavButtons(); + buttonList[index].click(); + }, + [navList], + ); - useEffect(() => { - console.time('🤯 [layout] inject - Header'); - hideOriganlNav(); - const list: TabsNavProps['items'] = navList.map((item) => { - return { - key: item.id, - label: mobile ?
onChange(item.id)}>{item.label}
: item.label, - }; - }); - setItems(list.filter(Boolean)); - console.timeEnd('🤯 [layout] inject - Header'); - }, [mobile]); + useEffect(() => { + try { + hideOriganlNav(); + const list: TabsNavProps['items'] = navList.map((item) => { + return { + key: item.id, + label: mobile ?
onChange(item.id)}>{item.label}
: item.label, + }; + }); + setItems(list.filter(Boolean)); + consola.success('🤯 [layout] inject - Header'); + } catch (error) { + consola.error('🤯 [layout] inject - Header', error); + } + }, [mobile]); - if (mobile) return ; + if (mobile) return ; - return ; + return ; }); export default Nav; diff --git a/src/features/Header/index.tsx b/src/features/Header/index.tsx index b44270c..2d5875b 100644 --- a/src/features/Header/index.tsx +++ b/src/features/Header/index.tsx @@ -12,36 +12,36 @@ import Actions from './Actions'; import Nav from './Nav'; const Header = memo(({ children }) => { - const { themeMode, version } = useAppStore( - (st) => ({ themeMode: st.themeMode, version: st.version }), - shallow, - ); - const theme = useTheme(); + const { themeMode, version } = useAppStore( + (st) => ({ themeMode: st.themeMode, version: st.version }), + shallow, + ); + const theme = useTheme(); - return ( - } - actionsStyle={{ flex: 0 }} - logo={ - - - - - - } - nav={ - <> -