@gxp-dev/tools 2.0.63 → 2.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -31
- package/bin/gx-devtools.js +74 -54
- package/bin/lib/cli.js +23 -21
- package/bin/lib/commands/add-dependency.js +366 -325
- package/bin/lib/commands/assets.js +137 -139
- package/bin/lib/commands/build.js +169 -174
- package/bin/lib/commands/datastore.js +181 -183
- package/bin/lib/commands/dev.js +127 -131
- package/bin/lib/commands/extensions.js +147 -149
- package/bin/lib/commands/extract-config.js +73 -67
- package/bin/lib/commands/index.js +12 -12
- package/bin/lib/commands/init.js +342 -240
- package/bin/lib/commands/publish.js +69 -75
- package/bin/lib/commands/socket.js +69 -69
- package/bin/lib/commands/ssl.js +14 -14
- package/bin/lib/constants.js +10 -24
- package/bin/lib/tui/App.tsx +761 -705
- package/bin/lib/tui/components/AIPanel.tsx +191 -171
- package/bin/lib/tui/components/CommandInput.tsx +394 -343
- package/bin/lib/tui/components/GeminiPanel.tsx +175 -151
- package/bin/lib/tui/components/Header.tsx +23 -21
- package/bin/lib/tui/components/LogPanel.tsx +244 -220
- package/bin/lib/tui/components/TabBar.tsx +50 -48
- package/bin/lib/tui/components/WelcomeScreen.tsx +126 -71
- package/bin/lib/tui/index.tsx +37 -39
- package/bin/lib/tui/services/AIService.ts +518 -462
- package/bin/lib/tui/services/ExtensionService.ts +140 -129
- package/bin/lib/tui/services/GeminiService.ts +367 -337
- package/bin/lib/tui/services/ServiceManager.ts +344 -322
- package/bin/lib/tui/services/SocketService.ts +168 -168
- package/bin/lib/tui/services/ViteService.ts +88 -88
- package/bin/lib/tui/services/index.ts +47 -22
- package/bin/lib/utils/ai-scaffold.js +291 -280
- package/bin/lib/utils/extract-config.js +157 -140
- package/bin/lib/utils/files.js +82 -86
- package/bin/lib/utils/index.js +7 -7
- package/bin/lib/utils/paths.js +34 -34
- package/bin/lib/utils/prompts.js +194 -169
- package/bin/lib/utils/ssl.js +79 -81
- package/browser-extensions/README.md +0 -1
- package/browser-extensions/chrome/background.js +244 -237
- package/browser-extensions/chrome/content.js +32 -29
- package/browser-extensions/chrome/devtools.html +7 -7
- package/browser-extensions/chrome/devtools.js +19 -19
- package/browser-extensions/chrome/inspector.js +802 -767
- package/browser-extensions/chrome/manifest.json +71 -63
- package/browser-extensions/chrome/panel.html +674 -636
- package/browser-extensions/chrome/panel.js +722 -712
- package/browser-extensions/chrome/popup.html +586 -543
- package/browser-extensions/chrome/popup.js +282 -244
- package/browser-extensions/chrome/rules.json +1 -1
- package/browser-extensions/chrome/test-chrome.html +216 -136
- package/browser-extensions/chrome/test-mixed-content.html +284 -189
- package/browser-extensions/chrome/test-uri-pattern.html +221 -198
- package/browser-extensions/firefox/README.md +9 -6
- package/browser-extensions/firefox/background.js +221 -218
- package/browser-extensions/firefox/content.js +55 -52
- package/browser-extensions/firefox/debug-errors.html +386 -228
- package/browser-extensions/firefox/debug-https.html +153 -105
- package/browser-extensions/firefox/devtools.html +7 -7
- package/browser-extensions/firefox/devtools.js +23 -20
- package/browser-extensions/firefox/inspector.js +802 -767
- package/browser-extensions/firefox/manifest.json +68 -68
- package/browser-extensions/firefox/panel.html +674 -636
- package/browser-extensions/firefox/panel.js +722 -712
- package/browser-extensions/firefox/popup.html +572 -535
- package/browser-extensions/firefox/popup.js +281 -236
- package/browser-extensions/firefox/test-gramercy.html +170 -125
- package/browser-extensions/firefox/test-imports.html +59 -55
- package/browser-extensions/firefox/test-masking.html +231 -140
- package/browser-extensions/firefox/test-uri-pattern.html +221 -198
- package/dist/tui/App.d.ts +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +154 -150
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/AIPanel.d.ts.map +1 -1
- package/dist/tui/components/AIPanel.js +42 -35
- package/dist/tui/components/AIPanel.js.map +1 -1
- package/dist/tui/components/CommandInput.d.ts +1 -1
- package/dist/tui/components/CommandInput.d.ts.map +1 -1
- package/dist/tui/components/CommandInput.js +92 -62
- package/dist/tui/components/CommandInput.js.map +1 -1
- package/dist/tui/components/GeminiPanel.d.ts.map +1 -1
- package/dist/tui/components/GeminiPanel.js +37 -30
- package/dist/tui/components/GeminiPanel.js.map +1 -1
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +1 -1
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/LogPanel.d.ts +1 -1
- package/dist/tui/components/LogPanel.d.ts.map +1 -1
- package/dist/tui/components/LogPanel.js +26 -24
- package/dist/tui/components/LogPanel.js.map +1 -1
- package/dist/tui/components/TabBar.d.ts +2 -2
- package/dist/tui/components/TabBar.d.ts.map +1 -1
- package/dist/tui/components/TabBar.js +11 -11
- package/dist/tui/components/TabBar.js.map +1 -1
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
- package/dist/tui/components/WelcomeScreen.js +6 -6
- package/dist/tui/components/WelcomeScreen.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +8 -8
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/services/AIService.d.ts +2 -2
- package/dist/tui/services/AIService.d.ts.map +1 -1
- package/dist/tui/services/AIService.js +165 -125
- package/dist/tui/services/AIService.js.map +1 -1
- package/dist/tui/services/ExtensionService.d.ts +1 -1
- package/dist/tui/services/ExtensionService.d.ts.map +1 -1
- package/dist/tui/services/ExtensionService.js +33 -26
- package/dist/tui/services/ExtensionService.js.map +1 -1
- package/dist/tui/services/GeminiService.d.ts +1 -1
- package/dist/tui/services/GeminiService.d.ts.map +1 -1
- package/dist/tui/services/GeminiService.js +87 -76
- package/dist/tui/services/GeminiService.js.map +1 -1
- package/dist/tui/services/ServiceManager.d.ts +3 -3
- package/dist/tui/services/ServiceManager.d.ts.map +1 -1
- package/dist/tui/services/ServiceManager.js +72 -58
- package/dist/tui/services/ServiceManager.js.map +1 -1
- package/dist/tui/services/SocketService.d.ts.map +1 -1
- package/dist/tui/services/SocketService.js +32 -32
- package/dist/tui/services/SocketService.js.map +1 -1
- package/dist/tui/services/ViteService.d.ts.map +1 -1
- package/dist/tui/services/ViteService.js +26 -28
- package/dist/tui/services/ViteService.js.map +1 -1
- package/dist/tui/services/index.d.ts +6 -6
- package/dist/tui/services/index.d.ts.map +1 -1
- package/dist/tui/services/index.js +6 -6
- package/dist/tui/services/index.js.map +1 -1
- package/mcp/gxp-api-server.js +83 -81
- package/package.json +109 -93
- package/runtime/PortalContainer.vue +258 -234
- package/runtime/dev-tools/DevToolsModal.vue +153 -155
- package/runtime/dev-tools/LayoutSwitcher.vue +144 -140
- package/runtime/dev-tools/MockDataEditor.vue +456 -433
- package/runtime/dev-tools/SocketSimulator.vue +379 -371
- package/runtime/dev-tools/StoreInspector.vue +517 -455
- package/runtime/dev-tools/index.js +5 -5
- package/runtime/fallback-layouts/PrivateLayout.vue +2 -2
- package/runtime/fallback-layouts/PublicLayout.vue +2 -2
- package/runtime/fallback-layouts/SystemLayout.vue +2 -2
- package/runtime/gxpStringsPlugin.js +159 -134
- package/runtime/index.html +17 -19
- package/runtime/main.js +24 -22
- package/runtime/mock-api/auth-middleware.js +15 -15
- package/runtime/mock-api/image-generator.js +46 -46
- package/runtime/mock-api/index.js +55 -55
- package/runtime/mock-api/response-generator.js +116 -105
- package/runtime/mock-api/route-generator.js +107 -84
- package/runtime/mock-api/socket-triggers.js +94 -93
- package/runtime/mock-api/spec-loader.js +79 -80
- package/runtime/package.json +3 -0
- package/runtime/server.js +68 -68
- package/runtime/stores/gxpPortalConfigStore.js +204 -186
- package/runtime/stores/index.js +2 -2
- package/runtime/vite-inspector-plugin.js +858 -707
- package/runtime/vite-source-tracker-plugin.js +132 -113
- package/runtime/vite.config.js +191 -139
- package/scripts/launch-chrome.js +41 -41
- package/scripts/pack-chrome.js +38 -39
- package/socket-events/AiSessionMessageCreated.json +17 -17
- package/socket-events/SocialStreamPostCreated.json +23 -23
- package/socket-events/SocialStreamPostVariantCompleted.json +22 -22
- package/template/.claude/agents/gxp-developer.md +100 -99
- package/template/.claude/settings.json +7 -7
- package/template/AGENTS.md +30 -23
- package/template/GEMINI.md +20 -20
- package/template/README.md +70 -53
- package/template/app-manifest.json +2 -4
- package/template/configuration.json +10 -10
- package/template/default-styling.css +1 -1
- package/template/index.html +18 -20
- package/template/main.js +24 -22
- package/template/src/DemoPage.vue +415 -362
- package/template/src/Plugin.vue +76 -85
- package/template/src/stores/index.js +3 -3
- package/template/src/stores/test-data.json +164 -172
- package/template/theme-layouts/AdditionalStyling.css +50 -50
- package/template/theme-layouts/PrivateLayout.vue +8 -12
- package/template/theme-layouts/PublicLayout.vue +8 -12
- package/template/theme-layouts/SystemLayout.vue +8 -12
- package/template/vite.extend.js +45 -0
- package/template/vite.config.js +0 -409
|
@@ -1,621 +1,644 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
2
|
+
<div class="mock-data-editor">
|
|
3
|
+
<div class="editor-description">
|
|
4
|
+
<p>
|
|
5
|
+
Edit mock data that simulates platform responses during development.
|
|
6
|
+
Changes are applied in memory and will reset on page reload.
|
|
7
|
+
</p>
|
|
8
|
+
</div>
|
|
9
|
+
|
|
10
|
+
<div class="data-sections">
|
|
11
|
+
<div class="data-section">
|
|
12
|
+
<div class="section-header" @click="toggleSection('theme')">
|
|
13
|
+
<span class="toggle-icon">{{
|
|
14
|
+
expandedSections.theme ? "▼" : "▶"
|
|
15
|
+
}}</span>
|
|
16
|
+
<h4>Theme Settings</h4>
|
|
17
|
+
</div>
|
|
18
|
+
<div v-if="expandedSections.theme" class="section-content">
|
|
19
|
+
<div class="color-grid">
|
|
20
|
+
<div
|
|
21
|
+
v-for="(value, key) in themeColors"
|
|
22
|
+
:key="key"
|
|
23
|
+
class="color-field"
|
|
24
|
+
>
|
|
25
|
+
<label>{{ formatLabel(key) }}</label>
|
|
26
|
+
<div class="color-input-wrapper">
|
|
27
|
+
<input
|
|
28
|
+
type="color"
|
|
29
|
+
:value="extractColor(value)"
|
|
30
|
+
@input="updateThemeColor(key, $event.target.value)"
|
|
31
|
+
class="color-picker"
|
|
32
|
+
/>
|
|
33
|
+
<input
|
|
34
|
+
type="text"
|
|
35
|
+
:value="value"
|
|
36
|
+
@input="updateThemeColor(key, $event.target.value)"
|
|
37
|
+
class="color-text"
|
|
38
|
+
/>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div class="data-section">
|
|
46
|
+
<div class="section-header" @click="toggleSection('navigation')">
|
|
47
|
+
<span class="toggle-icon">{{
|
|
48
|
+
expandedSections.navigation ? "▼" : "▶"
|
|
49
|
+
}}</span>
|
|
50
|
+
<h4>Navigation Items</h4>
|
|
51
|
+
</div>
|
|
52
|
+
<div v-if="expandedSections.navigation" class="section-content">
|
|
53
|
+
<div class="nav-items">
|
|
54
|
+
<div
|
|
55
|
+
v-for="(item, index) in navigationItems"
|
|
56
|
+
:key="index"
|
|
57
|
+
class="nav-item"
|
|
58
|
+
>
|
|
59
|
+
<input
|
|
60
|
+
v-model="item.title"
|
|
61
|
+
class="nav-input"
|
|
62
|
+
placeholder="Title"
|
|
63
|
+
/>
|
|
64
|
+
<input
|
|
65
|
+
v-model="item.route"
|
|
66
|
+
class="nav-input"
|
|
67
|
+
placeholder="Route"
|
|
68
|
+
/>
|
|
69
|
+
<button
|
|
70
|
+
class="btn-icon"
|
|
71
|
+
@click="removeNavItem(index)"
|
|
72
|
+
title="Remove"
|
|
73
|
+
>
|
|
74
|
+
×
|
|
75
|
+
</button>
|
|
76
|
+
</div>
|
|
77
|
+
<button class="btn-add" @click="addNavItem">
|
|
78
|
+
+ Add Navigation Item
|
|
79
|
+
</button>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div class="data-section">
|
|
85
|
+
<div class="section-header" @click="toggleSection('user')">
|
|
86
|
+
<span class="toggle-icon">{{
|
|
87
|
+
expandedSections.user ? "▼" : "▶"
|
|
88
|
+
}}</span>
|
|
89
|
+
<h4>User Session</h4>
|
|
90
|
+
</div>
|
|
91
|
+
<div v-if="expandedSections.user" class="section-content">
|
|
92
|
+
<div class="user-fields">
|
|
93
|
+
<div class="field-row">
|
|
94
|
+
<label>Authenticated:</label>
|
|
95
|
+
<label class="toggle-switch">
|
|
96
|
+
<input type="checkbox" v-model="userSession.authenticated" />
|
|
97
|
+
<span class="toggle-slider"></span>
|
|
98
|
+
</label>
|
|
99
|
+
</div>
|
|
100
|
+
<div class="field-row">
|
|
101
|
+
<label>User ID:</label>
|
|
102
|
+
<input
|
|
103
|
+
type="text"
|
|
104
|
+
v-model="userSession.userId"
|
|
105
|
+
class="field-input"
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
<div class="field-row">
|
|
109
|
+
<label>Username:</label>
|
|
110
|
+
<input
|
|
111
|
+
type="text"
|
|
112
|
+
v-model="userSession.username"
|
|
113
|
+
class="field-input"
|
|
114
|
+
/>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="field-row">
|
|
117
|
+
<label>Email:</label>
|
|
118
|
+
<input
|
|
119
|
+
type="email"
|
|
120
|
+
v-model="userSession.email"
|
|
121
|
+
class="field-input"
|
|
122
|
+
/>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<div class="data-section">
|
|
129
|
+
<div class="section-header" @click="toggleSection('permissions')">
|
|
130
|
+
<span class="toggle-icon">{{
|
|
131
|
+
expandedSections.permissions ? "▼" : "▶"
|
|
132
|
+
}}</span>
|
|
133
|
+
<h4>Permission Flags</h4>
|
|
134
|
+
</div>
|
|
135
|
+
<div v-if="expandedSections.permissions" class="section-content">
|
|
136
|
+
<div class="permissions-list">
|
|
137
|
+
<label
|
|
138
|
+
v-for="flag in availablePermissions"
|
|
139
|
+
:key="flag"
|
|
140
|
+
class="permission-item"
|
|
141
|
+
>
|
|
142
|
+
<input
|
|
143
|
+
type="checkbox"
|
|
144
|
+
:checked="activePermissions.includes(flag)"
|
|
145
|
+
@change="togglePermission(flag)"
|
|
146
|
+
/>
|
|
147
|
+
<span>{{ flag }}</span>
|
|
148
|
+
</label>
|
|
149
|
+
<div class="add-permission">
|
|
150
|
+
<input
|
|
151
|
+
v-model="newPermission"
|
|
152
|
+
placeholder="Add custom permission..."
|
|
153
|
+
class="field-input"
|
|
154
|
+
@keydown.enter="addPermission"
|
|
155
|
+
/>
|
|
156
|
+
<button class="btn-add-sm" @click="addPermission">Add</button>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<div class="editor-actions">
|
|
164
|
+
<button class="btn btn-secondary" @click="resetAllData">
|
|
165
|
+
Reset All to Defaults
|
|
166
|
+
</button>
|
|
167
|
+
<button class="btn btn-primary" @click="exportData">
|
|
168
|
+
Export as JSON
|
|
169
|
+
</button>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
156
172
|
</template>
|
|
157
173
|
|
|
158
174
|
<script setup>
|
|
159
|
-
import { ref, reactive, computed } from
|
|
175
|
+
import { ref, reactive, computed } from "vue"
|
|
160
176
|
|
|
161
177
|
const props = defineProps({
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
})
|
|
178
|
+
store: {
|
|
179
|
+
type: Object,
|
|
180
|
+
required: true,
|
|
181
|
+
},
|
|
182
|
+
})
|
|
167
183
|
|
|
168
184
|
const expandedSections = reactive({
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
})
|
|
185
|
+
theme: true,
|
|
186
|
+
navigation: false,
|
|
187
|
+
user: false,
|
|
188
|
+
permissions: false,
|
|
189
|
+
})
|
|
174
190
|
|
|
175
191
|
const themeColors = reactive({
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
})
|
|
192
|
+
background_color: "#ffffff",
|
|
193
|
+
text_color: "#333333",
|
|
194
|
+
primary_color: "#FFD600",
|
|
195
|
+
start_background_color: "#667eea",
|
|
196
|
+
start_text_color: "#ffffff",
|
|
197
|
+
final_background_color: "#4CAF50",
|
|
198
|
+
final_text_color: "#ffffff",
|
|
199
|
+
})
|
|
184
200
|
|
|
185
201
|
const navigationItems = reactive([
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
])
|
|
202
|
+
{ title: "Start", route: "/start" },
|
|
203
|
+
{ title: "Plugin", route: "/plugin" },
|
|
204
|
+
{ title: "Final", route: "/final" },
|
|
205
|
+
{ title: "Logout", route: "/logout", system_type: "logout" },
|
|
206
|
+
])
|
|
191
207
|
|
|
192
208
|
const userSession = reactive({
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
})
|
|
209
|
+
authenticated: false,
|
|
210
|
+
userId: "",
|
|
211
|
+
username: "",
|
|
212
|
+
email: "",
|
|
213
|
+
})
|
|
198
214
|
|
|
199
215
|
const availablePermissions = ref([
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
])
|
|
216
|
+
"admin",
|
|
217
|
+
"editor",
|
|
218
|
+
"viewer",
|
|
219
|
+
"can_upload",
|
|
220
|
+
"can_delete",
|
|
221
|
+
"can_share",
|
|
222
|
+
])
|
|
207
223
|
|
|
208
|
-
const activePermissions = ref([])
|
|
209
|
-
const newPermission = ref(
|
|
224
|
+
const activePermissions = ref([])
|
|
225
|
+
const newPermission = ref("")
|
|
210
226
|
|
|
211
227
|
function toggleSection(section) {
|
|
212
|
-
|
|
228
|
+
expandedSections[section] = !expandedSections[section]
|
|
213
229
|
}
|
|
214
230
|
|
|
215
231
|
function formatLabel(key) {
|
|
216
|
-
|
|
217
|
-
.replace(/_/g, ' ')
|
|
218
|
-
.replace(/\b\w/g, l => l.toUpperCase());
|
|
232
|
+
return key.replace(/_/g, " ").replace(/\b\w/g, (l) => l.toUpperCase())
|
|
219
233
|
}
|
|
220
234
|
|
|
221
235
|
function extractColor(value) {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
236
|
+
// Extract hex color from value (handle gradients, etc.)
|
|
237
|
+
if (typeof value !== "string") return "#ffffff"
|
|
238
|
+
const match = value.match(/#[0-9A-Fa-f]{6}/)
|
|
239
|
+
return match ? match[0] : "#ffffff"
|
|
226
240
|
}
|
|
227
241
|
|
|
228
242
|
function updateThemeColor(key, value) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
243
|
+
themeColors[key] = value
|
|
244
|
+
// Update store if available
|
|
245
|
+
if (props.store?.theme) {
|
|
246
|
+
props.store.theme[key] = value
|
|
247
|
+
}
|
|
248
|
+
console.log(`[DevTools] Theme ${key} updated:`, value)
|
|
235
249
|
}
|
|
236
250
|
|
|
237
251
|
function addNavItem() {
|
|
238
|
-
|
|
252
|
+
navigationItems.push({ title: "", route: "" })
|
|
239
253
|
}
|
|
240
254
|
|
|
241
255
|
function removeNavItem(index) {
|
|
242
|
-
|
|
256
|
+
navigationItems.splice(index, 1)
|
|
243
257
|
}
|
|
244
258
|
|
|
245
259
|
function togglePermission(flag) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
260
|
+
const index = activePermissions.value.indexOf(flag)
|
|
261
|
+
if (index > -1) {
|
|
262
|
+
activePermissions.value.splice(index, 1)
|
|
263
|
+
} else {
|
|
264
|
+
activePermissions.value.push(flag)
|
|
265
|
+
}
|
|
266
|
+
// Update store
|
|
267
|
+
if (props.store?.permissionFlags) {
|
|
268
|
+
props.store.permissionFlags.splice(
|
|
269
|
+
0,
|
|
270
|
+
props.store.permissionFlags.length,
|
|
271
|
+
...activePermissions.value,
|
|
272
|
+
)
|
|
273
|
+
}
|
|
274
|
+
console.log("[DevTools] Permissions updated:", activePermissions.value)
|
|
257
275
|
}
|
|
258
276
|
|
|
259
277
|
function addPermission() {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
278
|
+
if (
|
|
279
|
+
newPermission.value &&
|
|
280
|
+
!availablePermissions.value.includes(newPermission.value)
|
|
281
|
+
) {
|
|
282
|
+
availablePermissions.value.push(newPermission.value)
|
|
283
|
+
activePermissions.value.push(newPermission.value)
|
|
284
|
+
newPermission.value = ""
|
|
285
|
+
}
|
|
265
286
|
}
|
|
266
287
|
|
|
267
288
|
function resetAllData() {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
289
|
+
// Reset theme
|
|
290
|
+
Object.assign(themeColors, {
|
|
291
|
+
background_color: "#ffffff",
|
|
292
|
+
text_color: "#333333",
|
|
293
|
+
primary_color: "#FFD600",
|
|
294
|
+
start_background_color: "#667eea",
|
|
295
|
+
start_text_color: "#ffffff",
|
|
296
|
+
final_background_color: "#4CAF50",
|
|
297
|
+
final_text_color: "#ffffff",
|
|
298
|
+
})
|
|
299
|
+
|
|
300
|
+
// Reset navigation
|
|
301
|
+
navigationItems.splice(
|
|
302
|
+
0,
|
|
303
|
+
navigationItems.length,
|
|
304
|
+
{ title: "Start", route: "/start" },
|
|
305
|
+
{ title: "Plugin", route: "/plugin" },
|
|
306
|
+
{ title: "Final", route: "/final" },
|
|
307
|
+
{ title: "Logout", route: "/logout", system_type: "logout" },
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
// Reset user
|
|
311
|
+
Object.assign(userSession, {
|
|
312
|
+
authenticated: false,
|
|
313
|
+
userId: "",
|
|
314
|
+
username: "",
|
|
315
|
+
email: "",
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
// Reset permissions
|
|
319
|
+
activePermissions.value = []
|
|
320
|
+
|
|
321
|
+
console.log("[DevTools] All mock data reset to defaults")
|
|
299
322
|
}
|
|
300
323
|
|
|
301
324
|
async function exportData() {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
325
|
+
const data = {
|
|
326
|
+
theme: { ...themeColors },
|
|
327
|
+
navigation: [...navigationItems],
|
|
328
|
+
userSession: { ...userSession },
|
|
329
|
+
permissions: [...activePermissions.value],
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
try {
|
|
333
|
+
await navigator.clipboard.writeText(JSON.stringify(data, null, 2))
|
|
334
|
+
console.log("[DevTools] Mock data exported to clipboard")
|
|
335
|
+
} catch (err) {
|
|
336
|
+
console.error("[DevTools] Failed to export:", err)
|
|
337
|
+
}
|
|
315
338
|
}
|
|
316
339
|
</script>
|
|
317
340
|
|
|
318
341
|
<style scoped>
|
|
319
342
|
.mock-data-editor {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
343
|
+
display: flex;
|
|
344
|
+
flex-direction: column;
|
|
345
|
+
gap: 16px;
|
|
323
346
|
}
|
|
324
347
|
|
|
325
348
|
.editor-description {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
349
|
+
background: #2d2d2d;
|
|
350
|
+
padding: 12px 16px;
|
|
351
|
+
border-radius: 8px;
|
|
329
352
|
}
|
|
330
353
|
|
|
331
354
|
.editor-description p {
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
355
|
+
margin: 0;
|
|
356
|
+
font-size: 13px;
|
|
357
|
+
color: #888;
|
|
335
358
|
}
|
|
336
359
|
|
|
337
360
|
.data-sections {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
361
|
+
display: flex;
|
|
362
|
+
flex-direction: column;
|
|
363
|
+
gap: 8px;
|
|
341
364
|
}
|
|
342
365
|
|
|
343
366
|
.data-section {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
367
|
+
background: #2d2d2d;
|
|
368
|
+
border-radius: 8px;
|
|
369
|
+
overflow: hidden;
|
|
347
370
|
}
|
|
348
371
|
|
|
349
372
|
.section-header {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
373
|
+
display: flex;
|
|
374
|
+
align-items: center;
|
|
375
|
+
gap: 8px;
|
|
376
|
+
padding: 12px 16px;
|
|
377
|
+
cursor: pointer;
|
|
378
|
+
transition: background 0.2s;
|
|
356
379
|
}
|
|
357
380
|
|
|
358
381
|
.section-header:hover {
|
|
359
|
-
|
|
382
|
+
background: #3d3d3d;
|
|
360
383
|
}
|
|
361
384
|
|
|
362
385
|
.section-header h4 {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
386
|
+
margin: 0;
|
|
387
|
+
font-size: 13px;
|
|
388
|
+
font-weight: 500;
|
|
366
389
|
}
|
|
367
390
|
|
|
368
391
|
.toggle-icon {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
392
|
+
font-size: 10px;
|
|
393
|
+
color: #888;
|
|
394
|
+
width: 12px;
|
|
372
395
|
}
|
|
373
396
|
|
|
374
397
|
.section-content {
|
|
375
|
-
|
|
376
|
-
|
|
398
|
+
padding: 12px 16px;
|
|
399
|
+
border-top: 1px solid #3d3d3d;
|
|
377
400
|
}
|
|
378
401
|
|
|
379
402
|
/* Theme Colors */
|
|
380
403
|
.color-grid {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
404
|
+
display: grid;
|
|
405
|
+
grid-template-columns: repeat(2, 1fr);
|
|
406
|
+
gap: 12px;
|
|
384
407
|
}
|
|
385
408
|
|
|
386
409
|
.color-field label {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
410
|
+
display: block;
|
|
411
|
+
font-size: 11px;
|
|
412
|
+
color: #888;
|
|
413
|
+
margin-bottom: 4px;
|
|
391
414
|
}
|
|
392
415
|
|
|
393
416
|
.color-input-wrapper {
|
|
394
|
-
|
|
395
|
-
|
|
417
|
+
display: flex;
|
|
418
|
+
gap: 8px;
|
|
396
419
|
}
|
|
397
420
|
|
|
398
421
|
.color-picker {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
422
|
+
width: 40px;
|
|
423
|
+
height: 32px;
|
|
424
|
+
border: none;
|
|
425
|
+
border-radius: 4px;
|
|
426
|
+
cursor: pointer;
|
|
427
|
+
background: transparent;
|
|
405
428
|
}
|
|
406
429
|
|
|
407
430
|
.color-text {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
431
|
+
flex: 1;
|
|
432
|
+
background: #1e1e1e;
|
|
433
|
+
border: 1px solid #3d3d3d;
|
|
434
|
+
color: #e0e0e0;
|
|
435
|
+
padding: 6px 8px;
|
|
436
|
+
border-radius: 4px;
|
|
437
|
+
font-size: 12px;
|
|
438
|
+
font-family: "SF Mono", Monaco, monospace;
|
|
416
439
|
}
|
|
417
440
|
|
|
418
441
|
/* Navigation */
|
|
419
442
|
.nav-items {
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
443
|
+
display: flex;
|
|
444
|
+
flex-direction: column;
|
|
445
|
+
gap: 8px;
|
|
423
446
|
}
|
|
424
447
|
|
|
425
448
|
.nav-item {
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
449
|
+
display: flex;
|
|
450
|
+
gap: 8px;
|
|
451
|
+
align-items: center;
|
|
429
452
|
}
|
|
430
453
|
|
|
431
454
|
.nav-input {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
455
|
+
flex: 1;
|
|
456
|
+
background: #1e1e1e;
|
|
457
|
+
border: 1px solid #3d3d3d;
|
|
458
|
+
color: #e0e0e0;
|
|
459
|
+
padding: 8px 12px;
|
|
460
|
+
border-radius: 4px;
|
|
461
|
+
font-size: 12px;
|
|
439
462
|
}
|
|
440
463
|
|
|
441
464
|
.btn-icon {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
465
|
+
background: transparent;
|
|
466
|
+
border: none;
|
|
467
|
+
color: #888;
|
|
468
|
+
font-size: 18px;
|
|
469
|
+
cursor: pointer;
|
|
470
|
+
padding: 4px 8px;
|
|
448
471
|
}
|
|
449
472
|
|
|
450
473
|
.btn-icon:hover {
|
|
451
|
-
|
|
474
|
+
color: #ff6b6b;
|
|
452
475
|
}
|
|
453
476
|
|
|
454
477
|
.btn-add {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
478
|
+
background: #3d3d3d;
|
|
479
|
+
border: 1px dashed #555;
|
|
480
|
+
color: #888;
|
|
481
|
+
padding: 8px;
|
|
482
|
+
border-radius: 4px;
|
|
483
|
+
cursor: pointer;
|
|
484
|
+
font-size: 12px;
|
|
485
|
+
text-align: center;
|
|
486
|
+
transition: all 0.2s;
|
|
464
487
|
}
|
|
465
488
|
|
|
466
489
|
.btn-add:hover {
|
|
467
|
-
|
|
468
|
-
|
|
490
|
+
background: #4d4d4d;
|
|
491
|
+
color: #e0e0e0;
|
|
469
492
|
}
|
|
470
493
|
|
|
471
494
|
/* User Session */
|
|
472
495
|
.user-fields {
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
496
|
+
display: flex;
|
|
497
|
+
flex-direction: column;
|
|
498
|
+
gap: 12px;
|
|
476
499
|
}
|
|
477
500
|
|
|
478
501
|
.field-row {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
502
|
+
display: flex;
|
|
503
|
+
align-items: center;
|
|
504
|
+
gap: 12px;
|
|
482
505
|
}
|
|
483
506
|
|
|
484
507
|
.field-row > label:first-child {
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
508
|
+
min-width: 100px;
|
|
509
|
+
font-size: 12px;
|
|
510
|
+
color: #888;
|
|
488
511
|
}
|
|
489
512
|
|
|
490
513
|
.field-input {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
514
|
+
flex: 1;
|
|
515
|
+
background: #1e1e1e;
|
|
516
|
+
border: 1px solid #3d3d3d;
|
|
517
|
+
color: #e0e0e0;
|
|
518
|
+
padding: 8px 12px;
|
|
519
|
+
border-radius: 4px;
|
|
520
|
+
font-size: 12px;
|
|
498
521
|
}
|
|
499
522
|
|
|
500
523
|
/* Toggle Switch */
|
|
501
524
|
.toggle-switch {
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
525
|
+
position: relative;
|
|
526
|
+
display: inline-block;
|
|
527
|
+
width: 44px;
|
|
528
|
+
height: 24px;
|
|
506
529
|
}
|
|
507
530
|
|
|
508
531
|
.toggle-switch input {
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
532
|
+
opacity: 0;
|
|
533
|
+
width: 0;
|
|
534
|
+
height: 0;
|
|
512
535
|
}
|
|
513
536
|
|
|
514
537
|
.toggle-slider {
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
538
|
+
position: absolute;
|
|
539
|
+
cursor: pointer;
|
|
540
|
+
top: 0;
|
|
541
|
+
left: 0;
|
|
542
|
+
right: 0;
|
|
543
|
+
bottom: 0;
|
|
544
|
+
background-color: #3d3d3d;
|
|
545
|
+
transition: 0.3s;
|
|
546
|
+
border-radius: 24px;
|
|
524
547
|
}
|
|
525
548
|
|
|
526
549
|
.toggle-slider:before {
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
550
|
+
position: absolute;
|
|
551
|
+
content: "";
|
|
552
|
+
height: 18px;
|
|
553
|
+
width: 18px;
|
|
554
|
+
left: 3px;
|
|
555
|
+
bottom: 3px;
|
|
556
|
+
background-color: #888;
|
|
557
|
+
transition: 0.3s;
|
|
558
|
+
border-radius: 50%;
|
|
536
559
|
}
|
|
537
560
|
|
|
538
561
|
input:checked + .toggle-slider {
|
|
539
|
-
|
|
562
|
+
background-color: #61dafb;
|
|
540
563
|
}
|
|
541
564
|
|
|
542
565
|
input:checked + .toggle-slider:before {
|
|
543
|
-
|
|
544
|
-
|
|
566
|
+
transform: translateX(20px);
|
|
567
|
+
background-color: #1e1e1e;
|
|
545
568
|
}
|
|
546
569
|
|
|
547
570
|
/* Permissions */
|
|
548
571
|
.permissions-list {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
572
|
+
display: flex;
|
|
573
|
+
flex-direction: column;
|
|
574
|
+
gap: 8px;
|
|
552
575
|
}
|
|
553
576
|
|
|
554
577
|
.permission-item {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
578
|
+
display: flex;
|
|
579
|
+
align-items: center;
|
|
580
|
+
gap: 8px;
|
|
581
|
+
font-size: 12px;
|
|
582
|
+
cursor: pointer;
|
|
560
583
|
}
|
|
561
584
|
|
|
562
585
|
.permission-item input[type="checkbox"] {
|
|
563
|
-
|
|
586
|
+
accent-color: #61dafb;
|
|
564
587
|
}
|
|
565
588
|
|
|
566
589
|
.add-permission {
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
590
|
+
display: flex;
|
|
591
|
+
gap: 8px;
|
|
592
|
+
margin-top: 8px;
|
|
570
593
|
}
|
|
571
594
|
|
|
572
595
|
.btn-add-sm {
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
596
|
+
background: #3d3d3d;
|
|
597
|
+
border: none;
|
|
598
|
+
color: #e0e0e0;
|
|
599
|
+
padding: 8px 12px;
|
|
600
|
+
border-radius: 4px;
|
|
601
|
+
cursor: pointer;
|
|
602
|
+
font-size: 12px;
|
|
580
603
|
}
|
|
581
604
|
|
|
582
605
|
.btn-add-sm:hover {
|
|
583
|
-
|
|
606
|
+
background: #4d4d4d;
|
|
584
607
|
}
|
|
585
608
|
|
|
586
609
|
/* Actions */
|
|
587
610
|
.editor-actions {
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
611
|
+
display: flex;
|
|
612
|
+
gap: 8px;
|
|
613
|
+
justify-content: flex-end;
|
|
614
|
+
padding-top: 16px;
|
|
615
|
+
border-top: 1px solid #3d3d3d;
|
|
593
616
|
}
|
|
594
617
|
|
|
595
618
|
.btn {
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
619
|
+
padding: 8px 16px;
|
|
620
|
+
border: none;
|
|
621
|
+
border-radius: 4px;
|
|
622
|
+
cursor: pointer;
|
|
623
|
+
font-size: 12px;
|
|
624
|
+
transition: all 0.2s;
|
|
602
625
|
}
|
|
603
626
|
|
|
604
627
|
.btn-primary {
|
|
605
|
-
|
|
606
|
-
|
|
628
|
+
background: #61dafb;
|
|
629
|
+
color: #1e1e1e;
|
|
607
630
|
}
|
|
608
631
|
|
|
609
632
|
.btn-primary:hover {
|
|
610
|
-
|
|
633
|
+
background: #4fc3f7;
|
|
611
634
|
}
|
|
612
635
|
|
|
613
636
|
.btn-secondary {
|
|
614
|
-
|
|
615
|
-
|
|
637
|
+
background: #3d3d3d;
|
|
638
|
+
color: #e0e0e0;
|
|
616
639
|
}
|
|
617
640
|
|
|
618
641
|
.btn-secondary:hover {
|
|
619
|
-
|
|
642
|
+
background: #4d4d4d;
|
|
620
643
|
}
|
|
621
644
|
</style>
|