alamin655 commited on
Commit
311a8d5
2 Parent(s): c37a9b4 3be0c65

Merge pull request #110 from neon-mmd/improve-and-fix-settings-page

Browse files
Cargo.lock CHANGED
@@ -535,9 +535,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
535
 
536
  [[package]]
537
  name = "cpufeatures"
538
- version = "0.2.7"
539
  source = "registry+https://github.com/rust-lang/crates.io-index"
540
- checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
541
  dependencies = [
542
  "libc",
543
  ]
@@ -1773,9 +1773,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
1773
 
1774
  [[package]]
1775
  name = "pest"
1776
- version = "2.6.0"
1777
  source = "registry+https://github.com/rust-lang/crates.io-index"
1778
- checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70"
1779
  dependencies = [
1780
  "thiserror",
1781
  "ucd-trie",
@@ -1783,9 +1783,9 @@ dependencies = [
1783
 
1784
  [[package]]
1785
  name = "pest_derive"
1786
- version = "2.6.0"
1787
  source = "registry+https://github.com/rust-lang/crates.io-index"
1788
- checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb"
1789
  dependencies = [
1790
  "pest",
1791
  "pest_generator",
@@ -1793,9 +1793,9 @@ dependencies = [
1793
 
1794
  [[package]]
1795
  name = "pest_generator"
1796
- version = "2.6.0"
1797
  source = "registry+https://github.com/rust-lang/crates.io-index"
1798
- checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e"
1799
  dependencies = [
1800
  "pest",
1801
  "pest_meta",
@@ -1806,9 +1806,9 @@ dependencies = [
1806
 
1807
  [[package]]
1808
  name = "pest_meta"
1809
- version = "2.6.0"
1810
  source = "registry+https://github.com/rust-lang/crates.io-index"
1811
- checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411"
1812
  dependencies = [
1813
  "once_cell",
1814
  "pest",
@@ -2555,9 +2555,9 @@ dependencies = [
2555
 
2556
  [[package]]
2557
  name = "serde_json"
2558
- version = "1.0.96"
2559
  source = "registry+https://github.com/rust-lang/crates.io-index"
2560
- checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
2561
  dependencies = [
2562
  "itoa 1.0.6",
2563
  "ryu",
@@ -2617,9 +2617,9 @@ checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
2617
 
2618
  [[package]]
2619
  name = "sha2"
2620
- version = "0.10.6"
2621
  source = "registry+https://github.com/rust-lang/crates.io-index"
2622
- checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
2623
  dependencies = [
2624
  "cfg-if 1.0.0",
2625
  "cpufeatures",
@@ -3381,7 +3381,7 @@ dependencies = [
3381
 
3382
  [[package]]
3383
  name = "websurfx"
3384
- version = "0.12.3"
3385
  dependencies = [
3386
  "actix-files",
3387
  "actix-web",
 
535
 
536
  [[package]]
537
  name = "cpufeatures"
538
+ version = "0.2.8"
539
  source = "registry+https://github.com/rust-lang/crates.io-index"
540
+ checksum = "03e69e28e9f7f77debdedbaafa2866e1de9ba56df55a8bd7cfc724c25a09987c"
541
  dependencies = [
542
  "libc",
543
  ]
 
1773
 
1774
  [[package]]
1775
  name = "pest"
1776
+ version = "2.6.1"
1777
  source = "registry+https://github.com/rust-lang/crates.io-index"
1778
+ checksum = "16833386b02953ca926d19f64af613b9bf742c48dcd5e09b32fbfc9740bf84e2"
1779
  dependencies = [
1780
  "thiserror",
1781
  "ucd-trie",
 
1783
 
1784
  [[package]]
1785
  name = "pest_derive"
1786
+ version = "2.6.1"
1787
  source = "registry+https://github.com/rust-lang/crates.io-index"
1788
+ checksum = "7763190f9406839f99e5197afee8c9e759969f7dbfa40ad3b8dbee8757b745b5"
1789
  dependencies = [
1790
  "pest",
1791
  "pest_generator",
 
1793
 
1794
  [[package]]
1795
  name = "pest_generator"
1796
+ version = "2.6.1"
1797
  source = "registry+https://github.com/rust-lang/crates.io-index"
1798
+ checksum = "249061b22e99973da1f5f5f1410284419e283bb60b79255bf5f42a94b66a2e00"
1799
  dependencies = [
1800
  "pest",
1801
  "pest_meta",
 
1806
 
1807
  [[package]]
1808
  name = "pest_meta"
1809
+ version = "2.6.1"
1810
  source = "registry+https://github.com/rust-lang/crates.io-index"
1811
+ checksum = "457c310cfc9cf3f22bc58901cc7f0d3410ac5d6298e432a4f9a6138565cb6df6"
1812
  dependencies = [
1813
  "once_cell",
1814
  "pest",
 
2555
 
2556
  [[package]]
2557
  name = "serde_json"
2558
+ version = "1.0.97"
2559
  source = "registry+https://github.com/rust-lang/crates.io-index"
2560
+ checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a"
2561
  dependencies = [
2562
  "itoa 1.0.6",
2563
  "ryu",
 
2617
 
2618
  [[package]]
2619
  name = "sha2"
2620
+ version = "0.10.7"
2621
  source = "registry+https://github.com/rust-lang/crates.io-index"
2622
+ checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"
2623
  dependencies = [
2624
  "cfg-if 1.0.0",
2625
  "cpufeatures",
 
3381
 
3382
  [[package]]
3383
  name = "websurfx"
3384
+ version = "0.13.0"
3385
  dependencies = [
3386
  "actix-files",
3387
  "actix-web",
Cargo.toml CHANGED
@@ -1,6 +1,6 @@
1
  [package]
2
  name = "websurfx"
3
- version = "0.12.3"
4
  edition = "2021"
5
  description = "An open-source alternative to Searx that provides clean, ad-free, and organic results with incredible speed while keeping privacy and security in mind."
6
  repository = "https://github.com/neon-mmd/websurfx"
 
1
  [package]
2
  name = "websurfx"
3
+ version = "0.13.0"
4
  edition = "2021"
5
  description = "An open-source alternative to Searx that provides clean, ad-free, and organic results with incredible speed while keeping privacy and security in mind."
6
  repository = "https://github.com/neon-mmd/websurfx"
public/static/cookies.js ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // This function is executed when any page on the website finsihes loading and
2
+ // this function retrieves the cookies if it is present on the user's machine.
3
+ // If it is available then the saved cookies is display in the cookies tab
4
+ // otherwise an appropriate message is displayed if it is not available.
5
+ document.addEventListener(
6
+ 'DOMContentLoaded',
7
+ () => {
8
+ try {
9
+ let cookie = decodeURIComponent(document.cookie)
10
+ document.querySelector('.cookies input').value =
11
+ cookie !== '' ? cookie : 'No cookies have been saved on your system'
12
+ } catch (error) {
13
+ console.error('Error decoding cookie:', error)
14
+ document.querySelector('.cookies input').value = 'Error decoding cookie'
15
+ }
16
+ },
17
+ false
18
+ )
public/static/settings.js ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // This function handles the toggling of selections of all upstream search engines
2
+ // options in the settings page under the tab engines.
3
+ function toggleAllSelection() {
4
+ document
5
+ .querySelectorAll('.engine')
6
+ .forEach(
7
+ (engine_checkbox) =>
8
+ (engine_checkbox.checked =
9
+ document.querySelector('.select_all').checked)
10
+ )
11
+ }
12
+
13
+ // This function adds the functionality to sidebar buttons to only show settings
14
+ // related to that tab.
15
+ function setActiveTab(current_tab) {
16
+ document
17
+ .querySelectorAll('.tab')
18
+ .forEach((tab) => tab.classList.remove('active'))
19
+ document
20
+ .querySelectorAll('.btn')
21
+ .forEach((tab) => tab.classList.remove('active'))
22
+ current_tab.classList.add('active')
23
+ document
24
+ .querySelector(`.${current_tab.innerText.toLowerCase().replace(' ', '_')}`)
25
+ .classList.add('active')
26
+ }
27
+
28
+ // This function adds the functionality to save all the user selected preferences
29
+ // to be saved in a cookie on the users machine.
30
+ function setClientSettings() {
31
+ let cookie_dictionary = new Object()
32
+ document.querySelectorAll('select').forEach((select_tag) => {
33
+ if (select_tag.name === 'themes') {
34
+ cookie_dictionary['theme'] = select_tag.value
35
+ } else if (select_tag.name === 'colorschemes') {
36
+ cookie_dictionary['colorscheme'] = select_tag.value
37
+ }
38
+ })
39
+ let engines = []
40
+ document.querySelectorAll('.engine').forEach((engine_checkbox) => {
41
+ if (engine_checkbox.checked === true) {
42
+ engines.push(engine_checkbox.parentNode.parentNode.innerText.trim())
43
+ }
44
+ })
45
+ cookie_dictionary['engines'] = engines
46
+ let expiration_date = new Date()
47
+ expiration_date.setFullYear(expiration_date.getFullYear() + 1)
48
+ document.cookie = `appCookie=${JSON.stringify(
49
+ cookie_dictionary
50
+ )}; expires=${expiration_date.toUTCString()}`
51
+
52
+ document.querySelector('.message').innerText =
53
+ '✅ The settings have been saved sucessfully!!'
54
+
55
+ setTimeout(() => {
56
+ document.querySelector('.message').innerText = ''
57
+ }, 10000)
58
+ }
59
+
60
+ // This functions gets the saved cookies if it is present on the user's machine If it
61
+ // is available then it is parsed and converted to an object which is then used to
62
+ // retrieve the preferences that the user had selected previously and is then loaded in the
63
+ // website otherwise the function does nothing and the default server side settings are loaded.
64
+ function getClientSettings() {
65
+ let cookie = decodeURIComponent(document.cookie)
66
+
67
+ if (cookie !== '') {
68
+ let cookie_value = decodeURIComponent(document.cookie)
69
+ .split(';')
70
+ .map((item) => item.split('='))
71
+ .reduce((acc, [_, v]) => (acc = JSON.parse(v)) && acc, {})
72
+
73
+ let links = Array.from(document.querySelectorAll('link')).forEach(
74
+ (item) => {
75
+ if (item.href.includes('static/themes')) {
76
+ item.href = `static/themes/${cookie_value['theme']}.css`
77
+ } else if (item.href.includes('static/colorschemes')) {
78
+ item.href = `static/colorschemes/${cookie_value['colorscheme']}.css`
79
+ }
80
+ }
81
+ )
82
+ }
83
+ }
public/static/themes/simple.css CHANGED
@@ -263,41 +263,243 @@ footer {
263
 
264
  /* Styles for the about page */
265
 
266
- .about-container article{
267
- font-size: 1.5rem;
268
- color:var(--fg);
269
- padding-bottom: 10px;
270
- }
271
-
272
- .about-container article h1{
273
- color: var(--2);
274
- font-size: 2.8rem;
275
- }
276
-
277
- .about-container article div{
278
- padding-bottom: 15px;
279
- }
280
-
281
- .about-container a{
282
- color:var(--3);
283
- }
284
-
285
- .about-container article h2{
286
- color: var(--3);
287
- font-size: 1.8rem;
288
- padding-bottom: 10px;
289
- }
290
-
291
- .about-container p{
292
- color:var(--fg);
293
- font-size: 1.6rem;
294
- padding-bottom: 10px;
295
- }
296
-
297
- .about-container h3{
298
- font-size: 1.5rem;
299
- }
300
-
301
- .about-container {
302
- width: 80%;
303
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
 
264
  /* Styles for the about page */
265
 
266
+ .about-container article {
267
+ font-size: 1.5rem;
268
+ color: var(--fg);
269
+ padding-bottom: 10px;
270
+ }
271
+
272
+ .about-container article h1 {
273
+ color: var(--2);
274
+ font-size: 2.8rem;
275
+ }
276
+
277
+ .about-container article div {
278
+ padding-bottom: 15px;
279
+ }
280
+
281
+ .about-container a {
282
+ color: var(--3);
283
+ }
284
+
285
+ .about-container article h2 {
286
+ color: var(--3);
287
+ font-size: 1.8rem;
288
+ padding-bottom: 10px;
289
+ }
290
+
291
+ .about-container p {
292
+ color: var(--fg);
293
+ font-size: 1.6rem;
294
+ padding-bottom: 10px;
295
+ }
296
+
297
+ .about-container h3 {
298
+ font-size: 1.5rem;
299
+ }
300
+
301
+ .about-container {
302
+ width: 80%;
303
+ }
304
+
305
+ /* Styles for the settings page */
306
+ .settings_container {
307
+ display: flex;
308
+ justify-content: space-around;
309
+ width: 80dvw;
310
+ }
311
+
312
+ .settings h1 {
313
+ color: var(--2);
314
+ font-size: 2.5rem;
315
+ }
316
+
317
+ .settings hr {
318
+ border-color: var(--3);
319
+ margin: 0.3rem 0 1rem 0;
320
+ }
321
+
322
+ .settings_container .sidebar {
323
+ width: 30%;
324
+ cursor: pointer;
325
+ font-size: 2rem;
326
+ display: flex;
327
+ flex-direction: column;
328
+ margin-right: 0.5rem;
329
+ margin-left: -0.7rem;
330
+ padding: 0.7rem;
331
+ border-radius: 5px;
332
+ font-weight: bold;
333
+ margin-bottom: 0.5rem;
334
+ color: var(--fg);
335
+ text-transform: capitalize;
336
+ gap: 1.5rem;
337
+ }
338
+
339
+ .settings_container .sidebar .btn {
340
+ padding: 0.5rem;
341
+ border-radius: 0.5rem;
342
+ }
343
+
344
+ .settings_container .sidebar .btn.active {
345
+ background-color: var(--2);
346
+ }
347
+
348
+ .settings_container .main_container {
349
+ width: 70%;
350
+ border-left: 1.5px solid var(--3);
351
+ padding-left: 3rem;
352
+ }
353
+
354
+ .settings_container .tab {
355
+ display: none;
356
+ }
357
+
358
+ .settings_container .tab.active {
359
+ display: flex;
360
+ flex-direction: column;
361
+ justify-content: space-around;
362
+ }
363
+
364
+ .settings_container button {
365
+ margin-top: 1rem;
366
+ padding: 1rem 2rem;
367
+ font-size: 1.5rem;
368
+ background: var(--3);
369
+ color: var(--bg);
370
+ border-radius: 0.5rem;
371
+ border: 2px solid transparent;
372
+ font-weight: bold;
373
+ transition: all 0.1s ease-out;
374
+ cursor: pointer;
375
+ box-shadow: 5px 5px;
376
+ outline: none;
377
+ }
378
+
379
+ .settings_container button:active {
380
+ box-shadow: none;
381
+ translate: 5px 5px;
382
+ }
383
+
384
+ .settings_container .main_container .message {
385
+ font-size: 1.5rem;
386
+ color: var(--fg);
387
+ }
388
+
389
+ .settings_container .tab h3 {
390
+ font-size: 2rem;
391
+ font-weight: bold;
392
+ color: var(--4);
393
+ margin-top: 1.5rem;
394
+ text-transform: capitalize;
395
+ }
396
+
397
+ .settings_container .tab .description {
398
+ font-size: 1.5rem;
399
+ margin-bottom: 0.5rem;
400
+ color: var(--fg);
401
+ }
402
+
403
+ .settings_container .user_interface select {
404
+ margin: 0.7rem 0;
405
+ width: 20rem;
406
+ background-color: var(--bg);
407
+ color: var(--fg);
408
+ padding: 1rem 2rem;
409
+ border-radius: 0.5rem;
410
+ outline: none;
411
+ border: none;
412
+ text-transform: capitalize;
413
+ }
414
+
415
+ .settings_container .user_interface option:hover {
416
+ background-color: var(--1);
417
+ }
418
+
419
+ .settings_container .engines .engine_selection {
420
+ display: flex;
421
+ flex-direction: column;
422
+ justify-content: center;
423
+ gap: 1rem;
424
+ padding: 1rem 0;
425
+ }
426
+
427
+ .settings_container .engines .toggle_btn {
428
+ color: var(--fg);
429
+ font-size: 1.5rem;
430
+ display: flex;
431
+ gap: 0.5rem;
432
+ align-items: center;
433
+ }
434
+
435
+ .settings_container .engines hr {
436
+ margin: 0;
437
+ }
438
+
439
+ .settings_container .cookies input {
440
+ margin: 1rem 0rem;
441
+ }
442
+
443
+ /* Styles for the toggle button */
444
+ /* The switch - the box around the slider */
445
+ .switch {
446
+ position: relative;
447
+ display: inline-block;
448
+ width: 6rem;
449
+ height: 3.4rem;
450
+ }
451
+
452
+ /* Hide default HTML checkbox */
453
+ .switch input {
454
+ opacity: 0;
455
+ width: 0;
456
+ height: 0;
457
+ }
458
+
459
+ /* The slider */
460
+ .slider {
461
+ position: absolute;
462
+ cursor: pointer;
463
+ top: 0;
464
+ left: 0;
465
+ right: 0;
466
+ bottom: 0;
467
+ background-color: var(--bg);
468
+ -webkit-transition: 0.4s;
469
+ transition: 0.4s;
470
+ }
471
+
472
+ .slider:before {
473
+ position: absolute;
474
+ content: '';
475
+ height: 2.6rem;
476
+ width: 2.6rem;
477
+ left: 0.4rem;
478
+ bottom: 0.4rem;
479
+ background-color: var(--fg);
480
+ -webkit-transition: 0.4s;
481
+ transition: 0.4s;
482
+ }
483
+
484
+ input:checked + .slider {
485
+ background-color: var(--3);
486
+ }
487
+
488
+ input:focus + .slider {
489
+ box-shadow: 0 0 1px var(--3);
490
+ }
491
+
492
+ input:checked + .slider:before {
493
+ -webkit-transform: translateX(2.6rem);
494
+ -ms-transform: translateX(2.6rem);
495
+ transform: translateX(2.6rem);
496
+ }
497
+
498
+ /* Rounded sliders */
499
+ .slider.round {
500
+ border-radius: 3.4rem;
501
+ }
502
+
503
+ .slider.round:before {
504
+ border-radius: 50%;
505
+ }
public/templates/cookies_tab.html ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="cookies tab">
2
+ <h1>Cookies</h1>
3
+ <p class="description">
4
+ This is the cookies are saved on your system and it contains the preferences
5
+ you chose in the settings page
6
+ </p>
7
+ <input type="text" name="cookie_field" value="" readonly />
8
+ <p class="description">
9
+ The cookies stored are not used by us for any malicious intend or for
10
+ tracking you in any way.
11
+ </p>
12
+ </div>
public/templates/engines_tab.html ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="engines tab">
2
+ <h3>select search engines</h3>
3
+ <p class="description">
4
+ Select the search engines from the list of engines that you want results
5
+ from
6
+ </p>
7
+ <div class="engine_selection">
8
+ <div class="toggle_btn">
9
+ <label class="switch">
10
+ <input type="checkbox" class="select_all" onchange="toggleAllSelection()" />
11
+ <span class="slider round"></span>
12
+ </label>
13
+ Select All
14
+ </div>
15
+ <hr />
16
+ <div class="toggle_btn">
17
+ <label class="switch">
18
+ <input type="checkbox" class="engine" />
19
+ <span class="slider round"></span>
20
+ </label>
21
+ Duckduckgo
22
+ </div>
23
+ <div class="toggle_btn">
24
+ <label class="switch">
25
+ <input type="checkbox" class="engine" />
26
+ <span class="slider round"></span>
27
+ </label>
28
+ Searx
29
+ </div>
30
+ </div>
31
+ </div>
public/templates/footer.html CHANGED
@@ -10,6 +10,7 @@
10
  </ul>
11
  </div>
12
  </footer>
 
13
  </body>
14
 
15
  </html>
 
10
  </ul>
11
  </div>
12
  </footer>
13
+ <script src="static/settings.js"></script>
14
  </body>
15
 
16
  </html>
public/templates/general_tab.html ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ <div class="general tab active">
2
+ <h1>General</h1>
3
+ <p class="description">Coming soon!!</p>
4
+ </div>
public/templates/header.html CHANGED
@@ -1,12 +1,14 @@
1
  <!DOCTYPE html>
2
  <html lang="en">
3
- <head>
 
4
  <title>Websurfx</title>
5
  <meta charset="UTF-8" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1" />
7
  <link href="static/colorschemes/{{colorscheme}}.css" rel="stylesheet" type="text/css" />
8
  <link href="static/themes/{{theme}}.css" rel="stylesheet" type="text/css" />
9
- </head>
10
 
11
- <body>
12
  <header>{{>navbar}}</header>
 
 
1
  <!DOCTYPE html>
2
  <html lang="en">
3
+
4
+ <head>
5
  <title>Websurfx</title>
6
  <meta charset="UTF-8" />
7
  <meta name="viewport" content="width=device-width, initial-scale=1" />
8
  <link href="static/colorschemes/{{colorscheme}}.css" rel="stylesheet" type="text/css" />
9
  <link href="static/themes/{{theme}}.css" rel="stylesheet" type="text/css" />
10
+ </head>
11
 
12
+ <body onload="getClientSettings()">
13
  <header>{{>navbar}}</header>
14
+
public/templates/navbar.html CHANGED
@@ -1,6 +1,6 @@
1
  <nav>
2
- <ul>
3
- <li><a href="about">about</a></li>
4
- <li><a href="settings">settings</a></li>
5
- </ul>
6
  </nav>
 
1
  <nav>
2
+ <ul>
3
+ <li><a href="about">about</a></li>
4
+ <li><a href="settings">settings</a></li>
5
+ </ul>
6
  </nav>
public/templates/settings.html CHANGED
@@ -1,5 +1,22 @@
1
  {{>header this}}
2
- <main class="settings">
3
- <h1>Page is under construction</h1>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  </main>
 
 
5
  {{>footer}}
 
1
  {{>header this}}
2
+ <main class="settings" >
3
+ <h1>Settings</h1>
4
+ <hr />
5
+ <div class="settings_container">
6
+ <div class="sidebar">
7
+ <div class="btn active" onclick="setActiveTab(this)">general</div>
8
+ <div class="btn" onclick="setActiveTab(this)">user interface</div>
9
+ <div class="btn" onclick="setActiveTab(this)">engines</div>
10
+ <div class="btn" onclick="setActiveTab(this)">cookies</div>
11
+ </div>
12
+ <div class="main_container">
13
+ {{> general_tab}} {{> user_interface_tab}} {{> engines_tab}} {{>
14
+ cookies_tab}}
15
+ <p class="message"></p>
16
+ <button type="submit" onclick="setClientSettings()">Save</button>
17
+ </div>
18
+ </div>
19
  </main>
20
+ <script src="static/settings.js"></script>
21
+ <script src="static/cookies.js"></script>
22
  {{>footer}}
public/templates/user_interface_tab.html ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="user_interface tab">
2
+ <h3>select theme</h3>
3
+ <p class="description">
4
+ Select the theme from the available themes to be used in user interface
5
+ </p>
6
+ <select name="themes">
7
+ <option value="simple">simple</option>
8
+ </select>
9
+ <h3>select color scheme</h3>
10
+ <p class="description">
11
+ Select the color scheme for your theme to be used in user interface
12
+ </p>
13
+ <select name="colorschemes">
14
+ <option value="catppuccin-mocha">catppuccin mocha</option>
15
+ <option value="dark-chocolate">dark chocolate</option>
16
+ <option value="dracula">dracula</option>
17
+ <option value="gruvbox-dark">gruvbox dark</option>
18
+ <option value="monokai">monokai</option>
19
+ <option value="nord">nord</option>
20
+ <option value="oceanic-next">oceanic next</option>
21
+ <option value="one-dark">one dark</option>
22
+ <option value="solarized-dark">solarized dark</option>
23
+ <option value="solarized-light">solarized light</option>
24
+ <option value="tokyo-night">tokyo night</option>
25
+ <option value="tomorrow-night">tomorrow night</option>
26
+ </select>
27
+ </div>