feat(ui): improve discoverability of hidden interactions

- Expand onboarding tour from 8 to 11 steps: marquee drag-select,
  drag card to sidebar folder, and the three context menus
  (card / bulk / global); enrich bulk-mode step with range-select
  and exit tips
- Add Replay Tutorial button to help modal Getting Started tab
- Add Shortcuts cheat-sheet tab to help modal, opened directly via
  the '?' key when not typing
- Fix trigger-word tooltip to mention double-click to edit
- Keep checkpoint/embedding send tooltips truthful (no replace mode)

Sync new i18n keys to all locales (placeholders pending translation)
This commit is contained in:
Will Miao
2026-09-03 18:16:00 +08:00
parent b309becdf9
commit 8260bd022d
16 changed files with 816 additions and 54 deletions
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "Kontextmenü", "title": "Kontextmenü",
"content": "<strong>Rechtsklick</strong> auf eine Modellkarte öffnet ein Kontextmenü mit weiteren Aktionen." "content": "<strong>Rechtsklick</strong> auf eine Modellkarte öffnet ein Kontextmenü mit weiteren Aktionen."
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "Tippen zum Hinzufügen oder klicken Sie auf Vorschläge unten", "addPlaceholder": "Tippen zum Hinzufügen oder klicken Sie auf Vorschläge unten",
"editWord": "Trigger Word bearbeiten", "editWord": "Trigger Word bearbeiten",
"editPlaceholder": "Trigger Word bearbeiten", "editPlaceholder": "Trigger Word bearbeiten",
"copyWord": "Trigger Word kopieren", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "Trigger Word löschen", "deleteWord": "Trigger Word löschen",
"suggestions": { "suggestions": {
"noSuggestions": "Keine Vorschläge verfügbar", "noSuggestions": "Keine Vorschläge verfügbar",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "Erste Schritte", "gettingStarted": "Erste Schritte",
"updateVlogs": "Update-Vlogs", "updateVlogs": "Update-Vlogs",
"documentation": "Dokumentation" "documentation": "Dokumentation",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "Erste Schritte mit LoRA Manager" "title": "Erste Schritte mit LoRA Manager",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "Neueste Updates", "title": "Neueste Updates",
+55 -5
View File
@@ -96,7 +96,7 @@
}, },
"bulk": { "bulk": {
"title": "Bulk Operations", "title": "Bulk Operations",
"content": "Enter bulk mode by clicking this button or pressing <span class=\"onboarding-shortcut\">B</span>. Select multiple models and perform batch operations. Use <span class=\"onboarding-shortcut\">Ctrl+A</span> to select all visible models." "content": "Enter bulk mode by clicking this button or pressing <span class=\"onboarding-shortcut\">B</span> to select multiple models and perform batch operations.<br>• <span class=\"onboarding-shortcut\">Ctrl/Cmd+A</span> select all visible models, <span class=\"onboarding-shortcut\">Shift+Click</span> select a range.<br>• <span class=\"onboarding-shortcut\">Esc</span> or clicking an empty area exits bulk mode."
}, },
"searchOptions": { "searchOptions": {
"title": "Search Options", "title": "Search Options",
@@ -116,7 +116,19 @@
}, },
"contextMenu": { "contextMenu": {
"title": "Context Menu", "title": "Context Menu",
"content": "<strong>Right-click</strong> any model card for a context menu with additional actions." "content": "<strong>Right-click</strong> any model card for a context menu with card actions like moving, deleting, or editing metadata."
},
"marqueeSelect": {
"title": "Drag to Select",
"content": "Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "Organize by Dragging",
"content": "Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "More Context Menus",
"content": "In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "Type to add or click suggestions below", "addPlaceholder": "Type to add or click suggestions below",
"editWord": "Edit trigger word", "editWord": "Edit trigger word",
"editPlaceholder": "Edit trigger word", "editPlaceholder": "Edit trigger word",
"copyWord": "Copy trigger word", "copyOrEditWord": "Click to copy, double-click to edit",
"deleteWord": "Delete trigger word", "deleteWord": "Delete trigger word",
"suggestions": { "suggestions": {
"noSuggestions": "No suggestions available", "noSuggestions": "No suggestions available",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "Getting Started", "gettingStarted": "Getting Started",
"updateVlogs": "Update Vlogs", "updateVlogs": "Update Vlogs",
"documentation": "Documentation" "documentation": "Documentation",
"shortcuts": "Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "Getting Started with LoRA Manager" "title": "Getting Started with LoRA Manager",
"replayTutorial": "Replay Tutorial"
},
"shortcuts": {
"title": "Keyboard & Mouse Shortcuts",
"groups": {
"general": "General",
"selection": "Selection & Bulk Mode",
"navigation": "Navigation",
"modelModal": "Model / Recipe Modal",
"mediaViewer": "Media Viewer / Showcase"
},
"keys": {
"click": "Click",
"drag": "Drag",
"rightClick": "Right-click",
"letter": "Letter",
"swipe": "Swipe"
},
"entries": {
"focusSearch": "Focus search",
"closeModal": "Close modal / panel",
"openShortcuts": "Open this shortcuts panel",
"toggleBulkMode": "Toggle bulk mode",
"selectAll": "Select all visible models",
"rangeSelect": "Range select",
"marqueeSelect": "Marquee-select cards (on empty grid area)",
"exitBulkMode": "Exit bulk mode",
"bulkActions": "On selected card: bulk actions menu",
"globalActions": "On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "Scroll pages",
"jumpAlphabet": "Jump alphabet bar",
"prevNext": "Previous / next model",
"deleteEntry": "Delete",
"cycleMedia": "Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "Cycle media on touch devices",
"closeViewer": "Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "Latest Updates", "title": "Latest Updates",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "Menú contextual", "title": "Menú contextual",
"content": "<strong>Clic derecho</strong> en cualquier tarjeta de modelo para ver un menú contextual con acciones adicionales." "content": "<strong>Clic derecho</strong> en cualquier tarjeta de modelo para ver un menú contextual con acciones adicionales."
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "Escribe para añadir o haz clic en sugerencias de abajo", "addPlaceholder": "Escribe para añadir o haz clic en sugerencias de abajo",
"editWord": "Editar palabra de activación", "editWord": "Editar palabra de activación",
"editPlaceholder": "Editar palabra de activación", "editPlaceholder": "Editar palabra de activación",
"copyWord": "Copiar palabra de activación", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "Eliminar palabra de activación", "deleteWord": "Eliminar palabra de activación",
"suggestions": { "suggestions": {
"noSuggestions": "No hay sugerencias disponibles", "noSuggestions": "No hay sugerencias disponibles",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "Comenzando", "gettingStarted": "Comenzando",
"updateVlogs": "Vlogs de actualización", "updateVlogs": "Vlogs de actualización",
"documentation": "Documentación" "documentation": "Documentación",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "Comenzando con el gestor de LoRA" "title": "Comenzando con el gestor de LoRA",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "Últimas actualizaciones", "title": "Últimas actualizaciones",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "Menu contextuel", "title": "Menu contextuel",
"content": "<strong>Clic droit</strong> sur une carte de modèle pour accéder à un menu contextuel avec des actions supplémentaires." "content": "<strong>Clic droit</strong> sur une carte de modèle pour accéder à un menu contextuel avec des actions supplémentaires."
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "Tapez pour ajouter ou cliquez sur les suggestions ci-dessous", "addPlaceholder": "Tapez pour ajouter ou cliquez sur les suggestions ci-dessous",
"editWord": "Modifier le mot-clé", "editWord": "Modifier le mot-clé",
"editPlaceholder": "Modifier le mot-clé", "editPlaceholder": "Modifier le mot-clé",
"copyWord": "Copier le mot-clé", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "Supprimer le mot-clé", "deleteWord": "Supprimer le mot-clé",
"suggestions": { "suggestions": {
"noSuggestions": "Aucune suggestion disponible", "noSuggestions": "Aucune suggestion disponible",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "Commencer", "gettingStarted": "Commencer",
"updateVlogs": "Vlogs de mise à jour", "updateVlogs": "Vlogs de mise à jour",
"documentation": "Documentation" "documentation": "Documentation",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "Premiers pas avec le Gestionnaire LoRA" "title": "Premiers pas avec le Gestionnaire LoRA",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "Dernières mises à jour", "title": "Dernières mises à jour",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "תפריט הקשר", "title": "תפריט הקשר",
"content": "<strong>לחיצה ימנית</strong> על כל כרטיס מודל לתפריט הקשר עם פעולות נוספות." "content": "<strong>לחיצה ימנית</strong> על כל כרטיס מודל לתפריט הקשר עם פעולות נוספות."
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "הקלד להוספה או לחץ על הצעות למטה", "addPlaceholder": "הקלד להוספה או לחץ על הצעות למטה",
"editWord": "עריכת מילת טריגר", "editWord": "עריכת מילת טריגר",
"editPlaceholder": "עריכת מילת טריגר", "editPlaceholder": "עריכת מילת טריגר",
"copyWord": "העתק מילת טריגר", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "מחק מילת טריגר", "deleteWord": "מחק מילת טריגר",
"suggestions": { "suggestions": {
"noSuggestions": "אין הצעות זמינות", "noSuggestions": "אין הצעות זמינות",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "תחילת עבודה", "gettingStarted": "תחילת עבודה",
"updateVlogs": "בלוגי וידאו של עדכונים", "updateVlogs": "בלוגי וידאו של עדכונים",
"documentation": "תיעוד" "documentation": "תיעוד",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "תחילת עבודה עם מנהל LoRA" "title": "תחילת עבודה עם מנהל LoRA",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "עדכונים אחרונים", "title": "עדכונים אחרונים",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "コンテキストメニュー", "title": "コンテキストメニュー",
"content": "<strong>モデルカードを右クリック</strong>すると追加の操作ができるコンテキストメニューが表示されます。" "content": "<strong>モデルカードを右クリック</strong>すると追加の操作ができるコンテキストメニューが表示されます。"
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "入力して追加するか、下の提案をクリック", "addPlaceholder": "入力して追加するか、下の提案をクリック",
"editWord": "トリガーワードを編集", "editWord": "トリガーワードを編集",
"editPlaceholder": "トリガーワードを編集", "editPlaceholder": "トリガーワードを編集",
"copyWord": "トリガーワードをコピー", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "トリガーワードを削除", "deleteWord": "トリガーワードを削除",
"suggestions": { "suggestions": {
"noSuggestions": "提案はありません", "noSuggestions": "提案はありません",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "はじめに", "gettingStarted": "はじめに",
"updateVlogs": "更新Vlog", "updateVlogs": "更新Vlog",
"documentation": "ドキュメント" "documentation": "ドキュメント",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "LoRA Managerを始める" "title": "LoRA Managerを始める",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "最新の更新", "title": "最新の更新",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "컨텍스트 메뉴", "title": "컨텍스트 메뉴",
"content": "<strong>오른쪽 클릭</strong>으로 모델 카드의 추가 작업 메뉴를 사용할 수 있습니다." "content": "<strong>오른쪽 클릭</strong>으로 모델 카드의 추가 작업 메뉴를 사용할 수 있습니다."
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "입력하거나 아래 제안을 클릭하세요", "addPlaceholder": "입력하거나 아래 제안을 클릭하세요",
"editWord": "트리거 단어 편집", "editWord": "트리거 단어 편집",
"editPlaceholder": "트리거 단어 편집", "editPlaceholder": "트리거 단어 편집",
"copyWord": "트리거 단어 복사", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "트리거 단어 삭제", "deleteWord": "트리거 단어 삭제",
"suggestions": { "suggestions": {
"noSuggestions": "사용 가능한 제안이 없습니다", "noSuggestions": "사용 가능한 제안이 없습니다",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "시작하기", "gettingStarted": "시작하기",
"updateVlogs": "업데이트 영상", "updateVlogs": "업데이트 영상",
"documentation": "문서" "documentation": "문서",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "LoRA Manager 시작하기" "title": "LoRA Manager 시작하기",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "최신 업데이트", "title": "최신 업데이트",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "Контекстное меню", "title": "Контекстное меню",
"content": "<strong>Правый клик</strong> по карточке модели откроет контекстное меню с дополнительными действиями." "content": "<strong>Правый клик</strong> по карточке модели откроет контекстное меню с дополнительными действиями."
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "Введите для добавления или нажмите на предложения ниже", "addPlaceholder": "Введите для добавления или нажмите на предложения ниже",
"editWord": "Редактировать триггерное слово", "editWord": "Редактировать триггерное слово",
"editPlaceholder": "Редактировать триггерное слово", "editPlaceholder": "Редактировать триггерное слово",
"copyWord": "Копировать триггерное слово", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "Удалить триггерное слово", "deleteWord": "Удалить триггерное слово",
"suggestions": { "suggestions": {
"noSuggestions": "Предложения недоступны", "noSuggestions": "Предложения недоступны",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "Начало работы", "gettingStarted": "Начало работы",
"updateVlogs": "Видео обновлений", "updateVlogs": "Видео обновлений",
"documentation": "Документация" "documentation": "Документация",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "Начало работы с LoRA Manager" "title": "Начало работы с LoRA Manager",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "Последние обновления", "title": "Последние обновления",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "右键菜单", "title": "右键菜单",
"content": "<strong>右键点击</strong>任意模型卡片可打开更多操作菜单。" "content": "<strong>右键点击</strong>任意模型卡片可打开更多操作菜单。"
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "输入或点击下方建议添加", "addPlaceholder": "输入或点击下方建议添加",
"editWord": "编辑触发词", "editWord": "编辑触发词",
"editPlaceholder": "编辑触发词", "editPlaceholder": "编辑触发词",
"copyWord": "复制触发词", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "删除触发词", "deleteWord": "删除触发词",
"suggestions": { "suggestions": {
"noSuggestions": "暂无建议", "noSuggestions": "暂无建议",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "新手入门", "gettingStarted": "新手入门",
"updateVlogs": "更新日志", "updateVlogs": "更新日志",
"documentation": "文档" "documentation": "文档",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "LoRA 管理器新手入门" "title": "LoRA 管理器新手入门",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "最新更新", "title": "最新更新",
+53 -3
View File
@@ -117,6 +117,18 @@
"contextMenu": { "contextMenu": {
"title": "右鍵選單", "title": "右鍵選單",
"content": "<strong>右鍵點擊</strong>任一模型卡片可開啟更多操作選單。" "content": "<strong>右鍵點擊</strong>任一模型卡片可開啟更多操作選單。"
},
"marqueeSelect": {
"title": "[TODO: Translate] Drag to Select",
"content": "[TODO: Translate] Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once."
},
"dragToSidebar": {
"title": "[TODO: Translate] Organize by Dragging",
"content": "[TODO: Translate] Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode."
},
"contextMenus": {
"title": "[TODO: Translate] More Context Menus",
"content": "[TODO: Translate] In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models."
} }
} }
}, },
@@ -1629,7 +1641,7 @@
"addPlaceholder": "輸入或點擊下方建議", "addPlaceholder": "輸入或點擊下方建議",
"editWord": "編輯觸發詞", "editWord": "編輯觸發詞",
"editPlaceholder": "編輯觸發詞", "editPlaceholder": "編輯觸發詞",
"copyWord": "複製觸發詞", "copyOrEditWord": "[TODO: Translate] Click to copy, double-click to edit",
"deleteWord": "刪除觸發詞", "deleteWord": "刪除觸發詞",
"suggestions": { "suggestions": {
"noSuggestions": "無可用建議", "noSuggestions": "無可用建議",
@@ -1954,10 +1966,48 @@
"tabs": { "tabs": {
"gettingStarted": "快速開始", "gettingStarted": "快速開始",
"updateVlogs": "更新影片", "updateVlogs": "更新影片",
"documentation": "文件" "documentation": "文件",
"shortcuts": "[TODO: Translate] Shortcuts"
}, },
"gettingStarted": { "gettingStarted": {
"title": "LoRA 管理器快速開始" "title": "LoRA 管理器快速開始",
"replayTutorial": "[TODO: Translate] Replay Tutorial"
},
"shortcuts": {
"title": "[TODO: Translate] Keyboard & Mouse Shortcuts",
"groups": {
"general": "[TODO: Translate] General",
"selection": "[TODO: Translate] Selection & Bulk Mode",
"navigation": "[TODO: Translate] Navigation",
"modelModal": "[TODO: Translate] Model / Recipe Modal",
"mediaViewer": "[TODO: Translate] Media Viewer / Showcase"
},
"keys": {
"click": "[TODO: Translate] Click",
"drag": "[TODO: Translate] Drag",
"rightClick": "[TODO: Translate] Right-click",
"letter": "[TODO: Translate] Letter",
"swipe": "[TODO: Translate] Swipe"
},
"entries": {
"focusSearch": "[TODO: Translate] Focus search",
"closeModal": "[TODO: Translate] Close modal / panel",
"openShortcuts": "[TODO: Translate] Open this shortcuts panel",
"toggleBulkMode": "[TODO: Translate] Toggle bulk mode",
"selectAll": "[TODO: Translate] Select all visible models",
"rangeSelect": "[TODO: Translate] Range select",
"marqueeSelect": "[TODO: Translate] Marquee-select cards (on empty grid area)",
"exitBulkMode": "[TODO: Translate] Exit bulk mode",
"bulkActions": "[TODO: Translate] On selected card: bulk actions menu",
"globalActions": "[TODO: Translate] On empty page area: global actions menu (update check, manage excluded models)",
"scrollPages": "[TODO: Translate] Scroll pages",
"jumpAlphabet": "[TODO: Translate] Jump alphabet bar",
"prevNext": "[TODO: Translate] Previous / next model",
"deleteEntry": "[TODO: Translate] Delete",
"cycleMedia": "[TODO: Translate] Cycle media ([ / ] in showcase gallery)",
"swipeTouch": "[TODO: Translate] Cycle media on touch devices",
"closeViewer": "[TODO: Translate] Close viewer"
}
}, },
"updateVlogs": { "updateVlogs": {
"title": "最新更新", "title": "最新更新",
@@ -305,3 +305,86 @@
[data-theme="dark"] .video-container { [data-theme="dark"] .video-container {
background-color: var(--surface-hover); background-color: var(--surface-hover);
} }
/* Replay tutorial button styles */
.help-actions {
margin-top: var(--space-3);
}
.replay-tutorial-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 10px 20px;
border-radius: var(--border-radius-sm);
font-weight: 500;
cursor: pointer;
transition: var(--transition-base);
background-color: var(--lora-accent);
color: white;
border: none;
}
.replay-tutorial-btn:hover {
background-color: oklch(from var(--lora-accent) l c h / 85%);
}
/* Shortcuts tab styles */
.shortcuts-section {
margin-bottom: var(--space-3);
}
.shortcuts-section h4 {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: var(--space-1);
}
.shortcuts-list {
list-style-type: none;
padding-left: var(--space-3);
}
.shortcuts-list li {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: var(--space-1);
}
.shortcut-keys {
display: inline-flex;
align-items: center;
gap: 2px;
flex-shrink: 0;
min-width: 150px;
}
.shortcut-sep {
color: var(--text-muted);
font-size: 0.75rem;
margin: 0 1px;
}
.shortcuts-list kbd {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 18px;
height: 18px;
padding: 0 4px;
font-family: inherit;
font-size: 0.68rem;
font-weight: 500;
color: var(--text-muted);
/* Subtle tint derived from text color so it adapts to both light & dark themes */
background: color-mix(in oklch, var(--text-muted) 12%, transparent);
border: 1px solid color-mix(in oklch, var(--text-muted) 25%, transparent);
border-radius: var(--border-radius-xs, 3px);
line-height: 1;
}
.shortcut-description {
font-size: 0.9em;
opacity: 0.85;
}
+2
View File
@@ -607,9 +607,11 @@ export function createModelCard(model, modelType) {
sendTitle = translate('modelCard.actions.sendToWorkflow', {}, 'Send to ComfyUI (Click: Append, Shift+Click: Replace)'); sendTitle = translate('modelCard.actions.sendToWorkflow', {}, 'Send to ComfyUI (Click: Append, Shift+Click: Replace)');
copyTitle = translate('modelCard.actions.copyLoRASyntax', {}, 'Copy LoRA Syntax'); copyTitle = translate('modelCard.actions.copyLoRASyntax', {}, 'Copy LoRA Syntax');
} else if (modelType === MODEL_TYPES.CHECKPOINT) { } else if (modelType === MODEL_TYPES.CHECKPOINT) {
// Checkpoint send sets the widget value directly; no append/replace modes.
sendTitle = translate('modelCard.actions.sendCheckpointToWorkflow', {}, 'Send to ComfyUI'); sendTitle = translate('modelCard.actions.sendCheckpointToWorkflow', {}, 'Send to ComfyUI');
copyTitle = translate('modelCard.actions.copyCheckpointName', {}, 'Copy checkpoint name'); copyTitle = translate('modelCard.actions.copyCheckpointName', {}, 'Copy checkpoint name');
} else if (modelType === MODEL_TYPES.EMBEDDING) { } else if (modelType === MODEL_TYPES.EMBEDDING) {
// Embedding send always appends to the prompt; no replace mode.
sendTitle = translate('modelCard.actions.sendEmbeddingToWorkflow', {}, 'Send to ComfyUI'); sendTitle = translate('modelCard.actions.sendEmbeddingToWorkflow', {}, 'Send to ComfyUI');
copyTitle = translate('modelCard.actions.copyEmbeddingName', {}, 'Copy embedding name'); copyTitle = translate('modelCard.actions.copyEmbeddingName', {}, 'Copy embedding name');
} else { } else {
+4 -4
View File
@@ -227,7 +227,7 @@ export function renderTriggerWords(words, filePath) {
const escapedWord = escapeHtml(word); const escapedWord = escapeHtml(word);
const escapedAttr = escapeAttribute(word); const escapedAttr = escapeAttribute(word);
return ` return `
<div class="trigger-word-tag" data-word="${escapedAttr}" title="${translate('modals.model.triggerWords.copyWord')}"> <div class="trigger-word-tag" data-word="${escapedAttr}" title="${translate('modals.model.triggerWords.copyOrEditWord')}">
<span class="trigger-word-content">${escapedWord}</span> <span class="trigger-word-content">${escapedWord}</span>
<span class="trigger-word-copy"> <span class="trigger-word-copy">
<i class="fas fa-copy"></i> <i class="fas fa-copy"></i>
@@ -455,7 +455,7 @@ function resetTriggerWordsUIState(section) {
// Restore click-to-copy functionality // Restore click-to-copy functionality
tag.removeEventListener('click', startEditTriggerWord); tag.removeEventListener('click', startEditTriggerWord);
setupDisplayTriggerWordTag(tag); setupDisplayTriggerWordTag(tag);
tag.title = translate('modals.model.triggerWords.copyWord'); tag.title = translate('modals.model.triggerWords.copyOrEditWord');
// Show copy icon, hide delete button // Show copy icon, hide delete button
if (copyIcon) copyIcon.style.display = ''; if (copyIcon) copyIcon.style.display = '';
@@ -503,7 +503,7 @@ function createTriggerWordTag(word, isEditMode = false) {
const tag = document.createElement('div'); const tag = document.createElement('div');
tag.className = 'trigger-word-tag'; tag.className = 'trigger-word-tag';
tag.dataset.word = word; tag.dataset.word = word;
tag.title = translate(isEditMode ? 'modals.model.triggerWords.editWord' : 'modals.model.triggerWords.copyWord'); tag.title = translate(isEditMode ? 'modals.model.triggerWords.editWord' : 'modals.model.triggerWords.copyOrEditWord');
const escapedWord = escapeHtml(word); const escapedWord = escapeHtml(word);
tag.innerHTML = ` tag.innerHTML = `
@@ -537,7 +537,7 @@ function setupDisplayTriggerWordTag(tag) {
tag.addEventListener('click', handleDisplayTriggerWordClick); tag.addEventListener('click', handleDisplayTriggerWordClick);
tag.addEventListener('dblclick', handleDisplayTriggerWordDoubleClick); tag.addEventListener('dblclick', handleDisplayTriggerWordDoubleClick);
tag.title = translate('modals.model.triggerWords.copyWord'); tag.title = translate('modals.model.triggerWords.copyOrEditWord');
} }
/** /**
+57 -9
View File
@@ -1,4 +1,5 @@
import { getStorageItem, setStorageItem } from '../utils/storageHelpers.js'; import { getStorageItem, setStorageItem } from '../utils/storageHelpers.js';
import { onboardingManager } from './OnboardingManager.js';
/** /**
* Manages help modal functionality and tutorial update notifications * Manages help modal functionality and tutorial update notifications
@@ -55,6 +56,53 @@ export class HelpManager {
const tabButtons = document.querySelectorAll('.help-tabs .tab-btn'); const tabButtons = document.querySelectorAll('.help-tabs .tab-btn');
tabButtons.forEach(button => { tabButtons.forEach(button => {
button.addEventListener('click', (event) => { button.addEventListener('click', (event) => {
this.activateHelpTab(event.currentTarget.getAttribute('data-tab'));
});
});
// Replay tutorial button in the Getting Started tab
const replayTutorialBtn = document.getElementById('replayTutorialBtn');
if (replayTutorialBtn) {
replayTutorialBtn.addEventListener('click', () => {
// Close the help modal, then restart the onboarding tutorial
if (window.modalManager) {
window.modalManager.closeModal('helpModal');
}
onboardingManager.reset();
onboardingManager.startTutorial();
});
}
// Global "?" shortcut opens the help modal on the Shortcuts tab
document.addEventListener('keydown', (event) => {
if (event.key !== '?') return;
if (this.isTypingContext(event.target)) return;
if (window.modalManager?.isAnyModalOpen()) return;
event.preventDefault();
this.openHelpModal('shortcuts');
});
}
/**
* Check if the event target is a text entry context where "?" is literal input
*/
isTypingContext(target) {
if (!(target instanceof Element)) return false;
const tagName = target.tagName?.toLowerCase();
return target.isContentEditable || tagName === 'input' || tagName === 'textarea' || tagName === 'select';
}
/**
* Activate a specific help modal tab by its data-tab id
* @param {string} tabId - The tab id (matches data-tab and pane element id)
*/
activateHelpTab(tabId) {
const tabButton = document.querySelector(`.help-tabs .tab-btn[data-tab="${tabId}"]`);
const tabPane = document.getElementById(tabId);
if (!tabButton || !tabPane) return;
// Remove active class from all buttons and panes // Remove active class from all buttons and panes
document.querySelectorAll('.help-tabs .tab-btn').forEach(btn => { document.querySelectorAll('.help-tabs .tab-btn').forEach(btn => {
btn.classList.remove('active'); btn.classList.remove('active');
@@ -63,24 +111,24 @@ export class HelpManager {
pane.classList.remove('active'); pane.classList.remove('active');
}); });
// Add active class to clicked button // Activate the requested tab
event.currentTarget.classList.add('active'); tabButton.classList.add('active');
tabPane.classList.add('active');
// Show corresponding tab content
const tabId = event.currentTarget.getAttribute('data-tab');
document.getElementById(tabId).classList.add('active');
});
});
} }
/** /**
* Open the help modal * Open the help modal
* @param {string} [tabId] - Optional tab id to activate after opening
*/ */
openHelpModal() { openHelpModal(tabId) {
// Use modalManager to open the help modal // Use modalManager to open the help modal
if (window.modalManager) { if (window.modalManager) {
window.modalManager.toggleModal('helpModal'); window.modalManager.toggleModal('helpModal');
if (tabId) {
this.activateHelpTab(tabId);
}
// Add visual indicator to Documentation tab if there's new content // Add visual indicator to Documentation tab if there's new content
this.updateDocumentationTabIndicator(); this.updateDocumentationTabIndicator();
+22 -2
View File
@@ -43,7 +43,7 @@ export class OnboardingManager {
{ {
target: '.controls .action-buttons [data-action="bulk"]', target: '.controls .action-buttons [data-action="bulk"]',
title: () => translate('onboarding.steps.bulk.title', {}, 'Bulk Operations'), title: () => translate('onboarding.steps.bulk.title', {}, 'Bulk Operations'),
content: () => translate('onboarding.steps.bulk.content', {}, 'Enter bulk mode by clicking this button or pressing <span class="onboarding-shortcut">B</span>. Select multiple models and perform batch operations. Use <span class="onboarding-shortcut">Ctrl+A</span> to select all visible models.'), content: () => translate('onboarding.steps.bulk.content', {}, 'Enter bulk mode by clicking this button or pressing <span class="onboarding-shortcut">B</span> to select multiple models and perform batch operations.<br>• <span class="onboarding-shortcut">Ctrl/Cmd+A</span> select all visible models, <span class="onboarding-shortcut">Shift+Click</span> select a range.<br>• <span class="onboarding-shortcut">Esc</span> or clicking an empty area exits bulk mode.'),
position: 'bottom' position: 'bottom'
}, },
{ {
@@ -71,10 +71,30 @@ export class OnboardingManager {
position: 'top', position: 'top',
customPosition: { top: '20%', left: '50%' } customPosition: { top: '20%', left: '50%' }
}, },
{
target: '.card-grid',
title: () => translate('onboarding.steps.marqueeSelect.title', {}, 'Drag to Select'),
content: () => translate('onboarding.steps.marqueeSelect.content', {}, 'Hold the <strong>left mouse button</strong> on an empty area of the grid and drag to draw a marquee that selects multiple cards at once.'),
position: 'top',
customPosition: { top: '20%', left: '50%' }
},
{
target: '#folderSidebar',
title: () => translate('onboarding.steps.dragToSidebar.title', {}, 'Organize by Dragging'),
content: () => translate('onboarding.steps.dragToSidebar.content', {}, 'Drag a model card onto a folder in the sidebar to move the file there. This also works with multiple selected cards in bulk mode.'),
position: 'right'
},
{ {
target: '.card-grid', target: '.card-grid',
title: () => translate('onboarding.steps.contextMenu.title', {}, 'Context Menu'), title: () => translate('onboarding.steps.contextMenu.title', {}, 'Context Menu'),
content: () => translate('onboarding.steps.contextMenu.content', {}, '<strong>Right-click</strong> any model card for a context menu with additional actions.'), content: () => translate('onboarding.steps.contextMenu.content', {}, '<strong>Right-click</strong> any model card for a context menu with card actions like moving, deleting, or editing metadata.'),
position: 'top',
customPosition: { top: '20%', left: '50%' }
},
{
target: '.card-grid',
title: () => translate('onboarding.steps.contextMenus.title', {}, 'More Context Menus'),
content: () => translate('onboarding.steps.contextMenus.content', {}, 'In bulk mode, <strong>right-click a selected card</strong> for bulk actions. <strong>Right-click an empty area</strong> of the page for global actions like update checks and managing excluded models.'),
position: 'top', position: 'top',
customPosition: { top: '20%', left: '50%' } customPosition: { top: '20%', left: '50%' }
} }
+109
View File
@@ -10,6 +10,7 @@
<button class="tab-btn active" data-tab="getting-started">{{ t('help.tabs.gettingStarted') }}</button> <button class="tab-btn active" data-tab="getting-started">{{ t('help.tabs.gettingStarted') }}</button>
<button class="tab-btn" data-tab="update-vlogs">{{ t('help.tabs.updateVlogs') }}</button> <button class="tab-btn" data-tab="update-vlogs">{{ t('help.tabs.updateVlogs') }}</button>
<button class="tab-btn" data-tab="documentation">{{ t('help.tabs.documentation') }}</button> <button class="tab-btn" data-tab="documentation">{{ t('help.tabs.documentation') }}</button>
<button class="tab-btn" data-tab="shortcuts">{{ t('help.tabs.shortcuts') }}</button>
</div> </div>
<div class="help-content"> <div class="help-content">
@@ -39,6 +40,12 @@
<li><strong>Recipe System:</strong> Create, save and share your perfect combinations</li> <li><strong>Recipe System:</strong> Create, save and share your perfect combinations</li>
</ul> </ul>
</div> </div>
<div class="help-actions">
<button id="replayTutorialBtn" class="replay-tutorial-btn">
<i class="fas fa-graduation-cap"></i>
<span>{{ t('help.gettingStarted.replayTutorial') }}</span>
</button>
</div>
</div> </div>
<!-- Update Vlogs Tab --> <!-- Update Vlogs Tab -->
@@ -136,6 +143,108 @@
</ul> </ul>
</div> </div>
</div> </div>
<!-- Shortcuts Tab -->
<div class="tab-pane" id="shortcuts">
<h3>{{ t('help.shortcuts.title') }}</h3>
<div class="shortcuts-section">
<h4><i class="fas fa-keyboard"></i> {{ t('help.shortcuts.groups.general') }}</h4>
<ul class="shortcuts-list">
<li>
<span class="shortcut-keys"><kbd>Ctrl</kbd><span class="shortcut-sep">/</span><kbd>Cmd</kbd><span class="shortcut-sep">+</span><kbd>F</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.focusSearch') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>Esc</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.closeModal') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>?</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.openShortcuts') }}</span>
</li>
</ul>
</div>
<div class="shortcuts-section">
<h4><i class="fas fa-object-group"></i> {{ t('help.shortcuts.groups.selection') }}</h4>
<ul class="shortcuts-list">
<li>
<span class="shortcut-keys"><kbd>B</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.toggleBulkMode') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>Ctrl</kbd><span class="shortcut-sep">/</span><kbd>Cmd</kbd><span class="shortcut-sep">+</span><kbd>A</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.selectAll') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>Shift</kbd><span class="shortcut-sep">+</span><kbd>{{ t('help.shortcuts.keys.click') }}</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.rangeSelect') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>{{ t('help.shortcuts.keys.drag') }}</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.marqueeSelect') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>Esc</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.exitBulkMode') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>{{ t('help.shortcuts.keys.rightClick') }}</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.bulkActions') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>{{ t('help.shortcuts.keys.rightClick') }}</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.globalActions') }}</span>
</li>
</ul>
</div>
<div class="shortcuts-section">
<h4><i class="fas fa-arrows-alt-v"></i> {{ t('help.shortcuts.groups.navigation') }}</h4>
<ul class="shortcuts-list">
<li>
<span class="shortcut-keys"><kbd>PageUp</kbd><span class="shortcut-sep">/</span><kbd>PageDown</kbd><span class="shortcut-sep">/</span><kbd>Home</kbd><span class="shortcut-sep">/</span><kbd>End</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.scrollPages') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>Alt</kbd><span class="shortcut-sep">+</span><kbd>{{ t('help.shortcuts.keys.letter') }}</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.jumpAlphabet') }}</span>
</li>
</ul>
</div>
<div class="shortcuts-section">
<h4><i class="fas fa-window-restore"></i> {{ t('help.shortcuts.groups.modelModal') }}</h4>
<ul class="shortcuts-list">
<li>
<span class="shortcut-keys"><kbd>&larr;</kbd><span class="shortcut-sep">/</span><kbd>&rarr;</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.prevNext') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>Delete</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.deleteEntry') }}</span>
</li>
</ul>
</div>
<div class="shortcuts-section">
<h4><i class="fas fa-images"></i> {{ t('help.shortcuts.groups.mediaViewer') }}</h4>
<ul class="shortcuts-list">
<li>
<span class="shortcut-keys"><kbd>&larr;</kbd><span class="shortcut-sep">/</span><kbd>&rarr;</kbd><span class="shortcut-sep">/</span><kbd>[</kbd><span class="shortcut-sep">/</span><kbd>]</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.cycleMedia') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>{{ t('help.shortcuts.keys.swipe') }}</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.swipeTouch') }}</span>
</li>
<li>
<span class="shortcut-keys"><kbd>Esc</kbd></span>
<span class="shortcut-description">{{ t('help.shortcuts.entries.closeViewer') }}</span>
</li>
</ul>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>