@illuminateeducation/dna-atd-frontend 1.0.1-DNAATD-2189.0 → 1.0.5
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 +3 -4
- package/dist/AdminLayout-BQWZADPC.js +74 -0
- package/dist/AdminLayout-BQWZADPC.js.map +1 -0
- package/dist/AdminLayout-BaO704Tp.cjs +2 -0
- package/dist/AdminLayout-BaO704Tp.cjs.map +1 -0
- package/dist/CustomizationView-BJlqBq4I.js +15 -0
- package/dist/CustomizationView-BJlqBq4I.js.map +1 -0
- package/dist/CustomizationView-BRNwaKvj.cjs +2 -0
- package/dist/CustomizationView-BRNwaKvj.cjs.map +1 -0
- package/dist/HomeView-7jy27idX.js +10 -0
- package/dist/HomeView-7jy27idX.js.map +1 -0
- package/dist/HomeView-D6NWAtxc.cjs +2 -0
- package/dist/HomeView-D6NWAtxc.cjs.map +1 -0
- package/dist/NotFoundView-BCWgZLYs.js +28 -0
- package/dist/NotFoundView-BCWgZLYs.js.map +1 -0
- package/dist/NotFoundView-CNvAC47u.cjs +2 -0
- package/dist/NotFoundView-CNvAC47u.cjs.map +1 -0
- package/dist/ValidationView-DY83tE4M.js +15 -0
- package/dist/ValidationView-DY83tE4M.js.map +1 -0
- package/dist/ValidationView-ltSgO4AC.cjs +2 -0
- package/dist/ValidationView-ltSgO4AC.cjs.map +1 -0
- package/dist/assets/dna-atd-frontend.css +1 -0
- package/dist/index-1yktdPHs.cjs +2 -0
- package/dist/index-1yktdPHs.cjs.map +1 -0
- package/dist/index-CiZS9VrS.js +461 -0
- package/dist/index-CiZS9VrS.js.map +1 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.es.js +30 -0
- package/dist/index.es.js.map +1 -0
- package/package.json +11 -21
- package/dist/.vite/manifest.json +0 -87
- package/dist/assets/AdminLayout.css +0 -1
- package/dist/assets/AdminLayout.js +0 -1
- package/dist/assets/CustomizationView.css +0 -1
- package/dist/assets/CustomizationView.js +0 -1
- package/dist/assets/HomeView.css +0 -1
- package/dist/assets/HomeView.js +0 -1
- package/dist/assets/NotFoundView.css +0 -1
- package/dist/assets/NotFoundView.js +0 -1
- package/dist/assets/ValidationView.css +0 -1
- package/dist/assets/ValidationView.js +0 -1
- package/dist/assets/_plugin-vue_export-helper.js +0 -1
- package/dist/assets/index.css +0 -1
- package/dist/assets/index.js +0 -2
- package/dist/index.html +0 -14
- package/index.js +0 -1
- package/src/App.vue +0 -68
- package/src/__tests__/App.spec.js +0 -26
- package/src/components/common/BaseButton.vue +0 -20
- package/src/components/common/BaseInput.vue +0 -27
- package/src/components/common/BaseModal.vue +0 -37
- package/src/composables/useAsync.js +0 -34
- package/src/composables/useClickOutside.js +0 -29
- package/src/composables/useForm.js +0 -89
- package/src/composables/useLocalStorage.js +0 -51
- package/src/composables/useWindowSize.js +0 -30
- package/src/config/app.config.js +0 -79
- package/src/features/admin/customization/composables/useCustomization.js +0 -19
- package/src/features/admin/customization/store/customizationStore.js +0 -30
- package/src/features/admin/customization/views/CustomizationView.vue +0 -17
- package/src/features/admin/validation/composables/useValidation.js +0 -18
- package/src/features/admin/validation/store/validationStore.js +0 -25
- package/src/features/admin/validation/views/ValidationView.vue +0 -17
- package/src/index.js +0 -53
- package/src/layouts/AdminLayout.vue +0 -146
- package/src/main.js +0 -41
- package/src/router/index.js +0 -57
- package/src/services/apiService.js +0 -72
- package/src/services/integration.js +0 -59
- package/src/services/phpIntegration.js +0 -1
- package/src/stores/counter.js +0 -12
- package/src/utils/helpers.js +0 -119
- package/src/utils/validators.js +0 -131
- package/src/views/HomeView.vue +0 -121
- package/src/views/NotFoundView.vue +0 -56
package/README.md
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# DNA ATD Frontend
|
|
2
2
|
|
|
3
|
-

