From c9b643e1122643606787ecead8dc3b4f9631f21c Mon Sep 17 00:00:00 2001 From: sven Date: Wed, 17 May 2023 21:40:09 +0200 Subject: [PATCH] initial --- README.md | 49 +++++++ db.sql | 134 +++++++++++++++++ doc/bottom.png | Bin 0 -> 34375 bytes doc/boxes.png | Bin 0 -> 23506 bytes doc/editor.png | Bin 0 -> 10736 bytes doc/test.png | Bin 0 -> 9628 bytes doc/top.png | Bin 0 -> 33331 bytes index.php | 360 ++++++++++++++++++++++++++++++++++++++++++++++ static/reset.css | 48 +++++++ static/style.css | 103 +++++++++++++ static/style2.css | 84 +++++++++++ 11 files changed, 778 insertions(+) create mode 100644 README.md create mode 100644 db.sql create mode 100644 doc/bottom.png create mode 100644 doc/boxes.png create mode 100644 doc/editor.png create mode 100644 doc/test.png create mode 100644 doc/top.png create mode 100644 index.php create mode 100644 static/reset.css create mode 100644 static/style.css create mode 100644 static/style2.css diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae2ef80 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Flashy - Just another simple vocabulary trainer + +This is a single-file php application for training writing using flash cards sorted into boxes. +The UI is optimized for mobile viewing. Added cards are automatically sorted into different boxes based on successfully typing in the correct answer or not. + +The provided database contains cards for learning German for english speakers but it can be adapted to learn anything. Editing is also possible throug the UI (except for word classes) so adding an empty database is also an option. Please tweak db.sql before creating the sqlite3 database. + +## Why built it? +I wrote this small application to help my wife learn german but then thought of publishing it in case someone else is looking for a simple solution. I know there are plenty of language learning programs out there but i wanted something offline and with boxes the cards are sorted into the traditional way. Contributions and improvements are most welcome. + +## Screenshots +![Top view of App showing testing area and vocabulary boxes below](doc/top.png) +![View of lower part of App showing the editor area](doc/bottom.png) + +### Test +![Test Area](doc/test.png) + +### Vocabulary Boxes +![Test Area](doc/boxes.png) + +### Editor +![Test Area](doc/editor.png) + + +## Requirements + +- php 7.4 or higher +- php-sqlite3 extension + +## Installation +Create a database from the provided db.sql file: +``` +sqlite db.db < db.sql +``` + +## Edit index.php +Find following user/password lines and edit as needed. +``` +class Auth { + private $user = 'username'; + private $pass = 'password'; +``` + +You can also comment out the line + +``` +new Auth(); +``` +at the bottom to disable basic authentication completely. diff --git a/db.sql b/db.sql new file mode 100644 index 0000000..4a7dd7e --- /dev/null +++ b/db.sql @@ -0,0 +1,134 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE boxes ( + id INTEGER PRIMARY KEY, + name TEXT NOT NULL +); +INSERT INTO boxes VALUES(0,'Failed Thrice'); +INSERT INTO boxes VALUES(1,'Failed Twice'); +INSERT INTO boxes VALUES(2,'Failed Once'); +INSERT INTO boxes VALUES(3,'New'); +INSERT INTO boxes VALUES(4,'Correct Once'); +INSERT INTO boxes VALUES(5,'Correct Twice'); +INSERT INTO boxes VALUES(6,'Correct Thrice'); +INSERT INTO boxes VALUES(7,'Mastered'); +CREATE TABLE classes ( + id INTEGER PRIMARY KEY, + name TEXT NOT NULL +); +INSERT INTO classes VALUES(0,'Pronoun'); +INSERT INTO classes VALUES(1,'Noun'); +INSERT INTO classes VALUES(2,'Verb (Infinitive)'); +INSERT INTO classes VALUES(3,'Verb (Praesens)'); +INSERT INTO classes VALUES(4,'Verb (Perfekt)'); +INSERT INTO classes VALUES(5,'Verb (Praeteritum)'); +INSERT INTO classes VALUES(6,'Verb (Plusquamperfekt)'); +INSERT INTO classes VALUES(7,'Verb (Futur)'); +INSERT INTO classes VALUES(8,'Verb (Futur II)'); +INSERT INTO classes VALUES(9,'Adjective'); +INSERT INTO classes VALUES(10,'Adverb'); +CREATE TABLE cards ( + id INTEGER PRIMARY KEY, + box_id INTEGER DEFAULT 3, + class_id INTEGER NOT NULL, + front TEXT NOT NULL, + back TEXT NOT NULL, + FOREIGN KEY(box_id) REFERENCES boxes(id) ON UPDATE CASCADE, + FOREIGN KEY(class_id) REFERENCES classes(id) ON UPDATE CASCADE +); +INSERT INTO cards VALUES(1,3,1,'the house','das Haus'); +INSERT INTO cards VALUES(2,3,1,'my house','mein Haus'); +INSERT INTO cards VALUES(3,3,1,'your house','dein Haus'); +INSERT INTO cards VALUES(4,3,1,'his house','sein Haus'); +INSERT INTO cards VALUES(5,3,1,'her house','ihr Haus'); +INSERT INTO cards VALUES(6,3,1,'our house','unser Haus'); +INSERT INTO cards VALUES(7,3,1,'your house (plural)','euer Haus'); +INSERT INTO cards VALUES(8,3,1,'their house','ihr Haus'); +INSERT INTO cards VALUES(9,3,1,'the child','das Kind'); +INSERT INTO cards VALUES(10,3,1,'my child','mein Kind'); +INSERT INTO cards VALUES(11,3,1,'your child','dein Kind'); +INSERT INTO cards VALUES(12,3,1,'his child','sein Kind'); +INSERT INTO cards VALUES(13,3,1,'her child','ihr Kind'); +INSERT INTO cards VALUES(14,3,1,'our child','unser Kind'); +INSERT INTO cards VALUES(15,3,1,'your child (plural)','euer Kind'); +INSERT INTO cards VALUES(16,3,1,'their child','ihr Kind'); +INSERT INTO cards VALUES(17,3,2,'to eat','essen'); +INSERT INTO cards VALUES(18,3,3,'i eat','ich esse'); +INSERT INTO cards VALUES(19,3,3,'you eat (singular)','du isst'); +INSERT INTO cards VALUES(20,3,3,'he eats','er isst'); +INSERT INTO cards VALUES(21,3,3,'she eats','sie isst'); +INSERT INTO cards VALUES(22,3,3,'we eat','wir essen'); +INSERT INTO cards VALUES(23,3,3,'you eat (plural)','ihr esst'); +INSERT INTO cards VALUES(24,3,3,'they eat','sie essen'); +INSERT INTO cards VALUES(25,3,4,'i ate','ich ass'); +INSERT INTO cards VALUES(26,3,4,'you ate','du asst'); +INSERT INTO cards VALUES(27,3,4,'he ate','er ass'); +INSERT INTO cards VALUES(28,3,4,'she ate','sie ass'); +INSERT INTO cards VALUES(29,3,4,'we ate','wir assen'); +INSERT INTO cards VALUES(30,3,4,'you ate (plural)','ihr asst'); +INSERT INTO cards VALUES(31,3,4,'they ate','sie assen'); +INSERT INTO cards VALUES(32,3,1,'the baker','der Bäcker'); +INSERT INTO cards VALUES(33,3,1,'the children','die Kinder'); +INSERT INTO cards VALUES(34,3,1,'my children','meine Kinder'); +INSERT INTO cards VALUES(35,3,1,'your children','deine Kinder'); +INSERT INTO cards VALUES(36,3,1,'his children','seine Kinder'); +INSERT INTO cards VALUES(37,3,1,'her children','ihre Kinder'); +INSERT INTO cards VALUES(38,3,1,'our children','unsere Kinder'); +INSERT INTO cards VALUES(39,3,1,'your children (plural)','eure Kinder'); +INSERT INTO cards VALUES(40,3,1,'their children','ihre Kinder'); +INSERT INTO cards VALUES(41,3,1,'the bakers','die Bäcker'); +INSERT INTO cards VALUES(42,3,9,'ruthless','rücksichtslos'); +INSERT INTO cards VALUES(43,3,4,'it ate','es ass'); +INSERT INTO cards VALUES(46,3,1,'the mountain','der Berg'); +INSERT INTO cards VALUES(47,3,2,'to fit','passen'); +INSERT INTO cards VALUES(48,3,1,'river','Fluss'); +INSERT INTO cards VALUES(49,3,1,'the stage','die Bühne'); +INSERT INTO cards VALUES(50,3,2,'to find','finden'); +INSERT INTO cards VALUES(51,3,2,'to take','nehmen'); +INSERT INTO cards VALUES(52,3,2,'to taste','schmecken'); +INSERT INTO cards VALUES(53,3,1,'really','wirklick'); +INSERT INTO cards VALUES(54,3,2,'to pay','Zahlen'); +INSERT INTO cards VALUES(55,3,2,'to bring','bringen'); +INSERT INTO cards VALUES(56,3,1,'bill','Die Rechnung'); +INSERT INTO cards VALUES(57,3,1,'the waiter','Der Kellner'); +INSERT INTO cards VALUES(58,3,2,'to order','bestellen'); +INSERT INTO cards VALUES(59,3,2,'to wish','wünschen'); +INSERT INTO cards VALUES(60,3,2,'to get','bekommen'); +INSERT INTO cards VALUES(61,3,1,'exactly ','genau'); +INSERT INTO cards VALUES(62,3,1,'something','etwas'); +INSERT INTO cards VALUES(63,3,2,'to climb','klettern'); +INSERT INTO cards VALUES(64,3,2,'to desire','begehren'); +INSERT INTO cards VALUES(65,3,1,'the pub','Die Kneipe'); +INSERT INTO cards VALUES(66,3,1,'again','wieder'); +INSERT INTO cards VALUES(67,3,1,'open','geöffnet'); +INSERT INTO cards VALUES(68,3,2,'to open','öffnen'); +INSERT INTO cards VALUES(69,3,1,'closed','geschlossen'); +INSERT INTO cards VALUES(70,3,2,'to close','schliessen'); +INSERT INTO cards VALUES(71,3,1,'the resident','der Einwohner'); +INSERT INTO cards VALUES(72,3,2,'to freeze','frieren'); +INSERT INTO cards VALUES(73,3,1,'the desire','die Lust'); +INSERT INTO cards VALUES(74,3,1,'the passenger','der Fahrgast'); +INSERT INTO cards VALUES(75,3,1,'at','bei'); +INSERT INTO cards VALUES(76,3,1,'all','alle'); +INSERT INTO cards VALUES(77,3,1,'the area (surface)','die Fläche'); +INSERT INTO cards VALUES(78,3,2,'to lie down','liegen'); +INSERT INTO cards VALUES(79,3,1,'high','hoch'); +INSERT INTO cards VALUES(80,3,1,'the border','die Grenze'); +INSERT INTO cards VALUES(81,3,1,'the main train station','der Hauptbahnhof'); +INSERT INTO cards VALUES(82,3,1,'the harbour','der Hafen'); +INSERT INTO cards VALUES(83,3,1,'the Opera','die Oper'); +INSERT INTO cards VALUES(84,3,1,'the church','die Kirche'); +INSERT INTO cards VALUES(85,3,2,'last','dauern'); +INSERT INTO cards VALUES(86,3,2,'to get there','hingelangen'); +INSERT INTO cards VALUES(87,3,1,'the play','das Stück'); +INSERT INTO cards VALUES(88,3,1,'the ticket','das Ticket'); +INSERT INTO cards VALUES(89,3,1,'the fridge','der Kühlschrank'); +INSERT INTO cards VALUES(90,3,1,'afterwards','nachher'); +INSERT INTO cards VALUES(91,3,1,'rarely','selten'); +INSERT INTO cards VALUES(92,3,2,'to cut','schneiden'); +INSERT INTO cards VALUES(93,3,1,'both','beide'); +INSERT INTO cards VALUES(94,3,2,'to sit','sitzen'); +INSERT INTO cards VALUES(95,3,2,'to sit down','sich hinsetzen'); +INSERT INTO cards VALUES(96,3,2,'to fetch','holen'); +INSERT INTO cards VALUES(97,3,1,'the surface','die Oberfläche'); +COMMIT; diff --git a/doc/bottom.png b/doc/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..20634b7858bdea7806e530e15b8c2e6502d4c992 GIT binary patch literal 34375 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 literal 0 HcmV?d00001 diff --git a/doc/boxes.png b/doc/boxes.png new file mode 100644 index 0000000000000000000000000000000000000000..d93afd95f10a97d5620c2e0f006996d44f51c21f GIT binary patch literal 23506 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%0A-ch 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 SUpp}1pOl2Wc%i6{&;J5@CHhhT literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..1fa9c0b --- /dev/null +++ b/index.php @@ -0,0 +1,360 @@ + + + +Flashy + + + + + +user || + !isset($_SERVER['PHP_AUTH_PW']) || + $_SERVER['PHP_AUTH_PW'] != $this->pass + ) { + header('HTTP/1.0 401 Unauthorized'); + header('WWW-Authenticate: Basic realm="Flashy"'); + echo 'You are not authorized to access this site. Please log in.'; + exit; + } + } +} + +class Card { + public $id, $boxID, $classID, $front, $back; + public function __construct($id, $boxID, $classID, $front, $back) { + $this->id=$id; + $this->boxID=$boxID; + $this->classID=$classID; + $this->front=$front; + $this->back=$back; + } + + public static function createFromDBRow($row) { + return new Card($row['id'], $row['box_id'], $row['class_id'], $row['front'], $row['back']); + } +} + +class DB { + private $db; + + public function __construct() { + $this->db = new PDO('sqlite:db.db'); + $this->db->query("PRAGMA foreign_keys = ON"); + } + + public function __destruct() { + $db = null; + } + + public function getClasses() { + return $this->db->query("SELECT * FROM classes"); + } + + public function getBoxes() { + return $this->db->query("SELECT * FROM boxes"); + } + + public function getBoxNameByID($boxID) { + return $this->db->query("SELECT name FROM boxes WHERE id='".$boxID."' LIMIT 1")->fetchColumn(); + } + + public function getClassNameByID($classID) { + return $this->db->query("SELECT name FROM classes WHERE id='".$classID."' LIMIT 1")->fetchColumn(); + } + + public function getNumBoxes() { + return $this->db->query("SELECT COUNT(*) FROM boxes")->fetchColumn(); + } + + public function getFirstCardByBoxID($boxID) { + $res = $this->db->query("SELECT * FROM cards WHERE box_id = '" . $boxID . "' LIMIT 1")->fetchAll(); + if (count($res) > 0) { + $row = $res[0]; + return Card::createFromDBRow($row); + } + else { + return null; + } + } + + public function getCardByID($card_id) { + $res = $this->db->query("SELECT * FROM cards WHERE id = '" . $card_id . "' LIMIT 1")->fetchAll(); + if (count($res) > 0) { + $row = $res[0]; + return Card::createFromDBRow($row); + } + else { + return null; + } + } + + public function getNumCardsByBoxID($boxID) { + return $this->db->query("SELECT COUNT(*) FROM cards where box_id='" . $boxID . "'")->fetchColumn(); + } + + public function getNumCards() { + return $this->db->query("SELECT COUNT(*) FROM cards")->fetchColumn(); + } + + public function updateCard($card) { + $origCard = $this->getCardByID($card->id); + if($origCard->boxID != $card->boxID) { + $res = $this->db->query("UPDATE cards SET box_id='".$card->boxID."' WHERE id='".$card->id."'"); + } + if($origCard->classID != $card->classID) { + $res = $this->db->query("UPDATE cards SET class_id='".$card->classID."' WHERE id='".$card->id."'"); + } + if($origCard->front != $card->front) { + $res = $this->db->query("UPDATE cards SET front='".$card->front."' WHERE id='".$card->id."'"); + } + if($origCard->back != $card->back) { + $res = $this->db->query("UPDATE cards SET back='".$card->back."' WHERE id='".$card->id."'"); + } + } + + public function createCard($card) { + if($card->classID != null && $card->front != null && $card->back != null) { + $res = $this->db->query("INSERT INTO cards (box_id,class_id,front,back) VALUES(3,".$card->classID.",'".$card->front."','".$card->back."')"); + } + } + + public function deleteCard($cardID) { + if($cardID != null) { + $res = $this->db->query("DELETE FROM cards WHERE id='".$cardID."'"); + } + } + + public function getRandomCardByBoxID($boxID) {} + public function getAllCardsByBoxID($boxID) {} +} + +class App { + private $db, + $selectedCard, + $selectedBoxID, + $testInput, + $message, + $checkCase = true; + + public function __construct() { + $this->db = new DB(); + + $this->handleInput(); + + // Select random card from selected box since none is selected yet: + if($this->selectedBoxID != null && $this->selectedCard == null) { + $this->selectNewCard(); + /* + if($this->selectedCard != null) { + // Give the user some info... + $this->message = $this->selectedCard->front.' | '.$this->db->getClassNameByID($this->selectedCard->classID); + } + */ + } + + // Do some evaluation... + if(isset($this->selectedCard) && $this->testInput != null) { + // Case sensitive... + if($this->checkCase) { + $a = $this->selectedCard->back; + $b = $this->testInput; + } + // Case insensitive... + else { + $a = strtolower($this->selectedCard->back); + $b = strtolower($this->testInput); + } + //Answer correct: + if($a == $b) { + if($this->selectedCard->back == $this->testInput) { + $this->message = 'Correct'; + } + else { + $this->message = 'Almost Correct'; + } + + if($this->selectedCard->boxID >= 0 && $this->selectedCard->boxID < 3) { + $this->selectedCard->boxID = 4; + } + else if($this->selectedCard->boxID >= 3 && $this->selectedCard->boxID < $this->db->getNumBoxes()-1) { + $this->selectedCard->boxID += 1; + } + } + //Answer wrong: + else { + $this->message = 'Wrong - Correct answer:
'.$this->selectedCard->back; + if($this->selectedCard->boxID > 0 && $this->selectedCard->boxID <= 3) { + $this->selectedCard->boxID -= 1; + } + else if($this->selectedCard->boxID > 3 && $this->selectedCard->boxID < $this->db->getNumBoxes()) { + $this->selectedCard->boxID = 2; + } + } + $this->db->updateCard($this->selectedCard); + $this->testInput = ''; + $this->selectNewCard(); + } + + $this->renderTest(); + $this->renderBoxes(); + $this->renderConfigurator(); + } + + private function renderTest() { + echo '

