Skip to content

Commit 6254682

Browse files
mrmeesclaude
andcommitted
feat: add custom navigation links with drag-to-reorder and theme icon separation
Add user-configurable custom navigation links to the sidebar with add/edit/delete, icon selection (Material Design, Klipper, URL favicon, emoji), drag-to-reorder for system and custom links, collapsible links with popup menus, context menus, import/export, and expandable sidebar with hover-to-expand. Extract inline theme SVG icon data from config.json into individual icon_*.svg files using CSS variables for dynamic theming via vue-inline-svg. Add multi-link support per theme preset with icon fallback chain. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 0fd9118 commit 6254682

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2801
-239
lines changed

components.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ declare module 'vue' {
4242
AppNamedSwitch: typeof import('./src/components/ui/AppNamedSwitch.vue')['default']
4343
AppNamedTextField: typeof import('./src/components/ui/AppNamedTextField.vue')['default']
4444
AppNavDrawer: typeof import('./src/components/layout/AppNavDrawer.vue')['default']
45+
AppNavExternalItem: typeof import('./src/components/ui/AppNavExternalItem.vue')['default']
4546
AppNavItem: typeof import('./src/components/ui/AppNavItem.vue')['default']
47+
AppNavLinkIcon: typeof import('./src/components/ui/AppNavLinkIcon.vue')['default']
4648
AppNotificationMenu: typeof import('./src/components/layout/AppNotificationMenu.vue')['default']
4749
AppObservedColumn: typeof import('./src/components/layout/AppObservedColumn.vue')['default']
4850
AppQrCode: typeof import('./src/components/ui/AppQrCode.vue')['default']
@@ -79,6 +81,7 @@ declare module 'vue' {
7981
VAlert: typeof import('vuetify/lib')['VAlert']
8082
VApp: typeof import('vuetify/lib')['VApp']
8183
VAppBar: typeof import('vuetify/lib')['VAppBar']
84+
VAutocomplete: typeof import('vuetify/lib')['VAutocomplete']
8285
VBadge: typeof import('vuetify/lib')['VBadge']
8386
VBtn: typeof import('vuetify/lib')['VBtn']
8487
VBtnToggle: typeof import('vuetify/lib')['VBtnToggle']

public/config.json

Lines changed: 93 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,40 @@
1212
"color": "#2196F3",
1313
"isDark": true,
1414
"logo": {
15-
"src": "logo_fluidd.svg"
16-
}
15+
"src": "logo_fluidd.svg",
16+
"icon": "icon_fluidd.svg"
17+
},
18+
"links": [{ "title": "Fluidd", "url": "https://docs.fluidd.xyz/" }]
1719
},
1820
{
1921
"name": "Annex",
2022
"color": "#96CC4A",
2123
"isDark": true,
2224
"logo": {
23-
"src": "logo_annex.svg"
24-
}
25+
"src": "logo_annex.svg",
26+
"icon": "icon_annex.svg"
27+
},
28+
"links": [{ "title": "Annex", "url": "https://annex-engineering.eu/" }]
2529
},
2630
{
2731
"name": "BTT",
2832
"color": "#475A91",
2933
"isDark": true,
3034
"logo": {
31-
"src": "logo_btt.svg"
32-
}
35+
"src": "logo_btt.svg",
36+
"icon": "icon_btt.svg"
37+
},
38+
"links": [{ "title": "BTT", "url": "https://bigtree-tech.com/" }]
3339
},
3440
{
3541
"name": "Cocoa Press",
3642
"color": "#F27121",
3743
"isDark": true,
3844
"logo": {
39-
"src": "logo_cocoapress.svg"
40-
}
45+
"src": "logo_cocoapress.svg",
46+
"icon": "icon_cocoapress.svg"
47+
},
48+
"links": [{ "title": "Cocoa Press", "url": "https://cocoapress.com/" }]
4149
},
4250
{
4351
"name": "EVA",
@@ -46,72 +54,90 @@
4654
"logo": {
4755
"src": "logo_eva.svg",
4856
"dark": "#232323",
49-
"light": "#ffffff"
50-
}
57+
"light": "#ffffff",
58+
"icon": "icon_eva.svg"
59+
},
60+
"links": [{ "title": "EVA", "url": "https://main.eva-3d.page/" }]
5161
},
5262
{
5363
"name": "HevORT",
5464
"color": "#dfff3e",
5565
"isDark": true,
5666
"logo": {
57-
"src": "logo_hevort.svg"
58-
}
67+
"src": "logo_hevort.svg",
68+
"icon": "icon_hevort.svg"
69+
},
70+
"links": [{ "title": "HevORT", "url": "https://hevort.com/" }]
5971
},
6072
{
6173
"name": "Kingroon",
6274
"color": "#DA7A2C",
6375
"isDark": true,
6476
"logo": {
65-
"src": "logo_kingroon.svg"
66-
}
77+
"src": "logo_kingroon.svg",
78+
"icon": "icon_kingroon.svg"
79+
},
80+
"links": [{ "title": "Kingroon", "url": "https://kingroon.com/" }]
6781
},
6882
{
6983
"name": "Klipper",
7084
"color": "#B12F36",
7185
"isDark": true,
7286
"logo": {
73-
"src": "logo_klipper.svg"
74-
}
87+
"src": "logo_klipper.svg",
88+
"icon": "icon_klipper.svg"
89+
},
90+
"links": [{ "title": "Klipper", "url": "https://www.klipper3d.org/" }]
7591
},
7692
{
7793
"name": "LDO",
7894
"color": "#326799",
7995
"isDark": true,
8096
"logo": {
81-
"src": "logo_ldo.svg"
82-
}
97+
"src": "logo_ldo.svg",
98+
"icon": "icon_ldo.svg"
99+
},
100+
"links": [{ "title": "LDO", "url": "https://ldomotion.com/" }]
83101
},
84102
{
85103
"name": "Mellow",
86104
"color": "#003DFF",
87105
"isDark": true,
88106
"logo": {
89-
"src": "logo_mellow.svg"
90-
}
107+
"src": "logo_mellow.svg",
108+
"icon": "icon_mellow.svg"
109+
},
110+
"links": [{ "title": "Mellow", "url": "https://3dmellow.com/" }]
91111
},
92112
{
93113
"name": "Peopoly",
94114
"color": "#007CC2",
95115
"isDark": true,
96116
"logo": {
97-
"src": "logo_peopoly.svg"
98-
}
117+
"src": "logo_peopoly.svg",
118+
"icon": "icon_peopoly.svg"
119+
},
120+
"links": [{ "title": "Peopoly", "url": "https://peopoly.net/" }]
99121
},
100122
{
101123
"name": "Prusa",
102124
"color": "#E05D2D",
103125
"isDark": false,
104126
"logo": {
105-
"src": "logo_prusa.svg"
106-
}
127+
"src": "logo_prusa.svg",
128+
"icon": "icon_prusa.svg"
129+
},
130+
"links": [{ "title": "Prusa", "url": "https://www.prusa3d.com/" }]
107131
},
108132
{
109133
"name": "Qidi Tech",
110-
"color": "#5B7AEA",
134+
"color": "#3885EA",
111135
"isDark": true,
112136
"logo": {
113-
"src": "logo_qidi.svg"
114-
}
137+
"src": "logo_qidi.svg",
138+
"icon": "icon_qidi.svg"
139+
},
140+
"links": [{ "title": "Qidi Tech", "url": "https://qidi3d.com/" }]
115141
},
116142
{
117143
"name": "RatRig",
@@ -120,82 +146,100 @@
120146
"logo": {
121147
"src": "logo_ratrig.svg",
122148
"dark": "#232323",
123-
"light": "#ffffff"
124-
}
149+
"light": "#ffffff",
150+
"icon": "icon_ratrig.svg"
151+
},
152+
"links": [{ "title": "RatRig", "url": "https://ratrig.com/" }]
125153
},
126154
{
127155
"name": "Siboor",
128156
"color": "#32E0DF",
129157
"isDark": true,
130158
"logo": {
131-
"src": "logo_siboor.svg"
132-
}
159+
"src": "logo_siboor.svg",
160+
"icon": "icon_siboor.svg"
161+
},
162+
"links": [{ "title": "Siboor", "url": "https://www.siboor.com/" }]
133163
},
134164
{
135165
"name": "Voron",
136166
"color": "#FF2300",
137167
"isDark": true,
138168
"logo": {
139-
"src": "logo_voron.svg"
140-
}
169+
"src": "logo_voron.svg",
170+
"icon": "icon_voron.svg"
171+
},
172+
"links": [{ "title": "Voron", "url": "https://vorondesign.com/" }]
141173
},
142174
{
143175
"name": "VzBot",
144176
"color": "#FF2300",
145177
"isDark": true,
146178
"logo": {
147-
"src": "logo_vzbot.svg"
148-
}
179+
"src": "logo_vzbot.svg",
180+
"icon": "icon_vzbot.svg"
181+
},
182+
"links": [{ "title": "VzBot", "url": "https://vez3d.com/" }]
149183
},
150184
{
151185
"name": "Z-Bolt",
152-
"color": "#2196F3",
186+
"color": "#FFFFFF",
153187
"isDark": true,
154188
"logo": {
155189
"src": "logo_z-bolt.svg",
156-
"dark": "#232323",
157-
"light": "#ffffff"
158-
}
190+
"icon": "icon_z-bolt.svg"
191+
},
192+
"links": [{ "title": "Z-Bolt", "url": "https://z-bolt.ru/" }]
159193
},
160194
{
161195
"name": "ZeroG",
162196
"color": "#e34234",
163197
"isDark": true,
164198
"logo": {
165-
"src": "logo_zerog.svg"
166-
}
199+
"src": "logo_zerog.svg",
200+
"icon": "icon_zerog.svg"
201+
},
202+
"links": [{ "title": "ZeroG", "url": "https://zerog.one/" }]
167203
},
168204
{
169205
"name": "SnakeOil",
170206
"color": "#4bc3ca",
171207
"isDark": true,
172208
"logo": {
173-
"src": "logo_snakeoil.svg"
174-
}
209+
"src": "logo_snakeoil.svg",
210+
"icon": "icon_snakeoil.svg"
211+
},
212+
"links": [{ "title": "SnakeOil", "url": "https://github.com/SnakeOilXY/SnakeOil-XY" }]
175213
},
176214
{
177215
"name": "Printers for Ants",
178216
"color": "#42d62c",
179217
"isDark": true,
180218
"logo": {
181-
"src": "logo_pfa.svg"
182-
}
219+
"src": "logo_pfa.svg",
220+
"icon": "icon_pfa.svg"
221+
},
222+
"links": [{ "title": "Printers for Ants", "url": "https://3dprintersforants.com/" }]
183223
},
184224
{
185225
"name": "Micron",
186226
"color": "#42d62c",
187227
"isDark": true,
188228
"logo": {
189-
"src": "logo_micron.svg"
190-
}
229+
"src": "logo_micron.svg",
230+
"icon": "icon_micron.svg"
231+
},
232+
"links": [{ "title": "Micron", "url": "https://3dprintersforants.com/" }]
191233
},
192234
{
193235
"name": "Salad Fork",
194236
"color": "#0cff28",
195237
"isDark": true,
196238
"logo": {
197-
"src": "logo_salad_fork.svg"
198-
}
239+
"src": "logo_salad_fork.svg",
240+
"icon": "icon_salad_fork.svg"
241+
},
242+
"links": [{ "title": "Salad Fork", "url": "https://3dprintersforants.com/" }]
199243
}
200244
]
201245
}

public/icon_annex.svg

Lines changed: 3 additions & 0 deletions
Loading

public/icon_btt.svg

Lines changed: 3 additions & 0 deletions
Loading

public/icon_cocoapress.svg

Lines changed: 3 additions & 0 deletions
Loading

public/icon_eva.svg

Lines changed: 3 additions & 0 deletions
Loading

public/icon_fluidd.svg

Lines changed: 4 additions & 0 deletions
Loading

public/icon_hevort.svg

Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)