From 925960eb39aab70bdb071741cc694a5dcc6b15d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Sat, 7 Feb 2026 22:37:18 +0100 Subject: [PATCH] add reading history to /about --- .gitea/workflows/website.yml | 1 + .idea/php.xml | 15 + .idea/watcherTasks.xml | 6 +- Makefile | 12 + data/css_compress/Dockerfile | 8 + data/css_compress/compress.py | 4 +- www/data/css/styles.css | 461 +++++++++++++++++------- www/data/css/styles.min.css | 57 ++- www/data/css/styles_about.scss | 188 ++++++++++ www/data/images/ehr/stars_1.0.png | Bin 0 -> 7520 bytes www/data/images/ehr/stars_1.5.png | Bin 0 -> 7476 bytes www/data/images/ehr/stars_2.0.png | Bin 0 -> 7153 bytes www/data/images/ehr/stars_2.5.png | Bin 0 -> 7029 bytes www/data/images/ehr/stars_3.0.png | Bin 0 -> 6698 bytes www/data/images/ehr/stars_3.5.png | Bin 0 -> 6553 bytes www/data/images/ehr/stars_4.0.png | Bin 0 -> 6131 bytes www/data/images/ehr/stars_4.5.png | Bin 0 -> 5849 bytes www/data/images/ehr/stars_5.0.png | Bin 0 -> 5501 bytes www/internals/modules.php | 9 +- www/internals/modules/ebookhistory.php | 36 ++ www/internals/modules/projectlawful.php | 6 - www/internals/modules/selftest.php | 2 + www/internals/utils.php | 8 +- www/pages/about.php | 13 + 24 files changed, 662 insertions(+), 164 deletions(-) create mode 100644 data/css_compress/Dockerfile create mode 100644 www/data/images/ehr/stars_1.0.png create mode 100644 www/data/images/ehr/stars_1.5.png create mode 100644 www/data/images/ehr/stars_2.0.png create mode 100644 www/data/images/ehr/stars_2.5.png create mode 100644 www/data/images/ehr/stars_3.0.png create mode 100644 www/data/images/ehr/stars_3.5.png create mode 100644 www/data/images/ehr/stars_4.0.png create mode 100644 www/data/images/ehr/stars_4.5.png create mode 100644 www/data/images/ehr/stars_5.0.png create mode 100644 www/internals/modules/ebookhistory.php diff --git a/.gitea/workflows/website.yml b/.gitea/workflows/website.yml index f633af6..b6b2497 100644 --- a/.gitea/workflows/website.yml +++ b/.gitea/workflows/website.yml @@ -22,6 +22,7 @@ jobs: - name: Check out code uses: actions/checkout@v3 - run: cd "${{ gitea.workspace }}" && make clean + - run: cd "${{ gitea.workspace }}" && make css - run: cd "${{ gitea.workspace }}" && make docker - run: cd "${{ gitea.workspace }}" && make push-docker diff --git a/.idea/php.xml b/.idea/php.xml index 639f74d..aee82fc 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -9,10 +9,25 @@ + + + + + + + + + + + + + + + diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml index f8a509b..aefa896 100644 --- a/.idea/watcherTasks.xml +++ b/.idea/watcherTasks.xml @@ -22,7 +22,7 @@ - diff --git a/Makefile b/Makefile index 07363be..ee8c134 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,18 @@ push-docker: docker image push $(DOCKER_REPO)/$(DOCKER_NAME):$(NAMESPACE)-latest docker image push $(DOCKER_REPO)/$(DOCKER_NAME):latest +css: + docker build -t mscom-css-compile data/css_compress + docker run --rm \ + -v "$(shell pwd):/project" \ + -w /project/data/css_compress \ + mscom-css-compile \ + python3 /project/data/css_compress/compress.py \ + /project/www/data/css/styles.scss \ + /project/www/data/css/styles.css \ + /project/www/data/css/styles.min.css + docker image rm mscom-css-compile + clean: rm -rf ".run-data" git clean -fdx \ No newline at end of file diff --git a/data/css_compress/Dockerfile b/data/css_compress/Dockerfile new file mode 100644 index 0000000..b337535 --- /dev/null +++ b/data/css_compress/Dockerfile @@ -0,0 +1,8 @@ +FROM node:22-slim + +RUN apt-get update && apt-get install -y --no-install-recommends \ + python3 default-jre-headless \ + && npm install -g sass \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +WORKDIR /project diff --git a/data/css_compress/compress.py b/data/css_compress/compress.py index a81d411..b47d8bf 100644 --- a/data/css_compress/compress.py +++ b/data/css_compress/compress.py @@ -77,8 +77,8 @@ print() print() print('======== CALL SCSS ========') -print('> scss --style=expanded --no-cache --update "' + fsource + ':' + finput + '"') -out = subprocess.run([shutil.which('scss'), '--style=expanded', '--no-cache', '--update', fsource + ':' + finput], stdout=subprocess.PIPE, stderr=subprocess.PIPE) +print('> sass --style=expanded --no-source-map "' + fsource + ':' + finput + '"') +out = subprocess.run([shutil.which('sass'), '--style=expanded', '--no-source-map', fsource + ':' + finput], stdout=subprocess.PIPE, stderr=subprocess.PIPE) print('STDOUT:') print(out.stdout.decode('utf-8')) print('STDERR:') diff --git a/www/data/css/styles.css b/www/data/css/styles.css index 7fc9c39..9c85fcd 100644 --- a/www/data/css/styles.css +++ b/www/data/css/styles.css @@ -20,7 +20,7 @@ body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .content-responsive { width: 95%; width: calc(100% - 20px); @@ -29,7 +29,7 @@ body { } } /* Level: 1 */ -@media (min-device-width: 768px) and (max-device-width: 850px) { +@media (min-device-width:768px) and (max-device-width:850px) { .content-responsive { width: 95%; width: calc(100% - 20px); @@ -38,7 +38,7 @@ body { } } /* Level: 2 */ -@media (min-device-width: 851px) and (max-device-width: 991px) { +@media (min-device-width:851px) and (max-device-width:991px) { .content-responsive { width: 95%; width: calc(100% - 20px); @@ -47,13 +47,13 @@ body { } } /* Level: 3 */ -@media (min-device-width: 992px) and (max-device-width: 1199px) { +@media (min-device-width:992px) and (max-device-width:1199px) { .content-responsive { width: 724px; } } /* Level: 4 */ -@media (min-device-width: 1200px) { +@media (min-device-width:1200px) { .content-responsive { width: 1170px; } @@ -76,7 +76,7 @@ body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .contentheader h1 { font-size: 32px; } @@ -87,22 +87,21 @@ body { border: none; color: white; height: 1px; - background-color: #CCCCCCFF; - background: -moz-linear-gradient(left, #CCCCCCFF, #FFFFFF00); - background: -webkit-linear-gradient(left, #CCCCCCFF 0%, #FFFFFF00 100%); + background-color: #cccccc; + background: -moz-linear-gradient(left, #cccccc, rgba(255, 255, 255, 0)); + background: -webkit-linear-gradient(left, #cccccc 0%, rgba(255, 255, 255, 0) 100%); } /* Level: 0 - 2 */ -@media (max-device-width: 991px) { +@media (max-device-width:991px) { .contentheader h1 { text-align: center; margin-left: 10px; margin-right: 10px; } - .contentheader hr { - background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); - background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); + background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0)); + background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%); } } .blockcontent { @@ -322,91 +321,76 @@ body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .pagination { flex-direction: column; } - .pag20 { flex-direction: column; } - .pag10 { flex-direction: column; } - .pag05 { flex-direction: row; } } /* Level: 1 */ -@media (min-device-width: 768px) and (max-device-width: 850px) { +@media (min-device-width:768px) and (max-device-width:850px) { .pagination { flex-direction: column; } - .pag20 { flex-direction: column; } - .pag10 { flex-direction: row; } - .pag05 { flex-direction: row; } } /* Level: 2 */ -@media (min-device-width: 851px) and (max-device-width: 991px) { +@media (min-device-width:851px) and (max-device-width:991px) { .pagination { flex-direction: column; } - .pag20 { flex-direction: column; } - .pag10 { flex-direction: row; } - .pag05 { flex-direction: row; } } /* Level: 3 */ -@media (min-device-width: 992px) and (max-device-width: 1199px) { +@media (min-device-width:992px) and (max-device-width:1199px) { .pagination { flex-direction: column; } - .pag20 { flex-direction: column; } - .pag10 { flex-direction: row; } - .pag05 { flex-direction: row; } } /* Level: 4 */ -@media (min-device-width: 1200px) { +@media (min-device-width:1200px) { .pagination { flex-direction: column; } - .pag20 { flex-direction: row; } - .pag10 { flex-direction: row; } - .pag05 { flex-direction: row; } @@ -541,7 +525,7 @@ body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { #headerdiv { position: static; flex-direction: column; @@ -559,7 +543,6 @@ body { font-weight: bold; margin: 5px 10px; } - #content { padding-top: 0; } @@ -578,16 +561,14 @@ html, body { } #content { - padding-bottom: 60px; - /* Height of the footer */ + padding-bottom: 60px; /* Height of the footer */ } #footerdiv { position: absolute; bottom: 0; width: 100%; - height: 60px; - /* Height of the footer */ + height: 60px; /* Height of the footer */ text-align: center; color: #CCCCCC; left: 0; @@ -596,31 +577,31 @@ html, body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { #footerdiv { width: auto; } } /* Level: 1 */ -@media (min-device-width: 768px) and (max-device-width: 850px) { +@media (min-device-width:768px) and (max-device-width:850px) { #footerdiv { width: auto; } } /* Level: 2 */ -@media (min-device-width: 851px) and (max-device-width: 991px) { +@media (min-device-width:851px) and (max-device-width:991px) { #footerdiv { width: auto; } } /* Level: 3 */ -@media (min-device-width: 992px) and (max-device-width: 1199px) { +@media (min-device-width:992px) and (max-device-width:1199px) { #footerdiv { width: 724px; } } /* Level: 4 */ -@media (min-device-width: 1200px) { +@media (min-device-width:1200px) { #footerdiv { width: 1170px; } @@ -632,11 +613,11 @@ html, body { color: white; height: 1px; background: #CCCCCC; - background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 350, from(#CCCCCCFF), to(#FFFFFF00)); + background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 350, from(#cccccc), to(rgba(255, 255, 255, 0))); } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { #footerdiv .footerspan2 { display: none; visibility: collapse; @@ -667,7 +648,7 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .index_pnl_header a { font-size: 16px; } @@ -684,7 +665,7 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .index_pnl_base { width: 330px; } @@ -712,12 +693,11 @@ html, body { } /* Level: 0 - 2 */ -@media (max-device-width: 991px) { +@media (max-device-width:991px) { .git_list { width: 100%; height: auto; } - .extGitGraphContainer { width: 95%; width: calc(100% - 16px); @@ -825,6 +805,230 @@ html, body { fill: #003958; } +.about_ehr_container .reading-history { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + padding: 20px; + max-width: min(1170px, 100%); +} +.about_ehr_container .year-container { + margin-bottom: 16px; +} +.about_ehr_container .year-label { + font-size: 24px; + font-weight: bold; + color: #222222; + padding: 5px 10px; +} +.about_ehr_container .month-grid { + padding: 4px; + border: 1px solid #000; + display: grid; + gap: 8px; + /* Level: 4 */ +} +@media (min-device-width:1200px) { + .about_ehr_container .month-grid { + grid-template-columns: repeat(6, 1fr); + } +} +.about_ehr_container .month-grid { + /* Level: 3 */ +} +@media (min-device-width:992px) and (max-device-width:1199px) { + .about_ehr_container .month-grid { + grid-template-columns: repeat(4, 1fr); + } +} +.about_ehr_container .month-grid { + /* Level: 2 */ +} +@media (min-device-width:851px) and (max-device-width:991px) { + .about_ehr_container .month-grid { + grid-template-columns: repeat(4, 1fr); + } +} +.about_ehr_container .month-grid { + /* Level: 1 */ +} +@media (min-device-width:768px) and (max-device-width:850px) { + .about_ehr_container .month-grid { + grid-template-columns: repeat(3, 1fr); + } +} +.about_ehr_container .month-grid { + /* Level: 0 */ +} +@media (max-device-width:767px) { + .about_ehr_container .month-grid { + grid-template-columns: repeat(1, 1fr); + } +} +.about_ehr_container .month-cell { + min-height: 180px; + background: #AAAAAA; + border: 1px solid #000; +} +.about_ehr_container .book-grid { + padding: 4px; +} +.about_ehr_container .month-label { + font-size: 0.8em; + background-color: #888888; + color: #000000; + border-bottom: 1px solid #000000; + text-align: center; + margin-bottom: 8px; + font-weight: bold; +} +.about_ehr_container { + /* Book item styles */ +} +.about_ehr_container .book-item { + border-radius: 0; + position: relative; +} +.about_ehr_container .book-item:not(:hover) { + overflow: hidden; + border: 1px solid #000000; +} +.about_ehr_container .book-container { + position: relative; + transition: transform 0.2s ease-in-out, z-index 0s; + pointer-events: none; +} +.about_ehr_container { + /* Chapter overlay at top */ +} +.about_ehr_container .book-item .chapter-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + background: linear-gradient(rgba(0, 0, 0, 0.8), transparent); + color: white; + font-size: 2px; + padding: 1px 1px 4px 1px; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + opacity: 0; +} +.about_ehr_container { + /* Title overlay on hover */ +} +.about_ehr_container .book-item .title-overlay { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.8)); + color: white; + font-size: 2px; + padding: 4px 1px 1px 1px; + transition: opacity 0.2s ease-in-out; + white-space: wrap; + opacity: 0; +} +.about_ehr_container .book-item img { + aspect-ratio: var(--preview-aspect-ratio); +} +.about_ehr_container .book-item.no-cover { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + color: white; + text-align: center; + padding: 4px; +} +.about_ehr_container { + /* Rating stars - top right on hover */ +} +.about_ehr_container .rating-overlay { + position: absolute; + bottom: calc(100% + 0.5px); + right: 0; + width: 100%; + height: 2px; + background-size: contain; + background-repeat: no-repeat; + background-position: right bottom; + opacity: 0; +} +.about_ehr_container { + /* Word count - below title on hover */ +} +.about_ehr_container .wordcount-overlay { + position: absolute; + top: calc(100% + 0.5px); + left: 0; + right: 0; + padding: 1px; + font-size: 2px; + text-align: center; + color: white; + background: rgba(0, 0, 0, 0.7); + opacity: 0; +} +.about_ehr_container { + /* Use data-count attribute to select star image */ +} +.about_ehr_container .rating-overlay[data-count="1.0"] { + background-image: url("/data/images/ehr/stars_1.0.png"); +} +.about_ehr_container .rating-overlay[data-count="1.5"] { + background-image: url("/data/images/ehr/stars_1.5.png"); +} +.about_ehr_container .rating-overlay[data-count="2.0"] { + background-image: url("/data/images/ehr/stars_2.0.png"); +} +.about_ehr_container .rating-overlay[data-count="2.5"] { + background-image: url("/data/images/ehr/stars_2.5.png"); +} +.about_ehr_container .rating-overlay[data-count="3.0"] { + background-image: url("/data/images/ehr/stars_3.0.png"); +} +.about_ehr_container .rating-overlay[data-count="3.5"] { + background-image: url("/data/images/ehr/stars_3.5.png"); +} +.about_ehr_container .rating-overlay[data-count="4.0"] { + background-image: url("/data/images/ehr/stars_4.0.png"); +} +.about_ehr_container .rating-overlay[data-count="4.5"] { + background-image: url("/data/images/ehr/stars_4.5.png"); +} +.about_ehr_container .rating-overlay[data-count="5.0"] { + background-image: url("/data/images/ehr/stars_5.0.png"); +} +.about_ehr_container { + /* ================================================================================================================== */ +} +.about_ehr_container .book-item:hover .book-container { + transform: scale(8); + z-index: 10; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + background-color: #FFF; + position: absolute; + width: 32px; + height: calc(32px / var(--img-aspect-ratio)); + left: calc(50% - 16px); + top: calc(50% - 16px / var(--img-aspect-ratio)); +} +.about_ehr_container .book-item:hover .title-overlay { + opacity: 1; +} +.about_ehr_container .book-item:hover .chapter-overlay { + opacity: 1; +} +.about_ehr_container .book-item:hover .wordcount-overlay { + opacity: 1; +} +.about_ehr_container .book-item:hover .rating-overlay { + opacity: 1; +} + .admincontent { display: block; width: 100%; @@ -946,7 +1150,7 @@ html, body { width: 95%; height: 1px; border: none; - color: #FFFFFF00; + color: rgba(255, 255, 255, 0); background: -moz-radial-gradient(circle, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0)); background: -webkit-radial-gradient(circle, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0) 100%); } @@ -1113,7 +1317,7 @@ html, body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .ble_title { font-size: 1.25em; } @@ -1180,19 +1384,19 @@ html, body { } #PEB_tableProblems .PEB_TC_Value:not(:hover) { color: transparent; - -o-transition: .5s; - -ms-transition: .5s; - -moz-transition: .5s; - -webkit-transition: .5s; - transition: .5s; + -o-transition: 0.5s; + -ms-transition: 0.5s; + -moz-transition: 0.5s; + -webkit-transition: 0.5s; + transition: 0.5s; } #PEB_tableProblems .PEB_TC_Value:hover { color: #222222; - -o-transition: .5s; - -ms-transition: .5s; - -moz-transition: .5s; - -webkit-transition: .5s; - transition: .5s; + -o-transition: 0.5s; + -ms-transition: 0.5s; + -moz-transition: 0.5s; + -webkit-transition: 0.5s; + transition: 0.5s; } #PEB_tableProblems .PEB_TC_Time { border-radius: 1px; @@ -1247,21 +1451,19 @@ html, body { } /* Level: 0 - 3 */ -@media (max-device-width: 1199px) { +@media (max-device-width:1199px) { #PEB_tableProblems tr td:nth-child(1), #PEB_tableProblems tr th:nth-child(1) { display: none; } } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { #PEB_tableProblems tr td:nth-child(1), #PEB_tableProblems tr th:nth-child(1) { display: none; } - #PEB_tableProblems tr td:nth-child(3), #PEB_tableProblems tr th:nth-child(3) { display: none; } - #PEB_tableProblems tr td:nth-child(4), #PEB_tableProblems tr th:nth-child(4) { display: none; } @@ -1333,7 +1535,7 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .aoc_calendar { transform: scale(0.75); } @@ -1430,7 +1632,7 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .prgl_parent { align-items: center; } @@ -1533,59 +1735,49 @@ html, body { } /* Level: 0 - 3 */ -@media (max-device-width: 1199px) { +@media (max-device-width:1199px) { .prgl_elem_title { font-size: 22pt; } - .prgl_elem_subinfo { flex-direction: column; } - .prgl_elem_subinfo_data { justify-content: center; } - .prgl_elem_subinfo_caption { text-align: center; } - .prgl_elem_sdesc { font-size: 12pt; margin-bottom: 10px; } } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .prgl_elem { flex-direction: column; width: 350px; } - .prgl_elem_left img { width: 100%; height: 100%; } - .prgl_elem_title { font-size: 24pt; word-wrap: break-word; text-align: center; } - .prgl_elem_left { justify-content: center; } - .prgl_elem_info { flex-direction: column; margin: 8px 0 8px 8px; } - .prgl_elem_subinfo { flex-direction: row; } - .prgl_elem_sdesc { display: none; visibility: hidden; @@ -1609,8 +1801,8 @@ html, body { } #prgv_header hr { - background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); - background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); + background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0)); + background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%); } .prgv_top { @@ -1665,7 +1857,7 @@ html, body { } .prgv_right_comb { - grid-column: 1 / span 2; + grid-column: 1/span 2; } .prgv_right_lang { @@ -1702,37 +1894,33 @@ html, body { border: none; color: white; height: 1px; - background-color: #CCCCCCFF; - background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); - background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); + background-color: #cccccc; + background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0)); + background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%); } /* Level: 0 - 2 */ -@media (max-device-width: 991px) { +@media (max-device-width:991px) { .prgv_content { border: none; } } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .prgv_top { flex-direction: column; margin-top: 0; } - .prgv_left { margin: 0 10px 10px 10px; } - .prgv_right { min-height: 0; min-width: 0; } - .prgv_right_lang { justify-content: space-evenly; } - #prgv_header h1 { font-size: 28pt; } @@ -1782,6 +1970,7 @@ html, body { width: 150px; height: 200px; object-fit: contain; + object-position: left; } .booklst_right { @@ -1815,21 +2004,18 @@ html, body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .booklst_left { flex-direction: column; align-items: center; } - .booklst_entry { flex-direction: column; } - .booklst_date { display: none; visibility: hidden; } - .booklst_title { font-size: 32pt; } @@ -1852,8 +2038,8 @@ html, body { } #bookv_header hr { - background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); - background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); + background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0)); + background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%); } .bookv_top { @@ -1907,7 +2093,7 @@ html, body { } .bookv_right_comb { - grid-column: 1 / span 2; + grid-column: 1/span 2; } .bookv_right_lang { @@ -1946,41 +2132,36 @@ html, body { } /* Level: 0 - 2 */ -@media (max-device-width: 991px) { +@media (max-device-width:991px) { .bookv_content { border: none; } - #bookv_header h1 { font-size: 28pt; } } /* Level: 0 - 3 */ -@media (max-device-width: 1199px) { +@media (max-device-width:1199px) { #bookv_header h1 { font-size: 28pt; } } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .bookv_top { flex-direction: column; margin-top: 0; } - .bookv_left { margin: 0 10px 10px 10px; } - .bookv_right { min-height: 0; min-width: 0; } - .bookv_right_lang { justify-content: space-evenly; } - #bookv_header h1 { font-size: 18pt; } @@ -2038,7 +2219,7 @@ html, body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .wle_title { font-size: 1.25em; } @@ -2047,9 +2228,8 @@ html, body { align-self: center; width: 100%; /* Level: 2 - 4 */ - /* Level: 0 */ } -@media (min-device-width: 851px) { +@media (min-device-width:851px) { .ev_master { padding-bottom: 80px; } @@ -2077,7 +2257,10 @@ html, body { white-space: nowrap; width: 100%; } -@media (max-device-width: 767px) { +.ev_master { + /* Level: 0 */ +} +@media (max-device-width:767px) { .ev_master .ev_code { font-size: 75pt; } @@ -2093,7 +2276,7 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .euler_pnl_row { flex-direction: column; } @@ -2245,16 +2428,14 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .programs_pnl_entry { width: 100%; } - .programs_pnl_bottom_sub_top { margin-left: 4px; margin-right: 6px; } - .programs_pnl_bottom_1, .programs_pnl_bottom_2 { flex-direction: row; } @@ -2306,7 +2487,7 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .blogpnl_title { text-align: center; } @@ -2346,7 +2527,7 @@ html, body { } /* Level: 0 - 1 */ -@media (max-device-width: 850px) { +@media (max-device-width:850px) { .books_pnl_extra { display: none; visibility: collapse; @@ -2369,7 +2550,6 @@ html, body { border: 1px solid #888; background: #F8F8F8; padding: 6px; - /* Level: 0 */ } .bfjoust_runner_owner .hsplit { display: flex; @@ -2397,7 +2577,10 @@ html, body { .bfjoust_runner_owner .bottomelem { height: 200px; } -@media (max-device-width: 767px) { +.bfjoust_runner_owner { + /* Level: 0 */ +} +@media (max-device-width:767px) { .bfjoust_runner_owner .hsplit { display: block; } @@ -2555,7 +2738,7 @@ html, body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .bce_code .bce_code_ctrl { display: flex; flex-direction: column; @@ -2611,7 +2794,7 @@ html, body { } /* Level: 0 */ -@media (max-device-width: 767px) { +@media (max-device-width:767px) { .bce_code_out { flex-direction: column; } @@ -2624,12 +2807,6 @@ html, body { height: 150px; } } -.project-lawful-ebook-blogpost { - /* Level: 0 */ - /* Level: 1 */ - /* Level: 2 */ - /* Level: 3 */ -} .project-lawful-ebook-blogpost code { background-color: rgba(0, 0, 0, 0.1); border-radius: 2px; @@ -2704,7 +2881,10 @@ html, body { width: 100%; border: 1px solid #555; } -@media (max-device-width: 767px) { +.project-lawful-ebook-blogpost { + /* Level: 0 */ +} +@media (max-device-width:767px) { .project-lawful-ebook-blogpost .variant .dlbutton svg { width: 16px; } @@ -2718,7 +2898,10 @@ html, body { flex-direction: column; } } -@media (min-device-width: 768px) and (max-device-width: 850px) { +.project-lawful-ebook-blogpost { + /* Level: 1 */ +} +@media (min-device-width:768px) and (max-device-width:850px) { .project-lawful-ebook-blogpost .variant .dlbutton svg { width: 32px; } @@ -2729,12 +2912,18 @@ html, body { flex-direction: column; } } -@media (min-device-width: 851px) and (max-device-width: 991px) { +.project-lawful-ebook-blogpost { + /* Level: 2 */ +} +@media (min-device-width:851px) and (max-device-width:991px) { .project-lawful-ebook-blogpost .variant .dlbutton svg { width: 48px; } } -@media (min-device-width: 992px) and (max-device-width: 1199px) { +.project-lawful-ebook-blogpost { + /* Level: 3 */ +} +@media (min-device-width:992px) and (max-device-width:1199px) { .project-lawful-ebook-blogpost .variant .dlbutton svg { width: 48px; } @@ -2743,9 +2932,6 @@ html, body { } } -.project-lawful-ebook-blogpost { - /* Level: 0 - 3 */ -} .project-lawful-ebook-blogpost .variant.alt-variants { display: flex; flex-direction: column; @@ -2770,7 +2956,10 @@ html, body { .project-lawful-ebook-blogpost .dlbtn_alt svg { fill: #BBB; } -@media (max-device-width: 1199px) { +.project-lawful-ebook-blogpost { + /* Level: 0 - 3 */ +} +@media (max-device-width:1199px) { .project-lawful-ebook-blogpost .dlbtn_alt svg { width: 16px; } @@ -2779,5 +2968,3 @@ html, body { font-size: 0.75em; grid-column: 4; } - -/*# sourceMappingURL=styles.css.map */ diff --git a/www/data/css/styles.min.css b/www/data/css/styles.min.css index 4f495cc..921b8e4 100644 --- a/www/data/css/styles.min.css +++ b/www/data/css/styles.min.css @@ -10,10 +10,10 @@ .contentheader{width:100%;color:#333;font-size:large} .contentheader h1{font-family:Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:32px;font-weight:900;margin-bottom:0} @media(max-device-width:767px){.contentheader h1{font-size:32px}} -.contentheader hr{margin:0 0 25px 0;display:block;border:0;color:white;height:1px;background-color:#CCCCCCFF;background:-moz-linear-gradient(left,#CCCCCCFF,#FFFFFF00);background:-webkit-linear-gradient(left,#CCCCCCFF 0,#FFFFFF00 100%)} +.contentheader hr{margin:0 0 25px 0;display:block;border:0;color:white;height:1px;background-color:#ccc;background:-moz-linear-gradient(left,#ccc,rgba(255,255,255,0));background:-webkit-linear-gradient(left,#ccc 0,rgba(255,255,255,0) 100%)} @media(max-device-width:991px){ .contentheader h1{text-align:center;margin-left:10px;margin-right:10px} - .contentheader hr{background:-moz-radial-gradient(circle,#CCCCCCFF,#FFFFFF00);background:-webkit-radial-gradient(circle,#CCCCCCFF 0,#FFFFFF00 100%)} + .contentheader hr{background:-moz-radial-gradient(circle,#ccc,rgba(255,255,255,0));background:-webkit-radial-gradient(circle,#ccc 0,rgba(255,255,255,0) 100%)} } .blockcontent{display:block;width:100%} .generic_hidden{visibility:hidden !important} @@ -124,7 +124,7 @@ html,body{margin:0;padding:0;height:100%} @media(min-device-width:851px) and (max-device-width:991px){#footerdiv{width:auto}} @media(min-device-width:992px) and (max-device-width:1199px){#footerdiv{width:724px}} @media(min-device-width:1200px){#footerdiv{width:1170px}} -#footerdiv hr{margin-bottom:5px;display:block;border:0;color:white;height:1px;background:#ccc;background:-webkit-gradient(radial,50% 50%,0,50% 50%,350,from(#CCCCCCFF),to(#FFFFFF00))} +#footerdiv hr{margin-bottom:5px;display:block;border:0;color:white;height:1px;background:#ccc;background:-webkit-gradient(radial,50% 50%,0,50% 50%,350,from(#ccc),to(rgba(255,255,255,0)))} @media(max-device-width:850px){#footerdiv .footerspan2{display:none;visibility:collapse}} .index_pnl_base{display:inline-flex;flex-direction:column;border:1px solid #444;margin:15px;width:652px} .index_pnl_header{display:flex;align-items:center;justify-content:center;padding:4px;background:#bbb} @@ -145,7 +145,7 @@ html,body{margin:0;padding:0;height:100%} .git_list text.caption_month{font-size:8px;fill:#BBB} .git_list text.caption_day{font-size:8px;fill:#BBB} .svg-tip:after{box-sizing:border-box;position:absolute;left:50%;height:5px;width:5px;bottom:-10px;margin:0 0 0 -5px;content:" ";border:5px solid transparent;border-top-color:rgba(0,0,0,0.8);border-image:none} -.svg-tip{padding:5px;background:none repeat scroll 0 0 rgba(0,0,0,0.8);color:#BBB;font-size:12px;position:absolute;z-index:99999;text-align:center;border-radius:3px;box-sizing:border-box;opacity:0;pointer-events: none;} +.svg-tip{padding:5px;background:none repeat scroll 0 0 rgba(0,0,0,0.8);color:#BBB;font-size:12px;position:absolute;z-index:99999;text-align:center;border-radius:3px;box-sizing:border-box;opacity:0;pointer-events:none} .extGitGraphContainer{background-color:#fcfcfc;margin:10px;display:inline-block;border:1px solid #222;border-radius:0;box-shadow:0 0 1px rgba(0,0,0,0.25) inset} .egg_footer{margin-top:5px;text-align:right;margin-right:5px;margin-bottom:5px;color:#888} .egg_footer>a{text-decoration:none;color:inherit} @@ -158,6 +158,41 @@ html,body{margin:0;padding:0;height:100%} .egg_col_x5_2{fill:#00a1f3} .egg_col_x5_3{fill:#0079b7} .egg_col_x5_4{fill:#003958} +.about_ehr_container .reading-history{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;padding:20px;max-width:min(1170px,100%)} +.about_ehr_container .year-container{margin-bottom:16px} +.about_ehr_container .year-label{font-size:24px;font-weight:bold;color:#222;padding:5px 10px} +.about_ehr_container .month-grid{padding:4px;border:1px solid #000;display:grid;gap:8px} +@media(min-device-width:1200px){.about_ehr_container .month-grid{grid-template-columns:repeat(6,1fr)}} +@media(min-device-width:992px) and (max-device-width:1199px){.about_ehr_container .month-grid{grid-template-columns:repeat(4,1fr)}} +@media(min-device-width:851px) and (max-device-width:991px){.about_ehr_container .month-grid{grid-template-columns:repeat(4,1fr)}} +@media(min-device-width:768px) and (max-device-width:850px){.about_ehr_container .month-grid{grid-template-columns:repeat(3,1fr)}} +@media(max-device-width:767px){.about_ehr_container .month-grid{grid-template-columns:repeat(1,1fr)}} +.about_ehr_container .month-cell{min-height:180px;background:#aaa;border:1px solid #000} +.about_ehr_container .book-grid{padding:4px} +.about_ehr_container .month-label{font-size:.8em;background-color:#888;color:#000;border-bottom:1px solid #000;text-align:center;margin-bottom:8px;font-weight:bold} +.about_ehr_container .book-item{border-radius:0;position:relative} +.about_ehr_container .book-item:not(:hover){overflow:hidden;border:1px solid #000} +.about_ehr_container .book-container{position:relative;transition:transform .2s ease-in-out,z-index 0;pointer-events:none} +.about_ehr_container .book-item .chapter-overlay{position:absolute;top:0;left:0;right:0;background:linear-gradient(rgba(0,0,0,0.8),transparent);color:white;font-size:2px;padding:1px 1px 4px 1px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:0} +.about_ehr_container .book-item .title-overlay{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,0.8));color:white;font-size:2px;padding:4px 1px 1px 1px;transition:opacity .2s ease-in-out;white-space:wrap;opacity:0} +.about_ehr_container .book-item img{aspect-ratio:var(--preview-aspect-ratio)} +.about_ehr_container .book-item.no-cover{background:linear-gradient(135deg,#667eea 0,#764ba2 100%);display:flex;align-items:center;justify-content:center;font-size:10px;color:white;text-align:center;padding:4px} +.about_ehr_container .rating-overlay{position:absolute;bottom:calc(100%+0.5px);right:0;width:100%;height:2px;background-size:contain;background-repeat:no-repeat;background-position:right bottom;opacity:0} +.about_ehr_container .wordcount-overlay{position:absolute;top:calc(100%+0.5px);left:0;right:0;padding:1px;font-size:2px;text-align:center;color:white;background:rgba(0,0,0,0.7);opacity:0} +.about_ehr_container .rating-overlay[data-count="1.0"]{background-image:url("/data/images/ehr/stars_1.0.png")} +.about_ehr_container .rating-overlay[data-count="1.5"]{background-image:url("/data/images/ehr/stars_1.5.png")} +.about_ehr_container .rating-overlay[data-count="2.0"]{background-image:url("/data/images/ehr/stars_2.0.png")} +.about_ehr_container .rating-overlay[data-count="2.5"]{background-image:url("/data/images/ehr/stars_2.5.png")} +.about_ehr_container .rating-overlay[data-count="3.0"]{background-image:url("/data/images/ehr/stars_3.0.png")} +.about_ehr_container .rating-overlay[data-count="3.5"]{background-image:url("/data/images/ehr/stars_3.5.png")} +.about_ehr_container .rating-overlay[data-count="4.0"]{background-image:url("/data/images/ehr/stars_4.0.png")} +.about_ehr_container .rating-overlay[data-count="4.5"]{background-image:url("/data/images/ehr/stars_4.5.png")} +.about_ehr_container .rating-overlay[data-count="5.0"]{background-image:url("/data/images/ehr/stars_5.0.png")} +.about_ehr_container .book-item:hover .book-container{transform:scale(8);z-index:10;box-shadow:0 4px 12px rgba(0,0,0,0.3);background-color:#FFF;position:absolute;width:32px;height:calc(32px / var(--img-aspect-ratio));left:calc(50% - 16px);top:calc(50% - 16px / var(--img-aspect-ratio))} +.about_ehr_container .book-item:hover .title-overlay{opacity:1} +.about_ehr_container .book-item:hover .chapter-overlay{opacity:1} +.about_ehr_container .book-item:hover .wordcount-overlay{opacity:1} +.about_ehr_container .book-item:hover .rating-overlay{opacity:1} .admincontent{display:block;width:100%} .admincontent .boxedcontent{margin-bottom:20px} .egg_ajaxOutput{display:flex;box-sizing:border-box;width:100%;align-self:center;margin-left:auto;margin-right:auto;resize:none;height:300px} @@ -182,7 +217,7 @@ html,body{margin:0;padding:0;height:100%} .consistency_result_err{background:red} .consistency_result_intermed{background:#eee} .consistency_result_running{background:#ddd;border:1px solid #000} -.admincontent .boxedcontent hr{width:95%;height:1px;border:0;color:#FFFFFF00;background:-moz-radial-gradient(circle,rgba(0,0,0,0.1),rgba(0,0,0,0));background:-webkit-radial-gradient(circle,rgba(0,0,0,0.1) 0,rgba(0,0,0,0) 100%)} +.admincontent .boxedcontent hr{width:95%;height:1px;border:0;color:rgba(255,255,255,0);background:-moz-radial-gradient(circle,rgba(0,0,0,0.1),rgba(0,0,0,0));background:-webkit-radial-gradient(circle,rgba(0,0,0,0.1) 0,rgba(0,0,0,0) 100%)} .admindberr{color:#b22} .boxedcontent.alertbox{background-color:#f44;color:#222;border:1px solid #a44;font-weight:bold;text-align:center} .boxedcontent.alertbox .bc_data{padding-top:2px;padding-bottom:2px} @@ -303,7 +338,7 @@ html,body{margin:0;padding:0;height:100%} } .prgv_content{display:flex;flex-direction:column;color:#333;border:1px solid #444;background-color:#e0e0e0;width:100%;margin-left:auto;margin-right:auto} #prgv_header h1{font-size:48pt;text-align:center;margin-top:5px} -#prgv_header hr{background:-moz-radial-gradient(circle,#CCCCCCFF,#FFFFFF00);background:-webkit-radial-gradient(circle,#CCCCCCFF 0,#FFFFFF00 100%)} +#prgv_header hr{background:-moz-radial-gradient(circle,#ccc,rgba(255,255,255,0));background:-webkit-radial-gradient(circle,#ccc 0,rgba(255,255,255,0) 100%)} .prgv_top{display:flex;flex-direction:row;margin-top:15px} .prgv_left{display:inline-flex;justify-content:center;border:1px solid #333;flex-grow:1;margin-left:10px;margin-top:auto;margin-bottom:auto} .prgv_left img{height:100%;width:100%;object-fit:contain} @@ -311,13 +346,13 @@ html,body{margin:0;padding:0;height:100%} .prgv_right_key{font-weight:bold} .prgv_right_value a{color:#222;text-decoration:none} .prgv_right_value a:hover{color:#339;text-decoration:none} -.prgv_right_comb{grid-column:1 / span 2} +.prgv_right_comb{grid-column:1/span 2} .prgv_right_lang{display:flex;justify-content:flex-end} .prgv_dl_download{background:#422} .prgv_dl_github{background:#4078c0} .prgv_right_lang img{display:inline;height:16pt;max-width:32px;margin:1px 2px 0 2px} .prgv_center{margin:0 8px 8px 8px;padding:16px;background:#eee;color:#333;border:1px solid rgba(0,0,0,0.15)} -.prgv_sep{margin:40px 0 40px 0;display:block;border:0;color:white;height:1px;background-color:#CCCCCCFF;background:-moz-radial-gradient(circle,#CCCCCCFF,#FFFFFF00);background:-webkit-radial-gradient(circle,#CCCCCCFF 0,#FFFFFF00 100%)} +.prgv_sep{margin:40px 0 40px 0;display:block;border:0;color:white;height:1px;background-color:#ccc;background:-moz-radial-gradient(circle,#ccc,rgba(255,255,255,0));background:-webkit-radial-gradient(circle,#ccc 0,rgba(255,255,255,0) 100%)} @media(max-device-width:991px){.prgv_content{border:0}} @media(max-device-width:767px){ .prgv_top{flex-direction:column;margin-top:0} @@ -334,7 +369,7 @@ html,body{margin:0;padding:0;height:100%} .booklst_entry:hover .booklst_left img{filter:grayscale(100%)} .booklst_entry:hover .booklst_date span{background:#fff;border-left:1px solid #000;border-bottom:1px solid #000} .booklst_left{padding:4px;display:flex} -.booklst_left img{width:150px;height:200px;object-fit:contain} +.booklst_left img{width:150px;height:200px;object-fit:contain;object-position:left} .booklst_right{display:flex;flex-direction:column;flex-grow:1} .booklst_title{color:#333;font-size:40pt;font-weight:bolder;flex-grow:1;display:flex;justify-content:center;align-items:center;text-align:center} .booklst_date{display:flex;flex-direction:row-reverse;color:#333} @@ -347,7 +382,7 @@ html,body{margin:0;padding:0;height:100%} } .bookv_content{display:flex;flex-direction:column;color:#333;border:1px solid #444;background-color:#e0e0e0;width:100%;margin-left:auto;margin-right:auto} #bookv_header h1{font-size:48pt;text-align:center;margin-top:5px} -#bookv_header hr{background:-moz-radial-gradient(circle,#CCCCCCFF,#FFFFFF00);background:-webkit-radial-gradient(circle,#CCCCCCFF 0,#FFFFFF00 100%)} +#bookv_header hr{background:-moz-radial-gradient(circle,#ccc,rgba(255,255,255,0));background:-webkit-radial-gradient(circle,#ccc 0,rgba(255,255,255,0) 100%)} .bookv_top{display:flex;flex-direction:row;margin-top:15px;padding-bottom:10px} .bookv_left{display:inline-flex;justify-content:center;flex-grow:1;margin-left:10px;margin-top:auto;margin-bottom:auto} .bookv_left img{height:100%;width:100%;object-fit:contain} @@ -355,7 +390,7 @@ html,body{margin:0;padding:0;height:100%} .bookv_right_key{font-weight:bold} .bookv_right_value a{color:#222;text-decoration:none} .bookv_right_value a:hover{color:#339;text-decoration:none} -.bookv_right_comb{grid-column:1 / span 2} +.bookv_right_comb{grid-column:1/span 2} .bookv_right_lang{display:flex;justify-content:flex-end} .bookv_dl_download{background:#422} .bookv_dl_github{background:#4078c0} diff --git a/www/data/css/styles_about.scss b/www/data/css/styles_about.scss index 654dec5..f5ecf73 100644 --- a/www/data/css/styles_about.scss +++ b/www/data/css/styles_about.scss @@ -190,4 +190,192 @@ .egg_col_x9_6 { fill: #5E6B79; } .egg_col_x9_7 { fill: #455464; } .egg_col_x9_8 { fill: #2C3E50; } +} + +.about_ehr_container { + + .reading-history { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + padding: 20px; + + max-width: calc( min( 1170px, 100% ) ); + } + + .year-container { + margin-bottom: 16px; + } + + .year-label { + font-size: 24px; + font-weight: bold; + color: #222222; + padding: 5px 10px; + } + + .month-grid { + padding: 4px; + border: 1px solid #000; + + display: grid; + gap: 8px; + + @include rdmedia(4) { grid-template-columns: repeat(6, 1fr); } + @include rdmedia(3) { grid-template-columns: repeat(4, 1fr); } + @include rdmedia(2) { grid-template-columns: repeat(4, 1fr); } + @include rdmedia(1) { grid-template-columns: repeat(3, 1fr); } + @include rdmedia(0) { grid-template-columns: repeat(1, 1fr); } + } + + .month-cell { + min-height: 180px; + + background: #AAAAAA; + border: 1px solid #000; + } + + .book-grid { + padding: 4px; + } + + .month-label { + font-size: 0.8em; + background-color: #888888; + color: #000000; + border-bottom: 1px solid #000000; + + text-align: center; + margin-bottom: 8px; + + font-weight: bold; + } + + /* Book item styles */ + .book-item { + border-radius: 0; + position: relative; + } + + .book-item:not(:hover) { + overflow: hidden; + border: 1px solid #000000; + } + + .book-container { + position: relative; + transition: transform 0.2s ease-in-out, z-index 0s; + pointer-events: none; + } + + /* Chapter overlay at top */ + .book-item .chapter-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + background: linear-gradient(rgba(0, 0, 0, 0.8), transparent); + color: white; + font-size: 2px; + padding: 1px 1px 4px 1px; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + opacity: 0; + } + + /* Title overlay on hover */ + .book-item .title-overlay { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(transparent, rgba(0, 0, 0, 0.8)); + color: white; + font-size: 2px; + padding: 4px 1px 1px 1px; + transition: opacity 0.2s ease-in-out; + white-space: wrap; + + opacity: 0; + } + + .book-item img { + aspect-ratio: var(--preview-aspect-ratio); + } + + .book-item.no-cover { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + display: flex; + align-items: center; + justify-content: center; + font-size: 10px; + color: white; + text-align: center; + padding: 4px; + } + + /* Rating stars - top right on hover */ + .rating-overlay { + position: absolute; + bottom: calc(100% + 0.5px); + right: 0; + width: 100%; + height: 2px; + + background-size: contain; + background-repeat: no-repeat; + background-position: right bottom; + opacity: 0; + } + + /* Word count - below title on hover */ + .wordcount-overlay { + position: absolute; + top: calc(100% + 0.5px); + left: 0; + right: 0; + padding: 1px; + font-size: 2px; + text-align: center; + color: white; + background: rgba(0,0,0,0.7); + opacity: 0; + } + + /* Use data-count attribute to select star image */ + .rating-overlay[data-count="1.0"] { background-image: url('/data/images/ehr/stars_1.0.png'); } + .rating-overlay[data-count="1.5"] { background-image: url('/data/images/ehr/stars_1.5.png'); } + .rating-overlay[data-count="2.0"] { background-image: url('/data/images/ehr/stars_2.0.png'); } + .rating-overlay[data-count="2.5"] { background-image: url('/data/images/ehr/stars_2.5.png'); } + .rating-overlay[data-count="3.0"] { background-image: url('/data/images/ehr/stars_3.0.png'); } + .rating-overlay[data-count="3.5"] { background-image: url('/data/images/ehr/stars_3.5.png'); } + .rating-overlay[data-count="4.0"] { background-image: url('/data/images/ehr/stars_4.0.png'); } + .rating-overlay[data-count="4.5"] { background-image: url('/data/images/ehr/stars_4.5.png'); } + .rating-overlay[data-count="5.0"] { background-image: url('/data/images/ehr/stars_5.0.png'); } + + /* ================================================================================================================== */ + + .book-item:hover .book-container { + transform: scale(8); + z-index: 10; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + background-color: #FFF; + position: absolute; + width: 32px; + height: calc( 32px / var(--img-aspect-ratio) ); + left: calc(50% - 16px); + top: calc(50% - (16px / var(--img-aspect-ratio))); + } + + .book-item:hover .title-overlay { + opacity: 1; + } + .book-item:hover .chapter-overlay { + opacity: 1; + } + + .book-item:hover .wordcount-overlay { opacity: 1; } + .book-item:hover .rating-overlay { opacity: 1; } + } \ No newline at end of file diff --git a/www/data/images/ehr/stars_1.0.png b/www/data/images/ehr/stars_1.0.png new file mode 100644 index 0000000000000000000000000000000000000000..3eaa5f511a2429007ea1bebf0bba45d03436ecc6 GIT binary patch literal 7520 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 literal 0 HcmV?d00001 diff --git a/www/data/images/ehr/stars_2.5.png b/www/data/images/ehr/stars_2.5.png new file mode 100644 index 0000000000000000000000000000000000000000..cd105c8b2f3be8ede7247cff441a57456e14833f GIT binary patch literal 7029 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 TM1CNO00000NkvXXu0mjfC)Rf* literal 0 HcmV?d00001 diff --git a/www/data/images/ehr/stars_3.0.png b/www/data/images/ehr/stars_3.0.png new file mode 100644 index 0000000000000000000000000000000000000000..2724d9de7720ca0fc77a719994cf23bae76bfda6 GIT binary patch literal 6698 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 z zUsT+4Uv-%si9RDea#Af4Ss9~%Tk#jHrlf6;0kb`F@-!;zTx<9aRufai#$S2l{w+peYEGc@@NR;&+%aB+rT#y>=?QO=b*AXxvtaHNIJ*W9=KRV?O5cMXaK$nypBX{ zEaPBLgT);QcMPA#U)bn_BhY6>N#cZfir zvmA5q7uwE7Rtx2;8<%xED*}CXaLmD5dgqw-I(9SE)lIX*x=oK{jC;=^2g`w2CJ z9OP$_p2{ibK7<&85ThYv2F9+z}60qS$~4^At>4%rtRbQT7EKF z&;T5ciY;%muJ=Wt&qnD>19f0Go zms#?j2=qDLlC3L%^Kl<{eplcLOLbmD_%Ag!wK$&Nj{6rmgHZ{hY+c>#nJ4)@G8)pN zcjmr#(w{}$jbV9Sf z`i!$MiC&KXH}(6I{p#kgk&JQgWVG`^V0+JXw(;tw84J+>v*OQ&mA^~x$n!qIc*d~) zQzGdc6AkTq9XO19v$hQbZbUs_OI!aJi6i6O2*ZVrEkBto=#FyaGr781Lmct-8w@AX zb-?w&(46aj1TfQZ444?n7&qC_zNdiQa<2Qfm_MbzBLwn?>Eo@Wm3|!fTwo38AXLuo zq&B=C!pbWln)EI{scmyn9{L>uvSCZz*wYNY6Nm>>$lp&U3;Lj*fu?zNGbJK@CZt@1 z{+Y0X=yX6`Wu)0Dzd$^Jn!1zjTIyxsz`$(S1(=q?hE)WV?_}o$yMX6`y#sDUNdq~& zi~q=NSsw)g7h8sf_za%2L# z9tCy`*oJbzwDzuUUL@z|Wd<0I@`GtFIM~+%Z+rVB*sv`Raf35hA9+=JIko_g0be1G z<5*CE9F9jhC{-?MK0-a`=uMpH3QXdYPwr*`XAoCD`aMt)?JDC4G^6g+#t<(K0{+e? zy~eL1ju$7DgYm_{ORRs#`5f@2i1pbLb#=M6)xzvp}$c*dS9q$01gFiYc*c4(hKatHvf=qbmBjbGw%{Ww4w}X(zbk5al}*) z7>+u&{SXz?I%aIHcQ&(7_saEvzFMOtTA$Ss+tM2tqV-u?C;D_lC1P2l7oi_TY)fZt z%RF7`0gZYi&_&Nbb0W5-0d?ZM1{E~QYR-;-0cCuN2Mt=t9{>OV07*qoM6N<$f}*?F A$N&HU literal 0 HcmV?d00001 diff --git a/www/data/images/ehr/stars_3.5.png b/www/data/images/ehr/stars_3.5.png new file mode 100644 index 0000000000000000000000000000000000000000..ad92e7b016fe2a7ac589b0ece8245d523e4db059 GIT binary patch literal 6553 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 LNkvXXu0mjfm+Do# literal 0 HcmV?d00001 diff --git a/www/data/images/ehr/stars_4.0.png b/www/data/images/ehr/stars_4.0.png new file mode 100644 index 0000000000000000000000000000000000000000..694bcac12a39f2a28bb1bd257fc9e1ce998d7c0b GIT binary patch literal 6131 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 literal 0 HcmV?d00001 diff --git a/www/data/images/ehr/stars_5.0.png b/www/data/images/ehr/stars_5.0.png new file mode 100644 index 0000000000000000000000000000000000000000..65936d27ab38bc3a9afef0e7cda84f2368259c15 GIT binary patch literal 5501 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 literal 0 HcmV?d00001 diff --git a/www/internals/modules.php b/www/internals/modules.php index 865bbe9..a4f4e04 100644 --- a/www/internals/modules.php +++ b/www/internals/modules.php @@ -1,7 +1,5 @@ projectlawful === null) { require_once 'modules/projectlawful.php'; $this->projectlawful = new ProjectLawful($this->site); } return $this->projectlawful; } + + public function EbookHistory(): EbookHistory + { + if ($this->ebookhistory === null) { require_once 'modules/ebookhistory.php'; $this->ebookhistory = new EbookHistory($this->site); } + return $this->ebookhistory; + } } \ No newline at end of file diff --git a/www/internals/modules/ebookhistory.php b/www/internals/modules/ebookhistory.php new file mode 100644 index 0000000..7e8ff51 --- /dev/null +++ b/www/internals/modules/ebookhistory.php @@ -0,0 +1,36 @@ +site = $site; + } + + public function dir(): string + { + return __DIR__ . '/../../dynamic/ehr/'; + } + + public function checkConsistency(): array + { + $fn = $this->dir().'/snippet.html'; + + if (!file_exists($fn)) return ['result'=>'err', 'message' => 'File not found: ' . $fn]; + + if (filemtime($fn) < time()-(10*24*60*60)) return ['result'=>'warn', 'message' => 'Rendered data is older than 10 days']; + + return ['result' => 'ok', 'message' => '']; + } + + public function get(): string + { + $fn = $this->dir().'/snippet.html'; + if (!file_exists($fn)) return ''; + + return file_get_contents($fn); + } +} \ No newline at end of file diff --git a/www/internals/modules/projectlawful.php b/www/internals/modules/projectlawful.php index 0d00199..fd972ee 100644 --- a/www/internals/modules/projectlawful.php +++ b/www/internals/modules/projectlawful.php @@ -1,11 +1,5 @@ 'Webapps (data)', 'modules::highscores' => 'Highscores (data)', 'modules::projectlawful' => 'ProjectLawful-ebook (files)', + 'modules::ebookhistory' => 'eBook History (data)', 'egg::db-check' => 'ExtendedGitGraph (db-check)', 'backend::git' => 'Git Repository', ]; @@ -120,6 +121,7 @@ class SelfTest implements IWebsiteModule $this->addCheckConsistency("modules::webapps::webapps-check-consistency", function(){ return Website::inst()->modules->WebApps(); }); $this->addCheckConsistency("modules::highscores::highscores-check-consistency", function(){ return Website::inst()->modules->Highscores(); }); $this->addCheckConsistency("modules::projectlawful::projectlawful-check-consistency", function(){ return Website::inst()->modules->ProjectLawful(); }); + $this->addCheckConsistency("modules::ebookhistory::ebookhistory-check-consistency", function(){ return Website::inst()->modules->EbookHistory(); }); $this->addLambdaStatus("egg::db-check::check-db-consistency", function(){ return Website::inst()->modules->ExtendedGitGraph()->checkDatabaseConsistency(); }); diff --git a/www/internals/utils.php b/www/internals/utils.php index 0eff6b7..5ca11c7 100644 --- a/www/internals/utils.php +++ b/www/internals/utils.php @@ -292,9 +292,11 @@ function curl_http_request($url) return [ 'output'=>$output, 'statuscode'=>$httpcode, 'redirect'=>$redirect, 'errnum'=>$errnum, 'errstr'=>$errmsg ]; } -function array_last(array $arr) -{ - return $arr[count($arr)-1]; +if (!function_exists('array_last')) { + function array_last(array $arr) + { + return $arr[count($arr)-1]; + } } function explode_allow_empty(string $separator, string $str): array { diff --git a/www/pages/about.php b/www/pages/about.php index 61193f3..a55579e 100644 --- a/www/pages/about.php +++ b/www/pages/about.php @@ -107,4 +107,17 @@ $FRAME_OPTIONS->activeHeader = 'about'; + + +
+
Reading history (incomplete :/)
+ +
+ + modules->EbookHistory()->get(); ?> + +
+ +
+