1
0

add reading history to /about
Some checks failed
Build Docker and Deploy / Build Docker (push) Failing after 37s
Build Docker and Deploy / Deploy to Server (push) Has been skipped

This commit is contained in:
2026-02-07 22:37:18 +01:00
parent fcc10e1d70
commit 925960eb39
24 changed files with 662 additions and 164 deletions

View File

@@ -22,6 +22,7 @@ jobs:
- name: Check out code - name: Check out code
uses: actions/checkout@v3 uses: actions/checkout@v3
- run: cd "${{ gitea.workspace }}" && make clean - run: cd "${{ gitea.workspace }}" && make clean
- run: cd "${{ gitea.workspace }}" && make css
- run: cd "${{ gitea.workspace }}" && make docker - run: cd "${{ gitea.workspace }}" && make docker
- run: cd "${{ gitea.workspace }}" && make push-docker - run: cd "${{ gitea.workspace }}" && make push-docker

15
.idea/php.xml generated
View File

@@ -9,10 +9,25 @@
<component name="PHPCodeSnifferOptionsConfiguration"> <component name="PHPCodeSnifferOptionsConfiguration">
<option name="transferred" value="true" /> <option name="transferred" value="true" />
</component> </component>
<component name="PhpCodeSniffer">
<phpcs_settings>
<phpcs_by_interpreter asDefaultInterpreter="true" interpreter_id="9da4f7c9-0106-4c0e-bc76-ee52f4d3edc0" timeout="30000" />
</phpcs_settings>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.1" /> <component name="PhpProjectSharedConfiguration" php_language_level="8.1" />
<component name="PhpStan">
<PhpStan_settings>
<phpstan_by_interpreter asDefaultInterpreter="true" interpreter_id="9da4f7c9-0106-4c0e-bc76-ee52f4d3edc0" timeout="60000" />
</PhpStan_settings>
</component>
<component name="PhpStanOptionsConfiguration"> <component name="PhpStanOptionsConfiguration">
<option name="transferred" value="true" /> <option name="transferred" value="true" />
</component> </component>
<component name="Psalm">
<Psalm_settings>
<psalm_fixer_by_interpreter asDefaultInterpreter="true" interpreter_id="9da4f7c9-0106-4c0e-bc76-ee52f4d3edc0" timeout="60000" />
</Psalm_settings>
</component>
<component name="PsalmOptionsConfiguration"> <component name="PsalmOptionsConfiguration">
<option name="transferred" value="true" /> <option name="transferred" value="true" />
</component> </component>

View File

@@ -22,7 +22,7 @@
<envs /> <envs />
</TaskOptions> </TaskOptions>
<TaskOptions isEnabled="true"> <TaskOptions isEnabled="true">
<option name="arguments" value="&quot;$ProjectFileDir$/data/css_compress/compress.py&quot; &quot;$FileDir$/styles.scss&quot; &quot;$FileDir$/styles.css&quot; &quot;$FileDir$/styles.min.css&quot;" /> <option name="arguments" value="css" />
<option name="checkSyntaxErrors" value="true" /> <option name="checkSyntaxErrors" value="true" />
<option name="description" /> <option name="description" />
<option name="exitCodeBehavior" value="ERROR" /> <option name="exitCodeBehavior" value="ERROR" />
@@ -34,11 +34,11 @@
<array /> <array />
</option> </option>
<option name="outputFromStdout" value="false" /> <option name="outputFromStdout" value="false" />
<option name="program" value="python" /> <option name="program" value="make" />
<option name="runOnExternalChanges" value="true" /> <option name="runOnExternalChanges" value="true" />
<option name="scopeName" value="Project Files" /> <option name="scopeName" value="Project Files" />
<option name="trackOnlyRoot" value="true" /> <option name="trackOnlyRoot" value="true" />
<option name="workingDir" value="$PROJECT_DIR$/data/css_compress/" /> <option name="workingDir" value="$PROJECT_DIR$/" />
<envs /> <envs />
</TaskOptions> </TaskOptions>
</component> </component>

View File

