Spaces:
Running
Running
Make a support ticket create temlate and tell customer that yoiur ticket is been created and our support agent will reply you within 24 hrs you can even reply to thjise email for futher commnuination
Browse files- README.md +8 -5
- components/header.js +49 -0
- components/sidebar.js +48 -0
- components/support-ticket.js +156 -0
- index.html +167 -19
- script.js +232 -0
- style.css +69 -18
- support.html +28 -0
README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: EduLoom SupportSync 🎟️
|
| 3 |
+
colorFrom: blue
|
| 4 |
+
colorTo: pink
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
components/header.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomHeader extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.search-input:focus {
|
| 7 |
+
outline: none;
|
| 8 |
+
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2);
|
| 9 |
+
}
|
| 10 |
+
</style>
|
| 11 |
+
<div class="border-b border-gray-200 bg-white">
|
| 12 |
+
<div class="px-4 sm:px-6 lg:px-8">
|
| 13 |
+
<div class="flex justify-between h-16 items-center">
|
| 14 |
+
<!-- Search bar -->
|
| 15 |
+
<div class="flex-1 flex">
|
| 16 |
+
<div class="flex-1 max-w-xs">
|
| 17 |
+
<div class="relative focus-within:z-10">
|
| 18 |
+
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
|
| 19 |
+
<i data-feather="search" class="h-5 w-5 text-gray-400"></i>
|
| 20 |
+
</div>
|
| 21 |
+
<input class="search-input block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:placeholder-gray-400 sm:text-sm" placeholder="Search" type="search">
|
| 22 |
+
</div>
|
| 23 |
+
</div>
|
| 24 |
+
</div>
|
| 25 |
+
|
| 26 |
+
<!-- Right side icons -->
|
| 27 |
+
<div class="ml-4 flex items-center md:ml-6">
|
| 28 |
+
<button class="p-1 rounded-full text-gray-400 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500">
|
| 29 |
+
<span class="sr-only">View notifications</span>
|
| 30 |
+
<i data-feather="bell" class="h-6 w-6"></i>
|
| 31 |
+
</button>
|
| 32 |
+
|
| 33 |
+
<!-- Profile dropdown -->
|
| 34 |
+
<div class="ml-3 relative">
|
| 35 |
+
<div>
|
| 36 |
+
<button class="max-w-xs bg-white flex items-center text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500" id="user-menu">
|
| 37 |
+
<span class="sr-only">Open user menu</span>
|
| 38 |
+
<img class="h-8 w-8 rounded-full" src="http://static.photos/people/200x200/42" alt="">
|
| 39 |
+
</button>
|
| 40 |
+
</div>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
</div>
|
| 45 |
+
</div>
|
| 46 |
+
`;
|
| 47 |
+
}
|
| 48 |
+
}
|
| 49 |
+
customElements.define('custom-header', CustomHeader);
|
components/sidebar.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class CustomSidebar extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.sidebar-item {
|
| 7 |
+
padding: 0.75rem 1rem;
|
| 8 |
+
margin: 0.25rem 0;
|
| 9 |
+
border-radius: 0.375rem;
|
| 10 |
+
cursor: pointer;
|
| 11 |
+
transition: all 0.2s;
|
| 12 |
+
display: flex;
|
| 13 |
+
align-items: center;
|
| 14 |
+
}
|
| 15 |
+
.sidebar-item:hover {
|
| 16 |
+
background-color: rgba(59, 130, 246, 0.1);
|
| 17 |
+
color: rgb(59, 130, 246);
|
| 18 |
+
}
|
| 19 |
+
.sidebar-item.active {
|
| 20 |
+
background-color: rgba(59, 130, 246, 0.1);
|
| 21 |
+
color: rgb(59, 130, 246);
|
| 22 |
+
font-weight: 500;
|
| 23 |
+
}
|
| 24 |
+
.sidebar-icon {
|
| 25 |
+
margin-right: 0.75rem;
|
| 26 |
+
}
|
| 27 |
+
</style>
|
| 28 |
+
<div class="w-64 bg-white border-r border-gray-200 h-full p-4">
|
| 29 |
+
<h2 class="text-xl font-bold text-primary-600 mb-6">EduLoom</h2>
|
| 30 |
+
<div class="space-y-1">
|
| 31 |
+
<div class="sidebar-item active">
|
| 32 |
+
<i data-feather="book-open" class="sidebar-icon w-5 h-5"></i>
|
| 33 |
+
<span>Curriculum Builder</span>
|
| 34 |
+
</div>
|
| 35 |
+
<div class="sidebar-item">
|
| 36 |
+
<i data-feather="eye" class="sidebar-icon w-5 h-5"></i>
|
| 37 |
+
<span>Preview</span>
|
| 38 |
+
</div>
|
| 39 |
+
<div class="sidebar-item">
|
| 40 |
+
<i data-feather="save" class="sidebar-icon w-5 h-5"></i>
|
| 41 |
+
<span>Save Curriculum</span>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
</div>
|
| 45 |
+
`;
|
| 46 |
+
}
|
| 47 |
+
}
|
| 48 |
+
customElements.define('custom-sidebar', CustomSidebar);
|
components/support-ticket.js
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class SupportTicket extends HTMLElement {
|
| 2 |
+
connectedCallback() {
|
| 3 |
+
this.attachShadow({ mode: 'open' });
|
| 4 |
+
this.shadowRoot.innerHTML = `
|
| 5 |
+
<style>
|
| 6 |
+
.ticket-container {
|
| 7 |
+
background: white;
|
| 8 |
+
border-radius: 8px;
|
| 9 |
+
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
| 10 |
+
padding: 2rem;
|
| 11 |
+
max-width: 600px;
|
| 12 |
+
margin: 2rem auto;
|
| 13 |
+
}
|
| 14 |
+
.ticket-header {
|
| 15 |
+
display: flex;
|
| 16 |
+
align-items: center;
|
| 17 |
+
margin-bottom: 1.5rem;
|
| 18 |
+
}
|
| 19 |
+
.ticket-icon {
|
| 20 |
+
font-size: 2rem;
|
| 21 |
+
margin-right: 1rem;
|
| 22 |
+
color: #4f46e5;
|
| 23 |
+
}
|
| 24 |
+
.ticket-title {
|
| 25 |
+
font-size: 1.5rem;
|
| 26 |
+
font-weight: 600;
|
| 27 |
+
color: #111827;
|
| 28 |
+
}
|
| 29 |
+
.form-group {
|
| 30 |
+
margin-bottom: 1.5rem;
|
| 31 |
+
}
|
| 32 |
+
label {
|
| 33 |
+
display: block;
|
| 34 |
+
margin-bottom: 0.5rem;
|
| 35 |
+
font-weight: 500;
|
| 36 |
+
color: #374151;
|
| 37 |
+
}
|
| 38 |
+
input, select, textarea {
|
| 39 |
+
width: 100%;
|
| 40 |
+
padding: 0.75rem;
|
| 41 |
+
border: 1px solid #d1d5db;
|
| 42 |
+
border-radius: 6px;
|
| 43 |
+
font-size: 1rem;
|
| 44 |
+
}
|
| 45 |
+
textarea {
|
| 46 |
+
min-height: 120px;
|
| 47 |
+
resize: vertical;
|
| 48 |
+
}
|
| 49 |
+
.submit-btn {
|
| 50 |
+
background: #4f46e5;
|
| 51 |
+
color: white;
|
| 52 |
+
border: none;
|
| 53 |
+
padding: 0.75rem 1.5rem;
|
| 54 |
+
border-radius: 6px;
|
| 55 |
+
font-weight: 500;
|
| 56 |
+
cursor: pointer;
|
| 57 |
+
transition: background 0.2s;
|
| 58 |
+
}
|
| 59 |
+
.submit-btn:hover {
|
| 60 |
+
background: #4338ca;
|
| 61 |
+
}
|
| 62 |
+
.confirmation {
|
| 63 |
+
text-align: center;
|
| 64 |
+
padding: 2rem;
|
| 65 |
+
}
|
| 66 |
+
.confirmation-icon {
|
| 67 |
+
font-size: 3rem;
|
| 68 |
+
color: #10b981;
|
| 69 |
+
margin-bottom: 1rem;
|
| 70 |
+
}
|
| 71 |
+
.confirmation-title {
|
| 72 |
+
font-size: 1.5rem;
|
| 73 |
+
font-weight: 600;
|
| 74 |
+
margin-bottom: 1rem;
|
| 75 |
+
color: #111827;
|
| 76 |
+
}
|
| 77 |
+
.confirmation-message {
|
| 78 |
+
color: #4b5563;
|
| 79 |
+
margin-bottom: 1.5rem;
|
| 80 |
+
}
|
| 81 |
+
.hidden {
|
| 82 |
+
display: none;
|
| 83 |
+
}
|
| 84 |
+
</style>
|
| 85 |
+
<div class="ticket-container">
|
| 86 |
+
<div id="ticketForm">
|
| 87 |
+
<div class="ticket-header">
|
| 88 |
+
<div class="ticket-icon">🎟️</div>
|
| 89 |
+
<h2 class="ticket-title">Create Support Ticket</h2>
|
| 90 |
+
</div>
|
| 91 |
+
<form id="supportForm">
|
| 92 |
+
<div class="form-group">
|
| 93 |
+
<label for="subject">Subject</label>
|
| 94 |
+
<input type="text" id="subject" required>
|
| 95 |
+
</div>
|
| 96 |
+
<div class="form-group">
|
| 97 |
+
<label for="department">Department</label>
|
| 98 |
+
<select id="department" required>
|
| 99 |
+
<option value="">Select department</option>
|
| 100 |
+
<option value="technical">Technical Support</option>
|
| 101 |
+
<option value="billing">Billing</option>
|
| 102 |
+
<option value="account">Account</option>
|
| 103 |
+
<option value="general">General Inquiry</option>
|
| 104 |
+
</select>
|
| 105 |
+
</div>
|
| 106 |
+
<div class="form-group">
|
| 107 |
+
<label for="priority">Priority</label>
|
| 108 |
+
<select id="priority" required>
|
| 109 |
+
<option value="low">Low</option>
|
| 110 |
+
<option value="medium" selected>Medium</option>
|
| 111 |
+
<option value="high">High</option>
|
| 112 |
+
<option value="critical">Critical</option>
|
| 113 |
+
</select>
|
| 114 |
+
</div>
|
| 115 |
+
<div class="form-group">
|
| 116 |
+
<label for="description">Description</label>
|
| 117 |
+
<textarea id="description" required></textarea>
|
| 118 |
+
</div>
|
| 119 |
+
<button type="submit" class="submit-btn">Submit Ticket</button>
|
| 120 |
+
</form>
|
| 121 |
+
</div>
|
| 122 |
+
<div id="confirmation" class="hidden">
|
| 123 |
+
<div class="confirmation">
|
| 124 |
+
<div class="confirmation-icon">✓</div>
|
| 125 |
+
<h3 class="confirmation-title">Ticket Created Successfully!</h3>
|
| 126 |
+
<p class="confirmation-message">
|
| 127 |
+
Your support ticket has been created. Our team will respond within 24 hours.
|
| 128 |
+
You can reply to the confirmation email for further communication.
|
| 129 |
+
</p>
|
| 130 |
+
<button id="newTicketBtn" class="submit-btn">Create New Ticket</button>
|
| 131 |
+
</div>
|
| 132 |
+
</div>
|
| 133 |
+
</div>
|
| 134 |
+
`;
|
| 135 |
+
|
| 136 |
+
const form = this.shadowRoot.getElementById('supportForm');
|
| 137 |
+
const ticketForm = this.shadowRoot.getElementById('ticketForm');
|
| 138 |
+
const confirmation = this.shadowRoot.getElementById('confirmation');
|
| 139 |
+
const newTicketBtn = this.shadowRoot.getElementById('newTicketBtn');
|
| 140 |
+
|
| 141 |
+
form.addEventListener('submit', (e) => {
|
| 142 |
+
e.preventDefault();
|
| 143 |
+
// In a real app, you would send the form data to your backend
|
| 144 |
+
ticketForm.classList.add('hidden');
|
| 145 |
+
confirmation.classList.remove('hidden');
|
| 146 |
+
});
|
| 147 |
+
|
| 148 |
+
newTicketBtn.addEventListener('click', () => {
|
| 149 |
+
form.reset();
|
| 150 |
+
confirmation.classList.add('hidden');
|
| 151 |
+
ticketForm.classList.remove('hidden');
|
| 152 |
+
});
|
| 153 |
+
}
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
customElements.define('support-ticket', SupportTicket);
|
index.html
CHANGED
|
@@ -1,19 +1,167 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en" class="h-full bg-gray-50">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>EduLoom Navigator | Course Curriculum</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 11 |
+
<script src="components/sidebar.js"></script>
|
| 12 |
+
<script src="components/header.js"></script>
|
| 13 |
+
<script>
|
| 14 |
+
tailwind.config = {
|
| 15 |
+
theme: {
|
| 16 |
+
extend: {
|
| 17 |
+
colors: {
|
| 18 |
+
primary: {
|
| 19 |
+
50: '#f0f9ff',
|
| 20 |
+
100: '#e0f2fe',
|
| 21 |
+
200: '#bae6fd',
|
| 22 |
+
300: '#7dd3fc',
|
| 23 |
+
400: '#38bdf8',
|
| 24 |
+
500: '#0ea5e9',
|
| 25 |
+
600: '#0284c7',
|
| 26 |
+
700: '#0369a1',
|
| 27 |
+
800: '#075985',
|
| 28 |
+
900: '#0c4a6e',
|
| 29 |
+
},
|
| 30 |
+
secondary: {
|
| 31 |
+
50: '#f5f3ff',
|
| 32 |
+
100: '#ede9fe',
|
| 33 |
+
200: '#ddd6fe',
|
| 34 |
+
300: '#c4b5fd',
|
| 35 |
+
400: '#a78bfa',
|
| 36 |
+
500: '#8b5cf6',
|
| 37 |
+
600: '#7c3aed',
|
| 38 |
+
700: '#6d28d9',
|
| 39 |
+
800: '#5b21b6',
|
| 40 |
+
900: '#4c1d95',
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
}
|
| 46 |
+
</script>
|
| 47 |
+
</head>
|
| 48 |
+
<body class="h-full">
|
| 49 |
+
<div class="flex h-full">
|
| 50 |
+
<!-- Sidebar -->
|
| 51 |
+
<custom-sidebar></custom-sidebar>
|
| 52 |
+
|
| 53 |
+
<!-- Main Content -->
|
| 54 |
+
<div class="flex-1 flex flex-col overflow-hidden">
|
| 55 |
+
<custom-header></custom-header>
|
| 56 |
+
<!-- Main Content Area -->
|
| 57 |
+
<main class="flex-1 overflow-y-auto p-6 bg-gray-50">
|
| 58 |
+
<div class="max-w-7xl mx-auto">
|
| 59 |
+
<div class="flex justify-between items-center mb-8">
|
| 60 |
+
<h1 class="text-3xl font-bold text-gray-900">Course Curriculum</h1>
|
| 61 |
+
<button id="addModuleBtn" class="bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-lg flex items-center gap-2">
|
| 62 |
+
<i data-feather="plus"></i>
|
| 63 |
+
Add Module
|
| 64 |
+
</button>
|
| 65 |
+
</div>
|
| 66 |
+
|
| 67 |
+
<!-- Module Editor View -->
|
| 68 |
+
<div id="editorView" class="hidden">
|
| 69 |
+
<div class="flex justify-between items-center mb-6">
|
| 70 |
+
<h2 id="moduleTitle" class="text-2xl font-bold text-gray-800">Module: <span class="editable-title">Untitled Module</span></h2>
|
| 71 |
+
<button id="closeEditorBtn" class="text-gray-500 hover:text-gray-700">
|
| 72 |
+
<i data-feather="x"></i>
|
| 73 |
+
</button>
|
| 74 |
+
</div>
|
| 75 |
+
|
| 76 |
+
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6 mb-6">
|
| 77 |
+
<h3 class="text-lg font-semibold mb-4">Module Details</h3>
|
| 78 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-6">
|
| 79 |
+
<div>
|
| 80 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Title</label>
|
| 81 |
+
<input type="text" class="w-full px-3 py-2 border border-gray-300 rounded-md module-title-input" value="Untitled Module">
|
| 82 |
+
</div>
|
| 83 |
+
<div>
|
| 84 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Description</label>
|
| 85 |
+
<input type="text" class="w-full px-3 py-2 border border-gray-300 rounded-md" placeholder="Brief description">
|
| 86 |
+
</div>
|
| 87 |
+
</div>
|
| 88 |
+
|
| 89 |
+
<h3 class="text-lg font-semibold mb-4">Lessons</h3>
|
| 90 |
+
<div id="lessonsContainer" class="space-y-4">
|
| 91 |
+
<!-- Lessons will be added here -->
|
| 92 |
+
</div>
|
| 93 |
+
|
| 94 |
+
<div class="mt-6">
|
| 95 |
+
<button id="addLessonBtn" class="bg-primary-600 hover:bg-primary-700 text-white px-4 py-2 rounded-lg flex items-center gap-2">
|
| 96 |
+
<i data-feather="plus"></i>
|
| 97 |
+
Add Lesson
|
| 98 |
+
</button>
|
| 99 |
+
</div>
|
| 100 |
+
</div>
|
| 101 |
+
</div>
|
| 102 |
+
|
| 103 |
+
<!-- Curriculum Builder View -->
|
| 104 |
+
<div id="builderView" class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 105 |
+
<!-- Curriculum Builder -->
|
| 106 |
+
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
|
| 107 |
+
<h2 class="text-xl font-semibold mb-4">Build Your Curriculum</h2>
|
| 108 |
+
|
| 109 |
+
<div class="space-y-4">
|
| 110 |
+
<div>
|
| 111 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Module Title</label>
|
| 112 |
+
<input type="text" class="w-full px-3 py-2 border border-gray-300 rounded-md" placeholder="Enter module title">
|
| 113 |
+
</div>
|
| 114 |
+
|
| 115 |
+
<div>
|
| 116 |
+
<label class="block text-sm font-medium text-gray-700 mb-1">Add Lesson</label>
|
| 117 |
+
<div class="flex gap-2">
|
| 118 |
+
<select class="flex-1 px-3 py-2 border border-gray-300 rounded-md">
|
| 119 |
+
<option>Video Lesson</option>
|
| 120 |
+
<option>Reading</option>
|
| 121 |
+
<option>Quiz</option>
|
| 122 |
+
<option>Assignment</option>
|
| 123 |
+
</select>
|
| 124 |
+
<button class="bg-primary-600 text-white px-3 py-2 rounded-md">
|
| 125 |
+
<i data-feather="plus"></i>
|
| 126 |
+
</button>
|
| 127 |
+
</div>
|
| 128 |
+
</div>
|
| 129 |
+
|
| 130 |
+
<div class="border-t pt-4">
|
| 131 |
+
<button class="w-full bg-primary-600 hover:bg-primary-700 text-white py-2 rounded-md flex items-center justify-center gap-2">
|
| 132 |
+
<i data-feather="plus-circle"></i>
|
| 133 |
+
Add Module
|
| 134 |
+
</button>
|
| 135 |
+
</div>
|
| 136 |
+
</div>
|
| 137 |
+
</div>
|
| 138 |
+
<!-- Preview Panel -->
|
| 139 |
+
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
|
| 140 |
+
<h2 class="text-xl font-semibold mb-4">Curriculum Preview</h2>
|
| 141 |
+
|
| 142 |
+
<div id="previewContainer" class="space-y-3">
|
| 143 |
+
<!-- Modules will be added here dynamically -->
|
| 144 |
+
</div>
|
| 145 |
+
|
| 146 |
+
<div class="mt-6">
|
| 147 |
+
<button id="saveCurriculumBtn" class="w-full bg-green-600 hover:bg-green-700 text-white py-2 rounded-md flex items-center justify-center gap-2">
|
| 148 |
+
<i data-feather="save"></i>
|
| 149 |
+
Save Curriculum
|
| 150 |
+
</button>
|
| 151 |
+
</div>
|
| 152 |
+
</div>
|
| 153 |
+
</div>
|
| 154 |
+
</div>
|
| 155 |
+
</main>
|
| 156 |
+
</div>
|
| 157 |
+
</div>
|
| 158 |
+
|
| 159 |
+
<script>
|
| 160 |
+
feather.replace();
|
| 161 |
+
</script>
|
| 162 |
+
<script src="script.js"></script>
|
| 163 |
+
<script src="components/support-ticket.js"></script>
|
| 164 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 165 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 166 |
+
</body>
|
| 167 |
+
</html>
|
script.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 3 |
+
// DOM Elements
|
| 4 |
+
const previewContainer = document.getElementById('previewContainer');
|
| 5 |
+
const lessonsContainer = document.getElementById('lessonsContainer');
|
| 6 |
+
const addModuleBtn = document.getElementById('addModuleBtn');
|
| 7 |
+
const addLessonBtn = document.getElementById('addLessonBtn');
|
| 8 |
+
const saveCurriculumBtn = document.getElementById('saveCurriculumBtn');
|
| 9 |
+
const closeEditorBtn = document.getElementById('closeEditorBtn');
|
| 10 |
+
const builderView = document.getElementById('builderView');
|
| 11 |
+
const editorView = document.getElementById('editorView');
|
| 12 |
+
const moduleTitleInput = document.querySelector('.module-title-input');
|
| 13 |
+
const editableTitle = document.querySelector('.editable-title');
|
| 14 |
+
|
| 15 |
+
// State
|
| 16 |
+
let currentModule = null;
|
| 17 |
+
let modules = [];
|
| 18 |
+
|
| 19 |
+
// Add Module
|
| 20 |
+
addModuleBtn.addEventListener('click', function() {
|
| 21 |
+
const newModule = {
|
| 22 |
+
id: Date.now(),
|
| 23 |
+
title: 'New Module',
|
| 24 |
+
description: '',
|
| 25 |
+
lessons: []
|
| 26 |
+
};
|
| 27 |
+
|
| 28 |
+
modules.push(newModule);
|
| 29 |
+
renderModulePreview(newModule);
|
| 30 |
+
openModuleEditor(newModule);
|
| 31 |
+
});
|
| 32 |
+
|
| 33 |
+
// Add Lesson
|
| 34 |
+
addLessonBtn.addEventListener('click', function() {
|
| 35 |
+
if (!currentModule) return;
|
| 36 |
+
|
| 37 |
+
const newLesson = {
|
| 38 |
+
id: Date.now(),
|
| 39 |
+
type: 'video',
|
| 40 |
+
title: 'New Lesson',
|
| 41 |
+
duration: '',
|
| 42 |
+
content: ''
|
| 43 |
+
};
|
| 44 |
+
|
| 45 |
+
currentModule.lessons.push(newLesson);
|
| 46 |
+
renderLesson(newLesson);
|
| 47 |
+
});
|
| 48 |
+
|
| 49 |
+
// Save Curriculum
|
| 50 |
+
saveCurriculumBtn.addEventListener('click', function() {
|
| 51 |
+
alert('Curriculum saved successfully!');
|
| 52 |
+
console.log('Saved modules:', modules);
|
| 53 |
+
});
|
| 54 |
+
|
| 55 |
+
// Close Editor
|
| 56 |
+
closeEditorBtn.addEventListener('click', function() {
|
| 57 |
+
editorView.classList.add('hidden');
|
| 58 |
+
builderView.classList.remove('hidden');
|
| 59 |
+
currentModule = null;
|
| 60 |
+
});
|
| 61 |
+
|
| 62 |
+
// Module Title Update
|
| 63 |
+
moduleTitleInput.addEventListener('input', function() {
|
| 64 |
+
if (currentModule) {
|
| 65 |
+
currentModule.title = this.value;
|
| 66 |
+
editableTitle.textContent = this.value;
|
| 67 |
+
updateModulePreview(currentModule);
|
| 68 |
+
}
|
| 69 |
+
});
|
| 70 |
+
|
| 71 |
+
// Functions
|
| 72 |
+
function openModuleEditor(module) {
|
| 73 |
+
currentModule = module;
|
| 74 |
+
moduleTitleInput.value = module.title;
|
| 75 |
+
editableTitle.textContent = module.title;
|
| 76 |
+
lessonsContainer.innerHTML = '';
|
| 77 |
+
|
| 78 |
+
module.lessons.forEach(lesson => {
|
| 79 |
+
renderLesson(lesson);
|
| 80 |
+
});
|
| 81 |
+
|
| 82 |
+
builderView.classList.add('hidden');
|
| 83 |
+
editorView.classList.remove('hidden');
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
function renderModulePreview(module) {
|
| 87 |
+
const moduleEl = document.createElement('div');
|
| 88 |
+
moduleEl.className = 'bg-gray-50 p-3 rounded-lg border border-gray-200 cursor-pointer hover:bg-gray-100';
|
| 89 |
+
moduleEl.dataset.moduleId = module.id;
|
| 90 |
+
moduleEl.innerHTML = `
|
| 91 |
+
<div class="flex justify-between items-center">
|
| 92 |
+
<h3 class="font-medium">${module.title}</h3>
|
| 93 |
+
<button class="text-gray-500 hover:text-primary-600 edit-module-btn">
|
| 94 |
+
<i data-feather="edit-2" class="w-4 h-4"></i>
|
| 95 |
+
</button>
|
| 96 |
+
</div>
|
| 97 |
+
<div class="mt-2 space-y-2" id="module-lessons-${module.id}">
|
| 98 |
+
${module.lessons.length > 0 ?
|
| 99 |
+
module.lessons.map(lesson => `
|
| 100 |
+
<div class="flex items-center gap-2 text-sm">
|
| 101 |
+
<i data-feather="${getLessonIcon(lesson.type)}" class="w-4 h-4 text-gray-500"></i>
|
| 102 |
+
<span>${lesson.title}${lesson.duration ? ` (${lesson.duration} min)` : ''}</span>
|
| 103 |
+
</div>
|
| 104 |
+
`).join('') :
|
| 105 |
+
'<p class="text-sm text-gray-400">No lessons yet</p>'
|
| 106 |
+
}
|
| 107 |
+
</div>
|
| 108 |
+
`;
|
| 109 |
+
|
| 110 |
+
previewContainer.appendChild(moduleEl);
|
| 111 |
+
feather.replace();
|
| 112 |
+
|
| 113 |
+
// Add click handler for edit button
|
| 114 |
+
moduleEl.querySelector('.edit-module-btn').addEventListener('click', (e) => {
|
| 115 |
+
e.stopPropagation();
|
| 116 |
+
openModuleEditor(module);
|
| 117 |
+
});
|
| 118 |
+
|
| 119 |
+
// Add click handler for entire module
|
| 120 |
+
moduleEl.addEventListener('click', () => {
|
| 121 |
+
openModuleEditor(module);
|
| 122 |
+
});
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
function updateModulePreview(module) {
|
| 126 |
+
const moduleEl = previewContainer.querySelector(`[data-module-id="${module.id}"]`);
|
| 127 |
+
if (moduleEl) {
|
| 128 |
+
moduleEl.querySelector('h3').textContent = module.title;
|
| 129 |
+
|
| 130 |
+
const lessonsContainer = moduleEl.querySelector(`#module-lessons-${module.id}`);
|
| 131 |
+
lessonsContainer.innerHTML = module.lessons.length > 0 ?
|
| 132 |
+
module.lessons.map(lesson => `
|
| 133 |
+
<div class="flex items-center gap-2 text-sm">
|
| 134 |
+
<i data-feather="${getLessonIcon(lesson.type)}" class="w-4 h-4 text-gray-500"></i>
|
| 135 |
+
<span>${lesson.title}${lesson.duration ? ` (${lesson.duration} min)` : ''}</span>
|
| 136 |
+
</div>
|
| 137 |
+
`).join('') :
|
| 138 |
+
'<p class="text-sm text-gray-400">No lessons yet</p>';
|
| 139 |
+
|
| 140 |
+
feather.replace();
|
| 141 |
+
}
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
function renderLesson(lesson) {
|
| 145 |
+
const lessonEl = document.createElement('div');
|
| 146 |
+
lessonEl.className = 'bg-gray-50 p-4 rounded-lg border border-gray-200';
|
| 147 |
+
lessonEl.innerHTML = `
|
| 148 |
+
<div class="flex justify-between items-start mb-2">
|
| 149 |
+
<div>
|
| 150 |
+
<h4 class="font-medium">${lesson.title}</h4>
|
| 151 |
+
<div class="flex items-center gap-4 mt-1">
|
| 152 |
+
<span class="text-sm text-gray-500">${lesson.type}</span>
|
| 153 |
+
${lesson.duration ? `<span class="text-sm text-gray-500">${lesson.duration} min</span>` : ''}
|
| 154 |
+
</div>
|
| 155 |
+
</div>
|
| 156 |
+
<div class="flex gap-2">
|
| 157 |
+
<button class="text-gray-500 hover:text-primary-600 edit-lesson-btn">
|
| 158 |
+
<i data-feather="edit-2" class="w-4 h-4"></i>
|
| 159 |
+
</button>
|
| 160 |
+
<button class="text-gray-500 hover:text-red-600 delete-lesson-btn">
|
| 161 |
+
<i data-feather="trash-2" class="w-4 h-4"></i>
|
| 162 |
+
</button>
|
| 163 |
+
</div>
|
| 164 |
+
</div>
|
| 165 |
+
<p class="text-sm text-gray-500">${lesson.content || 'No content yet'}</p>
|
| 166 |
+
`;
|
| 167 |
+
|
| 168 |
+
lessonsContainer.appendChild(lessonEl);
|
| 169 |
+
feather.replace();
|
| 170 |
+
|
| 171 |
+
// Add event handlers
|
| 172 |
+
lessonEl.querySelector('.edit-lesson-btn').addEventListener('click', () => {
|
| 173 |
+
editLesson(lesson);
|
| 174 |
+
});
|
| 175 |
+
|
| 176 |
+
lessonEl.querySelector('.delete-lesson-btn').addEventListener('click', () => {
|
| 177 |
+
deleteLesson(lesson);
|
| 178 |
+
});
|
| 179 |
+
}
|
| 180 |
+
|
| 181 |
+
function editLesson(lesson) {
|
| 182 |
+
// In a real app, you'd open a modal or form to edit the lesson
|
| 183 |
+
const newTitle = prompt('Edit lesson title:', lesson.title);
|
| 184 |
+
if (newTitle !== null) {
|
| 185 |
+
lesson.title = newTitle;
|
| 186 |
+
const moduleIndex = modules.findIndex(m => m.id === currentModule.id);
|
| 187 |
+
if (moduleIndex !== -1) {
|
| 188 |
+
const lessonIndex = modules[moduleIndex].lessons.findIndex(l => l.id === lesson.id);
|
| 189 |
+
if (lessonIndex !== -1) {
|
| 190 |
+
modules[moduleIndex].lessons[lessonIndex] = lesson;
|
| 191 |
+
updateModulePreview(currentModule);
|
| 192 |
+
lessonsContainer.innerHTML = '';
|
| 193 |
+
currentModule.lessons.forEach(l => renderLesson(l));
|
| 194 |
+
}
|
| 195 |
+
}
|
| 196 |
+
}
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
function deleteLesson(lesson) {
|
| 200 |
+
if (confirm('Are you sure you want to delete this lesson?')) {
|
| 201 |
+
const moduleIndex = modules.findIndex(m => m.id === currentModule.id);
|
| 202 |
+
if (moduleIndex !== -1) {
|
| 203 |
+
modules[moduleIndex].lessons = modules[moduleIndex].lessons.filter(l => l.id !== lesson.id);
|
| 204 |
+
updateModulePreview(currentModule);
|
| 205 |
+
lessonsContainer.innerHTML = '';
|
| 206 |
+
currentModule.lessons.forEach(l => renderLesson(l));
|
| 207 |
+
}
|
| 208 |
+
}
|
| 209 |
+
}
|
| 210 |
+
function getLessonIcon(type) {
|
| 211 |
+
switch(type.toLowerCase()) {
|
| 212 |
+
case 'video': return 'play';
|
| 213 |
+
case 'reading': return 'file-text';
|
| 214 |
+
case 'quiz': return 'check-circle';
|
| 215 |
+
case 'assignment': return 'edit-3';
|
| 216 |
+
default: return 'file';
|
| 217 |
+
}
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
// Add support link functionality
|
| 221 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 222 |
+
const sidebarItems = document.querySelectorAll('.sidebar-item');
|
| 223 |
+
sidebarItems.forEach(item => {
|
| 224 |
+
item.addEventListener('click', function() {
|
| 225 |
+
const text = this.textContent.trim();
|
| 226 |
+
if (text === 'Support') {
|
| 227 |
+
window.location.href = '/support.html';
|
| 228 |
+
}
|
| 229 |
+
});
|
| 230 |
+
});
|
| 231 |
+
});
|
| 232 |
+
});
|
style.css
CHANGED
|
@@ -1,28 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
|
|
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
font-size: 15px;
|
| 14 |
-
margin-bottom: 10px;
|
| 15 |
-
margin-top: 5px;
|
| 16 |
}
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
padding: 16px;
|
| 22 |
-
border: 1px solid lightgray;
|
| 23 |
-
border-radius: 16px;
|
| 24 |
}
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
| 28 |
}
|
|
|
|
| 1 |
+
|
| 2 |
+
/* Custom styles that can't be achieved with Tailwind */
|
| 3 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
|
| 4 |
+
|
| 5 |
body {
|
| 6 |
+
font-family: 'Inter', sans-serif;
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
+
/* Form styles */
|
| 10 |
+
input, select {
|
| 11 |
+
transition: all 0.2s;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
input:focus, select:focus {
|
| 15 |
+
outline: none;
|
| 16 |
+
border-color: #3b82f6;
|
| 17 |
+
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
|
| 18 |
+
}
|
| 19 |
+
/* Module and lesson styles */
|
| 20 |
+
.preview-module {
|
| 21 |
+
transition: all 0.2s;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
.preview-module:hover {
|
| 25 |
+
transform: translateY(-2px);
|
| 26 |
+
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
.lesson-card {
|
| 30 |
+
transition: all 0.2s;
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
.lesson-card:hover {
|
| 34 |
+
background-color: #f8fafc;
|
| 35 |
+
transform: translateX(2px);
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
.editable-title {
|
| 39 |
+
border-bottom: 2px dotted #cbd5e1;
|
| 40 |
+
padding-bottom: 2px;
|
| 41 |
+
cursor: text;
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
.edit-lesson-btn, .delete-lesson-btn {
|
| 45 |
+
transition: transform 0.1s;
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
.edit-lesson-btn:hover {
|
| 49 |
+
transform: scale(1.1);
|
| 50 |
+
color: #3b82f6 !important;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.delete-lesson-btn:hover {
|
| 54 |
+
transform: scale(1.1);
|
| 55 |
+
color: #ef4444 !important;
|
| 56 |
+
}
|
| 57 |
+
/* Button transitions */
|
| 58 |
+
button {
|
| 59 |
+
transition: all 0.2s;
|
| 60 |
}
|
| 61 |
|
| 62 |
+
/* Custom scrollbar */
|
| 63 |
+
::-webkit-scrollbar {
|
| 64 |
+
width: 6px;
|
| 65 |
+
height: 6px;
|
| 66 |
}
|
| 67 |
|
| 68 |
+
::-webkit-scrollbar-track {
|
| 69 |
+
background: #f1f1f1;
|
|
|
|
|
|
|
|
|
|
| 70 |
}
|
| 71 |
|
| 72 |
+
::-webkit-scrollbar-thumb {
|
| 73 |
+
background: #c1c1c1;
|
| 74 |
+
border-radius: 3px;
|
|
|
|
|
|
|
|
|
|
| 75 |
}
|
| 76 |
|
| 77 |
+
::-webkit-scrollbar-thumb:hover {
|
| 78 |
+
background: #a8a8a8;
|
| 79 |
}
|
support.html
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Support | EduLoom</title>
|
| 7 |
+
<link rel="stylesheet" href="style.css">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="components/sidebar.js"></script>
|
| 11 |
+
<script src="components/header.js"></script>
|
| 12 |
+
<script src="components/support-ticket.js"></script>
|
| 13 |
+
</head>
|
| 14 |
+
<body class="h-full bg-gray-50">
|
| 15 |
+
<div class="flex h-full">
|
| 16 |
+
<custom-sidebar></custom-sidebar>
|
| 17 |
+
<div class="flex-1 flex flex-col overflow-hidden">
|
| 18 |
+
<custom-header></custom-header>
|
| 19 |
+
<main class="flex-1 overflow-y-auto p-6">
|
| 20 |
+
<support-ticket></support-ticket>
|
| 21 |
+
</main>
|
| 22 |
+
</div>
|
| 23 |
+
</div>
|
| 24 |
+
<script>
|
| 25 |
+
feather.replace();
|
| 26 |
+
</script>
|
| 27 |
+
</body>
|
| 28 |
+
</html>
|