From c0fc9e9d0053975837ae48fa1db93b5095d33146 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Thu, 20 Mar 2025 19:54:37 -0600 Subject: [PATCH] styling, navigation bar, theming, article lists, page routing. --- articles.php | 28 ++++ components/foot.php | 1 - components/head.php | 17 ++- components/nav.php | 28 ++++ article.php => compose.php | 3 - css/base.css | 147 +++++++++++++++++++-- css/dark.css | 47 +++++++ css/images.css | 5 - css/light.css | 64 +++++++++ css/text.css | 47 ------- functions/article_functions.php | 51 +++++-- functions/init.php | 11 +- index.php | 3 - resources/HackNerdFont-Bold.ttf | Bin 0 -> 2627284 bytes resources/HackNerdFont-BoldItalic.ttf | Bin 0 -> 2632960 bytes resources/HackNerdFont-Italic.ttf | Bin 0 -> 2626328 bytes resources/HackNerdFont-Regular.ttf | Bin 0 -> 2618892 bytes resources/HackNerdFontMono-Bold.ttf | Bin 0 -> 2545048 bytes resources/HackNerdFontMono-BoldItalic.ttf | Bin 0 -> 2550816 bytes resources/HackNerdFontMono-Italic.ttf | Bin 0 -> 2544192 bytes resources/HackNerdFontMono-Regular.ttf | Bin 0 -> 2536820 bytes resources/HackNerdFontPropo-Bold.ttf | Bin 0 -> 2627068 bytes resources/HackNerdFontPropo-BoldItalic.ttf | Bin 0 -> 2632740 bytes resources/HackNerdFontPropo-Italic.ttf | Bin 0 -> 2626108 bytes resources/HackNerdFontPropo-Regular.ttf | Bin 0 -> 2618680 bytes resources/LICENSE.md | 45 +++++++ resources/README.md | 48 +++++++ scripts/init.sql | 39 ++++-- 28 files changed, 489 insertions(+), 95 deletions(-) create mode 100644 articles.php create mode 100644 components/nav.php rename article.php => compose.php (78%) create mode 100644 css/dark.css delete mode 100644 css/images.css create mode 100644 css/light.css delete mode 100644 css/text.css create mode 100644 resources/HackNerdFont-Bold.ttf create mode 100644 resources/HackNerdFont-BoldItalic.ttf create mode 100644 resources/HackNerdFont-Italic.ttf create mode 100644 resources/HackNerdFont-Regular.ttf create mode 100644 resources/HackNerdFontMono-Bold.ttf create mode 100644 resources/HackNerdFontMono-BoldItalic.ttf create mode 100644 resources/HackNerdFontMono-Italic.ttf create mode 100644 resources/HackNerdFontMono-Regular.ttf create mode 100644 resources/HackNerdFontPropo-Bold.ttf create mode 100644 resources/HackNerdFontPropo-BoldItalic.ttf create mode 100644 resources/HackNerdFontPropo-Italic.ttf create mode 100644 resources/HackNerdFontPropo-Regular.ttf create mode 100644 resources/LICENSE.md create mode 100644 resources/README.md diff --git a/articles.php b/articles.php new file mode 100644 index 0000000..a1e2e1c --- /dev/null +++ b/articles.php @@ -0,0 +1,28 @@ + diff --git a/components/head.php b/components/head.php index fe942c9..751dbdb 100644 --- a/components/head.php +++ b/components/head.php @@ -3,8 +3,21 @@ - - + + + '; +} elseif ($_SESSION['theme'] == 'light') { + echo ' + + '; +} +?> + + + diff --git a/components/nav.php b/components/nav.php new file mode 100644 index 0000000..b7c872a --- /dev/null +++ b/components/nav.php @@ -0,0 +1,28 @@ + +
+ +
+'; + +$theme_toggle = ''; +if ($_SESSION['theme'] == 'dark') + $theme_toggle = 'light'; +else + $theme_toggle = 'dark'; + +$nav .= ' + +
+
+ +'; + +echo $nav; diff --git a/article.php b/compose.php similarity index 78% rename from article.php rename to compose.php index 0aec9e4..da33b09 100644 --- a/article.php +++ b/compose.php @@ -1,10 +1,7 @@ text($markdown); + $html = '
'; + $html .= $parsedown->text($markdown); + $html .= '
'; return $html; } @@ -24,17 +50,20 @@ function article_page_from_markdown($article_id) */ function article_card($article_id) { - $article_query = 'SELECT * FROM articles WHERE article_id = ' . $article_id . ';'; + $article_query = 'SELECT * FROM article WHERE article_id = ' . $article_id . ';'; $article = query_db_one_result($article_query); $article_tags_query = 'SELECT tag FROM article_tags INNER JOIN tags ON article_tags.tag_id = tags.tag_id WHERE article_id = ' . $article_id . ';'; $tags_results = query_db_one_or_more_results($article_tags_query); - $tags_html = '
'; + $tags_html = ''; + if ($tags_results != null) { + $tags_html .= '
'; - while ($row = mysqli_fetch_array($tags_results)) - $tags_html .= '#' . $row['tag'] . ''; + while ($row = mysqli_fetch_array($tags_results)) + $tags_html .= '#' . $row['tag'] . ''; - $tags_html .= '
'; + $tags_html .= '
'; + } $author_query = 'SELECT username, profile_picture FROM user WHERE user_id = ' . $article['author_id'] . ';'; $author = query_db_one_result($author_query); @@ -56,7 +85,7 @@ function article_card($article_id)

' . $article['excerpt'] . '

- Read More + Read More
' . $tags_html . '
diff --git a/functions/init.php b/functions/init.php index cd22382..989d46c 100644 --- a/functions/init.php +++ b/functions/init.php @@ -1,4 +1,5 @@ safeLoad(); // Set SESSION variable. -$_SESSION['initialized'] = true; +if (!isset($_SESSION['initialized'])) { + $_SESSION['initialized'] = true; + $_SESSION['theme'] = 'dark'; +} + +if ($_SESSION['initialized'] && isset($_POST['theme'])) { + $_SESSION['theme'] = $_POST['theme']; + unset($_POST['theme']); +} diff --git a/index.php b/index.php index 22e0a92..c9257f4 100644 --- a/index.php +++ b/index.php @@ -8,7 +8,4 @@ require_once 'functions/functions.php'; include_once 'components/head.php'; -include_once 'functions/article_functions.php'; -echo article_card(1); - include_once 'components/foot.php'; diff --git a/resources/HackNerdFont-Bold.ttf b/resources/HackNerdFont-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7b73ac5e66f1efa7250812e57c06de6bf515ae86 GIT binary patch literal 2627284 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