' . "\n"; + echo '
' . $this->message . "
\n"; + echo '
'.($this->selectedCard == null ? '' : $this->selectedCard->front.' | '.$this->db->getClassNameByID($this->selectedCard->classID))."
\n"; + echo '
' . "\n"; + echo 'testInput == null ? '' : ' value="' . $this->testInput . '"') + .($this->selectedCard == null ? '' : ' autofocus') + .'>'."\n"; + echo '' . "\n"; + echo ''."\n"; + echo '
' . "\n"; + echo 'Case sensitive' . "\n"; + echo "
\n"; + } + + private function renderBoxes() { + echo '
'."\n"; + echo "
    \n"; + foreach ($this->db->getBoxes() as $box) { + $this->addGetParameter('box_id', $box['id']); + $this->addGetParameter('check_case', $this->checkCase); + if (isset($this->selectedBoxID)) { + $html_selected = $box['id'] == $this->selectedBoxID ? ' class="selected"' : ''; + } + else { + $html_selected = ''; + } + + echo "
  • \n"; + echo ''.$box['name'].' ('.$this->db->getNumCardsByBoxID($box['id']).")\n"; + echo "
  • \n"; + } + echo "
\n"; + echo "
\n"; + } + + private function renderConfigurator() { + echo '
' . "\n"; + echo '
' . "\n"; + echo '
' . "\n"; + echo '
' . "\n"; + echo '\n"; + echo '
' . "\n"; + echo '
' . "\n"; + echo '
' . "\n"; + echo ''."\n"; + echo '
' . "\n"; + echo "
\n"; + } + + private function handleInput() { + if (isset($_REQUEST['box_id']) && + $_REQUEST['box_id'] >= 0 && + $_REQUEST['box_id'] < $this->db->getNumBoxes()) + { + $this->selectedBoxID = $_REQUEST['box_id']; + } + if (isset($_REQUEST['card_id']) && + $_REQUEST['card_id'] >= 0) + { + $this->selectedCard = $this->db->getCardByID($_REQUEST['card_id']); + } + if (isset($_REQUEST['check_case']) && + $_REQUEST['check_case'] == 1) + { + $this->checkCase = true; + } + else $this->checkCase = false; + + if (isset($_REQUEST['test_input']) && $_REQUEST['test_input'] != '') { + $this->testInput = trim($_REQUEST['test_input']); + } + + // Create a new Card in the database + if (isset($_REQUEST['action_create']) && + isset($_REQUEST['class_id']) && $_REQUEST['class_id'] != null && + isset($_REQUEST['card_front']) && $_REQUEST['card_front'] != null && + isset($_REQUEST['card_back']) && $_REQUEST['card_back'] != null) + { + $card = new Card(null, 3, $_REQUEST['class_id'], trim($_REQUEST['card_front']), trim($_REQUEST['card_back'])); + $this->db->createCard($card); + } + // Modify an existing card in the database + else if (isset($_REQUEST['action_replace']) && + isset($_REQUEST['class_id']) && $_REQUEST['class_id'] != null && + isset($_REQUEST['card_front']) && $_REQUEST['card_front'] != null && + isset($_REQUEST['card_back']) && $_REQUEST['card_back'] != null && + $this->selectedCard != null) + { + $card = new Card($this->selectedCard->id, $this->selectedCard->boxID, $_REQUEST['class_id'], trim($_REQUEST['card_front']), trim($_REQUEST['card_back'])); + $this->db->updateCard($card); + // Reload the updated card + $this->selectedCard = $this->db->getCardByID($card->id); + } + // Delete a card from the database + else if (isset($_REQUEST['action_delete']) && + $this->selectedCard != null) + { + $this->db->deleteCard($this->selectedCard->id); + // Make sure the deleted card is no longer selected + $this->selectedCard = null; + } + } + + private function selectNewCard() { + $this->selectedCard = $this->db->getFirstCardByBoxID($this->selectedBoxID); + } + + private function addGetParameter($parameterName, $parameterValue) { + $_GET[$parameterName] = $parameterValue; + } + + private function createGetParameterString() { + $tmp = '?'; + foreach($_GET as $key => $value) { + $tmp = $tmp . $key . '=' . $value . '&'; + } + return trim($tmp, '&');//substr($tmp, 0, -1); + } + + //Add a temporary extra key/value pair to string + private function createExtendedGetParameterString($key, $value) { + $this->deleteGetParameter($key); + $existingParams = $this->createGetParameterString(); + return $existingParams == '?' ? '?'.$key.'='.$value : $existingParams.'&'.$key.'='.$value; + } + + private function deleteGetParameter($key) { + unset($_GET[$key]); + } +} + +new Auth(); +new App(); +?> + + diff --git a/static/reset.css b/static/reset.css new file mode 100644 index 0000000..af94440 --- /dev/null +++ b/static/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..c1f1bd6 --- /dev/null +++ b/static/style.css @@ -0,0 +1,103 @@ +body { + margin: 0px auto; + padding: 0px; + background-color: #83bdfc; + font-size: 14px; + max-width: 600px; +} + +a { + color: inherit; + text-decoration: none; + display: block; + border-radius: 15px; +} + +input, select { + margin: 0 0 20px 0; + padding: 10px; + border-radius: 15px; + border: none; + width: 100%; + box-sizing: border-box; + text-align: center; +} + +.box_view { + margin: 0; + padding: 10px 10px 50px 10px; + +} + +.box_view ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +.box_view li { + margin: 20px 0; + padding: 0; + +} + +.box_view ul li a { + padding: 10px; + margin: 0; + background-color: #b4d8ff; + text-align: center; +} + +.box_view ul li a.selected { + background-color: #202020; + color: #EEEEEE; +} + +.box_view li a:hover { + background-color: #202020; + color: #EEEEEE; +} + +.test_view { + margin: 0; + padding: 10px 10px 35px 10px; +} + +.std_row, .btn_row { + margin: 0 0 20px 0; + padding: 10px; + min-height: 14px; + border-radius: 15px; + background-color: #b4d8ff; + text-align: center; +} + +.btn_row.selected { + background-color: #202020; + color: #EEEEEE; +} + +.btn_row:hover { + background-color: #202020; + color: #EEEEEE; +} + +.configurator_view { + padding: 10px 10px 25px 10px; +} + +.configurator_view select { + background-color: #FFFFFF; +} +/* +.infos { + margin: 0; + padding: 10px; + background-color: #83bdfc; +} + +.infos div { + margin: 20px 0; + padding: 0px; +} +*/ \ No newline at end of file diff --git a/static/style2.css b/static/style2.css new file mode 100644 index 0000000..c0329ac --- /dev/null +++ b/static/style2.css @@ -0,0 +1,84 @@ +body { + margin: 0px; + padding: 0px; + color: #EEEEEE; +} + +a { + color: inherit; + text-decoration: none; +} + +input, select { + margin: 0; + margin-bottom: 20px; + padding: 0px 15px; + height: 40px; + border-radius: 5px; + border: none; + width: 100%; + /*width: inherit;*/ + box-sizing: border-box; +} + +.box_view { + margin: 0px; + padding: 0px; + width: 100%; + background-color: #505050; +} + +.box_view #head { + font-weight: bold; +} + +.box_view tr { + padding: 15px 10px; +} + +.box_view td { + padding: inherit; +} + +.test_input { + background-color: #505050; + margin: 0; + padding: 10px; +} + +.test_input form { + margin: 0; + padding: 0; +} + +.test_input div { + margin: 0; + /*margin-bottom: 20px;*/ + padding: 0; + min-height: 40px; + width: 100%; +} + +.test_input #feedback { + margin: auto; + padding: 15px; + width: fit-content; + text-align: center; + line-height: 25px; +} + +.configurator_input { + background-color: #3f3f3f; + padding: 10px 10px; +} + +.infos { + margin: 0; + padding: 10px; + background-color: #3f3f3f; +} + +.infos div { + margin: 20px 0; + padding: 0px; +} \ No newline at end of file