domma-cms 0.10.0 → 0.12.0
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/CLAUDE.md +248 -159
- package/admin/css/admin.css +1 -1
- package/admin/js/api.js +1 -1
- package/admin/js/app.js +7 -3
- package/admin/js/config/sidebar-config.js +1 -1
- package/admin/js/http-interceptor.js +1 -0
- package/admin/js/lib/safe-html.js +1 -0
- package/admin/js/templates/layouts.html +5 -4
- package/admin/js/templates/notifications.html +14 -0
- package/admin/js/templates/plugin-marketplace.html +16 -0
- package/admin/js/templates/plugins.html +17 -5
- package/admin/js/views/index.js +1 -1
- package/admin/js/views/layouts.js +1 -16
- package/admin/js/views/notifications.js +1 -0
- package/admin/js/views/plugin-marketplace.js +1 -0
- package/admin/js/views/plugins.js +16 -16
- package/config/navigation.json +5 -72
- package/config/plugins.json +10 -14
- package/config/presets.json +50 -13
- package/config/site.json +11 -63
- package/package.json +2 -1
- package/plugins/_template/admin/templates/index.html +17 -0
- package/plugins/_template/admin/views/index.js +19 -0
- package/plugins/_template/config.js +8 -0
- package/plugins/_template/plugin.js +23 -0
- package/plugins/_template/plugin.json +34 -0
- package/plugins/analytics/plugin.json +41 -31
- package/plugins/blog/admin/templates/blog.html +22 -0
- package/plugins/blog/admin/templates/categories.html +7 -0
- package/plugins/blog/admin/templates/comments.html +11 -0
- package/plugins/blog/admin/templates/post-editor.html +97 -0
- package/plugins/blog/admin/templates/settings.html +11 -0
- package/plugins/blog/admin/views/blog.js +183 -0
- package/plugins/blog/admin/views/categories.js +235 -0
- package/plugins/blog/admin/views/comments.js +187 -0
- package/plugins/blog/admin/views/post-editor.js +291 -0
- package/plugins/blog/admin/views/settings.js +100 -0
- package/plugins/blog/collections/categories/schema.json +12 -0
- package/plugins/blog/collections/comments/schema.json +16 -0
- package/plugins/blog/collections/posts/schema.json +19 -0
- package/plugins/blog/config.js +8 -0
- package/plugins/blog/plugin.js +352 -0
- package/plugins/blog/plugin.json +96 -0
- package/plugins/blog/roles/blog-author.json +10 -0
- package/plugins/blog/roles/blog-editor.json +12 -0
- package/plugins/blog/templates/author.html +9 -0
- package/plugins/blog/templates/category.html +9 -0
- package/plugins/blog/templates/index.html +9 -0
- package/plugins/blog/templates/post.html +17 -0
- package/plugins/blog/templates/tag.html +9 -0
- package/plugins/contacts/collections/user-contact-groups/schema.json +1 -1
- package/plugins/contacts/collections/user-contacts/schema.json +1 -1
- package/plugins/contacts/plugin.js +4 -10
- package/plugins/contacts/plugin.json +13 -3
- package/plugins/notes/collections/user-notes/schema.json +1 -1
- package/plugins/notes/plugin.js +3 -9
- package/plugins/notes/plugin.json +13 -3
- package/plugins/site-search/plugin.json +5 -2
- package/plugins/theme-switcher/plugin.json +1 -1
- package/plugins/todo/collections/todos/schema.json +1 -1
- package/plugins/todo/plugin.js +3 -9
- package/plugins/todo/plugin.json +13 -3
- package/public/css/site.css +1 -1
- package/scripts/build.js +48 -0
- package/scripts/create-plugin.js +113 -0
- package/scripts/fresh.js +6 -7
- package/scripts/gen-instance-secret.js +46 -0
- package/scripts/reset.js +3 -3
- package/scripts/setup.js +31 -13
- package/server/middleware/auth.js +48 -0
- package/server/middleware/managerAuth.js +36 -0
- package/server/routes/api/actions.js +1 -1
- package/server/routes/api/auth.js +4 -3
- package/server/routes/api/layouts.js +173 -49
- package/server/routes/api/notifications.js +155 -0
- package/server/routes/api/plugin-marketplace.js +75 -0
- package/server/routes/api/users.js +1 -1
- package/server/routes/api/views.js +1 -1
- package/server/routes/public.js +4 -9
- package/server/server.js +32 -3
- package/server/services/actions.js +1 -1
- package/server/services/managerClient.js +182 -0
- package/server/services/permissionRegistry.js +245 -173
- package/server/services/pluginInstaller.js +301 -0
- package/server/services/plugins.js +117 -10
- package/server/services/presetCollections.js +66 -251
- package/server/services/renderer.js +99 -0
- package/server/services/roles.js +191 -39
- package/server/services/users.js +1 -1
- package/server/services/views.js +1 -1
- package/server/templates/page.html +2 -2
- package/plugins/docs/admin/templates/docs.html +0 -69
- package/plugins/docs/admin/views/docs.js +0 -276
- package/plugins/docs/config.js +0 -8
- package/plugins/docs/data/documents/57e003f0-68f2-47dc-9c36-ed4b10ed3deb.json +0 -11
- package/plugins/docs/data/folders.json +0 -9
- package/plugins/docs/data/templates.json +0 -1
- package/plugins/docs/data/versions/57e003f0-68f2-47dc-9c36-ed4b10ed3deb/1.json +0 -5
- package/plugins/docs/plugin.js +0 -375
- package/plugins/docs/plugin.json +0 -23
- package/plugins/form-builder/data/forms/contacts.json +0 -66
- package/plugins/form-builder/data/forms/enquiries.json +0 -103
- package/plugins/form-builder/data/forms/feedback.json +0 -131
- package/plugins/form-builder/data/forms/notes.json +0 -79
- package/plugins/form-builder/data/forms/to-do.json +0 -100
- package/plugins/form-builder/data/submissions/contacts.json +0 -1
- package/plugins/form-builder/data/submissions/enquiries.json +0 -1
- package/plugins/form-builder/data/submissions/feedback.json +0 -1
- package/plugins/form-builder/data/submissions/notes.json +0 -1
- package/plugins/form-builder/data/submissions/to-do.json +0 -1
- package/plugins/garage/admin/templates/garage.html +0 -111
- package/plugins/garage/admin/views/garage.js +0 -622
- package/plugins/garage/collections/garage-vehicles/schema.json +0 -101
- package/plugins/garage/config.js +0 -18
- package/plugins/garage/data/vehicles.json +0 -70
- package/plugins/garage/plugin.js +0 -398
- package/plugins/garage/plugin.json +0 -33
- package/scripts/seed.js +0 -1996
- package/server/services/userTypes.js +0 -227
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"slug": "feedback",
|
|
3
|
-
"title": "Feedback",
|
|
4
|
-
"description": "Share your feedback with us",
|
|
5
|
-
"fields": [
|
|
6
|
-
{
|
|
7
|
-
"name": "name",
|
|
8
|
-
"type": "string",
|
|
9
|
-
"label": "Your Name",
|
|
10
|
-
"required": true,
|
|
11
|
-
"placeholder": "Please enter your full name",
|
|
12
|
-
"helper": "Please enter your full name",
|
|
13
|
-
"validation": {
|
|
14
|
-
"min": 2,
|
|
15
|
-
"max": 100
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"name": "email",
|
|
20
|
-
"type": "email",
|
|
21
|
-
"label": "Email Address",
|
|
22
|
-
"required": true,
|
|
23
|
-
"placeholder": "your@email.com",
|
|
24
|
-
"helper": "Please enter your email address"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"name": "rating",
|
|
28
|
-
"type": "select",
|
|
29
|
-
"label": "Overall Rating",
|
|
30
|
-
"required": true,
|
|
31
|
-
"helper": "Tell us how we are doing!",
|
|
32
|
-
"options": [
|
|
33
|
-
{
|
|
34
|
-
"value": "none",
|
|
35
|
-
"label": "Please Choose"
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"value": "excellent",
|
|
39
|
-
"label": "Excellent"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"value": "good",
|
|
43
|
-
"label": "Good"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"value": "average",
|
|
47
|
-
"label": "Average"
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"value": "poor",
|
|
51
|
-
"label": "Poor"
|
|
52
|
-
}
|
|
53
|
-
]
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"name": "category",
|
|
57
|
-
"type": "select",
|
|
58
|
-
"label": "Category",
|
|
59
|
-
"required": true,
|
|
60
|
-
"placeholder": "Please select a category",
|
|
61
|
-
"helper": "",
|
|
62
|
-
"options": [
|
|
63
|
-
{
|
|
64
|
-
"value": "general",
|
|
65
|
-
"label": "General"
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"value": "bug-report",
|
|
69
|
-
"label": "Bug Report"
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"value": "feature-request",
|
|
73
|
-
"label": "Feature Request"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"value": "praise",
|
|
77
|
-
"label": "Praise"
|
|
78
|
-
}
|
|
79
|
-
]
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
"name": "subject",
|
|
83
|
-
"type": "string",
|
|
84
|
-
"label": "Subject",
|
|
85
|
-
"required": true,
|
|
86
|
-
"placeholder": "Brief summary of your feedback",
|
|
87
|
-
"helper": "",
|
|
88
|
-
"validation": {
|
|
89
|
-
"max": 200
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
"name": "message",
|
|
94
|
-
"type": "textarea",
|
|
95
|
-
"label": "Your Feedback",
|
|
96
|
-
"required": true,
|
|
97
|
-
"placeholder": "Please share your thoughts in detail…",
|
|
98
|
-
"helper": "Please share your thoughts in detail…",
|
|
99
|
-
"rows": 4,
|
|
100
|
-
"validation": {
|
|
101
|
-
"min": 10,
|
|
102
|
-
"max": 2000
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
],
|
|
106
|
-
"settings": {
|
|
107
|
-
"submitText": "Submit Feedback",
|
|
108
|
-
"successMessage": "Thank you for your feedback! We appreciate you taking the time.",
|
|
109
|
-
"layout": "stacked",
|
|
110
|
-
"honeypot": true,
|
|
111
|
-
"rateLimitPerMinute": 3
|
|
112
|
-
},
|
|
113
|
-
"actions": {
|
|
114
|
-
"email": {
|
|
115
|
-
"enabled": true,
|
|
116
|
-
"recipients": "",
|
|
117
|
-
"subjectPrefix": "[feedback]"
|
|
118
|
-
},
|
|
119
|
-
"webhook": {
|
|
120
|
-
"enabled": false,
|
|
121
|
-
"url": "",
|
|
122
|
-
"method": "POST"
|
|
123
|
-
},
|
|
124
|
-
"collection": {
|
|
125
|
-
"enabled": true,
|
|
126
|
-
"slug": "feedback"
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
"createdAt": "2026-03-17T12:35:44.569Z",
|
|
130
|
-
"updatedAt": "2026-03-17T12:35:44.569Z"
|
|
131
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"slug": "notes",
|
|
3
|
-
"title": "Notes",
|
|
4
|
-
"description": "Free-form notes with categories and tags.",
|
|
5
|
-
"fields": [
|
|
6
|
-
{
|
|
7
|
-
"name": "title",
|
|
8
|
-
"type": "string",
|
|
9
|
-
"label": "Title",
|
|
10
|
-
"required": true,
|
|
11
|
-
"placeholder": "Note title"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"name": "content",
|
|
15
|
-
"type": "textarea",
|
|
16
|
-
"label": "Content",
|
|
17
|
-
"required": true,
|
|
18
|
-
"placeholder": "Write your note here…",
|
|
19
|
-
"rows": 5
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"name": "category",
|
|
23
|
-
"type": "select",
|
|
24
|
-
"label": "Category",
|
|
25
|
-
"required": false,
|
|
26
|
-
"options": [
|
|
27
|
-
{
|
|
28
|
-
"value": "general",
|
|
29
|
-
"label": "General"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"value": "idea",
|
|
33
|
-
"label": "Idea"
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"value": "reminder",
|
|
37
|
-
"label": "Reminder"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"value": "reference",
|
|
41
|
-
"label": "Reference"
|
|
42
|
-
}
|
|
43
|
-
]
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"name": "tags",
|
|
47
|
-
"type": "string",
|
|
48
|
-
"label": "Tags",
|
|
49
|
-
"required": false,
|
|
50
|
-
"placeholder": "Comma-separated tags",
|
|
51
|
-
"helper": "Separate tags with commas"
|
|
52
|
-
}
|
|
53
|
-
],
|
|
54
|
-
"settings": {
|
|
55
|
-
"submitText": "Save Note",
|
|
56
|
-
"successMessage": "Note saved successfully.",
|
|
57
|
-
"layout": "stacked",
|
|
58
|
-
"honeypot": true,
|
|
59
|
-
"rateLimitPerMinute": 3
|
|
60
|
-
},
|
|
61
|
-
"actions": {
|
|
62
|
-
"email": {
|
|
63
|
-
"enabled": false,
|
|
64
|
-
"recipients": "",
|
|
65
|
-
"subjectPrefix": "[notes]"
|
|
66
|
-
},
|
|
67
|
-
"webhook": {
|
|
68
|
-
"enabled": false,
|
|
69
|
-
"url": "",
|
|
70
|
-
"method": "POST"
|
|
71
|
-
},
|
|
72
|
-
"collection": {
|
|
73
|
-
"enabled": true,
|
|
74
|
-
"slug": "notes"
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
"createdAt": "2026-03-17T12:35:44.569Z",
|
|
78
|
-
"updatedAt": "2026-03-17T12:35:44.569Z"
|
|
79
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"slug": "to-do",
|
|
3
|
-
"title": "To-Do",
|
|
4
|
-
"description": "Task tracking with status, priority, and due dates.",
|
|
5
|
-
"fields": [
|
|
6
|
-
{
|
|
7
|
-
"name": "title",
|
|
8
|
-
"type": "string",
|
|
9
|
-
"label": "Title",
|
|
10
|
-
"required": true,
|
|
11
|
-
"placeholder": "Task title"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"name": "description",
|
|
15
|
-
"type": "textarea",
|
|
16
|
-
"label": "Description",
|
|
17
|
-
"required": false,
|
|
18
|
-
"placeholder": "Task details…",
|
|
19
|
-
"rows": 3
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"name": "status",
|
|
23
|
-
"type": "select",
|
|
24
|
-
"label": "Status",
|
|
25
|
-
"required": true,
|
|
26
|
-
"options": [
|
|
27
|
-
{
|
|
28
|
-
"value": "pending",
|
|
29
|
-
"label": "Pending"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"value": "in-progress",
|
|
33
|
-
"label": "In Progress"
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
"value": "done",
|
|
37
|
-
"label": "Done"
|
|
38
|
-
}
|
|
39
|
-
]
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"name": "priority",
|
|
43
|
-
"type": "select",
|
|
44
|
-
"label": "Priority",
|
|
45
|
-
"required": false,
|
|
46
|
-
"options": [
|
|
47
|
-
{
|
|
48
|
-
"value": "low",
|
|
49
|
-
"label": "Low"
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"value": "medium",
|
|
53
|
-
"label": "Medium"
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"value": "high",
|
|
57
|
-
"label": "High"
|
|
58
|
-
}
|
|
59
|
-
]
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
"name": "due_date",
|
|
63
|
-
"type": "date",
|
|
64
|
-
"label": "Due Date",
|
|
65
|
-
"required": false
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"name": "assigned_to",
|
|
69
|
-
"type": "string",
|
|
70
|
-
"label": "Assigned To",
|
|
71
|
-
"required": false,
|
|
72
|
-
"placeholder": "Name or email"
|
|
73
|
-
}
|
|
74
|
-
],
|
|
75
|
-
"settings": {
|
|
76
|
-
"submitText": "Add Task",
|
|
77
|
-
"successMessage": "Task added successfully.",
|
|
78
|
-
"layout": "stacked",
|
|
79
|
-
"honeypot": true,
|
|
80
|
-
"rateLimitPerMinute": 3
|
|
81
|
-
},
|
|
82
|
-
"actions": {
|
|
83
|
-
"email": {
|
|
84
|
-
"enabled": false,
|
|
85
|
-
"recipients": "",
|
|
86
|
-
"subjectPrefix": "[to-do]"
|
|
87
|
-
},
|
|
88
|
-
"webhook": {
|
|
89
|
-
"enabled": false,
|
|
90
|
-
"url": "",
|
|
91
|
-
"method": "POST"
|
|
92
|
-
},
|
|
93
|
-
"collection": {
|
|
94
|
-
"enabled": true,
|
|
95
|
-
"slug": "to-do"
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
"createdAt": "2026-03-17T12:35:44.569Z",
|
|
99
|
-
"updatedAt": "2026-03-17T12:35:44.569Z"
|
|
100
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[]
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
<div class="garage-plugin">
|
|
2
|
-
|
|
3
|
-
<!-- Lookup Card -->
|
|
4
|
-
<div class="card mb-4">
|
|
5
|
-
<div class="card-header" style="display:flex;align-items:center;gap:0.5rem;">
|
|
6
|
-
<span data-icon="truck"></span>
|
|
7
|
-
<strong>Vehicle Lookup</strong>
|
|
8
|
-
</div>
|
|
9
|
-
<div class="card-body">
|
|
10
|
-
<div style="display:flex;gap:0.75rem;align-items:center;flex-wrap:wrap;">
|
|
11
|
-
<input
|
|
12
|
-
id="reg-input"
|
|
13
|
-
type="text"
|
|
14
|
-
class="form-input"
|
|
15
|
-
placeholder="AB12 CDE"
|
|
16
|
-
maxlength="8"
|
|
17
|
-
autocomplete="off"
|
|
18
|
-
spellcheck="false"
|
|
19
|
-
style="width:160px;background:#FFD900;color:#000;font-family:'Arial Black',Arial,sans-serif;font-size:1.25rem;font-weight:900;text-transform:uppercase;text-align:center;letter-spacing:3px;border:3px solid #000;border-radius:6px;padding:0.4rem 0.5rem;"
|
|
20
|
-
>
|
|
21
|
-
<button id="lookup-btn" class="btn btn-primary">
|
|
22
|
-
<span data-icon="search"></span> Look Up
|
|
23
|
-
</button>
|
|
24
|
-
<span id="rate-limit-info" style="font-size:0.8rem;color:var(--dm-text-muted,#888);"></span>
|
|
25
|
-
</div>
|
|
26
|
-
<div id="lookup-error" style="display:none;margin-top:0.75rem;" class="text-danger"></div>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
|
|
30
|
-
<!-- Tabs -->
|
|
31
|
-
<div id="garage-tabs" class="tabs">
|
|
32
|
-
<div class="tab-list">
|
|
33
|
-
<button class="tab-item active">Results</button>
|
|
34
|
-
<button class="tab-item" id="tab-btn-garage">My Garage</button>
|
|
35
|
-
<button class="tab-item" id="tab-btn-history">History</button>
|
|
36
|
-
<button class="tab-item" id="tab-btn-settings"><span data-icon="settings"></span> Settings</button>
|
|
37
|
-
</div>
|
|
38
|
-
<div class="tab-content">
|
|
39
|
-
|
|
40
|
-
<!-- Results Tab -->
|
|
41
|
-
<div class="tab-panel active" id="tab-results">
|
|
42
|
-
<div id="vehicle-result" style="display:none;margin-top:1rem;"></div>
|
|
43
|
-
<div id="result-empty" style="text-align:center;padding:3rem 1rem;color:var(--dm-text-muted,#888);">
|
|
44
|
-
<span data-icon="truck"
|
|
45
|
-
style="font-size:2.5rem;display:block;margin-bottom:0.75rem;opacity:0.4;"></span>
|
|
46
|
-
Enter a registration number above to look up a vehicle.
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
|
|
50
|
-
<!-- My Garage Tab -->
|
|
51
|
-
<div class="tab-panel" id="tab-garage">
|
|
52
|
-
<div style="display:flex;align-items:center;margin:1rem 0 0.75rem;">
|
|
53
|
-
<span id="garage-count" style="font-size:0.8rem;color:var(--dm-text-muted,#888);"></span>
|
|
54
|
-
</div>
|
|
55
|
-
<div id="garage-table" style="border-radius:8px;overflow:hidden;"></div>
|
|
56
|
-
<div id="garage-empty"
|
|
57
|
-
style="display:none;text-align:center;padding:3rem 1rem;color:var(--dm-text-muted,#888);">
|
|
58
|
-
<span data-icon="truck"
|
|
59
|
-
style="font-size:2.5rem;display:block;margin-bottom:0.75rem;opacity:0.4;"></span>
|
|
60
|
-
No saved vehicles yet. Look up a vehicle and save it to your garage.
|
|
61
|
-
</div>
|
|
62
|
-
</div>
|
|
63
|
-
|
|
64
|
-
<!-- History Tab -->
|
|
65
|
-
<div class="tab-panel" id="tab-history">
|
|
66
|
-
<div style="display:flex;gap:0.5rem;align-items:center;margin:1rem 0 0.75rem;flex-wrap:wrap;">
|
|
67
|
-
<span id="history-count" style="font-size:0.8rem;color:var(--dm-text-muted,#888);flex:1;"></span>
|
|
68
|
-
<button id="clear-history-btn" class="btn btn-sm btn-danger">
|
|
69
|
-
<span data-icon="trash"></span> Clear History
|
|
70
|
-
</button>
|
|
71
|
-
</div>
|
|
72
|
-
<div id="history-table" style="border-radius:8px;overflow:hidden;"></div>
|
|
73
|
-
<div id="history-empty"
|
|
74
|
-
style="display:none;text-align:center;padding:3rem 1rem;color:var(--dm-text-muted,#888);">
|
|
75
|
-
No lookup history yet.
|
|
76
|
-
</div>
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
<!-- Settings Tab -->
|
|
80
|
-
<div class="tab-panel" id="tab-settings">
|
|
81
|
-
<div style="max-width:480px;margin-top:1rem;">
|
|
82
|
-
<div class="card">
|
|
83
|
-
<div class="card-header" style="display:flex;align-items:center;gap:0.5rem;">
|
|
84
|
-
<span data-icon="key"></span>
|
|
85
|
-
<strong>DVLA API Configuration</strong>
|
|
86
|
-
</div>
|
|
87
|
-
<div class="card-body">
|
|
88
|
-
<p style="font-size:0.87rem;color:var(--dm-text-muted,#888);margin:0 0 1rem;">
|
|
89
|
-
An API key from the DVLA Vehicle Enquiry Service is required to look up vehicle details.
|
|
90
|
-
Obtain yours at the
|
|
91
|
-
<a href="https://developer-portal.driver-vehicle-licensing.api.gov.uk" target="_blank"
|
|
92
|
-
rel="noopener">DVLA developer portal</a>.
|
|
93
|
-
</p>
|
|
94
|
-
<div id="settings-key-status" style="margin-bottom:1rem;font-size:0.87rem;"></div>
|
|
95
|
-
<label style="display:block;font-size:0.9rem;font-weight:500;margin-bottom:0.35rem;">API
|
|
96
|
-
Key</label>
|
|
97
|
-
<input id="settings-api-key" type="password" class="form-input"
|
|
98
|
-
placeholder="Paste your DVLA API key" autocomplete="off"
|
|
99
|
-
style="width:100%;margin-bottom:1rem;">
|
|
100
|
-
<button id="settings-save-btn" class="btn btn-primary">
|
|
101
|
-
<span data-icon="save"></span> Save
|
|
102
|
-
</button>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
|
|
108
|
-
</div>
|
|
109
|
-
</div>
|
|
110
|
-
|
|
111
|
-
</div>
|