@@ -62,6 +62,18 @@ push-docker:
docker image push $(DOCKER_REPO)/$(DOCKER_NAME):$(NAMESPACE)-latest docker image push $(DOCKER_REPO)/$(DOCKER_NAME):$(NAMESPACE)-latest
docker image push $(DOCKER_REPO)/$(DOCKER_NAME):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: clean:
rm -rf ".run-data" rm -rf ".run-data"
git clean -fdx git clean -fdx

View File

@@ -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

View File

@@ -77,8 +77,8 @@ print()
print() print()
print('======== CALL SCSS ========') print('======== CALL SCSS ========')
print('> scss --style=expanded --no-cache --update "' + fsource + ':' + finput + '"') print('> sass --style=expanded --no-source-map "' + fsource + ':' + finput + '"')
out = subprocess.run([shutil.which('scss'), '--style=expanded', '--no-cache', '--update', fsource + ':' + finput], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out = subprocess.run([shutil.which('sass'), '--style=expanded', '--no-source-map', fsource + ':' + finput], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print('STDOUT:') print('STDOUT:')
print(out.stdout.decode('utf-8')) print(out.stdout.decode('utf-8'))
print('STDERR:') print('STDERR:')

View File

@@ -20,7 +20,7 @@ body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.content-responsive { .content-responsive {
width: 95%; width: 95%;
width: calc(100% - 20px); width: calc(100% - 20px);
@@ -29,7 +29,7 @@ body {
} }
} }
/* Level: 1 */ /* Level: 1 */
@media (min-device-width: 768px) and (max-device-width: 850px) { @media (min-device-width:768px) and (max-device-width:850px) {
.content-responsive { .content-responsive {
width: 95%; width: 95%;
width: calc(100% - 20px); width: calc(100% - 20px);
@@ -38,7 +38,7 @@ body {
} }
} }
/* Level: 2 */ /* Level: 2 */
@media (min-device-width: 851px) and (max-device-width: 991px) { @media (min-device-width:851px) and (max-device-width:991px) {
.content-responsive { .content-responsive {
width: 95%; width: 95%;
width: calc(100% - 20px); width: calc(100% - 20px);
@@ -47,13 +47,13 @@ body {
} }
} }
/* Level: 3 */ /* Level: 3 */
@media (min-device-width: 992px) and (max-device-width: 1199px) { @media (min-device-width:992px) and (max-device-width:1199px) {
.content-responsive { .content-responsive {
width: 724px; width: 724px;
} }
} }
/* Level: 4 */ /* Level: 4 */
@media (min-device-width: 1200px) { @media (min-device-width:1200px) {
.content-responsive { .content-responsive {
width: 1170px; width: 1170px;
} }
@@ -76,7 +76,7 @@ body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.contentheader h1 { .contentheader h1 {
font-size: 32px; font-size: 32px;
} }
@@ -87,22 +87,21 @@ body {
border: none; border: none;
color: white; color: white;
height: 1px; height: 1px;
background-color: #CCCCCCFF; background-color: #cccccc;
background: -moz-linear-gradient(left, #CCCCCCFF, #FFFFFF00); background: -moz-linear-gradient(left, #cccccc, rgba(255, 255, 255, 0));
background: -webkit-linear-gradient(left, #CCCCCCFF 0%, #FFFFFF00 100%); background: -webkit-linear-gradient(left, #cccccc 0%, rgba(255, 255, 255, 0) 100%);
} }
/* Level: 0 - 2 */ /* Level: 0 - 2 */
@media (max-device-width: 991px) { @media (max-device-width:991px) {
.contentheader h1 { .contentheader h1 {
text-align: center; text-align: center;
margin-left: 10px; margin-left: 10px;
margin-right: 10px; margin-right: 10px;
} }
.contentheader hr { .contentheader hr {
background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0));
background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%);
} }
} }
.blockcontent { .blockcontent {
@@ -322,91 +321,76 @@ body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.pagination { .pagination {
flex-direction: column; flex-direction: column;
} }
.pag20 { .pag20 {
flex-direction: column; flex-direction: column;
} }
.pag10 { .pag10 {
flex-direction: column; flex-direction: column;
} }
.pag05 { .pag05 {
flex-direction: row; flex-direction: row;
} }
} }
/* Level: 1 */ /* Level: 1 */
@media (min-device-width: 768px) and (max-device-width: 850px) { @media (min-device-width:768px) and (max-device-width:850px) {
.pagination { .pagination {
flex-direction: column; flex-direction: column;
} }
.pag20 { .pag20 {
flex-direction: column; flex-direction: column;
} }
.pag10 { .pag10 {
flex-direction: row; flex-direction: row;
} }
.pag05 { .pag05 {
flex-direction: row; flex-direction: row;
} }
} }
/* Level: 2 */ /* Level: 2 */
@media (min-device-width: 851px) and (max-device-width: 991px) { @media (min-device-width:851px) and (max-device-width:991px) {
.pagination { .pagination {
flex-direction: column; flex-direction: column;
} }
.pag20 { .pag20 {
flex-direction: column; flex-direction: column;
} }
.pag10 { .pag10 {
flex-direction: row; flex-direction: row;
} }
.pag05 { .pag05 {
flex-direction: row; flex-direction: row;
} }
} }
/* Level: 3 */ /* Level: 3 */
@media (min-device-width: 992px) and (max-device-width: 1199px) { @media (min-device-width:992px) and (max-device-width:1199px) {
.pagination { .pagination {
flex-direction: column; flex-direction: column;
} }
.pag20 { .pag20 {
flex-direction: column; flex-direction: column;
} }
.pag10 { .pag10 {
flex-direction: row; flex-direction: row;
} }
.pag05 { .pag05 {
flex-direction: row; flex-direction: row;
} }
} }
/* Level: 4 */ /* Level: 4 */
@media (min-device-width: 1200px) { @media (min-device-width:1200px) {
.pagination { .pagination {
flex-direction: column; flex-direction: column;
} }
.pag20 { .pag20 {
flex-direction: row; flex-direction: row;
} }
.pag10 { .pag10 {
flex-direction: row; flex-direction: row;
} }
.pag05 { .pag05 {
flex-direction: row; flex-direction: row;
} }
@@ -541,7 +525,7 @@ body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
#headerdiv { #headerdiv {
position: static; position: static;
flex-direction: column; flex-direction: column;
@@ -559,7 +543,6 @@ body {
font-weight: bold; font-weight: bold;
margin: 5px 10px; margin: 5px 10px;
} }
#content { #content {
padding-top: 0; padding-top: 0;
} }
@@ -578,16 +561,14 @@ html, body {
} }
#content { #content {
padding-bottom: 60px; padding-bottom: 60px; /* Height of the footer */
/* Height of the footer */
} }
#footerdiv { #footerdiv {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
width: 100%; width: 100%;
height: 60px; height: 60px; /* Height of the footer */
/* Height of the footer */
text-align: center; text-align: center;
color: #CCCCCC; color: #CCCCCC;
left: 0; left: 0;
@@ -596,31 +577,31 @@ html, body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
#footerdiv { #footerdiv {
width: auto; width: auto;
} }
} }
/* Level: 1 */ /* Level: 1 */
@media (min-device-width: 768px) and (max-device-width: 850px) { @media (min-device-width:768px) and (max-device-width:850px) {
#footerdiv { #footerdiv {
width: auto; width: auto;
} }
} }
/* Level: 2 */ /* Level: 2 */
@media (min-device-width: 851px) and (max-device-width: 991px) { @media (min-device-width:851px) and (max-device-width:991px) {
#footerdiv { #footerdiv {
width: auto; width: auto;
} }
} }
/* Level: 3 */ /* Level: 3 */
@media (min-device-width: 992px) and (max-device-width: 1199px) { @media (min-device-width:992px) and (max-device-width:1199px) {
#footerdiv { #footerdiv {
width: 724px; width: 724px;
} }
} }
/* Level: 4 */ /* Level: 4 */
@media (min-device-width: 1200px) { @media (min-device-width:1200px) {
#footerdiv { #footerdiv {
width: 1170px; width: 1170px;
} }
@@ -632,11 +613,11 @@ html, body {
color: white; color: white;
height: 1px; height: 1px;
background: #CCCCCC; 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 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
#footerdiv .footerspan2 { #footerdiv .footerspan2 {
display: none; display: none;
visibility: collapse; visibility: collapse;
@@ -667,7 +648,7 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.index_pnl_header a { .index_pnl_header a {
font-size: 16px; font-size: 16px;
} }
@@ -684,7 +665,7 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.index_pnl_base { .index_pnl_base {
width: 330px; width: 330px;
} }
@@ -712,12 +693,11 @@ html, body {
} }
/* Level: 0 - 2 */ /* Level: 0 - 2 */
@media (max-device-width: 991px) { @media (max-device-width:991px) {
.git_list { .git_list {
width: 100%; width: 100%;
height: auto; height: auto;
} }
.extGitGraphContainer { .extGitGraphContainer {
width: 95%; width: 95%;
width: calc(100% - 16px); width: calc(100% - 16px);
@@ -825,6 +805,230 @@ html, body {
fill: #003958; 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 { .admincontent {
display: block; display: block;
width: 100%; width: 100%;
@@ -946,7 +1150,7 @@ html, body {
width: 95%; width: 95%;
height: 1px; height: 1px;
border: none; 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: -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%); 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 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.ble_title { .ble_title {
font-size: 1.25em; font-size: 1.25em;
} }
@@ -1180,19 +1384,19 @@ html, body {
} }
#PEB_tableProblems .PEB_TC_Value:not(:hover) { #PEB_tableProblems .PEB_TC_Value:not(:hover) {
color: transparent; color: transparent;
-o-transition: .5s; -o-transition: 0.5s;
-ms-transition: .5s; -ms-transition: 0.5s;
-moz-transition: .5s; -moz-transition: 0.5s;
-webkit-transition: .5s; -webkit-transition: 0.5s;
transition: .5s; transition: 0.5s;
} }
#PEB_tableProblems .PEB_TC_Value:hover { #PEB_tableProblems .PEB_TC_Value:hover {
color: #222222; color: #222222;
-o-transition: .5s; -o-transition: 0.5s;
-ms-transition: .5s; -ms-transition: 0.5s;
-moz-transition: .5s; -moz-transition: 0.5s;
-webkit-transition: .5s; -webkit-transition: 0.5s;
transition: .5s; transition: 0.5s;
} }
#PEB_tableProblems .PEB_TC_Time { #PEB_tableProblems .PEB_TC_Time {
border-radius: 1px; border-radius: 1px;
@@ -1247,21 +1451,19 @@ html, body {
} }
/* Level: 0 - 3 */ /* 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) { #PEB_tableProblems tr td:nth-child(1), #PEB_tableProblems tr th:nth-child(1) {
display: none; display: none;
} }
} }
/* Level: 0 */ /* 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) { #PEB_tableProblems tr td:nth-child(1), #PEB_tableProblems tr th:nth-child(1) {
display: none; display: none;
} }
#PEB_tableProblems tr td:nth-child(3), #PEB_tableProblems tr th:nth-child(3) { #PEB_tableProblems tr td:nth-child(3), #PEB_tableProblems tr th:nth-child(3) {
display: none; display: none;
} }
#PEB_tableProblems tr td:nth-child(4), #PEB_tableProblems tr th:nth-child(4) { #PEB_tableProblems tr td:nth-child(4), #PEB_tableProblems tr th:nth-child(4) {
display: none; display: none;
} }
@@ -1333,7 +1535,7 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.aoc_calendar { .aoc_calendar {
transform: scale(0.75); transform: scale(0.75);
} }
@@ -1430,7 +1632,7 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.prgl_parent { .prgl_parent {
align-items: center; align-items: center;
} }
@@ -1533,59 +1735,49 @@ html, body {
} }
/* Level: 0 - 3 */ /* Level: 0 - 3 */
@media (max-device-width: 1199px) { @media (max-device-width:1199px) {
.prgl_elem_title { .prgl_elem_title {
font-size: 22pt; font-size: 22pt;
} }
.prgl_elem_subinfo { .prgl_elem_subinfo {
flex-direction: column; flex-direction: column;
} }
.prgl_elem_subinfo_data { .prgl_elem_subinfo_data {
justify-content: center; justify-content: center;
} }
.prgl_elem_subinfo_caption { .prgl_elem_subinfo_caption {
text-align: center; text-align: center;
} }
.prgl_elem_sdesc { .prgl_elem_sdesc {
font-size: 12pt; font-size: 12pt;
margin-bottom: 10px; margin-bottom: 10px;
} }
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.prgl_elem { .prgl_elem {
flex-direction: column; flex-direction: column;
width: 350px; width: 350px;
} }
.prgl_elem_left img { .prgl_elem_left img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.prgl_elem_title { .prgl_elem_title {
font-size: 24pt; font-size: 24pt;
word-wrap: break-word; word-wrap: break-word;
text-align: center; text-align: center;
} }
.prgl_elem_left { .prgl_elem_left {
justify-content: center; justify-content: center;
} }
.prgl_elem_info { .prgl_elem_info {
flex-direction: column; flex-direction: column;
margin: 8px 0 8px 8px; margin: 8px 0 8px 8px;
} }
.prgl_elem_subinfo { .prgl_elem_subinfo {
flex-direction: row; flex-direction: row;
} }
.prgl_elem_sdesc { .prgl_elem_sdesc {
display: none; display: none;
visibility: hidden; visibility: hidden;
@@ -1609,8 +1801,8 @@ html, body {
} }
#prgv_header hr { #prgv_header hr {
background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0));
background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%);
} }
.prgv_top { .prgv_top {
@@ -1665,7 +1857,7 @@ html, body {
} }
.prgv_right_comb { .prgv_right_comb {
grid-column: 1 / span 2; grid-column: 1/span 2;
} }
.prgv_right_lang { .prgv_right_lang {
@@ -1702,37 +1894,33 @@ html, body {
border: none; border: none;
color: white; color: white;
height: 1px; height: 1px;
background-color: #CCCCCCFF; background-color: #cccccc;
background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0));
background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%);
} }
/* Level: 0 - 2 */ /* Level: 0 - 2 */
@media (max-device-width: 991px) { @media (max-device-width:991px) {
.prgv_content { .prgv_content {
border: none; border: none;
} }
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.prgv_top { .prgv_top {
flex-direction: column; flex-direction: column;
margin-top: 0; margin-top: 0;
} }
.prgv_left { .prgv_left {
margin: 0 10px 10px 10px; margin: 0 10px 10px 10px;
} }
.prgv_right { .prgv_right {
min-height: 0; min-height: 0;
min-width: 0; min-width: 0;
} }
.prgv_right_lang { .prgv_right_lang {
justify-content: space-evenly; justify-content: space-evenly;
} }
#prgv_header h1 { #prgv_header h1 {
font-size: 28pt; font-size: 28pt;
} }
@@ -1782,6 +1970,7 @@ html, body {
width: 150px; width: 150px;
height: 200px; height: 200px;
object-fit: contain; object-fit: contain;
object-position: left;
} }
.booklst_right { .booklst_right {
@@ -1815,21 +2004,18 @@ html, body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.booklst_left { .booklst_left {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
.booklst_entry { .booklst_entry {
flex-direction: column; flex-direction: column;
} }
.booklst_date { .booklst_date {
display: none; display: none;
visibility: hidden; visibility: hidden;
} }
.booklst_title { .booklst_title {
font-size: 32pt; font-size: 32pt;
} }
@@ -1852,8 +2038,8 @@ html, body {
} }
#bookv_header hr { #bookv_header hr {
background: -moz-radial-gradient(circle, #CCCCCCFF, #FFFFFF00); background: -moz-radial-gradient(circle, #cccccc, rgba(255, 255, 255, 0));
background: -webkit-radial-gradient(circle, #CCCCCCFF 0%, #FFFFFF00 100%); background: -webkit-radial-gradient(circle, #cccccc 0%, rgba(255, 255, 255, 0) 100%);
} }
.bookv_top { .bookv_top {
@@ -1907,7 +2093,7 @@ html, body {
} }
.bookv_right_comb { .bookv_right_comb {
grid-column: 1 / span 2; grid-column: 1/span 2;
} }
.bookv_right_lang { .bookv_right_lang {
@@ -1946,41 +2132,36 @@ html, body {
} }
/* Level: 0 - 2 */ /* Level: 0 - 2 */
@media (max-device-width: 991px) { @media (max-device-width:991px) {
.bookv_content { .bookv_content {
border: none; border: none;
} }
#bookv_header h1 { #bookv_header h1 {
font-size: 28pt; font-size: 28pt;
} }
} }
/* Level: 0 - 3 */ /* Level: 0 - 3 */
@media (max-device-width: 1199px) { @media (max-device-width:1199px) {
#bookv_header h1 { #bookv_header h1 {
font-size: 28pt; font-size: 28pt;
} }
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.bookv_top { .bookv_top {
flex-direction: column; flex-direction: column;
margin-top: 0; margin-top: 0;
} }
.bookv_left { .bookv_left {
margin: 0 10px 10px 10px; margin: 0 10px 10px 10px;
} }
.bookv_right { .bookv_right {
min-height: 0; min-height: 0;
min-width: 0; min-width: 0;
} }
.bookv_right_lang { .bookv_right_lang {
justify-content: space-evenly; justify-content: space-evenly;
} }
#bookv_header h1 { #bookv_header h1 {
font-size: 18pt; font-size: 18pt;
} }
@@ -2038,7 +2219,7 @@ html, body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.wle_title { .wle_title {
font-size: 1.25em; font-size: 1.25em;
} }
@@ -2047,9 +2228,8 @@ html, body {
align-self: center; align-self: center;
width: 100%; width: 100%;
/* Level: 2 - 4 */ /* Level: 2 - 4 */
/* Level: 0 */
} }
@media (min-device-width: 851px) { @media (min-device-width:851px) {
.ev_master { .ev_master {
padding-bottom: 80px; padding-bottom: 80px;
} }
@@ -2077,7 +2257,10 @@ html, body {
white-space: nowrap; white-space: nowrap;
width: 100%; width: 100%;
} }
@media (max-device-width: 767px) { .ev_master {
/* Level: 0 */
}
@media (max-device-width:767px) {
.ev_master .ev_code { .ev_master .ev_code {
font-size: 75pt; font-size: 75pt;
} }
@@ -2093,7 +2276,7 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.euler_pnl_row { .euler_pnl_row {
flex-direction: column; flex-direction: column;
} }
@@ -2245,16 +2428,14 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.programs_pnl_entry { .programs_pnl_entry {
width: 100%; width: 100%;
} }
.programs_pnl_bottom_sub_top { .programs_pnl_bottom_sub_top {
margin-left: 4px; margin-left: 4px;
margin-right: 6px; margin-right: 6px;
} }
.programs_pnl_bottom_1, .programs_pnl_bottom_2 { .programs_pnl_bottom_1, .programs_pnl_bottom_2 {
flex-direction: row; flex-direction: row;
} }
@@ -2306,7 +2487,7 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.blogpnl_title { .blogpnl_title {
text-align: center; text-align: center;
} }
@@ -2346,7 +2527,7 @@ html, body {
} }
/* Level: 0 - 1 */ /* Level: 0 - 1 */
@media (max-device-width: 850px) { @media (max-device-width:850px) {
.books_pnl_extra { .books_pnl_extra {
display: none; display: none;
visibility: collapse; visibility: collapse;
@@ -2369,7 +2550,6 @@ html, body {
border: 1px solid #888; border: 1px solid #888;
background: #F8F8F8; background: #F8F8F8;
padding: 6px; padding: 6px;
/* Level: 0 */
} }
.bfjoust_runner_owner .hsplit { .bfjoust_runner_owner .hsplit {
display: flex; display: flex;
@@ -2397,7 +2577,10 @@ html, body {
.bfjoust_runner_owner .bottomelem { .bfjoust_runner_owner .bottomelem {
height: 200px; height: 200px;
} }
@media (max-device-width: 767px) { .bfjoust_runner_owner {
/* Level: 0 */
}
@media (max-device-width:767px) {
.bfjoust_runner_owner .hsplit { .bfjoust_runner_owner .hsplit {
display: block; display: block;
} }
@@ -2555,7 +2738,7 @@ html, body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.bce_code .bce_code_ctrl { .bce_code .bce_code_ctrl {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -2611,7 +2794,7 @@ html, body {
} }
/* Level: 0 */ /* Level: 0 */
@media (max-device-width: 767px) { @media (max-device-width:767px) {
.bce_code_out { .bce_code_out {
flex-direction: column; flex-direction: column;
} }
@@ -2624,12 +2807,6 @@ html, body {
height: 150px; height: 150px;
} }
} }
.project-lawful-ebook-blogpost {
/* Level: 0 */
/* Level: 1 */
/* Level: 2 */
/* Level: 3 */
}
.project-lawful-ebook-blogpost code { .project-lawful-ebook-blogpost code {
background-color: rgba(0, 0, 0, 0.1); background-color: rgba(0, 0, 0, 0.1);
border-radius: 2px; border-radius: 2px;
@@ -2704,7 +2881,10 @@ html, body {
width: 100%; width: 100%;
border: 1px solid #555; 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 { .project-lawful-ebook-blogpost .variant .dlbutton svg {
width: 16px; width: 16px;
} }
@@ -2718,7 +2898,10 @@ html, body {
flex-direction: column; 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 { .project-lawful-ebook-blogpost .variant .dlbutton svg {
width: 32px; width: 32px;
} }
@@ -2729,12 +2912,18 @@ html, body {
flex-direction: column; 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 { .project-lawful-ebook-blogpost .variant .dlbutton svg {
width: 48px; 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 { .project-lawful-ebook-blogpost .variant .dlbutton svg {
width: 48px; width: 48px;
} }
@@ -2743,9 +2932,6 @@ html, body {
} }
} }
.project-lawful-ebook-blogpost {
/* Level: 0 - 3 */
}
.project-lawful-ebook-blogpost .variant.alt-variants { .project-lawful-ebook-blogpost .variant.alt-variants {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -2770,7 +2956,10 @@ html, body {
.project-lawful-ebook-blogpost .dlbtn_alt svg { .project-lawful-ebook-blogpost .dlbtn_alt svg {
fill: #BBB; 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 { .project-lawful-ebook-blogpost .dlbtn_alt svg {
width: 16px; width: 16px;
} }
@@ -2779,5 +2968,3 @@ html, body {
font-size: 0.75em; font-size: 0.75em;
grid-column: 4; grid-column: 4;
} }
/*# sourceMappingURL=styles.css.map */

View File

@@ -10,10 +10,10 @@
.contentheader{width:100%;color:#333;font-size:large} .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} .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}} @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){ @media(max-device-width:991px){
.contentheader h1{text-align:center;margin-left:10px;margin-right:10px} .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%} .blockcontent{display:block;width:100%}
.generic_hidden{visibility:hidden !important} .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: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:992px) and (max-device-width:1199px){#footerdiv{width:724px}}
@media(min-device-width:1200px){#footerdiv{width:1170px}} @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}} @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_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} .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_month{font-size:8px;fill:#BBB}
.git_list text.caption_day{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: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} .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{margin-top:5px;text-align:right;margin-right:5px;margin-bottom:5px;color:#888}
.egg_footer>a{text-decoration:none;color:inherit} .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_2{fill:#00a1f3}
.egg_col_x5_3{fill:#0079b7} .egg_col_x5_3{fill:#0079b7}
.egg_col_x5_4{fill:#003958} .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{display:block;width:100%}
.admincontent .boxedcontent{margin-bottom:20px} .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} .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_err{background:red}
.consistency_result_intermed{background:#eee} .consistency_result_intermed{background:#eee}
.consistency_result_running{background:#ddd;border:1px solid #000} .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} .admindberr{color:#b22}
.boxedcontent.alertbox{background-color:#f44;color:#222;border:1px solid #a44;font-weight:bold;text-align:center} .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} .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_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 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_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{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} .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_key{font-weight:bold}
.prgv_right_value a{color:#222;text-decoration:none} .prgv_right_value a{color:#222;text-decoration:none}
.prgv_right_value a:hover{color:#339;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_right_lang{display:flex;justify-content:flex-end}
.prgv_dl_download{background:#422} .prgv_dl_download{background:#422}
.prgv_dl_github{background:#4078c0} .prgv_dl_github{background:#4078c0}
.prgv_right_lang img{display:inline;height:16pt;max-width:32px;margin:1px 2px 0 2px} .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_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:991px){.prgv_content{border:0}}
@media(max-device-width:767px){ @media(max-device-width:767px){
.prgv_top{flex-direction:column;margin-top:0} .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_left img{filter:grayscale(100%)}
.booklst_entry:hover .booklst_date span{background:#fff;border-left:1px solid #000;border-bottom:1px solid #000} .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{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_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_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} .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_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 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_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{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} .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_key{font-weight:bold}
.bookv_right_value a{color:#222;text-decoration:none} .bookv_right_value a{color:#222;text-decoration:none}
.bookv_right_value a:hover{color:#339;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_right_lang{display:flex;justify-content:flex-end}
.bookv_dl_download{background:#422} .bookv_dl_download{background:#422}
.bookv_dl_github{background:#4078c0} .bookv_dl_github{background:#4078c0}

View File

@@ -191,3 +191,191 @@
.egg_col_x9_7 { fill: #455464; } .egg_col_x9_7 { fill: #455464; }
.egg_col_x9_8 { fill: #2C3E50; } .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; }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -1,7 +1,5 @@
<?php <?php
use internals\modules\ProjectLawful;
require_once 'website.php'; require_once 'website.php';
class Modules class Modules
@@ -19,6 +17,7 @@ class Modules
/** @var Highscores|null */ private $highscores = null; /** @var Highscores|null */ private $highscores = null;
/** @var SelfTest|null */ private $selftest = null; /** @var SelfTest|null */ private $selftest = null;
/** @var ProjectLawful|null */ private $projectlawful = null; /** @var ProjectLawful|null */ private $projectlawful = null;
/** @var EbookHistory|null */ private $ebookhistory = null;
/** @var Website */ /** @var Website */
private $site; private $site;
@@ -105,4 +104,10 @@ class Modules
if ($this->projectlawful === null) { require_once 'modules/projectlawful.php'; $this->projectlawful = new ProjectLawful($this->site); } if ($this->projectlawful === null) { require_once 'modules/projectlawful.php'; $this->projectlawful = new ProjectLawful($this->site); }
return $this->projectlawful; 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;
}
} }

View File

@@ -0,0 +1,36 @@
<?php
class EbookHistory implements IWebsiteModule
{
/** @var Website */
private $site;
public function __construct(Website $site)
{
$this->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);
}
}

View File

@@ -1,11 +1,5 @@
<?php <?php
namespace internals\modules;
use IWebsiteModule;
use PDO;
use Throwable;
use Website;
class ProjectLawful implements IWebsiteModule class ProjectLawful implements IWebsiteModule
{ {
/** @var Website */ /** @var Website */

View File

@@ -31,6 +31,7 @@ class SelfTest implements IWebsiteModule
'modules::webapps' => 'Webapps (data)', 'modules::webapps' => 'Webapps (data)',
'modules::highscores' => 'Highscores (data)', 'modules::highscores' => 'Highscores (data)',
'modules::projectlawful' => 'ProjectLawful-ebook (files)', 'modules::projectlawful' => 'ProjectLawful-ebook (files)',
'modules::ebookhistory' => 'eBook History (data)',
'egg::db-check' => 'ExtendedGitGraph (db-check)', 'egg::db-check' => 'ExtendedGitGraph (db-check)',
'backend::git' => 'Git Repository', '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::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::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::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(); }); $this->addLambdaStatus("egg::db-check::check-db-consistency", function(){ return Website::inst()->modules->ExtendedGitGraph()->checkDatabaseConsistency(); });

View File

@@ -292,9 +292,11 @@ function curl_http_request($url)
return [ 'output'=>$output, 'statuscode'=>$httpcode, 'redirect'=>$redirect, 'errnum'=>$errnum, 'errstr'=>$errmsg ]; return [ 'output'=>$output, 'statuscode'=>$httpcode, 'redirect'=>$redirect, 'errnum'=>$errnum, 'errstr'=>$errmsg ];
} }
function array_last(array $arr) if (!function_exists('array_last')) {
{ function array_last(array $arr)
{
return $arr[count($arr)-1]; return $arr[count($arr)-1];
}
} }
function explode_allow_empty(string $separator, string $str): array { function explode_allow_empty(string $separator, string $str): array {

View File

@@ -107,4 +107,17 @@ $FRAME_OPTIONS->activeHeader = 'about';
</div> </div>
<!-- - - - - - - - - - - - - - - - - - - - - -->
<div class="boxedcontent">
<div class="bc_header">Reading history (incomplete :/)</div>
<div class="bc_data about_ehr_container">
<?php echo $SITE->modules->EbookHistory()->get(); ?>
</div>
</div>
</div> </div>