diff --git a/docs/Presentations/AI Learning Tool Beta.pdf b/docs/Presentations/AI Learning Tool Beta.pdf
new file mode 100644
index 00000000..86e0ff12
Binary files /dev/null and b/docs/Presentations/AI Learning Tool Beta.pdf differ
diff --git a/docs/Presentations/AI Learning Tool MVP.pdf b/docs/Presentations/AI Learning Tool MVP.pdf
new file mode 100644
index 00000000..2154184c
Binary files /dev/null and b/docs/Presentations/AI Learning Tool MVP.pdf differ
diff --git a/docs/Research/vue-notes.md b/docs/Research/vue-notes.md
new file mode 100644
index 00000000..d909ca22
--- /dev/null
+++ b/docs/Research/vue-notes.md
@@ -0,0 +1,81 @@
+# Basics
+
+@keyup.enter \- waits for “Enter” keypress event
+
+{{ sum }} \- represents the “sum” variable in Virtual Object Model.
+
+import { createApp } from 'vue'
+
+const app \= createApp({
+ data() {
+ return {
+ count: 0
+ }
+ },
+ methods: {
+ changeCount(x) {
+ this.count \= x
+ }
+ }
+})
+
+data \- represents local constants/variables in the application instance.
+methods \- represent local methods.
+
+\# Triggers toggleBox routine when the button is clicked.
+\
+
+\# Only renders the div when “isVisible” variable is set to “true”.
+\
\
+
+app.mount('\#app')
+
+\# v-model \- binds value of a form input to a variable
+\
+
+\# v-bind \- turns a standard HTML label into something that can be parsed by JS. You can also just put “:” instead of “v-bind”:
+\
+
+—---------
+
+\# “prevent” \- prevents default action, “stop” \- stops propagation. Modifiers can be chained as below:
+\
+
+# Reusable components
+
+![][image1]
+Login form, in template HTML:
+ \
+
+loginForm: {
+ template: \`
+ \
+ \`,
+ components: {
+ customInput
+ },
+ data() {
+ return {
+ title: "Login form",
+ email: "",
+ password: "",
+ emailLabel: "Email",
+ passwordLabel: "Password"
+ }
+ }
+ },
+ customInput: {
+ template:
+ \`\\`,
+ props: \["label", "modelValue"\],
+ }
+
+[image1]:
\ No newline at end of file
diff --git a/frontend/public/index.html b/frontend/public/index.html
index 8796d909..038bd1b7 100644
--- a/frontend/public/index.html
+++ b/frontend/public/index.html
@@ -3,7 +3,7 @@
-
+
<%= htmlWebpackPlugin.options.title %>
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index 39e96854..a49243f9 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -62,6 +62,8 @@ export default {
};
+
+
\ No newline at end of file
+
diff --git a/frontend/src/main.js b/frontend/src/main.js
index 39ee0768..a8f5dd94 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -33,8 +33,31 @@ router.afterEach((to) => {
document.title = to.meta.title || 'Default title';
});
+// Detect if it is a mobile device
+function isMobileDevice() {
+ return /Android|iPhone|iPad|iPod/i.test(navigator.userAgent);
+}
+
+// Attempts to lock screen orientation, performed on mobile only
+function lockOrientation() {
+ if (!isMobileDevice()) return; // Mobile only
+
+ if (screen.orientation && screen.orientation.lock) {
+ screen.orientation.lock("portrait").catch(err => {
+ console.warn("Screen orientation lock failed:", err);
+ });
+ }
+}
+
+// Vue mounts and then tries to lock the orientation
+document.addEventListener("DOMContentLoaded", lockOrientation);
+document.addEventListener("fullscreenchange", lockOrientation);
+
const app = createApp(App);
app.use(router);
app.mount('#app');
+// Try locking again (make sure it takes effect after Vue is mounted)
+lockOrientation();
+
export default router;