keepup-http 0.5.0__py3-none-any.whl
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.
- keepup_http/__init__.py +38 -0
- keepup_http/api_docs.py +76 -0
- keepup_http/body_limit.py +156 -0
- keepup_http/events_api.py +237 -0
- keepup_http/factory.py +562 -0
- keepup_http/lock_routes.py +155 -0
- keepup_http/plugin.py +53 -0
- keepup_http/routes.py +549 -0
- keepup_http/static/css/aos.css +1 -0
- keepup_http/static/css/main_nebula.css +232 -0
- keepup_http/static/css/main_new.css +869 -0
- keepup_http/static/css/tailwind.css +1 -0
- keepup_http/static/index_nebula.html +282 -0
- keepup_http/static/index_new.html +275 -0
- keepup_http/static/js/aos.js +1 -0
- keepup_http/static/js/feather-icons.js +13 -0
- keepup_http/static/js/layout_bootstrap.js +29 -0
- keepup_http/static/js/main_new.js +2076 -0
- keepup_http/static/js/tailwind.js +83 -0
- keepup_http/static/modules/css/background_tasks.css +233 -0
- keepup_http/static/modules/css/cluster.css +16 -0
- keepup_http/static/modules/css/event_manager.css +386 -0
- keepup_http/static/modules/css/integration_logs.css +33 -0
- keepup_http/static/modules/css/metrics.css +115 -0
- keepup_http/static/modules/css/modules.css +189 -0
- keepup_http/static/modules/css/themes.css +563 -0
- keepup_http/static/modules/css/users.css +278 -0
- keepup_http/static/modules/js/background_tasks.js +695 -0
- keepup_http/static/modules/js/chart.js +14 -0
- keepup_http/static/modules/js/chartjs-adapter-date-fns.bundle.min.js +7 -0
- keepup_http/static/modules/js/cluster.js +374 -0
- keepup_http/static/modules/js/event_manager.js +1007 -0
- keepup_http/static/modules/js/integration_logs.js +795 -0
- keepup_http/static/modules/js/metrics.js +929 -0
- keepup_http/static/modules/js/modules.js +1128 -0
- keepup_http/static/modules/js/themes.js +684 -0
- keepup_http/static/modules/js/users.js +898 -0
- keepup_http/web.py +214 -0
- keepup_http-0.5.0.dist-info/METADATA +29 -0
- keepup_http-0.5.0.dist-info/RECORD +43 -0
- keepup_http-0.5.0.dist-info/WHEEL +5 -0
- keepup_http-0.5.0.dist-info/entry_points.txt +2 -0
- keepup_http-0.5.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<base href="/selfcare">
|
|
8
|
+
<title>KeepUP</title>
|
|
9
|
+
<link rel="icon" href="/favicon.ico?v=2" type="image/x-icon">
|
|
10
|
+
<link rel="stylesheet" href="/keepup-static/css/tailwind.css">
|
|
11
|
+
<style>
|
|
12
|
+
.auth-block {
|
|
13
|
+
position: fixed;
|
|
14
|
+
top: 0;
|
|
15
|
+
left: 0;
|
|
16
|
+
width: 100%;
|
|
17
|
+
height: 100%;
|
|
18
|
+
background-color: #f3f4f6;
|
|
19
|
+
z-index: 9999;
|
|
20
|
+
display: flex;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
align-items: center;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.hidden {
|
|
26
|
+
display: none !important;
|
|
27
|
+
}
|
|
28
|
+
</style>
|
|
29
|
+
<link rel="stylesheet" href="/keepup-static/css/main_new.css">
|
|
30
|
+
<link rel="stylesheet" href="/keepup-static/css/main_nebula.css">
|
|
31
|
+
<script src="/keepup-static/js/feather-icons.js"></script>
|
|
32
|
+
<script src="/keepup-static/js/aos.js"></script>
|
|
33
|
+
<script src="/keepup-static/js/tailwind.js"></script>
|
|
34
|
+
<!-- Adaptive layout bootstrap. Runs while the head is parsed, after the
|
|
35
|
+
theme stylesheets, so --layout-breakpoint already resolves and the
|
|
36
|
+
narrow layout never flashes as the desktop one. It also feeds the same
|
|
37
|
+
token to Tailwind, so the md: utilities the sections use switch at the
|
|
38
|
+
same width as the chrome instead of at Tailwind's own 768px. From here
|
|
39
|
+
on main_new.js owns the class. Kept in every theme that links
|
|
40
|
+
main_new.css -- checked by tests/panel_shell_tests.py.
|
|
41
|
+
A file, not an inline script: the panel is served with a
|
|
42
|
+
Content-Security-Policy and inline script is what it refuses
|
|
43
|
+
(keepup-93). -->
|
|
44
|
+
<script src="/keepup-static/js/layout_bootstrap.js"></script>
|
|
45
|
+
</head>
|
|
46
|
+
|
|
47
|
+
<body class="bg-gray-50">
|
|
48
|
+
<div id="authBlock" class="auth-block hidden">
|
|
49
|
+
<div class="bg-white rounded-lg shadow-xl p-6 max-w-md w-full mx-4">
|
|
50
|
+
<div class="flex justify-between items-center mb-6">
|
|
51
|
+
<h3 class="text-2xl font-bold text-gray-800">Sign in</h3>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="flex border-b mb-6">
|
|
54
|
+
<button id="loginTab" class="tab-button px-4 py-2 font-medium text-blue-600 border-b-2 border-blue-600 text-sm">
|
|
55
|
+
Sign in
|
|
56
|
+
</button>
|
|
57
|
+
<button id="registerTab" class="tab-button px-4 py-2 font-medium text-gray-500 text-sm">
|
|
58
|
+
Register
|
|
59
|
+
</button>
|
|
60
|
+
</div>
|
|
61
|
+
<div id="loginTabContent" class="tab-content active">
|
|
62
|
+
<form id="loginForm">
|
|
63
|
+
<div class="mb-4">
|
|
64
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Username</label>
|
|
65
|
+
<input type="text" id="loginUsername" required
|
|
66
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
67
|
+
</div>
|
|
68
|
+
<div class="mb-6">
|
|
69
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Password</label>
|
|
70
|
+
<input type="password" id="loginPassword" required
|
|
71
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
72
|
+
</div>
|
|
73
|
+
<button type="submit" class="w-full bg-blue-600 text-white py-3 rounded-lg hover:bg-blue-700 font-medium">
|
|
74
|
+
Sign in
|
|
75
|
+
</button>
|
|
76
|
+
<p class="mt-3 text-center text-sm text-gray-500">
|
|
77
|
+
Forgot your password?
|
|
78
|
+
<a id="forgotPasswordLink" href="#" class="text-blue-600 hover:underline">Ask the bot</a>
|
|
79
|
+
and send <code>/password</code>.
|
|
80
|
+
</p>
|
|
81
|
+
</form>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div id="registerTabContent" class="tab-content">
|
|
85
|
+
<form id="registerForm" class="space-y-4">
|
|
86
|
+
<div>
|
|
87
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Username *</label>
|
|
88
|
+
<input type="text" id="registerUsername" required
|
|
89
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div>
|
|
93
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Email</label>
|
|
94
|
+
<input type="email" id="registerEmail"
|
|
95
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
96
|
+
placeholder="example@email.com">
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div>
|
|
100
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Phone</label>
|
|
101
|
+
<input type="tel" id="registerPhone"
|
|
102
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
103
|
+
placeholder="+1 555 000 0000">
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<div>
|
|
107
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Full name</label>
|
|
108
|
+
<input type="text" id="registerFullName"
|
|
109
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
110
|
+
placeholder="Jane Doe">
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div class="relative">
|
|
114
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Password *</label>
|
|
115
|
+
<input type="password" id="registerPassword" required
|
|
116
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500 pr-10">
|
|
117
|
+
<button type="button" data-action="shell.toggle-password" data-input="registerPassword"
|
|
118
|
+
id="registerPasswordToggle"
|
|
119
|
+
class="absolute right-3 top-9 transform text-gray-500 hover:text-gray-700">
|
|
120
|
+
<i data-feather="eye" class="w-4 h-4"></i>
|
|
121
|
+
</button>
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<div class="relative">
|
|
125
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Confirm password *</label>
|
|
126
|
+
<input type="password" id="registerPasswordConfirm" required
|
|
127
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500 pr-10">
|
|
128
|
+
<button type="button" data-action="shell.toggle-password" data-input="registerPasswordConfirm"
|
|
129
|
+
id="registerPasswordConfirmToggle"
|
|
130
|
+
class="absolute right-3 top-9 transform text-gray-500 hover:text-gray-700">
|
|
131
|
+
<i data-feather="eye" class="w-4 h-4"></i>
|
|
132
|
+
</button>
|
|
133
|
+
</div>
|
|
134
|
+
|
|
135
|
+
<div class="flex items-center">
|
|
136
|
+
<input type="checkbox" id="registerAgreeTerms" required
|
|
137
|
+
class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
|
|
138
|
+
<label for="registerAgreeTerms" class="ml-2 block text-sm text-gray-700">
|
|
139
|
+
I agree to the <a href="#" data-action="shell.open-terms" class="text-blue-600 hover:text-blue-800 underline">terms of use</a>
|
|
140
|
+
</label>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<button type="submit" class="w-full bg-green-600 text-white py-3 rounded-lg hover:bg-green-700 font-medium mt-4">
|
|
144
|
+
Create account
|
|
145
|
+
</button>
|
|
146
|
+
</form>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<div id="authMessage" class="mt-4 hidden p-3 rounded-lg"></div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
<div class="min-h-screen">
|
|
155
|
+
<div class="nebula-bg" aria-hidden="true">
|
|
156
|
+
<div class="nebula-grid"></div>
|
|
157
|
+
<div class="nebula-orb nebula-orb-1"></div>
|
|
158
|
+
<div class="nebula-orb nebula-orb-2"></div>
|
|
159
|
+
</div>
|
|
160
|
+
|
|
161
|
+
<div class="min-h-screen">
|
|
162
|
+
<!-- Sidebar -->
|
|
163
|
+
<div id="sidebar">
|
|
164
|
+
<div class="flex items-center justify-between h-16 px-4">
|
|
165
|
+
<h1 class="text-xl font-bold logo-text">KeepUP</h1>
|
|
166
|
+
<button id="toggleSidebar" class="toggle-sidebar-btn p-1 rounded">
|
|
167
|
+
<i data-feather="chevron-left" class="w-4 h-4"></i>
|
|
168
|
+
</button>
|
|
169
|
+
</div>
|
|
170
|
+
<nav class="mt-4" id="main-nav">
|
|
171
|
+
|
|
172
|
+
<div id="modules-nav-container"></div>
|
|
173
|
+
</nav>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
<!-- Drawer backdrop. Chrome, so the theme styles it; a module must not.
|
|
177
|
+
It stays in the DOM and is hidden by visibility, which keeps the
|
|
178
|
+
fade in CSS and out of the toggle code. -->
|
|
179
|
+
<div id="nav-backdrop" class="nav-backdrop"></div>
|
|
180
|
+
|
|
181
|
+
<!-- Main Content -->
|
|
182
|
+
<div class="main-content">
|
|
183
|
+
<header class="app-header bg-white shadow-sm">
|
|
184
|
+
<div class="app-header-row flex items-center justify-between px-4 py-3">
|
|
185
|
+
<div class="app-header-title flex items-center">
|
|
186
|
+
<button id="sidebarToggle" type="button" aria-expanded="false"
|
|
187
|
+
aria-controls="sidebar" aria-label="Sections menu"
|
|
188
|
+
class="nav-toggle-btn p-2 text-gray-600 rounded-md focus:outline-none">
|
|
189
|
+
<i data-feather="menu"></i>
|
|
190
|
+
</button>
|
|
191
|
+
<h2 class="ml-2 text-xl font-semibold text-gray-800" id="current-section-title">Dashboard</h2>
|
|
192
|
+
</div>
|
|
193
|
+
<div class="app-header-actions flex items-center space-x-4">
|
|
194
|
+
<div class="text-sm text-gray-600" id="userInfo">
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
<!-- Additional user fields (shown when data is available) -->
|
|
198
|
+
<div id="userExtraInfo" class="hidden">
|
|
199
|
+
<div class="text-xs text-gray-500 mt-1">
|
|
200
|
+
<span id="userFullName" class="mr-2"></span>
|
|
201
|
+
<span id="userEmail"></span>
|
|
202
|
+
<span id="userPhone" class="ml-2"></span>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
<div id="userUpperPanel" class="flex items-center mt-1">
|
|
207
|
+
<div class="flex items-center">
|
|
208
|
+
<i data-feather="user" class="w-4 h-4 mr-1 text-gray-500"></i>
|
|
209
|
+
<span id="usernameDisplay" class="font-medium"></span>
|
|
210
|
+
</div>
|
|
211
|
+
<span id="userRole" class="role-badge"></span>
|
|
212
|
+
<span id="userStatus" class="ml-2 status-badge"></span>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<button type="button" data-action="shell.logout"
|
|
217
|
+
class="ml-4 p-2 text-gray-600 rounded-full hover:bg-gray-100 hover:text-red-600 transition-colors duration-150">
|
|
218
|
+
<i data-feather="log-out" class="w-4 h-4"></i>
|
|
219
|
+
</button>
|
|
220
|
+
|
|
221
|
+
<button class="app-header-bell p-2 text-gray-600 rounded-full hover:bg-gray-100">
|
|
222
|
+
<i data-feather="bell"></i>
|
|
223
|
+
</button>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</header>
|
|
227
|
+
|
|
228
|
+
<!-- Content Sections -->
|
|
229
|
+
<main class="p-6">
|
|
230
|
+
<div id="modules-container"></div>
|
|
231
|
+
<div id="profile-section" class="content-section">
|
|
232
|
+
<div class="bg-white rounded-lg shadow-sm p-6">
|
|
233
|
+
<div id="profile-content">
|
|
234
|
+
<div class="text-center py-8">
|
|
235
|
+
<i data-feather="user" class="w-12 h-12 text-gray-400 mx-auto mb-4"></i>
|
|
236
|
+
<p class="text-gray-500">Loading profile...</p>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</main>
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
<div id="versionPanel" class="hidden fixed bottom-0 left-0 right-0 bg-gray-800 text-white text-xs py-1 px-4 border-t border-gray-700">
|
|
245
|
+
<div class="flex justify-between items-center">
|
|
246
|
+
<div class="version-panel-fields flex space-x-6">
|
|
247
|
+
<span><strong>Project:</strong> <span id="versionProject">-</span></span>
|
|
248
|
+
<span><strong>Release:</strong> <span id="versionRelease">-</span></span>
|
|
249
|
+
<span><strong>Build:</strong> <span id="versionBuildNumber">-</span></span>
|
|
250
|
+
<span><strong>Built:</strong> <span id="versionBuildDate">-</span></span>
|
|
251
|
+
</div>
|
|
252
|
+
<button type="button" data-action="shell.hide-version-panel" class="text-gray-400 hover:text-white">
|
|
253
|
+
<i data-feather="x" class="w-3 h-3"></i>
|
|
254
|
+
</button>
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
<!-- Terms of use modal. The text is the application's and arrives at run
|
|
258
|
+
time: a theme of the framework must not carry one application's
|
|
259
|
+
agreement -- the previous copy named a real person and their taxpayer
|
|
260
|
+
id, and the package goes to a public index (keepup-27). -->
|
|
261
|
+
<div id="termsModal" class="modal-overlay hidden">
|
|
262
|
+
<div class="modal-content">
|
|
263
|
+
<div class="modal-header">
|
|
264
|
+
<h2 class="modal-title">Terms of use</h2>
|
|
265
|
+
<button type="button" class="close-btn" data-action="shell.close-terms">
|
|
266
|
+
<i data-feather="x" class="w-5 h-5 lg:w-6 lg:h-6"></i>
|
|
267
|
+
</button>
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<div class="modal-body">
|
|
271
|
+
<div class="modal-section">
|
|
272
|
+
<div class="terms-content" id="termsContent">
|
|
273
|
+
<p>Loading the terms...</p>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
</div>
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
<script src="/keepup-static/js/main_new.js"></script>
|
|
280
|
+
</body>
|
|
281
|
+
|
|
282
|
+
</html>
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<base href="/selfcare">
|
|
8
|
+
<title>KeepUP</title>
|
|
9
|
+
<link rel="icon" href="/favicon.ico?v=2" type="image/x-icon">
|
|
10
|
+
<link rel="stylesheet" href="/keepup-static/css/tailwind.css">
|
|
11
|
+
<style>
|
|
12
|
+
.auth-block {
|
|
13
|
+
position: fixed;
|
|
14
|
+
top: 0;
|
|
15
|
+
left: 0;
|
|
16
|
+
width: 100%;
|
|
17
|
+
height: 100%;
|
|
18
|
+
background-color: #f3f4f6;
|
|
19
|
+
z-index: 9999;
|
|
20
|
+
display: flex;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
align-items: center;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.hidden {
|
|
26
|
+
display: none !important;
|
|
27
|
+
}
|
|
28
|
+
</style>
|
|
29
|
+
<link rel="stylesheet" href="/keepup-static/css/main_new.css">
|
|
30
|
+
<script src="/keepup-static/js/feather-icons.js"></script>
|
|
31
|
+
<script src="/keepup-static/js/aos.js"></script>
|
|
32
|
+
<script src="/keepup-static/js/tailwind.js"></script>
|
|
33
|
+
<!-- Adaptive layout bootstrap. Runs while the head is parsed, after the
|
|
34
|
+
theme stylesheets, so --layout-breakpoint already resolves and the
|
|
35
|
+
narrow layout never flashes as the desktop one. It also feeds the same
|
|
36
|
+
token to Tailwind, so the md: utilities the sections use switch at the
|
|
37
|
+
same width as the chrome instead of at Tailwind's own 768px. From here
|
|
38
|
+
on main_new.js owns the class. Kept in every theme that links
|
|
39
|
+
main_new.css -- checked by tests/panel_shell_tests.py.
|
|
40
|
+
A file, not an inline script: the panel is served with a
|
|
41
|
+
Content-Security-Policy and inline script is what it refuses
|
|
42
|
+
(keepup-93). -->
|
|
43
|
+
<script src="/keepup-static/js/layout_bootstrap.js"></script>
|
|
44
|
+
</head>
|
|
45
|
+
|
|
46
|
+
<body class="bg-gray-50">
|
|
47
|
+
<div id="authBlock" class="auth-block hidden">
|
|
48
|
+
<div class="bg-white rounded-lg shadow-xl p-6 max-w-md w-full mx-4">
|
|
49
|
+
<div class="flex justify-between items-center mb-6">
|
|
50
|
+
<h3 class="text-2xl font-bold text-gray-800">Sign in</h3>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="flex border-b mb-6">
|
|
53
|
+
<button id="loginTab" class="tab-button px-4 py-2 font-medium text-blue-600 border-b-2 border-blue-600 text-sm">
|
|
54
|
+
Sign in
|
|
55
|
+
</button>
|
|
56
|
+
<button id="registerTab" class="tab-button px-4 py-2 font-medium text-gray-500 text-sm">
|
|
57
|
+
Register
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
<div id="loginTabContent" class="tab-content active">
|
|
61
|
+
<form id="loginForm">
|
|
62
|
+
<div class="mb-4">
|
|
63
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Username</label>
|
|
64
|
+
<input type="text" id="loginUsername" required
|
|
65
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
66
|
+
</div>
|
|
67
|
+
<div class="mb-6">
|
|
68
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Password</label>
|
|
69
|
+
<input type="password" id="loginPassword" required
|
|
70
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
71
|
+
</div>
|
|
72
|
+
<button type="submit" class="w-full bg-blue-600 text-white py-3 rounded-lg hover:bg-blue-700 font-medium">
|
|
73
|
+
Sign in
|
|
74
|
+
</button>
|
|
75
|
+
<p class="mt-3 text-center text-sm text-gray-500">
|
|
76
|
+
Forgot your password?
|
|
77
|
+
<a id="forgotPasswordLink" href="#" class="text-blue-600 hover:underline">Ask the bot</a>
|
|
78
|
+
and send <code>/password</code>.
|
|
79
|
+
</p>
|
|
80
|
+
</form>
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<div id="registerTabContent" class="tab-content">
|
|
84
|
+
<form id="registerForm" class="space-y-4">
|
|
85
|
+
<div>
|
|
86
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Username *</label>
|
|
87
|
+
<input type="text" id="registerUsername" required
|
|
88
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500">
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<div>
|
|
92
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Email</label>
|
|
93
|
+
<input type="email" id="registerEmail"
|
|
94
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
95
|
+
placeholder="example@email.com">
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div>
|
|
99
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Phone</label>
|
|
100
|
+
<input type="tel" id="registerPhone"
|
|
101
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
102
|
+
placeholder="+1 555 000 0000">
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<div>
|
|
106
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Full name</label>
|
|
107
|
+
<input type="text" id="registerFullName"
|
|
108
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
109
|
+
placeholder="Jane Doe">
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<div class="relative">
|
|
113
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Password *</label>
|
|
114
|
+
<input type="password" id="registerPassword" required
|
|
115
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500 pr-10">
|
|
116
|
+
<button type="button" data-action="shell.toggle-password" data-input="registerPassword"
|
|
117
|
+
id="registerPasswordToggle"
|
|
118
|
+
class="absolute right-3 top-9 transform text-gray-500 hover:text-gray-700">
|
|
119
|
+
<i data-feather="eye" class="w-4 h-4"></i>
|
|
120
|
+
</button>
|
|
121
|
+
</div>
|
|
122
|
+
|
|
123
|
+
<div class="relative">
|
|
124
|
+
<label class="block text-sm font-medium text-gray-700 mb-2">Confirm password *</label>
|
|
125
|
+
<input type="password" id="registerPasswordConfirm" required
|
|
126
|
+
class="w-full border border-gray-300 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-blue-500 pr-10">
|
|
127
|
+
<button type="button" data-action="shell.toggle-password" data-input="registerPasswordConfirm"
|
|
128
|
+
id="registerPasswordConfirmToggle"
|
|
129
|
+
class="absolute right-3 top-9 transform text-gray-500 hover:text-gray-700">
|
|
130
|
+
<i data-feather="eye" class="w-4 h-4"></i>
|
|
131
|
+
</button>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<div class="flex items-center">
|
|
135
|
+
<input type="checkbox" id="registerAgreeTerms" required
|
|
136
|
+
class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
|
|
137
|
+
<label for="registerAgreeTerms" class="ml-2 block text-sm text-gray-700">
|
|
138
|
+
I agree to the <a href="#" data-action="shell.open-terms" class="text-blue-600 hover:text-blue-800 underline">terms of use</a>
|
|
139
|
+
</label>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<button type="submit" class="w-full bg-green-600 text-white py-3 rounded-lg hover:bg-green-700 font-medium mt-4">
|
|
143
|
+
Create account
|
|
144
|
+
</button>
|
|
145
|
+
</form>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div id="authMessage" class="mt-4 hidden p-3 rounded-lg"></div>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
<div class="min-h-screen">
|
|
154
|
+
<div class="min-h-screen">
|
|
155
|
+
<!-- Sidebar -->
|
|
156
|
+
<div id="sidebar">
|
|
157
|
+
<div class="flex items-center justify-between h-16 px-4 bg-blue-800">
|
|
158
|
+
<h1 class="text-xl font-bold logo-text">KeepUP</h1>
|
|
159
|
+
<button id="toggleSidebar" class="toggle-sidebar-btn p-1 text-white hover:bg-blue-600 rounded">
|
|
160
|
+
<i data-feather="chevron-left" class="w-4 h-4"></i>
|
|
161
|
+
</button>
|
|
162
|
+
</div>
|
|
163
|
+
<nav class="mt-4" id="main-nav">
|
|
164
|
+
|
|
165
|
+
<div id="modules-nav-container"></div>
|
|
166
|
+
</nav>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
<!-- Drawer backdrop. Chrome, so the theme styles it; a module must not.
|
|
170
|
+
It stays in the DOM and is hidden by visibility, which keeps the
|
|
171
|
+
fade in CSS and out of the toggle code. -->
|
|
172
|
+
<div id="nav-backdrop" class="nav-backdrop"></div>
|
|
173
|
+
|
|
174
|
+
<!-- Main Content -->
|
|
175
|
+
<div class="main-content">
|
|
176
|
+
<header class="app-header bg-white shadow-sm">
|
|
177
|
+
<div class="app-header-row flex items-center justify-between px-4 py-3">
|
|
178
|
+
<div class="app-header-title flex items-center">
|
|
179
|
+
<button id="sidebarToggle" type="button" aria-expanded="false"
|
|
180
|
+
aria-controls="sidebar" aria-label="Sections menu"
|
|
181
|
+
class="nav-toggle-btn p-2 text-gray-600 rounded-md focus:outline-none">
|
|
182
|
+
<i data-feather="menu"></i>
|
|
183
|
+
</button>
|
|
184
|
+
<h2 class="ml-2 text-xl font-semibold text-gray-800" id="current-section-title">Dashboard</h2>
|
|
185
|
+
</div>
|
|
186
|
+
<div class="app-header-actions flex items-center space-x-4">
|
|
187
|
+
<div class="text-sm text-gray-600" id="userInfo">
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
<!-- Extra profile fields, shown when the data is there -->
|
|
191
|
+
<div id="userExtraInfo" class="hidden">
|
|
192
|
+
<div class="text-xs text-gray-500 mt-1">
|
|
193
|
+
<span id="userFullName" class="mr-2"></span>
|
|
194
|
+
<span id="userEmail"></span>
|
|
195
|
+
<span id="userPhone" class="ml-2"></span>
|
|
196
|
+
</div>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<div id="userUpperPanel" class="flex items-center mt-1">
|
|
200
|
+
<div class="flex items-center">
|
|
201
|
+
<i data-feather="user" class="w-4 h-4 mr-1 text-gray-500"></i>
|
|
202
|
+
<span id="usernameDisplay" class="font-medium"></span>
|
|
203
|
+
</div>
|
|
204
|
+
<span id="userRole" class="role-badge"></span>
|
|
205
|
+
<span id="userStatus" class="ml-2 status-badge"></span>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
|
|
209
|
+
<button type="button" data-action="shell.logout"
|
|
210
|
+
class="ml-4 p-2 text-gray-600 rounded-full hover:bg-gray-100 hover:text-red-600 transition-colors duration-150">
|
|
211
|
+
<i data-feather="log-out" class="w-4 h-4"></i>
|
|
212
|
+
</button>
|
|
213
|
+
|
|
214
|
+
<button class="app-header-bell p-2 text-gray-600 rounded-full hover:bg-gray-100">
|
|
215
|
+
<i data-feather="bell"></i>
|
|
216
|
+
</button>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
</header>
|
|
220
|
+
|
|
221
|
+
<!-- Content Sections -->
|
|
222
|
+
<main class="p-6">
|
|
223
|
+
<div id="modules-container"></div>
|
|
224
|
+
<div id="profile-section" class="content-section">
|
|
225
|
+
<div class="bg-white rounded-lg shadow-sm p-6">
|
|
226
|
+
<div id="profile-content">
|
|
227
|
+
<div class="text-center py-8">
|
|
228
|
+
<i data-feather="user" class="w-12 h-12 text-gray-400 mx-auto mb-4"></i>
|
|
229
|
+
<p class="text-gray-500">Loading profile...</p>
|
|
230
|
+
</div>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</main>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
<div id="versionPanel" class="hidden fixed bottom-0 left-0 right-0 bg-gray-800 text-white text-xs py-1 px-4 border-t border-gray-700">
|
|
238
|
+
<div class="flex justify-between items-center">
|
|
239
|
+
<div class="version-panel-fields flex space-x-6">
|
|
240
|
+
<span><strong>Project:</strong> <span id="versionProject">-</span></span>
|
|
241
|
+
<span><strong>Release:</strong> <span id="versionRelease">-</span></span>
|
|
242
|
+
<span><strong>Build:</strong> <span id="versionBuildNumber">-</span></span>
|
|
243
|
+
<span><strong>Built:</strong> <span id="versionBuildDate">-</span></span>
|
|
244
|
+
</div>
|
|
245
|
+
<button type="button" data-action="shell.hide-version-panel" class="text-gray-400 hover:text-white">
|
|
246
|
+
<i data-feather="x" class="w-3 h-3"></i>
|
|
247
|
+
</button>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
<!-- Terms of the test release. The text comes from the server, from the
|
|
251
|
+
same file the rental agreement is built from: the page used to carry
|
|
252
|
+
its own copy, which described a different product and a company that
|
|
253
|
+
has nothing to do with this one. -->
|
|
254
|
+
<div id="termsModal" class="modal-overlay hidden">
|
|
255
|
+
<div class="modal-content">
|
|
256
|
+
<div class="modal-header">
|
|
257
|
+
<h2 class="modal-title">Terms of the test release</h2>
|
|
258
|
+
<button type="button" class="close-btn" data-action="shell.close-terms">
|
|
259
|
+
<i data-feather="x" class="w-5 h-5 lg:w-6 lg:h-6"></i>
|
|
260
|
+
</button>
|
|
261
|
+
</div>
|
|
262
|
+
|
|
263
|
+
<div class="modal-body">
|
|
264
|
+
<div class="modal-section">
|
|
265
|
+
<div class="terms-content" id="termsContent">
|
|
266
|
+
<p>Loading the terms...</p>
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
</div>
|
|
272
|
+
<script src="/keepup-static/js/main_new.js"></script>
|
|
273
|
+
</body>
|
|
274
|
+
|
|
275
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},r=n(1),a=(o(r),n(6)),u=o(a),c=n(7),f=o(c),s=n(8),d=o(s),l=n(9),p=o(l),m=n(10),b=o(m),v=n(11),y=o(v),g=n(14),h=o(g),w=[],k=!1,x=document.all&&!window.atob,j={offset:120,delay:0,easing:"ease",duration:400,disable:!1,once:!1,startEvent:"DOMContentLoaded",throttleDelay:99,debounceDelay:50,disableMutationObserver:!1},O=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,j),(0,b.default)(w,j.once),w},_=function(){w=(0,h.default)(),O()},S=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},z=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},A=function(e){return j=i(j,e),w=(0,h.default)(),z(j.disable)||x?S():(document.querySelector("body").setAttribute("data-aos-easing",j.easing),document.querySelector("body").setAttribute("data-aos-duration",j.duration),document.querySelector("body").setAttribute("data-aos-delay",j.delay),"DOMContentLoaded"===j.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?O(!0):"load"===j.startEvent?window.addEventListener(j.startEvent,function(){O(!0)}):document.addEventListener(j.startEvent,function(){O(!0)}),window.addEventListener("resize",(0,f.default)(O,j.debounceDelay,!0)),window.addEventListener("orientationchange",(0,f.default)(O,j.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,j.once)},j.throttleDelay)),j.disableMutationObserver||(0,d.default)("[data-aos]",_),w)};e.exports={init:A,refresh:O,refreshHard:_}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(f);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return s;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f="Expected a function",s=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==s}function a(e){if("number"==typeof e)return e;if(r(e))return f;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",f=NaN,s="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e,t){var n=new r(o);a=t,n.observe(i.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute("data-aos")}).length;o&&a()})}Object.defineProperty(t,"__esModule",{value:!0});var i=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=function(){};t.default=n},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),r=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,a=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,u=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i,c=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,f=function(){function e(){n(this,e)}return i(e,[{key:"phone",value:function(){var e=o();return!(!r.test(e)&&!a.test(e.substr(0,4)))}},{key:"mobile",value:function(){var e=o();return!(!u.test(e)&&!c.test(e.substr(0,4)))}},{key:"tablet",value:function(){return this.mobile()&&!this.phone()}}]),e}();t.default=new f},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t,n){var o=e.node.getAttribute("data-aos-once");t>e.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});
|