ndmhung6 commited on
Commit
48872eb
·
1 Parent(s): fd3a485

style: group sidebar navigation links into clean logical sections using uppercase category headers

Browse files
Files changed (2) hide show
  1. static/theme.css +4 -0
  2. 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
- <a class="nav-link nav-link-collapsible {% if request.path.startswith('/translator') %}active{% endif %}"
27
- href="/translator/text"
28
- data-bs-toggle="collapse"
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 nav-link-collapsible {% if request.path.startswith('/pdf') %}active{% endif %}"
84
- href="/pdf/summarize"
 
 
 
 
 
 
 
 
 
85
  data-bs-toggle="collapse"
86
- data-bs-target="#pdf-sub"
87
- aria-expanded="{{ 'true' if request.path.startswith('/pdf') else 'false' }}"
88
  onclick="return handleNavCollapse(event, this)">
89
- <span><i class="fas fa-file-pdf"></i> Smart PDF</span>
90
- <i class="fas fa-chevron-down nav-chevron {% if not request.path.startswith('/pdf') %}collapsed{% endif %}"></i>
91
  </a>
92
- <div class="collapse nav-sub {% if request.path.startswith('/pdf') %}show{% endif %}" id="pdf-sub">
93
- <a class="nav-link nav-link-sub {% if request.path == '/pdf/summarize' %}active{% endif %}" href="/pdf/summarize">
94
- <i class="fas fa-align-left"></i> Tóm tắt
95
  </a>
96
- <a class="nav-link nav-link-sub {% if request.path == '/pdf/extract' %}active{% endif %}" href="/pdf/extract">
97
- <i class="fas fa-table"></i> Trích xuất dữ liệu
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