|
|
3
|
+
[](https://github.com/illuminateeducation/dna-atd-frontend/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/illuminateeducation/dna-atd-frontend/actions/workflows/npm-publish.yml)
|
|
6
5
|
|
|
7
6
|
Vue 3 application with feature-based architecture and backend integration.
|
|
8
7
|
|
|
@@ -30,7 +29,7 @@ src/
|
|
|
30
29
|
├── layouts/ # Layout components
|
|
31
30
|
├── router/ # Routes
|
|
32
31
|
├── services/ # API & Integration
|
|
33
|
-
├── utils/ # Helpers
|
|
32
|
+
├── utils/ # Helpers
|
|
34
33
|
└── views/ # Main views
|
|
35
34
|
```
|
|
36
35
|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { computed as _, resolveComponent as l, createElementBlock as u, openBlock as p, createElementVNode as t, createVNode as n, withCtx as i, normalizeClass as c, createTextVNode as v, toDisplayString as f } from "vue";
|
|
2
|
+
import { useRoute as k } from "vue-router";
|
|
3
|
+
import { _ as C } from "./index-CiZS9VrS.js";
|
|
4
|
+
const h = { class: "admin-layout" }, b = { class: "admin-sidebar" }, x = { class: "sidebar-nav" }, y = ["onClick"], A = ["onClick"], V = { class: "sidebar-footer" }, w = { class: "admin-content" }, z = { class: "content-header" }, B = { class: "content-body" }, N = {
|
|
5
|
+
__name: "AdminLayout",
|
|
6
|
+
setup(g) {
|
|
7
|
+
const d = k(), r = _(() => d.meta.title || "Admin");
|
|
8
|
+
return (E, o) => {
|
|
9
|
+
const s = l("router-link"), m = l("router-view");
|
|
10
|
+
return p(), u("div", h, [
|
|
11
|
+
t("aside", b, [
|
|
12
|
+
o[3] || (o[3] = t("div", { class: "sidebar-header" }, [
|
|
13
|
+
t("h2", null, "Admin Panel")
|
|
14
|
+
], -1)),
|
|
15
|
+
t("nav", x, [
|
|
16
|
+
n(s, {
|
|
17
|
+
to: "/admin/validation",
|
|
18
|
+
custom: ""
|
|
19
|
+
}, {
|
|
20
|
+
default: i(({ isActive: e, navigate: a }) => [
|
|
21
|
+
t("a", {
|
|
22
|
+
class: c(["nav-item", { active: e }]),
|
|
23
|
+
onClick: a
|
|
24
|
+
}, [...o[0] || (o[0] = [
|
|
25
|
+
t("span", { class: "nav-icon" }, "✓", -1),
|
|
26
|
+
t("span", null, "Validation", -1)
|
|
27
|
+
])], 10, y)
|
|
28
|
+
]),
|
|
29
|
+
_: 1
|
|
30
|
+
}),
|
|
31
|
+
n(s, {
|
|
32
|
+
to: "/admin/customization",
|
|
33
|
+
custom: ""
|
|
34
|
+
}, {
|
|
35
|
+
default: i(({ isActive: e, navigate: a }) => [
|
|
36
|
+
t("a", {
|
|
37
|
+
class: c(["nav-item", { active: e }]),
|
|
38
|
+
onClick: a
|
|
39
|
+
}, [...o[1] || (o[1] = [
|
|
40
|
+
t("span", { class: "nav-icon" }, "🎨", -1),
|
|
41
|
+
t("span", null, "Customization", -1)
|
|
42
|
+
])], 10, A)
|
|
43
|
+
]),
|
|
44
|
+
_: 1
|
|
45
|
+
})
|
|
46
|
+
]),
|
|
47
|
+
t("div", V, [
|
|
48
|
+
n(s, {
|
|
49
|
+
to: "/",
|
|
50
|
+
class: "back-link"
|
|
51
|
+
}, {
|
|
52
|
+
default: i(() => [...o[2] || (o[2] = [
|
|
53
|
+
v(" ← Back to Home ", -1)
|
|
54
|
+
])]),
|
|
55
|
+
_: 1
|
|
56
|
+
})
|
|
57
|
+
])
|
|
58
|
+
]),
|
|
59
|
+
t("main", w, [
|
|
60
|
+
t("div", z, [
|
|
61
|
+
t("h1", null, f(r.value), 1)
|
|
62
|
+
]),
|
|
63
|
+
t("div", B, [
|
|
64
|
+
n(m)
|
|
65
|
+
])
|
|
66
|
+
])
|
|
67
|
+
]);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}, H = /* @__PURE__ */ C(N, [["__scopeId", "data-v-3c4dc53f"]]);
|
|
71
|
+
export {
|
|
72
|
+
H as default
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=AdminLayout-BQWZADPC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminLayout-BQWZADPC.js","sources":["../src/layouts/AdminLayout.vue"],"sourcesContent":["<!--\n/**\n * @file AdminLayout.vue\n * @description Admin panel layout wrapper with sidebar navigation\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides consistent admin panel layout structure\n * - Manages sidebar navigation for admin features (Validation, Customization)\n * - Displays dynamic page titles based on current route\n * - Handles routing between admin sub-pages\n * - Provides navigation back to home page\n */\n-->\n\n<template>\n <div class=\"admin-layout\">\n <aside class=\"admin-sidebar\">\n <div class=\"sidebar-header\">\n <h2>Admin Panel</h2>\n </div>\n <nav class=\"sidebar-nav\">\n <router-link \n to=\"/admin/validation\" \n v-slot=\"{ isActive, navigate }\"\n custom\n >\n <a \n class=\"nav-item\" \n :class=\"{ active: isActive }\"\n @click=\"navigate\"\n >\n <span class=\"nav-icon\">✓</span>\n <span>Validation</span>\n </a>\n </router-link>\n <router-link \n to=\"/admin/customization\" \n v-slot=\"{ isActive, navigate }\"\n custom\n >\n <a \n class=\"nav-item\" \n :class=\"{ active: isActive }\"\n @click=\"navigate\"\n >\n <span class=\"nav-icon\">🎨</span>\n <span>Customization</span>\n </a>\n </router-link>\n </nav>\n <div class=\"sidebar-footer\">\n <router-link to=\"/\" class=\"back-link\">\n ← Back to Home\n </router-link>\n </div>\n </aside>\n \n <main class=\"admin-content\">\n <div class=\"content-header\">\n <h1>{{ pageTitle }}</h1>\n </div>\n <div class=\"content-body\">\n <router-view />\n </div>\n </main>\n </div>\n</template>\n\n<script setup>\nimport { computed } from 'vue'\nimport { useRoute } from 'vue-router'\n\nconst route = useRoute()\n\nconst pageTitle = computed(() => {\n return route.meta.title || 'Admin'\n})\n</script>\n\n<style scoped>\n.admin-layout {\n display: flex;\n min-height: 100vh;\n background-color: #f5f7fa;\n}\n\n.admin-sidebar {\n width: 250px;\n background-color: #2c3e50;\n color: white;\n display: flex;\n flex-direction: column;\n}\n\n.sidebar-header {\n padding: 2rem 1.5rem;\n border-bottom: 1px solid rgba(255,255,255,0.1);\n}\n\n.sidebar-header h2 {\n margin: 0;\n font-size: 1.5rem;\n}\n\n.sidebar-nav {\n flex: 1;\n padding: 1rem 0;\n}\n\n.nav-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n color: rgba(255,255,255,0.8);\n text-decoration: none;\n transition: all 0.3s;\n}\n\n.nav-item:hover {\n background-color: rgba(255,255,255,0.1);\n color: white;\n}\n\n.nav-item.active {\n background-color: #3498db;\n color: white;\n border-right: 3px solid #2ecc71;\n}\n\n.nav-icon {\n font-size: 1.2rem;\n}\n\n.sidebar-footer {\n padding: 1.5rem;\n border-top: 1px solid rgba(255,255,255,0.1);\n}\n\n.back-link {\n color: rgba(255,255,255,0.8);\n text-decoration: none;\n transition: color 0.3s;\n}\n\n.back-link:hover {\n color: white;\n}\n\n.admin-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.content-header {\n background: white;\n padding: 1.5rem 2rem;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.content-header h1 {\n margin: 0;\n font-size: 1.5rem;\n color: #2c3e50;\n}\n\n.content-body {\n flex: 1;\n overflow-y: auto;\n}\n</style>\n"],"names":["route","useRoute","pageTitle","computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_createVNode","_component_router_link","isActive","navigate","_normalizeClass","_hoisted_6","_cache","_hoisted_7","_hoisted_8","_hoisted_9","_component_router_view"],"mappings":";;;;;;AA0EA,UAAMA,IAAQC,EAAQ,GAEhBC,IAAYC,EAAS,MAClBH,EAAM,KAAK,SAAS,OAC5B;;;AA7DC,aAAAI,EAAA,GAAAC,EAkDM,OAlDNC,GAkDM;AAAA,QAjDJC,EAuCQ,SAvCRC,GAuCQ;AAAA,0BAtCND,EAEM,OAAA,EAFD,OAAM,oBAAgB;AAAA,YACzBA,EAAoB,YAAhB,aAAW;AAAA;UAEjBA,EA6BM,OA7BNE,GA6BM;AAAA,YA5BJC,EAacC,GAAA;AAAA,cAZZ,IAAG;AAAA,cAEH,QAAA;AAAA;yBAEA,CAOI,EAVM,UAAAC,GAAU,UAAAC,EAAQ,MAAA;AAAA,gBAG5BN,EAOI,KAAA;AAAA,kBANF,OAAKO,EAAA,CAAC,YAAU,EAAA,QACEF,EAAQ,CAAA,CAAA;AAAA,kBACzB,SAAOC;AAAA;kBAERN,EAA+B,QAAA,EAAzB,OAAM,WAAU,GAAC,KAAC,EAAA;AAAA,kBACxBA,EAAuB,cAAjB,cAAU,EAAA;AAAA;;;;YAGpBG,EAacC,GAAA;AAAA,cAZZ,IAAG;AAAA,cAEH,QAAA;AAAA;yBAEA,CAOI,EAVM,UAAAC,GAAU,UAAAC,EAAQ,MAAA;AAAA,gBAG5BN,EAOI,KAAA;AAAA,kBANF,OAAKO,EAAA,CAAC,YAAU,EAAA,QACEF,EAAQ,CAAA,CAAA;AAAA,kBACzB,SAAOC;AAAA;kBAERN,EAAgC,QAAA,EAA1B,OAAM,WAAU,GAAC,MAAE,EAAA;AAAA,kBACzBA,EAA0B,cAApB,iBAAa,EAAA;AAAA;;;;;UAIzBA,EAIM,OAJNQ,GAIM;AAAA,YAHJL,EAEcC,GAAA;AAAA,cAFD,IAAG;AAAA,cAAI,OAAM;AAAA;yBAAY,MAEtC,CAAA,GAAAK,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,kBAFsC,oBAEtC,EAAA;AAAA;;;;;QAIJT,EAOO,QAPPU,GAOO;AAAA,UANLV,EAEM,OAFNW,GAEM;AAAA,YADJX,EAAwB,cAAjBL,EAAA,KAAS,GAAA,CAAA;AAAA;UAElBK,EAEM,OAFNY,GAEM;AAAA,YADJT,EAAeU,CAAA;AAAA;;;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),l=require("vue-router"),d=require("./index-1yktdPHs.cjs"),r={class:"admin-layout"},m={class:"admin-sidebar"},u={class:"sidebar-nav"},_=["onClick"],v=["onClick"],V={class:"sidebar-footer"},N={class:"admin-content"},p={class:"content-header"},E={class:"content-body"},C={__name:"AdminLayout",setup(f){const s=l.useRoute(),i=e.computed(()=>s.meta.title||"Admin");return(h,t)=>{const o=e.resolveComponent("router-link"),c=e.resolveComponent("router-view");return e.openBlock(),e.createElementBlock("div",r,[e.createElementVNode("aside",m,[t[3]||(t[3]=e.createElementVNode("div",{class:"sidebar-header"},[e.createElementVNode("h2",null,"Admin Panel")],-1)),e.createElementVNode("nav",u,[e.createVNode(o,{to:"/admin/validation",custom:""},{default:e.withCtx(({isActive:n,navigate:a})=>[e.createElementVNode("a",{class:e.normalizeClass(["nav-item",{active:n}]),onClick:a},[...t[0]||(t[0]=[e.createElementVNode("span",{class:"nav-icon"},"✓",-1),e.createElementVNode("span",null,"Validation",-1)])],10,_)]),_:1}),e.createVNode(o,{to:"/admin/customization",custom:""},{default:e.withCtx(({isActive:n,navigate:a})=>[e.createElementVNode("a",{class:e.normalizeClass(["nav-item",{active:n}]),onClick:a},[...t[1]||(t[1]=[e.createElementVNode("span",{class:"nav-icon"},"🎨",-1),e.createElementVNode("span",null,"Customization",-1)])],10,v)]),_:1})]),e.createElementVNode("div",V,[e.createVNode(o,{to:"/",class:"back-link"},{default:e.withCtx(()=>[...t[2]||(t[2]=[e.createTextVNode(" ← Back to Home ",-1)])]),_:1})])]),e.createElementVNode("main",N,[e.createElementVNode("div",p,[e.createElementVNode("h1",null,e.toDisplayString(i.value),1)]),e.createElementVNode("div",E,[e.createVNode(c)])])])}}},k=d._export_sfc(C,[["__scopeId","data-v-3c4dc53f"]]);exports.default=k;
|
|
2
|
+
//# sourceMappingURL=AdminLayout-BaO704Tp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminLayout-BaO704Tp.cjs","sources":["../src/layouts/AdminLayout.vue"],"sourcesContent":["<!--\n/**\n * @file AdminLayout.vue\n * @description Admin panel layout wrapper with sidebar navigation\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides consistent admin panel layout structure\n * - Manages sidebar navigation for admin features (Validation, Customization)\n * - Displays dynamic page titles based on current route\n * - Handles routing between admin sub-pages\n * - Provides navigation back to home page\n */\n-->\n\n<template>\n <div class=\"admin-layout\">\n <aside class=\"admin-sidebar\">\n <div class=\"sidebar-header\">\n <h2>Admin Panel</h2>\n </div>\n <nav class=\"sidebar-nav\">\n <router-link \n to=\"/admin/validation\" \n v-slot=\"{ isActive, navigate }\"\n custom\n >\n <a \n class=\"nav-item\" \n :class=\"{ active: isActive }\"\n @click=\"navigate\"\n >\n <span class=\"nav-icon\">✓</span>\n <span>Validation</span>\n </a>\n </router-link>\n <router-link \n to=\"/admin/customization\" \n v-slot=\"{ isActive, navigate }\"\n custom\n >\n <a \n class=\"nav-item\" \n :class=\"{ active: isActive }\"\n @click=\"navigate\"\n >\n <span class=\"nav-icon\">🎨</span>\n <span>Customization</span>\n </a>\n </router-link>\n </nav>\n <div class=\"sidebar-footer\">\n <router-link to=\"/\" class=\"back-link\">\n ← Back to Home\n </router-link>\n </div>\n </aside>\n \n <main class=\"admin-content\">\n <div class=\"content-header\">\n <h1>{{ pageTitle }}</h1>\n </div>\n <div class=\"content-body\">\n <router-view />\n </div>\n </main>\n </div>\n</template>\n\n<script setup>\nimport { computed } from 'vue'\nimport { useRoute } from 'vue-router'\n\nconst route = useRoute()\n\nconst pageTitle = computed(() => {\n return route.meta.title || 'Admin'\n})\n</script>\n\n<style scoped>\n.admin-layout {\n display: flex;\n min-height: 100vh;\n background-color: #f5f7fa;\n}\n\n.admin-sidebar {\n width: 250px;\n background-color: #2c3e50;\n color: white;\n display: flex;\n flex-direction: column;\n}\n\n.sidebar-header {\n padding: 2rem 1.5rem;\n border-bottom: 1px solid rgba(255,255,255,0.1);\n}\n\n.sidebar-header h2 {\n margin: 0;\n font-size: 1.5rem;\n}\n\n.sidebar-nav {\n flex: 1;\n padding: 1rem 0;\n}\n\n.nav-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.5rem;\n color: rgba(255,255,255,0.8);\n text-decoration: none;\n transition: all 0.3s;\n}\n\n.nav-item:hover {\n background-color: rgba(255,255,255,0.1);\n color: white;\n}\n\n.nav-item.active {\n background-color: #3498db;\n color: white;\n border-right: 3px solid #2ecc71;\n}\n\n.nav-icon {\n font-size: 1.2rem;\n}\n\n.sidebar-footer {\n padding: 1.5rem;\n border-top: 1px solid rgba(255,255,255,0.1);\n}\n\n.back-link {\n color: rgba(255,255,255,0.8);\n text-decoration: none;\n transition: color 0.3s;\n}\n\n.back-link:hover {\n color: white;\n}\n\n.admin-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.content-header {\n background: white;\n padding: 1.5rem 2rem;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.content-header h1 {\n margin: 0;\n font-size: 1.5rem;\n color: #2c3e50;\n}\n\n.content-body {\n flex: 1;\n overflow-y: auto;\n}\n</style>\n"],"names":["route","useRoute","pageTitle","computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_createVNode","_component_router_link","isActive","navigate","_normalizeClass","_hoisted_6","_cache","_hoisted_7","_hoisted_8","_hoisted_9","_component_router_view"],"mappings":"kZA0EA,MAAMA,EAAQC,EAAAA,SAAQ,EAEhBC,EAAYC,EAAAA,SAAS,IAClBH,EAAM,KAAK,OAAS,OAC5B,8FA7DC,OAAAI,YAAA,EAAAC,qBAkDM,MAlDNC,EAkDM,CAjDJC,EAAAA,mBAuCQ,QAvCRC,EAuCQ,aAtCND,EAAAA,mBAEM,MAAA,CAFD,MAAM,kBAAgB,CACzBA,qBAAoB,UAAhB,aAAW,QAEjBA,EAAAA,mBA6BM,MA7BNE,EA6BM,CA5BJC,EAAAA,YAacC,EAAA,CAZZ,GAAG,oBAEH,OAAA,uBAEA,CAOI,CAVM,SAAAC,EAAU,SAAAC,CAAQ,IAAA,CAG5BN,EAAAA,mBAOI,IAAA,CANF,MAAKO,EAAAA,eAAA,CAAC,WAAU,CAAA,OACEF,CAAQ,CAAA,CAAA,EACzB,QAAOC,oBAERN,EAAAA,mBAA+B,OAAA,CAAzB,MAAM,UAAU,EAAC,IAAC,EAAA,EACxBA,EAAAA,mBAAuB,YAAjB,aAAU,EAAA,mBAGpBG,EAAAA,YAacC,EAAA,CAZZ,GAAG,uBAEH,OAAA,uBAEA,CAOI,CAVM,SAAAC,EAAU,SAAAC,CAAQ,IAAA,CAG5BN,EAAAA,mBAOI,IAAA,CANF,MAAKO,EAAAA,eAAA,CAAC,WAAU,CAAA,OACEF,CAAQ,CAAA,CAAA,EACzB,QAAOC,oBAERN,EAAAA,mBAAgC,OAAA,CAA1B,MAAM,UAAU,EAAC,KAAE,EAAA,EACzBA,EAAAA,mBAA0B,YAApB,gBAAa,EAAA,qBAIzBA,EAAAA,mBAIM,MAJNQ,EAIM,CAHJL,EAAAA,YAEcC,EAAA,CAFD,GAAG,IAAI,MAAM,gCAAY,IAEtC,CAAA,GAAAK,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAFsC,mBAEtC,EAAA,gBAIJT,EAAAA,mBAOO,OAPPU,EAOO,CANLV,EAAAA,mBAEM,MAFNW,EAEM,CADJX,EAAAA,mBAAwB,4BAAjBL,EAAA,KAAS,EAAA,CAAA,IAElBK,EAAAA,mBAEM,MAFNY,EAEM,CADJT,EAAAA,YAAeU,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createElementBlock as e, openBlock as n, createElementVNode as o } from "vue";
|
|
2
|
+
import { _ as s } from "./index-CiZS9VrS.js";
|
|
3
|
+
const i = { class: "customization-view" }, a = {
|
|
4
|
+
__name: "CustomizationView",
|
|
5
|
+
setup(r) {
|
|
6
|
+
return (c, t) => (n(), e("div", i, [...t[0] || (t[0] = [
|
|
7
|
+
o("h2", null, "Customization Module", -1),
|
|
8
|
+
o("p", null, "Customization feature content goes here.", -1)
|
|
9
|
+
])]));
|
|
10
|
+
}
|
|
11
|
+
}, _ = /* @__PURE__ */ s(a, [["__scopeId", "data-v-323a56cb"]]);
|
|
12
|
+
export {
|
|
13
|
+
_ as default
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=CustomizationView-BJlqBq4I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomizationView-BJlqBq4I.js","sources":["../src/features/admin/customization/views/CustomizationView.vue"],"sourcesContent":["<!--\n/**\n * @file CustomizationView.vue\n * @description Admin customization settings view component\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Displays UI customization settings interface\n * - Allows admins to configure application appearance\n * - Integrates with customization store for state management\n * - Part of the admin feature module\n */\n-->\n\n<template>\n <div class=\"customization-view\">\n <h2>Customization Module</h2>\n <p>Customization feature content goes here.</p>\n </div>\n</template>\n\n<script setup>\n// Customization module - basic implementation\n</script>\n\n<style scoped>\n.customization-view {\n padding: 2rem;\n}\n</style>\n\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode"],"mappings":";;;;;sBAgBEA,EAAA,GAAAC,EAGM,OAHNC,GAGM,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,MAFJC,EAA6B,YAAzB,wBAAoB,EAAA;AAAA,MACxBA,EAA+C,WAA5C,4CAAwC,EAAA;AAAA;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),o=require("./index-1yktdPHs.cjs"),n={class:"customization-view"},i={__name:"CustomizationView",setup(r){return(u,t)=>(e.openBlock(),e.createElementBlock("div",n,[...t[0]||(t[0]=[e.createElementVNode("h2",null,"Customization Module",-1),e.createElementVNode("p",null,"Customization feature content goes here.",-1)])]))}},s=o._export_sfc(i,[["__scopeId","data-v-323a56cb"]]);exports.default=s;
|
|
2
|
+
//# sourceMappingURL=CustomizationView-BRNwaKvj.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CustomizationView-BRNwaKvj.cjs","sources":["../src/features/admin/customization/views/CustomizationView.vue"],"sourcesContent":["<!--\n/**\n * @file CustomizationView.vue\n * @description Admin customization settings view component\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Displays UI customization settings interface\n * - Allows admins to configure application appearance\n * - Integrates with customization store for state management\n * - Part of the admin feature module\n */\n-->\n\n<template>\n <div class=\"customization-view\">\n <h2>Customization Module</h2>\n <p>Customization feature content goes here.</p>\n </div>\n</template>\n\n<script setup>\n// Customization module - basic implementation\n</script>\n\n<style scoped>\n.customization-view {\n padding: 2rem;\n}\n</style>\n\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode"],"mappings":"6NAgBEA,YAAA,EAAAC,qBAGM,MAHNC,EAGM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJC,EAAAA,mBAA6B,UAAzB,uBAAoB,EAAA,EACxBA,EAAAA,mBAA+C,SAA5C,2CAAwC,EAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HomeView-7jy27idX.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HomeView-D6NWAtxc.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { resolveComponent as n, createElementBlock as r, openBlock as s, createElementVNode as t, createVNode as l, withCtx as d, createTextVNode as u } from "vue";
|
|
2
|
+
import { _ as p } from "./index-CiZS9VrS.js";
|
|
3
|
+
const i = { class: "not-found" }, m = {
|
|
4
|
+
__name: "NotFoundView",
|
|
5
|
+
setup(_) {
|
|
6
|
+
return (f, o) => {
|
|
7
|
+
const e = n("router-link");
|
|
8
|
+
return s(), r("div", i, [
|
|
9
|
+
o[1] || (o[1] = t("h1", null, "404", -1)),
|
|
10
|
+
o[2] || (o[2] = t("h2", null, "Page Not Found", -1)),
|
|
11
|
+
o[3] || (o[3] = t("p", null, "The page you're looking for doesn't exist.", -1)),
|
|
12
|
+
l(e, {
|
|
13
|
+
to: "/",
|
|
14
|
+
class: "btn"
|
|
15
|
+
}, {
|
|
16
|
+
default: d(() => [...o[0] || (o[0] = [
|
|
17
|
+
u("Go Home", -1)
|
|
18
|
+
])]),
|
|
19
|
+
_: 1
|
|
20
|
+
})
|
|
21
|
+
]);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}, N = /* @__PURE__ */ p(m, [["__scopeId", "data-v-f6374bfd"]]);
|
|
25
|
+
export {
|
|
26
|
+
N as default
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=NotFoundView-BCWgZLYs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotFoundView-BCWgZLYs.js","sources":["../src/views/NotFoundView.vue"],"sourcesContent":["<!--\n/**\n * @file NotFoundView.vue\n * @description 404 error page component for handling invalid routes\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Displays user-friendly 404 error message\n * - Provides navigation back to home page\n * - Catches all unmatched routes via router wildcard\n * - Maintains consistent branding and styling\n */\n-->\n\n<template>\n <div class=\"not-found\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <p>The page you're looking for doesn't exist.</p>\n <router-link to=\"/\" class=\"btn\">Go Home</router-link>\n </div>\n</template>\n\n<script setup>\n// 404 Not Found view\n</script>\n\n<style scoped>\n.not-found {\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 2rem;\n}\n\n.not-found h1 {\n font-size: 6rem;\n margin: 0;\n color: #3498db;\n}\n\n.not-found h2 {\n font-size: 2rem;\n margin: 1rem 0;\n color: #2c3e50;\n}\n\n.not-found p {\n font-size: 1.2rem;\n color: #7f8c8d;\n margin-bottom: 2rem;\n}\n\n.btn {\n background-color: #3498db;\n color: white;\n padding: 1rem 2rem;\n border-radius: 4px;\n text-decoration: none;\n transition: all 0.3s;\n}\n\n.btn:hover {\n background-color: #2980b9;\n}\n</style>\n\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createVNode","_component_router_link"],"mappings":";;;;;;;AAgBE,aAAAA,EAAA,GAAAC,EAKM,OALNC,GAKM;AAAA,QAJJC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAAY,YAAR,OAAG,EAAA;AAAA,QACPD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAAuB,YAAnB,kBAAc,EAAA;AAAA,QAClBD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAC,EAAiD,WAA9C,8CAA0C,EAAA;AAAA,QAC7CC,EAAqDC,GAAA;AAAA,UAAxC,IAAG;AAAA,UAAI,OAAM;AAAA;qBAAM,MAAO,CAAA,GAAAH,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAAP,WAAO,EAAA;AAAA;;;;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),n=require("./index-1yktdPHs.cjs"),r={class:"not-found"},l={__name:"NotFoundView",setup(u){return(d,t)=>{const o=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("div",r,[t[1]||(t[1]=e.createElementVNode("h1",null,"404",-1)),t[2]||(t[2]=e.createElementVNode("h2",null,"Page Not Found",-1)),t[3]||(t[3]=e.createElementVNode("p",null,"The page you're looking for doesn't exist.",-1)),e.createVNode(o,{to:"/",class:"btn"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("Go Home",-1)])]),_:1})])}}},s=n._export_sfc(l,[["__scopeId","data-v-f6374bfd"]]);exports.default=s;
|
|
2
|
+
//# sourceMappingURL=NotFoundView-CNvAC47u.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotFoundView-CNvAC47u.cjs","sources":["../src/views/NotFoundView.vue"],"sourcesContent":["<!--\n/**\n * @file NotFoundView.vue\n * @description 404 error page component for handling invalid routes\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Displays user-friendly 404 error message\n * - Provides navigation back to home page\n * - Catches all unmatched routes via router wildcard\n * - Maintains consistent branding and styling\n */\n-->\n\n<template>\n <div class=\"not-found\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <p>The page you're looking for doesn't exist.</p>\n <router-link to=\"/\" class=\"btn\">Go Home</router-link>\n </div>\n</template>\n\n<script setup>\n// 404 Not Found view\n</script>\n\n<style scoped>\n.not-found {\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 2rem;\n}\n\n.not-found h1 {\n font-size: 6rem;\n margin: 0;\n color: #3498db;\n}\n\n.not-found h2 {\n font-size: 2rem;\n margin: 1rem 0;\n color: #2c3e50;\n}\n\n.not-found p {\n font-size: 1.2rem;\n color: #7f8c8d;\n margin-bottom: 2rem;\n}\n\n.btn {\n background-color: #3498db;\n color: white;\n padding: 1rem 2rem;\n border-radius: 4px;\n text-decoration: none;\n transition: all 0.3s;\n}\n\n.btn:hover {\n background-color: #2980b9;\n}\n</style>\n\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createVNode","_component_router_link"],"mappings":"yPAgBE,OAAAA,YAAA,EAAAC,qBAKM,MALNC,EAKM,CAJJC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,qBAAY,UAAR,MAAG,EAAA,GACPD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,qBAAuB,UAAnB,iBAAc,EAAA,GAClBD,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,qBAAiD,SAA9C,6CAA0C,EAAA,GAC7CC,EAAAA,YAAqDC,EAAA,CAAxC,GAAG,IAAI,MAAM,0BAAM,IAAO,CAAA,GAAAH,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,mBAAP,UAAO,EAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createElementBlock as o, openBlock as a, createElementVNode as t } from "vue";
|
|
2
|
+
import { _ as n } from "./index-CiZS9VrS.js";
|
|
3
|
+
const i = { class: "validation-view" }, l = {
|
|
4
|
+
__name: "ValidationView",
|
|
5
|
+
setup(r) {
|
|
6
|
+
return (s, e) => (a(), o("div", i, [...e[0] || (e[0] = [
|
|
7
|
+
t("h2", null, "Validation Module", -1),
|
|
8
|
+
t("p", null, "Validation feature content goes here.", -1)
|
|
9
|
+
])]));
|
|
10
|
+
}
|
|
11
|
+
}, c = /* @__PURE__ */ n(l, [["__scopeId", "data-v-4069f97b"]]);
|
|
12
|
+
export {
|
|
13
|
+
c as default
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=ValidationView-DY83tE4M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationView-DY83tE4M.js","sources":["../src/features/admin/validation/views/ValidationView.vue"],"sourcesContent":["<!--\n/**\n * @file ValidationView.vue\n * @description Admin validation management view component\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Displays validation management interface\n * - Provides UI for data validation operations\n * - Integrates with validation store for state management\n * - Part of the admin feature module\n */\n-->\n\n<template>\n <div class=\"validation-view\">\n <h2>Validation Module</h2>\n <p>Validation feature content goes here.</p>\n </div>\n</template>\n\n<script setup>\n// Validation module - basic implementation\n</script>\n\n<style scoped>\n.validation-view {\n padding: 2rem;\n}\n</style>\n\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode"],"mappings":";;;;;sBAgBEA,EAAA,GAAAC,EAGM,OAHNC,GAGM,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,MAFJC,EAA0B,YAAtB,qBAAiB,EAAA;AAAA,MACrBA,EAA4C,WAAzC,yCAAqC,EAAA;AAAA;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),o=require("./index-1yktdPHs.cjs"),n={class:"validation-view"},i={__name:"ValidationView",setup(l){return(r,t)=>(e.openBlock(),e.createElementBlock("div",n,[...t[0]||(t[0]=[e.createElementVNode("h2",null,"Validation Module",-1),e.createElementVNode("p",null,"Validation feature content goes here.",-1)])]))}},a=o._export_sfc(i,[["__scopeId","data-v-4069f97b"]]);exports.default=a;
|
|
2
|
+
//# sourceMappingURL=ValidationView-ltSgO4AC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationView-ltSgO4AC.cjs","sources":["../src/features/admin/validation/views/ValidationView.vue"],"sourcesContent":["<!--\n/**\n * @file ValidationView.vue\n * @description Admin validation management view component\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Displays validation management interface\n * - Provides UI for data validation operations\n * - Integrates with validation store for state management\n * - Part of the admin feature module\n */\n-->\n\n<template>\n <div class=\"validation-view\">\n <h2>Validation Module</h2>\n <p>Validation feature content goes here.</p>\n </div>\n</template>\n\n<script setup>\n// Validation module - basic implementation\n</script>\n\n<style scoped>\n.validation-view {\n padding: 2rem;\n}\n</style>\n\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode"],"mappings":"uNAgBEA,YAAA,EAAAC,qBAGM,MAHNC,EAGM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJC,EAAAA,mBAA0B,UAAtB,oBAAiB,EAAA,EACrBA,EAAAA,mBAA4C,SAAzC,wCAAqC,EAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*{margin:0;padding:0;box-sizing:border-box}#app{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50}:root{--primary-color: #3498db;--secondary-color: #2c3e50;--success-color: #2ecc71;--danger-color: #e74c3c;--warning-color: #f39c12;--info-color: #3498db;--light-color: #ecf0f1;--dark-color: #2c3e50;--base-font-size: 16px;--border-radius: 4px;--box-shadow: 0 2px 4px rgba(0,0,0,.1);--transition: all .3s ease}[data-theme=dark]{--primary-color: #3498db;--secondary-color: #ecf0f1;--bg-color: #1a1a1a;--text-color: #ecf0f1;--border-color: #333}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#555}.btn[data-v-a099710f]{padding:.5rem 1rem;border:1px solid #ddd;border-radius:4px;cursor:pointer;background:#fff}.input[data-v-ce30f4cb]{padding:.5rem;border:1px solid #ddd;border-radius:4px}.modal[data-v-78e47d76]{position:fixed;top:0;left:0;width:100%;height:100%;background:#00000080;display:flex;align-items:center;justify-content:center}.modal-content[data-v-78e47d76]{background:#fff;padding:2rem;border-radius:4px}.admin-layout[data-v-3c4dc53f]{display:flex;min-height:100vh;background-color:#f5f7fa}.admin-sidebar[data-v-3c4dc53f]{width:250px;background-color:#2c3e50;color:#fff;display:flex;flex-direction:column}.sidebar-header[data-v-3c4dc53f]{padding:2rem 1.5rem;border-bottom:1px solid rgba(255,255,255,.1)}.sidebar-header h2[data-v-3c4dc53f]{margin:0;font-size:1.5rem}.sidebar-nav[data-v-3c4dc53f]{flex:1;padding:1rem 0}.nav-item[data-v-3c4dc53f]{display:flex;align-items:center;gap:1rem;padding:1rem 1.5rem;color:#fffc;text-decoration:none;transition:all .3s}.nav-item[data-v-3c4dc53f]:hover{background-color:#ffffff1a;color:#fff}.nav-item.active[data-v-3c4dc53f]{background-color:#3498db;color:#fff;border-right:3px solid #2ecc71}.nav-icon[data-v-3c4dc53f]{font-size:1.2rem}.sidebar-footer[data-v-3c4dc53f]{padding:1.5rem;border-top:1px solid rgba(255,255,255,.1)}.back-link[data-v-3c4dc53f]{color:#fffc;text-decoration:none;transition:color .3s}.back-link[data-v-3c4dc53f]:hover{color:#fff}.admin-content[data-v-3c4dc53f]{flex:1;display:flex;flex-direction:column}.content-header[data-v-3c4dc53f]{background:#fff;padding:1.5rem 2rem;box-shadow:0 2px 4px #0000001a}.content-header h1[data-v-3c4dc53f]{margin:0;font-size:1.5rem;color:#2c3e50}.content-body[data-v-3c4dc53f]{flex:1;overflow-y:auto}.validation-view[data-v-4069f97b],.customization-view[data-v-323a56cb]{padding:2rem}.not-found[data-v-f6374bfd]{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:2rem}.not-found h1[data-v-f6374bfd]{font-size:6rem;margin:0;color:#3498db}.not-found h2[data-v-f6374bfd]{font-size:2rem;margin:1rem 0;color:#2c3e50}.not-found p[data-v-f6374bfd]{font-size:1.2rem;color:#7f8c8d;margin-bottom:2rem}.btn[data-v-f6374bfd]{background-color:#3498db;color:#fff;padding:1rem 2rem;border-radius:4px;text-decoration:none;transition:all .3s}.btn[data-v-f6374bfd]:hover{background-color:#2980b9}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const o=require("vue"),d=require("pinia"),g=require("vue-router"),p=g.createRouter({history:g.createWebHistory("./"),routes:[{path:"/",name:"home",component:()=>Promise.resolve().then(()=>require("./HomeView-D6NWAtxc.cjs")),meta:{title:"DNA ATD Frontend - Home"}},{path:"/admin",name:"admin",component:()=>Promise.resolve().then(()=>require("./AdminLayout-BaO704Tp.cjs")),redirect:"/admin/validation",children:[{path:"validation",name:"admin-validation",component:()=>Promise.resolve().then(()=>require("./ValidationView-ltSgO4AC.cjs")),meta:{title:"Admin Validation"}},{path:"customization",name:"admin-customization",component:()=>Promise.resolve().then(()=>require("./CustomizationView-BRNwaKvj.cjs")),meta:{title:"Customization"}}],meta:{requiresAuth:!0}},{path:"/:pathMatch(.*)*",name:"not-found",component:()=>Promise.resolve().then(()=>require("./NotFoundView-CNvAC47u.cjs")),meta:{title:"404 - Page Not Found"}}]});p.beforeEach((e,n,t)=>{e.meta.requiresAuth,t()});p.afterEach(e=>{const n="DNA ATD Frontend";document.title=e.meta?.title||n});const E={id:"app"},y={__name:"App",setup(e){return(n,t)=>(o.openBlock(),o.createElementBlock("div",E,[o.createVNode(o.unref(g.RouterView))]))}},f=(e,n)=>{const t=e.__vccOpts||e;for(const[r,a]of n)t[r]=a;return t},T={__name:"BaseButton",emits:["click"],setup(e){return(n,t)=>(o.openBlock(),o.createElementBlock("button",{class:"btn",onClick:t[0]||(t[0]=r=>n.$emit("click"))},[o.renderSlot(n.$slots,"default",{},void 0,!0)]))}},B=f(T,[["__scopeId","data-v-a099710f"]]),F=["value"],L={__name:"BaseInput",props:{modelValue:{type:String,default:""}},emits:["update:modelValue"],setup(e){return(n,t)=>(o.openBlock(),o.createElementBlock("input",{value:e.modelValue,class:"input",onInput:t[0]||(t[0]=r=>n.$emit("update:modelValue",r.target.value))},null,40,F))}},C=f(L,[["__scopeId","data-v-ce30f4cb"]]),q={key:0,class:"modal"},$={class:"modal-content"},z={__name:"BaseModal",props:{show:{type:Boolean,default:!1}},setup(e){return(n,t)=>e.show?(o.openBlock(),o.createElementBlock("div",q,[o.createElementVNode("div",$,[o.renderSlot(n.$slots,"default",{},void 0,!0)])])):o.createCommentVNode("",!0)}},b=f(z,[["__scopeId","data-v-78e47d76"]]);function O(e){const n=o.ref(null),t=o.ref(null),r=o.ref(!1);return{data:n,error:t,isLoading:r,execute:async(...c)=>{r.value=!0,t.value=null;try{return n.value=await e(...c),n.value}catch(i){throw t.value=i,i}finally{r.value=!1}}}}function I(e={},n={}){const t=o.ref({...e}),r=o.ref({}),a=o.ref({}),c=o.computed(()=>Object.keys(r.value).length===0),i=s=>{const l=t.value[s],_=n[s];if(!_)return!0;for(const S of _)if(!S.validator(l))return r.value[s]=S.message,!1;return delete r.value[s],!0};return{formData:t,errors:r,touched:a,isValid:c,validateField:i,validateForm:()=>{r.value={};let s=!0;return Object.keys(n).forEach(l=>{i(l)||(s=!1)}),s},handleBlur:s=>{a.value[s]=!0,i(s)},handleChange:(s,l)=>{t.value[s]=l,a.value[s]&&i(s)},resetForm:()=>{t.value={...e},r.value={},a.value={}},setFieldValue:(s,l)=>{t.value[s]=l},setFieldError:(s,l)=>{r.value[s]=l}}}function M(e){const n=o.ref(null),t=r=>{n.value&&!n.value.contains(r.target)&&e()};return o.onMounted(()=>{document.addEventListener("click",t)}),o.onUnmounted(()=>{document.removeEventListener("click",t)}),{elementRef:n}}function P(e,n=null){const t=o.ref(n),r=()=>{try{const i=window.localStorage.getItem(e);return i?JSON.parse(i):n}catch(i){return console.error(`Error reading localStorage key "${e}":`,i),n}},a=i=>{try{t.value=i,window.localStorage.setItem(e,JSON.stringify(i))}catch(m){console.error(`Error writing localStorage key "${e}":`,m)}},c=()=>{try{window.localStorage.removeItem(e),t.value=n}catch(i){console.error(`Error removing localStorage key "${e}":`,i)}};return o.onMounted(()=>{t.value=r()}),{data:t,write:a,remove:c}}function w(e,n=300){let t;return function(...a){const c=()=>{clearTimeout(t),e(...a)};clearTimeout(t),t=setTimeout(c,n)}}function H(e,n=300){let t;return function(...a){t||(e(...a),t=!0,setTimeout(()=>t=!1,n))}}function v(e){if(e===null||typeof e!="object")return e;if(e instanceof Date)return new Date(e.getTime());if(e instanceof Array)return e.map(t=>v(t));const n={};for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(n[t]=v(e[t]));return n}function V(e,n="short"){const t=new Date(e),r={short:{year:"numeric",month:"short",day:"numeric"},long:{year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"},time:{hour:"2-digit",minute:"2-digit",second:"2-digit"}};return n==="time"?t.toLocaleTimeString("en-US",r.time):t.toLocaleDateString("en-US",r[n]||r.short)}function U(){return`${Date.now()}-${Math.random().toString(36).slice(2,11)}`}function R(e){return e?e.charAt(0).toUpperCase()+e.slice(1).toLowerCase():""}function x(e,n=50,t="..."){return!e||e.length<=n?e:e.substring(0,n).trim()+t}function Y(e){return!!(e==null||typeof e=="string"&&e.trim()===""||Array.isArray(e)&&e.length===0||typeof e=="object"&&Object.keys(e).length===0)}function N(){const e=o.ref(window.innerWidth),n=o.ref(window.innerHeight),t=w(()=>{e.value=window.innerWidth,n.value=window.innerHeight},200);return o.onMounted(()=>{window.addEventListener("resize",t)}),o.onUnmounted(()=>{window.removeEventListener("resize",t)}),{width:e,height:n}}const A=d.defineStore("validation",()=>{const e=o.ref([]),n=o.ref(!1);return{data:e,isLoading:n,fetchData:async()=>{n.value=!0,n.value=!1}}}),D=d.defineStore("customization",()=>{const e=o.ref({}),n=o.ref(!1);return{settings:e,isLoading:n,fetchSettings:async()=>{n.value=!0,n.value=!1},updateSettings:a=>{e.value={...e.value,...a}}}});function W(){const e=A(),{data:n,isLoading:t}=d.storeToRefs(e),{fetchData:r}=e;return{data:n,isLoading:t,fetchData:r}}function J(){const e=D(),{settings:n,isLoading:t}=d.storeToRefs(e),{fetchSettings:r,updateSettings:a}=e;return{settings:n,isLoading:t,fetchSettings:r,updateSettings:a}}const j="http://localhost:3000/api";class G{constructor(n=j){this.baseURL=n}async request(n,t={}){const r=`${this.baseURL}${n}`,{body:a,headers:c={},...i}=t,m={...c};a&&!(a instanceof FormData)&&(m["Content-Type"]="application/json");const h={...i,headers:m};a!==void 0&&(h.body=a);try{const u=await fetch(r,h);if(!u.ok)throw new Error(`HTTP ${u.status}: ${u.statusText}`);return u.status===204?null:(u.headers.get("content-type")||"").includes("application/json")?await u.json():await u.text()}catch(u){throw console.error("API request failed:",u),u}}get(n,t={}){return this.request(n,{method:"GET",...t})}post(n,t,r={}){return this.request(n,{method:"POST",body:t instanceof FormData?t:JSON.stringify(t),...r})}put(n,t,r={}){return this.request(n,{method:"PUT",body:t instanceof FormData?t:JSON.stringify(t),...r})}patch(n,t,r={}){return this.request(n,{method:"PATCH",body:t instanceof FormData?t:JSON.stringify(t),...r})}delete(n,t={}){return this.request(n,{method:"DELETE",...t})}}const K=new G,Q={name:"DNA ATD Frontend",version:"1.0.0",api:{baseURL:"http://localhost:3000/api",timeout:3e4,headers:{"Content-Type":"application/json"}},theme:{default:"light",available:["light","dark","auto"]},layout:{sidebarWidth:250,headerHeight:64,footerHeight:48},pagination:{defaultPageSize:10,pageSizeOptions:[10,20,50,100]},dateFormat:{short:"MMM DD, YYYY",long:"MMMM DD, YYYY HH:mm",time:"HH:mm:ss"},storageKeys:{theme:"app_theme",locale:"app_locale",token:"app_token",user:"app_user"},features:{darkMode:!0,notifications:!0,analytics:!1},validation:{password:{minLength:8,requireUppercase:!0,requireLowercase:!0,requireNumbers:!0,requireSpecialChars:!0},username:{minLength:3,maxLength:20}}};function X(e="#app"){const n=o.createApp(y),t=d.createPinia();return n.use(t),n.use(p),n.mount(e)}function Z(){const e=o.createApp(y),n=d.createPinia();return e.use(n),e.use(p),e}exports.BaseButton=B;exports.BaseInput=C;exports.BaseModal=b;exports._export_sfc=f;exports._sfc_main=y;exports.apiService=K;exports.appConfig=Q;exports.capitalize=R;exports.createDnaAtdApp=X;exports.createDnaAtdAppInstance=Z;exports.debounce=w;exports.deepClone=v;exports.formatDate=V;exports.generateId=U;exports.isEmpty=Y;exports.router=p;exports.throttle=H;exports.truncate=x;exports.useAsync=O;exports.useClickOutside=M;exports.useCustomization=J;exports.useCustomizationStore=D;exports.useForm=I;exports.useLocalStorage=P;exports.useValidation=W;exports.useValidationStore=A;exports.useWindowSize=N;
|
|
2
|
+
//# sourceMappingURL=index-1yktdPHs.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-1yktdPHs.cjs","sources":["../src/router/index.js","../src/App.vue","../src/components/common/BaseButton.vue","../src/components/common/BaseInput.vue","../src/components/common/BaseModal.vue","../src/composables/useAsync.js","../src/composables/useForm.js","../src/composables/useClickOutside.js","../src/composables/useLocalStorage.js","../src/utils/helpers.js","../src/composables/useWindowSize.js","../src/features/admin/validation/store/validationStore.js","../src/features/admin/customization/store/customizationStore.js","../src/features/admin/validation/composables/useValidation.js","../src/features/admin/customization/composables/useCustomization.js","../src/services/apiService.js","../src/config/app.config.js","../src/index.js"],"sourcesContent":["/**\n * @file index.js\n * @description Vue Router configuration for DNA ATD Frontend application\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Defines application routing structure and navigation\n * - Configures route hierarchy with nested admin routes\n * - Implements navigation guards for authentication checks\n * - Manages route metadata (titles, auth requirements)\n * - Handles 404 Not Found fallback routing\n * - Uses lazy loading for optimal performance\n */\n\nimport { createRouter, createWebHistory } from 'vue-router'\n\nconst router = createRouter({\n history: createWebHistory(import.meta.env.BASE_URL),\n routes: [\n {\n path: '/',\n name: 'home',\n component: () => import('../views/HomeView.vue'),\n meta: {\n title: 'DNA ATD Frontend - Home'\n }\n },\n {\n path: '/admin',\n name: 'admin',\n component: () => import('../layouts/AdminLayout.vue'),\n redirect: '/admin/validation',\n children: [\n {\n path: 'validation',\n name: 'admin-validation',\n component: () => import('../features/admin/validation/views/ValidationView.vue'),\n meta: {\n title: 'Admin Validation'\n }\n },\n {\n path: 'customization',\n name: 'admin-customization',\n component: () => import('../features/admin/customization/views/CustomizationView.vue'),\n meta: {\n title: 'Customization'\n }\n }\n ],\n meta: {\n requiresAuth: true\n }\n },\n {\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n component: () => import('../views/NotFoundView.vue'),\n meta: {\n title: '404 - Page Not Found'\n }\n }\n ]\n})\n\n// Navigation guard for authentication\nrouter.beforeEach((to, from, next) => {\n if (to.meta.requiresAuth) {\n // Add your authentication logic here\n // For now, we'll just allow access\n next()\n } else {\n next()\n }\n})\n\n// Update document title after each navigation\nrouter.afterEach((to) => {\n // Set document title from route meta or use default\n const defaultTitle = 'DNA ATD Frontend'\n document.title = to.meta?.title || defaultTitle\n})\n\nexport default router\n","<!--\n/**\n * @file App.vue\n * @description Root application component for DNA ATD Frontend\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Serves as the main application entry point\n * - Provides global styles and CSS variables\n * - Defines theme system (light/dark mode support)\n * - Implements global scrollbar styling\n * - Contains RouterView for dynamic page rendering\n * - Sets up base application structure and layout\n */\n-->\n\n<script setup>\nimport { RouterView } from 'vue-router'\n</script>\n\n<template>\n <div id=\"app\">\n <RouterView />\n </div>\n</template>\n\n<style>\n* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n#app {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n color: #2c3e50;\n}\n\n/* Global CSS Variables */\n:root {\n --primary-color: #3498db;\n --secondary-color: #2c3e50;\n --success-color: #2ecc71;\n --danger-color: #e74c3c;\n --warning-color: #f39c12;\n --info-color: #3498db;\n --light-color: #ecf0f1;\n --dark-color: #2c3e50;\n --base-font-size: 16px;\n --border-radius: 4px;\n --box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n --transition: all 0.3s ease;\n}\n\n/* Dark Theme */\n[data-theme=\"dark\"] {\n --primary-color: #3498db;\n --secondary-color: #ecf0f1;\n --bg-color: #1a1a1a;\n --text-color: #ecf0f1;\n --border-color: #333;\n}\n\n/* Scrollbar Styling */\n::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n::-webkit-scrollbar-track {\n background: #f1f1f1;\n}\n\n::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 4px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: #555;\n}\n</style>\n","<!--\n/**\n * @file BaseButton.vue\n * @description Reusable button component with consistent styling\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides base button component for consistent UI\n * - Emits click events to parent components\n * - Supports slot content for flexible button text/icons\n * - Applies standard button styling\n * - Part of common component library\n */\n-->\n\n<template>\n <button class=\"btn\" @click=\"$emit('click')\">\n <slot />\n </button>\n</template>\n\n<script setup>\ndefineEmits(['click'])\n</script>\n\n<style scoped>\n.btn {\n padding: 0.5rem 1rem;\n border: 1px solid #ddd;\n border-radius: 4px;\n cursor: pointer;\n background: white;\n}\n</style>\n\n","<!--\n/**\n * @file BaseInput.vue\n * @description Reusable input component with v-model support\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides base input field with consistent styling\n * - Implements v-model two-way binding\n * - Emits update:modelValue for reactive data binding\n * - Applies standard input styling\n * - Part of common component library\n */\n-->\n\n<template>\n <input\n :value=\"modelValue\"\n class=\"input\"\n @input=\"$emit('update:modelValue', $event.target.value)\"\n />\n</template>\n\n<script setup>\ndefineProps({\n modelValue: {\n type: String,\n default: ''\n }\n})\n\ndefineEmits(['update:modelValue'])\n</script>\n\n<style scoped>\n.input {\n padding: 0.5rem;\n border: 1px solid #ddd;\n border-radius: 4px;\n}\n</style>\n\n","<!--\n/**\n * @file BaseModal.vue\n * @description Reusable modal/dialog component with overlay\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides modal overlay functionality\n * - Conditionally renders based on show prop\n * - Supports slot content for flexible modal body\n * - Implements centered modal layout with backdrop\n * - Part of common component library\n */\n-->\n\n<template>\n <div v-if=\"show\" class=\"modal\">\n <div class=\"modal-content\">\n <slot />\n </div>\n </div>\n</template>\n\n<script setup>\ndefineProps({\n show: {\n type: Boolean,\n default: false\n }\n})\n</script>\n\n<style scoped>\n.modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.modal-content {\n background: white;\n padding: 2rem;\n border-radius: 4px;\n}\n</style>\n\n","/**\n * @file useAsync.js\n * @description Vue composable for managing asynchronous operations with loading and error states\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Wraps async functions with loading state management\n * - Handles error catching and reporting\n * - Provides reactive data, error, and loading states\n * - Simplifies async operation handling in components\n * - Ensures proper cleanup and state management\n */\n\nimport { ref } from 'vue'\n\n/**\n * Composable for handling async operations\n * @param {Function} asyncFunction - Async function to execute\n * @returns {Object}\n */\nexport function useAsync(asyncFunction) {\n const data = ref(null)\n const error = ref(null)\n const isLoading = ref(false)\n\n const execute = async (...args) => {\n isLoading.value = true\n error.value = null\n try {\n data.value = await asyncFunction(...args)\n return data.value\n } catch (err) {\n error.value = err\n throw err\n } finally {\n isLoading.value = false\n }\n }\n\n return {\n data,\n error,\n isLoading,\n execute\n }\n}\n\n","/**\n * @file useForm.js\n * @description Vue composable for comprehensive form state management and validation\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Manages form data state reactively\n * - Implements field-level and form-level validation\n * - Tracks touched fields for better UX\n * - Handles blur and change events\n * - Provides form reset functionality\n * - Exposes methods for programmatic field updates\n * - Validates against custom rule sets\n */\n\nimport { ref, computed } from 'vue'\n\n/**\n * Composable for form validation\n * @param {Object} initialValues - Initial form values\n * @param {Object} validationRules - Validation rules for each field\n * @returns {Object}\n */\nexport function useForm(initialValues = {}, validationRules = {}) {\n const formData = ref({ ...initialValues })\n const errors = ref({})\n const touched = ref({})\n\n const isValid = computed(() => {\n return Object.keys(errors.value).length === 0\n })\n\n const validateField = (fieldName) => {\n const value = formData.value[fieldName]\n const rules = validationRules[fieldName]\n\n if (!rules) return true\n\n for (const rule of rules) {\n const result = rule.validator(value)\n if (!result) {\n errors.value[fieldName] = rule.message\n return false\n }\n }\n\n delete errors.value[fieldName]\n return true\n }\n\n const validateForm = () => {\n errors.value = {}\n let isFormValid = true\n\n Object.keys(validationRules).forEach(fieldName => {\n if (!validateField(fieldName)) {\n isFormValid = false\n }\n })\n\n return isFormValid\n }\n\n const handleBlur = (fieldName) => {\n touched.value[fieldName] = true\n validateField(fieldName)\n }\n\n const handleChange = (fieldName, value) => {\n formData.value[fieldName] = value\n if (touched.value[fieldName]) {\n validateField(fieldName)\n }\n }\n\n const resetForm = () => {\n formData.value = { ...initialValues }\n errors.value = {}\n touched.value = {}\n }\n\n const setFieldValue = (fieldName, value) => {\n formData.value[fieldName] = value\n }\n\n const setFieldError = (fieldName, error) => {\n errors.value[fieldName] = error\n }\n\n return {\n formData,\n errors,\n touched,\n isValid,\n validateField,\n validateForm,\n handleBlur,\n handleChange,\n resetForm,\n setFieldValue,\n setFieldError\n }\n}\n\n","/**\n * @file useClickOutside.js\n * @description Vue composable for detecting clicks outside of a DOM element\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Detects clicks outside a referenced element\n * - Executes callback when outside click detected\n * - Manages event listener lifecycle (mount/unmount)\n * - Useful for closing dropdowns, modals, and popovers\n * - Prevents memory leaks with proper cleanup\n */\n\nimport { ref, onMounted, onUnmounted } from 'vue'\n\n/**\n * Composable for detecting clicks outside an element\n * @param {Function} callback - Function to call when clicked outside\n * @returns {Object}\n */\nexport function useClickOutside(callback) {\n const elementRef = ref(null)\n\n const handleClickOutside = (event) => {\n if (elementRef.value && !elementRef.value.contains(event.target)) {\n callback()\n }\n }\n\n onMounted(() => {\n document.addEventListener('click', handleClickOutside)\n })\n\n onUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n })\n\n return {\n elementRef\n }\n}\n\n","/**\n * @file useLocalStorage.js\n * @description Vue composable for reactive browser localStorage management\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides reactive interface to browser localStorage\n * - Handles JSON serialization/deserialization\n * - Implements safe read/write operations with error handling\n * - Manages default values when keys don't exist\n * - Exposes remove functionality for cleanup\n * - Initializes data on component mount\n */\n\nimport { ref, onMounted } from 'vue'\n\n/**\n * Composable for managing localStorage\n * @param {string} key - Storage key\n * @param {*} defaultValue - Default value if key doesn't exist\n * @returns {Object}\n */\nexport function useLocalStorage(key, defaultValue = null) {\n const data = ref(defaultValue)\n\n const read = () => {\n try {\n const item = window.localStorage.getItem(key)\n return item ? JSON.parse(item) : defaultValue\n } catch (error) {\n console.error(`Error reading localStorage key \"${key}\":`, error)\n return defaultValue\n }\n }\n\n const write = (value) => {\n try {\n data.value = value\n window.localStorage.setItem(key, JSON.stringify(value))\n } catch (error) {\n console.error(`Error writing localStorage key \"${key}\":`, error)\n }\n }\n\n const remove = () => {\n try {\n window.localStorage.removeItem(key)\n data.value = defaultValue\n } catch (error) {\n console.error(`Error removing localStorage key \"${key}\":`, error)\n }\n }\n\n // Initialize\n onMounted(() => {\n data.value = read()\n })\n\n return {\n data,\n write,\n remove\n }\n}\n\n","/**\n * @file helpers.js\n * @description Collection of reusable utility functions for common operations\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides performance optimization functions (debounce, throttle)\n * - Handles object manipulation (deep cloning)\n * - Date formatting and manipulation utilities\n * - String operations (capitalize, truncate)\n * - Unique ID generation\n * - Value validation helpers (isEmpty checks)\n * - Shared utility logic across the application\n */\n\n/**\n * Debounce function to limit rate of function execution\n * @param {Function} func - Function to debounce\n * @param {number} wait - Delay in milliseconds\n * @returns {Function}\n */\nexport function debounce(func, wait = 300) {\n let timeout\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout)\n func(...args)\n }\n clearTimeout(timeout)\n timeout = setTimeout(later, wait)\n }\n}\n\n/**\n * Throttle function to limit function execution frequency\n * @param {Function} func - Function to throttle\n * @param {number} limit - Time limit in milliseconds\n * @returns {Function}\n */\nexport function throttle(func, limit = 300) {\n let inThrottle\n return function executedFunction(...args) {\n if (!inThrottle) {\n func(...args)\n inThrottle = true\n setTimeout(() => (inThrottle = false), limit)\n }\n }\n}\n\n/**\n * Deep clone an object\n * @param {*} obj - Object to clone\n * @returns {*}\n */\nexport function deepClone(obj) {\n if (obj === null || typeof obj !== 'object') return obj\n if (obj instanceof Date) return new Date(obj.getTime())\n if (obj instanceof Array) return obj.map(item => deepClone(item))\n \n const clonedObj = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n clonedObj[key] = deepClone(obj[key])\n }\n }\n return clonedObj\n}\n\n/**\n * Format date to readable string\n * @param {Date|string} date - Date to format\n * @param {string} format - Format type ('short', 'long', 'time')\n * @returns {string}\n */\nexport function formatDate(date, format = 'short') {\n const d = new Date(date)\n \n const options = {\n short: { year: 'numeric', month: 'short', day: 'numeric' },\n long: { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' },\n time: { hour: '2-digit', minute: '2-digit', second: '2-digit' }\n }\n \n // Use toLocaleTimeString for time-only format\n if (format === 'time') {\n return d.toLocaleTimeString('en-US', options.time)\n }\n \n return d.toLocaleDateString('en-US', options[format] || options.short)\n}\n\n/**\n * Generate unique ID\n * @returns {string}\n */\nexport function generateId() {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n}\n\n/**\n * Capitalize first letter of string\n * @param {string} str - String to capitalize\n * @returns {string}\n */\nexport function capitalize(str) {\n if (!str) return ''\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\n/**\n * Truncate string to specified length\n * @param {string} str - String to truncate\n * @param {number} length - Max length\n * @param {string} suffix - Suffix to add\n * @returns {string}\n */\nexport function truncate(str, length = 50, suffix = '...') {\n if (!str || str.length <= length) return str\n return str.substring(0, length).trim() + suffix\n}\n\n/**\n * Check if value is empty (null, undefined, empty string, empty array, empty object)\n * @param {*} value - Value to check\n * @returns {boolean}\n */\nexport function isEmpty(value) {\n if (value === null || value === undefined) return true\n if (typeof value === 'string' && value.trim() === '') return true\n if (Array.isArray(value) && value.length === 0) return true\n if (typeof value === 'object' && Object.keys(value).length === 0) return true\n return false\n}\n\n","/**\n * @file useWindowSize.js\n * @description Vue composable for reactive window size tracking with debouncing\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Tracks browser window width and height reactively\n * - Implements debounced resize listener for performance\n * - Updates reactive values on window resize\n * - Manages resize event listener lifecycle\n * - Useful for responsive layouts and conditional rendering\n */\n\nimport { ref, onMounted, onUnmounted } from 'vue'\nimport { debounce } from '../utils/helpers'\n\n/**\n * Composable for tracking window size\n * @returns {Object}\n */\nexport function useWindowSize() {\n const width = ref(window.innerWidth)\n const height = ref(window.innerHeight)\n\n const handleResize = debounce(() => {\n width.value = window.innerWidth\n height.value = window.innerHeight\n }, 200)\n\n onMounted(() => {\n window.addEventListener('resize', handleResize)\n })\n\n onUnmounted(() => {\n window.removeEventListener('resize', handleResize)\n })\n\n return {\n width,\n height\n }\n}\n\n","/**\n * @file validationStore.js\n * @description Pinia store for managing validation feature state and actions\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @store validation\n * @responsibilities\n * - Manages validation data state across the application\n * - Handles async data fetching for validation features\n * - Provides centralized loading state management\n * - Exposes validation data to components via Pinia composition API\n */\n\nimport { defineStore } from 'pinia'\nimport { ref } from 'vue'\nexport const useValidationStore = defineStore('validation', () => {\n // State\n const data = ref([])\n const isLoading = ref(false)\n\n // Actions\n const fetchData = async () => {\n isLoading.value = true\n // Add your API call here\n isLoading.value = false\n }\n\n return {\n data,\n isLoading,\n fetchData\n }\n})\n\n","/**\n * @file customizationStore.js\n * @description Pinia store for managing customization settings and preferences\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @store customization\n * @responsibilities\n * - Manages application customization settings state\n * - Handles fetching and updating of user/admin customization preferences\n * - Provides centralized loading state for customization operations\n * - Exposes settings data and update methods to components\n */\n\nimport { defineStore } from 'pinia'\nimport { ref } from 'vue'\nexport const useCustomizationStore = defineStore('customization', () => {\n // State\n const settings = ref({})\n const isLoading = ref(false)\n\n // Actions\n const fetchSettings = async () => {\n isLoading.value = true\n // Add your API call here\n isLoading.value = false\n }\n\n const updateSettings = (newSettings) => {\n settings.value = { ...settings.value, ...newSettings }\n }\n\n return {\n settings,\n isLoading,\n fetchSettings,\n updateSettings\n }\n})\n\n","/**\n * @file useValidation.js\n * @description Vue composable for accessing validation store functionality\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides reactive access to validation store state\n * - Exposes validation data and loading states to components\n * - Wraps store actions for validation data fetching\n * - Ensures reactivity using storeToRefs\n * - Simplifies validation feature integration in components\n */\n\nimport { storeToRefs } from 'pinia'\nimport { useValidationStore } from '../store/validationStore'\nexport function useValidation() {\n const validationStore = useValidationStore()\n const { data, isLoading } = storeToRefs(validationStore)\n const { fetchData } = validationStore\n \n return {\n data,\n isLoading,\n fetchData\n }\n}\n\n","/**\n * @file useCustomization.js\n * @description Vue composable for accessing customization store functionality\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides reactive access to customization store state\n * - Exposes settings and loading states to components\n * - Wraps store actions for fetching and updating settings\n * - Ensures reactivity using storeToRefs\n * - Simplifies customization feature integration in components\n */\n\nimport { storeToRefs } from 'pinia'\nimport { useCustomizationStore } from '../store/customizationStore'\nexport function useCustomization() {\n const customizationStore = useCustomizationStore()\n const { settings, isLoading } = storeToRefs(customizationStore)\n const { fetchSettings, updateSettings } = customizationStore\n \n return {\n settings,\n isLoading,\n fetchSettings,\n updateSettings\n }\n}\n\n","/**\n * @file apiService.js\n * @description Centralized HTTP API service for all backend communications\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Provides unified API request interface using native Fetch API\n * - Handles HTTP methods: GET, POST, PUT, PATCH, DELETE\n * - Manages request/response formatting and JSON serialization\n * - Implements centralized error handling and logging\n * - Configures base URL from environment variables\n * - Sets default headers (Content-Type, custom headers)\n * - Validates HTTP response status codes\n */\n\nconst API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000/api'\n\nclass ApiService {\n constructor(baseURL = API_BASE_URL) {\n this.baseURL = baseURL\n }\n\n async request(endpoint, options = {}) {\n const url = `${this.baseURL}${endpoint}`\n \n // Extract body and headers from options\n const { body, headers = {}, ...rest } = options\n \n // Build final headers object\n const finalHeaders = { ...headers }\n \n // Only set Content-Type for JSON payloads, not for FormData or GET requests\n // FormData needs browser-generated multipart/form-data with boundary\n if (body && !(body instanceof FormData)) {\n finalHeaders['Content-Type'] = 'application/json'\n }\n \n // Build final config\n const config = {\n ...rest,\n headers: finalHeaders\n }\n \n // Add body if present\n if (body !== undefined) {\n config.body = body\n }\n\n try {\n const response = await fetch(url, config)\n \n // Check for HTTP errors\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n // Handle 204 No Content - no body to parse\n if (response.status === 204) {\n return null\n }\n \n // Parse based on content-type header\n const contentType = response.headers.get('content-type') || ''\n \n if (contentType.includes('application/json')) {\n return await response.json()\n }\n \n // Return text for non-JSON responses\n return await response.text()\n } catch (error) {\n console.error('API request failed:', error)\n throw error\n }\n }\n\n get(endpoint, options = {}) {\n return this.request(endpoint, { method: 'GET', ...options })\n }\n\n post(endpoint, data, options = {}) {\n return this.request(endpoint, {\n method: 'POST',\n body: data instanceof FormData ? data : JSON.stringify(data),\n ...options\n })\n }\n\n put(endpoint, data, options = {}) {\n return this.request(endpoint, {\n method: 'PUT',\n body: data instanceof FormData ? data : JSON.stringify(data),\n ...options\n })\n }\n\n patch(endpoint, data, options = {}) {\n return this.request(endpoint, {\n method: 'PATCH',\n body: data instanceof FormData ? data : JSON.stringify(data),\n ...options\n })\n }\n\n delete(endpoint, options = {}) {\n return this.request(endpoint, { method: 'DELETE', ...options })\n }\n}\n\nexport const apiService = new ApiService()\nexport default apiService\n\n","/**\n * @file app.config.js\n * @description Central application configuration file for DNA ATD Frontend\n * @author Illuminate Education\n * @lastUpdated 2025-12-10\n * \n * @responsibilities\n * - Defines application-wide configuration constants\n * - Manages API endpoint and timeout settings\n * - Configures theme options and layout dimensions\n * - Sets pagination defaults and date format preferences\n * - Defines localStorage key conventions\n * - Manages feature flags for conditional features\n * - Establishes validation rules for user inputs\n */\n\nexport const appConfig = {\n // Application name\n name: 'DNA ATD Frontend',\n \n // Version\n version: '1.0.0',\n \n // API Configuration\n api: {\n baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000/api',\n timeout: 30000,\n headers: {\n 'Content-Type': 'application/json'\n }\n },\n \n // Theme Configuration\n theme: {\n default: 'light',\n available: ['light', 'dark', 'auto']\n },\n \n // Layout Configuration\n layout: {\n sidebarWidth: 250,\n headerHeight: 64,\n footerHeight: 48\n },\n \n // Pagination\n pagination: {\n defaultPageSize: 10,\n pageSizeOptions: [10, 20, 50, 100]\n },\n \n // Date Format\n dateFormat: {\n short: 'MMM DD, YYYY',\n long: 'MMMM DD, YYYY HH:mm',\n time: 'HH:mm:ss'\n },\n \n // Storage Keys\n storageKeys: {\n theme: 'app_theme',\n locale: 'app_locale',\n token: 'app_token',\n user: 'app_user'\n },\n \n // Feature Flags\n features: {\n darkMode: true,\n notifications: true,\n analytics: false\n },\n \n // Validation Rules\n validation: {\n password: {\n minLength: 8,\n requireUppercase: true,\n requireLowercase: true,\n requireNumbers: true,\n requireSpecialChars: true\n },\n username: {\n minLength: 3,\n maxLength: 20\n }\n }\n}\n\nexport default appConfig\n\n","/**\n * @file index.js\n * @description Library entry point - exports all public API components, composables, and utilities\n * @author Illuminate Education\n * @lastUpdated 2025-12-15\n * \n * @responsibilities\n * - Provides factory functions for creating app instances\n * - Exports reusable components for external consumption\n * - Exposes composables and stores for external consumption\n * - Exports utility functions and services\n * - Serves as the main entry point when used as an npm package\n * - Enables modular consumption of library features\n */\n\nimport { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport router from './router'\nimport App from './App.vue'\n\nexport function createDnaAtdApp(elementId = '#app') {\n const app = createApp(App)\n const pinia = createPinia()\n app.use(pinia)\n app.use(router)\n return app.mount(elementId)\n}\n\nexport function createDnaAtdAppInstance() {\n const app = createApp(App)\n const pinia = createPinia()\n app.use(pinia)\n app.use(router)\n return app\n}\n\nexport { default as App } from './App.vue'\nexport { default as router } from './router'\n\nexport { default as BaseButton } from './components/common/BaseButton.vue'\nexport { default as BaseInput } from './components/common/BaseInput.vue'\nexport { default as BaseModal } from './components/common/BaseModal.vue'\n\nexport { useAsync } from './composables/useAsync'\nexport { useForm } from './composables/useForm'\nexport { useClickOutside } from './composables/useClickOutside'\nexport { useLocalStorage } from './composables/useLocalStorage'\nexport { useWindowSize } from './composables/useWindowSize'\n\nexport { useValidationStore } from './features/admin/validation/store/validationStore'\nexport { useCustomizationStore } from './features/admin/customization/store/customizationStore'\n\nexport { useValidation } from './features/admin/validation/composables/useValidation'\nexport { useCustomization } from './features/admin/customization/composables/useCustomization'\n\nexport { default as apiService } from './services/apiService'\nexport { appConfig } from './config/app.config'\n\nexport * from './utils/helpers'\n"],"names":["router","createRouter","createWebHistory","to","from","next","defaultTitle","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","RouterView","$emit","_renderSlot","_ctx","__props","$event","_createElementVNode","_hoisted_2","useAsync","asyncFunction","data","ref","error","isLoading","args","err","useForm","initialValues","validationRules","formData","errors","touched","isValid","computed","validateField","fieldName","value","rules","rule","isFormValid","useClickOutside","callback","elementRef","handleClickOutside","event","onMounted","onUnmounted","useLocalStorage","key","defaultValue","read","item","write","remove","debounce","func","wait","timeout","later","throttle","limit","inThrottle","deepClone","obj","clonedObj","formatDate","date","format","d","options","generateId","capitalize","str","truncate","length","suffix","isEmpty","useWindowSize","width","height","handleResize","useValidationStore","defineStore","useCustomizationStore","settings","newSettings","useValidation","validationStore","storeToRefs","fetchData","useCustomization","customizationStore","fetchSettings","updateSettings","API_BASE_URL","ApiService","baseURL","endpoint","url","body","headers","rest","finalHeaders","config","response","apiService","appConfig","createDnaAtdApp","elementId","app","createApp","App","pinia","createPinia","createDnaAtdAppInstance"],"mappings":"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"}
|