Spaces:
Sleeping
Sleeping
style: group sidebar navigation links into clean logical sections using uppercase category headers
Browse files- static/theme.css +4 -0
- templates/layout.html +73 -60
static/theme.css
CHANGED
|
@@ -87,6 +87,10 @@ body {
|
|
| 87 |
border-right: 1px solid var(--color-border);
|
| 88 |
padding: var(--spacing-lg) calc(var(--spacing-lg) * 0.8);
|
| 89 |
flex-shrink: 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
}
|
| 91 |
|
| 92 |
/* --- Brand / Logo --- */
|
|
|
|
| 87 |
border-right: 1px solid var(--color-border);
|
| 88 |
padding: var(--spacing-lg) calc(var(--spacing-lg) * 0.8);
|
| 89 |
flex-shrink: 0;
|
| 90 |
+
overflow-y: auto;
|
| 91 |
+
height: 100vh;
|
| 92 |
+
position: sticky;
|
| 93 |
+
top: 0;
|
| 94 |
}
|
| 95 |
|
| 96 |
/* --- Brand / Logo --- */
|
templates/layout.html
CHANGED
|
@@ -20,46 +20,13 @@
|
|
| 20 |
<span class="brand-name">PUM'S TOOLKIT</span>
|
| 21 |
</div>
|
| 22 |
<nav class="nav flex-column">
|
|
|
|
| 23 |
<a class="nav-link {% if request.path == '/' %}active{% endif %}" href="/">
|
| 24 |
<i class="fas fa-th-large"></i> Dashboard
|
| 25 |
</a>
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
data-bs-target="#translator-sub"
|
| 30 |
-
aria-expanded="{{ 'true' if request.path.startswith('/translator') else 'false' }}"
|
| 31 |
-
onclick="return handleNavCollapse(event, this)">
|
| 32 |
-
<span><i class="fas fa-language"></i> AI Translator</span>
|
| 33 |
-
<i class="fas fa-chevron-down nav-chevron {% if not request.path.startswith('/translator') %}collapsed{% endif %}"></i>
|
| 34 |
-
</a>
|
| 35 |
-
<div class="collapse nav-sub {% if request.path.startswith('/translator') %}show{% endif %}" id="translator-sub">
|
| 36 |
-
<a class="nav-link nav-link-sub {% if request.path == '/translator/text' %}active{% endif %}" href="/translator/text">
|
| 37 |
-
<i class="fas fa-font"></i> Văn bản
|
| 38 |
-
</a>
|
| 39 |
-
<a class="nav-link nav-link-sub {% if request.path == '/translator/file' %}active{% endif %}" href="/translator/file">
|
| 40 |
-
<i class="fas fa-file-alt"></i> Tài liệu
|
| 41 |
-
</a>
|
| 42 |
-
<a class="nav-link nav-link-sub {% if request.path == '/translator/image' %}active{% endif %}" href="/translator/image">
|
| 43 |
-
<i class="fas fa-image"></i> Dịch ảnh
|
| 44 |
-
</a>
|
| 45 |
-
</div>
|
| 46 |
-
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/image-studio') %}active{% endif %}"
|
| 47 |
-
href="/image-studio/remove-bg"
|
| 48 |
-
data-bs-toggle="collapse"
|
| 49 |
-
data-bs-target="#image-sub"
|
| 50 |
-
aria-expanded="{{ 'true' if request.path.startswith('/image-studio') else 'false' }}"
|
| 51 |
-
onclick="return handleNavCollapse(event, this)">
|
| 52 |
-
<span><i class="fas fa-image"></i> Image Studio</span>
|
| 53 |
-
<i class="fas fa-chevron-down nav-chevron {% if not request.path.startswith('/image-studio') %}collapsed{% endif %}"></i>
|
| 54 |
-
</a>
|
| 55 |
-
<div class="collapse nav-sub {% if request.path.startswith('/image-studio') %}show{% endif %}" id="image-sub">
|
| 56 |
-
<a class="nav-link nav-link-sub {% if request.path == '/image-studio/remove-bg' %}active{% endif %}" href="/image-studio/remove-bg">
|
| 57 |
-
<i class="fas fa-cut"></i> Xóa nền
|
| 58 |
-
</a>
|
| 59 |
-
<a class="nav-link nav-link-sub {% if request.path == '/image-studio/upscale' %}active{% endif %}" href="/image-studio/upscale">
|
| 60 |
-
<i class="fas fa-expand-arrows-alt"></i> Nâng cấp ảnh
|
| 61 |
-
</a>
|
| 62 |
-
</div>
|
| 63 |
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/tts') %}active{% endif %}"
|
| 64 |
href="/tts/vieneu"
|
| 65 |
data-bs-toggle="collapse"
|
|
@@ -80,26 +47,44 @@
|
|
| 80 |
<i class="fab fa-microsoft"></i> Edge TTS
|
| 81 |
</a>
|
| 82 |
</div>
|
| 83 |
-
<a class="nav-link
|
| 84 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 85 |
data-bs-toggle="collapse"
|
| 86 |
-
data-bs-target="#
|
| 87 |
-
aria-expanded="{{ 'true' if request.path.startswith('/
|
| 88 |
onclick="return handleNavCollapse(event, this)">
|
| 89 |
-
<span><i class="fas fa-
|
| 90 |
-
<i class="fas fa-chevron-down nav-chevron {% if not request.path.startswith('/
|
| 91 |
</a>
|
| 92 |
-
<div class="collapse nav-sub {% if request.path.startswith('/
|
| 93 |
-
<a class="nav-link nav-link-sub {% if request.path == '/
|
| 94 |
-
<i class="fas fa-
|
| 95 |
</a>
|
| 96 |
-
<a class="nav-link nav-link-sub {% if request.path == '/
|
| 97 |
-
<i class="fas fa-
|
| 98 |
</a>
|
| 99 |
</div>
|
|
|
|
|
|
|
|
|
|
| 100 |
<a class="nav-link {% if request.path.startswith('/video-ai') %}active{% endif %}" href="/video-ai">
|
| 101 |
<i class="fas fa-video"></i> Video AI
|
| 102 |
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/prompt-generator') %}active{% endif %}"
|
| 104 |
href="/prompt-generator/code"
|
| 105 |
data-bs-toggle="collapse"
|
|
@@ -147,21 +132,49 @@
|
|
| 147 |
<i class="fas fa-wand-magic-sparkles"></i> Tối ưu Prompt thô
|
| 148 |
</a>
|
| 149 |
</div>
|
| 150 |
-
<a class="nav-link {% if request.path.startswith('/audio-story-studio') %}active{% endif %}" href="/audio-story-studio">
|
| 151 |
-
<i class="fas fa-podcast"></i> AI Audio Story Studio
|
| 152 |
-
</a>
|
| 153 |
-
<a class="nav-link {% if request.path.startswith('/podcast-studio') %}active{% endif %}" href="/podcast-studio">
|
| 154 |
-
<i class="fas fa-microphone"></i> AI Podcast Studio
|
| 155 |
-
</a>
|
| 156 |
-
<a class="nav-link {% if request.path.startswith('/shorts-generator') %}active{% endif %}" href="/shorts-generator">
|
| 157 |
-
<i class="fas fa-mobile-alt"></i> AI Shorts Generator
|
| 158 |
-
</a>
|
| 159 |
-
<a class="nav-link {% if request.path.startswith('/comic-creator') %}active{% endif %}" href="/comic-creator">
|
| 160 |
-
<i class="fas fa-book-open"></i> AI Comic Creator
|
| 161 |
-
</a>
|
| 162 |
<a class="nav-link {% if request.path.startswith('/omnichannel-writer') %}active{% endif %}" href="/omnichannel-writer">
|
| 163 |
<i class="fas fa-paper-plane"></i> AI Omnichannel Writer
|
| 164 |
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
</nav>
|
| 166 |
</div>
|
| 167 |
|
|
|
|
| 20 |
<span class="brand-name">PUM'S TOOLKIT</span>
|
| 21 |
</div>
|
| 22 |
<nav class="nav flex-column">
|
| 23 |
+
<!-- 🏠 TRANG CHỦ -->
|
| 24 |
<a class="nav-link {% if request.path == '/' %}active{% endif %}" href="/">
|
| 25 |
<i class="fas fa-th-large"></i> Dashboard
|
| 26 |
</a>
|
| 27 |
+
|
| 28 |
+
<!-- 🎙️ ÂM THANH & LỒNG TIẾNG -->
|
| 29 |
+
<div class="nav-section-label">ÂM THANH & LỒNG TIẾNG</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/tts') %}active{% endif %}"
|
| 31 |
href="/tts/vieneu"
|
| 32 |
data-bs-toggle="collapse"
|
|
|
|
| 47 |
<i class="fab fa-microsoft"></i> Edge TTS
|
| 48 |
</a>
|
| 49 |
</div>
|
| 50 |
+
<a class="nav-link {% if request.path.startswith('/audio-story-studio') %}active{% endif %}" href="/audio-story-studio">
|
| 51 |
+
<i class="fas fa-podcast"></i> AI Audio Story Studio
|
| 52 |
+
</a>
|
| 53 |
+
<a class="nav-link {% if request.path.startswith('/podcast-studio') %}active{% endif %}" href="/podcast-studio">
|
| 54 |
+
<i class="fas fa-microphone"></i> AI Podcast Studio
|
| 55 |
+
</a>
|
| 56 |
+
|
| 57 |
+
<!-- 🎬 HÌNH ẢNH & VIDEO AI -->
|
| 58 |
+
<div class="nav-section-label">HÌNH ẢNH & VIDEO AI</div>
|
| 59 |
+
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/image-studio') %}active{% endif %}"
|
| 60 |
+
href="/image-studio/remove-bg"
|
| 61 |
data-bs-toggle="collapse"
|
| 62 |
+
data-bs-target="#image-sub"
|
| 63 |
+
aria-expanded="{{ 'true' if request.path.startswith('/image-studio') else 'false' }}"
|
| 64 |
onclick="return handleNavCollapse(event, this)">
|
| 65 |
+
<span><i class="fas fa-image"></i> Image Studio</span>
|
| 66 |
+
<i class="fas fa-chevron-down nav-chevron {% if not request.path.startswith('/image-studio') %}collapsed{% endif %}"></i>
|
| 67 |
</a>
|
| 68 |
+
<div class="collapse nav-sub {% if request.path.startswith('/image-studio') %}show{% endif %}" id="image-sub">
|
| 69 |
+
<a class="nav-link nav-link-sub {% if request.path == '/image-studio/remove-bg' %}active{% endif %}" href="/image-studio/remove-bg">
|
| 70 |
+
<i class="fas fa-cut"></i> Xóa nền
|
| 71 |
</a>
|
| 72 |
+
<a class="nav-link nav-link-sub {% if request.path == '/image-studio/upscale' %}active{% endif %}" href="/image-studio/upscale">
|
| 73 |
+
<i class="fas fa-expand-arrows-alt"></i> Nâng cấp ảnh
|
| 74 |
</a>
|
| 75 |
</div>
|
| 76 |
+
<a class="nav-link {% if request.path.startswith('/comic-creator') %}active{% endif %}" href="/comic-creator">
|
| 77 |
+
<i class="fas fa-book-open"></i> AI Comic Creator
|
| 78 |
+
</a>
|
| 79 |
<a class="nav-link {% if request.path.startswith('/video-ai') %}active{% endif %}" href="/video-ai">
|
| 80 |
<i class="fas fa-video"></i> Video AI
|
| 81 |
</a>
|
| 82 |
+
<a class="nav-link {% if request.path.startswith('/shorts-generator') %}active{% endif %}" href="/shorts-generator">
|
| 83 |
+
<i class="fas fa-mobile-alt"></i> AI Shorts Generator
|
| 84 |
+
</a>
|
| 85 |
+
|
| 86 |
+
<!-- ✍️ TRỢ LÝ NỘI DUNG -->
|
| 87 |
+
<div class="nav-section-label">TRỢ LÝ NỘI DUNG</div>
|
| 88 |
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/prompt-generator') %}active{% endif %}"
|
| 89 |
href="/prompt-generator/code"
|
| 90 |
data-bs-toggle="collapse"
|
|
|
|
| 132 |
<i class="fas fa-wand-magic-sparkles"></i> Tối ưu Prompt thô
|
| 133 |
</a>
|
| 134 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
<a class="nav-link {% if request.path.startswith('/omnichannel-writer') %}active{% endif %}" href="/omnichannel-writer">
|
| 136 |
<i class="fas fa-paper-plane"></i> AI Omnichannel Writer
|
| 137 |
</a>
|
| 138 |
+
|
| 139 |
+
<!-- 💼 DỊCH THUẬT & TÀI LIỆU -->
|
| 140 |
+
<div class="nav-section-label">DỊCH THUẬT & TÀI LIỆU</div>
|
| 141 |
+
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/translator') %}active{% endif %}"
|
| 142 |
+
href="/translator/text"
|
| 143 |
+
data-bs-toggle="collapse"
|
| 144 |
+
data-bs-target="#translator-sub"
|
| 145 |
+
aria-expanded="{{ 'true' if request.path.startswith('/translator') else 'false' }}"
|
| 146 |
+
onclick="return handleNavCollapse(event, this)">
|
| 147 |
+
<span><i class="fas fa-language"></i> AI Translator</span>
|
| 148 |
+
<i class="fas fa-chevron-down nav-chevron {% if not request.path.startswith('/translator') %}collapsed{% endif %}"></i>
|
| 149 |
+
</a>
|
| 150 |
+
<div class="collapse nav-sub {% if request.path.startswith('/translator') %}show{% endif %}" id="translator-sub">
|
| 151 |
+
<a class="nav-link nav-link-sub {% if request.path == '/translator/text' %}active{% endif %}" href="/translator/text">
|
| 152 |
+
<i class="fas fa-font"></i> Văn bản
|
| 153 |
+
</a>
|
| 154 |
+
<a class="nav-link nav-link-sub {% if request.path == '/translator/file' %}active{% endif %}" href="/translator/file">
|
| 155 |
+
<i class="fas fa-file-alt"></i> Tài liệu
|
| 156 |
+
</a>
|
| 157 |
+
<a class="nav-link nav-link-sub {% if request.path == '/translator/image' %}active{% endif %}" href="/translator/image">
|
| 158 |
+
<i class="fas fa-image"></i> Dịch ảnh
|
| 159 |
+
</a>
|
| 160 |
+
</div>
|
| 161 |
+
<a class="nav-link nav-link-collapsible {% if request.path.startswith('/pdf') %}active{% endif %}"
|
| 162 |
+
href="/pdf/summarize"
|
| 163 |
+
data-bs-toggle="collapse"
|
| 164 |
+
data-bs-target="#pdf-sub"
|
| 165 |
+
aria-expanded="{{ 'true' if request.path.startswith('/pdf') else 'false' }}"
|
| 166 |
+
onclick="return handleNavCollapse(event, this)">
|
| 167 |
+
<span><i class="fas fa-file-pdf"></i> Smart PDF</span>
|
| 168 |
+
<i class="fas fa-chevron-down nav-chevron {% if not request.path.startswith('/pdf') %}collapsed{% endif %}"></i>
|
| 169 |
+
</a>
|
| 170 |
+
<div class="collapse nav-sub {% if request.path.startswith('/pdf') %}show{% endif %}" id="pdf-sub">
|
| 171 |
+
<a class="nav-link nav-link-sub {% if request.path == '/pdf/summarize' %}active{% endif %}" href="/pdf/summarize">
|
| 172 |
+
<i class="fas fa-align-left"></i> Tóm tắt
|
| 173 |
+
</a>
|
| 174 |
+
<a class="nav-link nav-link-sub {% if request.path == '/pdf/extract' %}active{% endif %}" href="/pdf/extract">
|
| 175 |
+
<i class="fas fa-table"></i> Trích xuất dữ liệu
|
| 176 |
+
</a>
|
| 177 |
+
</div>
|
| 178 |
</nav>
|
| 179 |
</div>
|
| 180 |
|