Skip to content

Commit bc7e346

Browse files
committed
Added PWA support
1 parent a67554b commit bc7e346

28 files changed

+951
-107
lines changed

assets/icons/icon-192.png

6.01 KB
Loading

assets/icons/icon-512.png

393 KB
Loading

assets/input.css

Lines changed: 74 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,63 +12,63 @@
1212
.sidebar-item {
1313
@apply flex items-center px-4 py-3 text-gray-700 dark:text-dark-200 hover:text-primary-600 dark:hover:text-primary-300 hover:bg-primary-50 dark:hover:bg-primary-900/20 rounded-lg mx-2 transition-all duration-200;
1414
}
15-
15+
1616
.sidebar-item-active {
1717
@apply bg-primary-600 text-white shadow-lg;
1818
}
19-
19+
2020
.sidebar-item-modern {
2121
@apply flex items-center space-x-3 px-4 py-3 rounded-lg mx-2 transition-all duration-200 hover:bg-primary-50 dark:hover:bg-primary-900/20;
2222
}
23-
23+
2424
.sidebar-item-modern-active {
2525
@apply bg-primary-50 dark:bg-primary-900/30 border border-primary-200 dark:border-primary-700/50 shadow-sm;
2626
}
27-
27+
2828
.nav-item {
2929
@apply text-gray-600 dark:text-dark-300 hover:text-gray-900 dark:hover:text-white transition-all duration-200;
3030
}
31-
31+
3232
.nav-item-active {
3333
@apply text-primary-400 bg-gray-100/60 dark:bg-dark-700/60;
3434
}
35-
35+
3636
.book-card {
3737
@apply relative bg-white dark:bg-dark-800 rounded-lg overflow-hidden transition-all duration-300 hover:scale-105 hover:shadow-2xl;
3838
}
39-
39+
4040
.book-progress-bar {
4141
@apply absolute bottom-0 left-0 h-1 bg-gradient-to-r transition-all duration-300;
4242
}
43-
43+
4444
.progress-reading {
4545
@apply from-primary-500 to-primary-400;
4646
}
47-
47+
4848
.progress-complete {
4949
@apply from-green-500 to-green-400;
5050
}
51-
51+
5252
.search-input {
5353
@apply w-full bg-gray-100 dark:bg-dark-700 border border-gray-300 dark:border-dark-600 rounded-lg px-4 py-2 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-dark-400 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent;
5454
}
55-
55+
5656
.filter-button {
5757
@apply px-4 py-2 bg-gray-100 dark:bg-dark-700 hover:bg-gray-200 dark:hover:bg-dark-600 text-gray-600 dark:text-dark-300 hover:text-gray-900 dark:hover:text-white rounded-lg transition-all duration-200 shadow;
5858
}
59-
59+
6060
.filter-button-active {
6161
@apply bg-primary-600 text-white;
6262
}
63-
63+
6464
.book-description p {
6565
@apply mb-4;
6666
}
67-
67+
6868
.book-description p:last-child {
6969
@apply mb-0;
7070
}
71-
71+
7272
.book-description h1,
7373
.book-description h2,
7474
.book-description h3,
@@ -77,7 +77,7 @@
7777
.book-description h6 {
7878
@apply mt-6 mb-3;
7979
}
80-
80+
8181
.book-description h1:first-child,
8282
.book-description h2:first-child,
8383
.book-description h3:first-child,
@@ -86,21 +86,21 @@
8686
.book-description h6:first-child {
8787
@apply mt-0;
8888
}
89-
89+
9090
.book-description ul,
9191
.book-description ol {
9292
@apply mb-4;
9393
}
94-
94+
9595
.book-description blockquote {
9696
@apply my-4;
9797
}
98-
98+
9999
/* EventCalendar Custom Styles */
100100
.ec {
101101
@apply font-sans;
102102
}
103-
103+
104104
/* Custom EC-Dark Theme */
105105
.ec-dark .ec {
106106
--ec-bg-fallback-color: theme('calendar.darkBg');
@@ -119,43 +119,43 @@
119119
--ec-list-day-bg-color: theme('calendar.darkButtonBg');
120120
--ec-now-indicator-color: theme('calendar.primaryLight');
121121
}
122-
122+
123123
/* Specific EC Elements Styling */
124-
.ec-dark .ec-button:not(:disabled):hover,
124+
.ec-dark .ec-button:not(:disabled):hover,
125125
.ec-dark .ec-button.ec-active {
126126
@apply bg-primary-600 border-primary-700 text-white;
127127
}
128-
129-
.ec-dark .ec-header,
130-
.ec-dark .ec-all-day,
131-
.ec-dark .ec-body,
132-
.ec-dark .ec-days,
133-
.ec-dark .ec-day,
128+
129+
.ec-dark .ec-header,
130+
.ec-dark .ec-all-day,
131+
.ec-dark .ec-body,
132+
.ec-dark .ec-days,
133+
.ec-dark .ec-day,
134134
.ec-dark .ec-day-head,
135135
.ec-dark .ec-sidebar,
136136
.ec-dark .ec-popup {
137137
@apply border-gray-200 dark:border-dark-700;
138138
}
139-
139+
140140
/* Calendar container specific styles */
141141
.calendar-container {
142142
@apply w-full overflow-x-auto;
143143
}
144-
144+
145145
.calendar-container .ec {
146146
@apply min-w-[700px];
147147
border: none;
148148
background-color: transparent;
149149
}
150-
150+
151151
.calendar-container .ec .ec-header,
152152
.calendar-container .ec .ec-all-day,
153153
.calendar-container .ec .ec-body,
154154
.calendar-container .ec .ec-sidebar {
155155
border: none;
156156
background-color: transparent;
157157
}
158-
158+
159159
/* Improve the overall calendar appearance */
160160
.calendar-container .ec {
161161
margin: 0;
@@ -164,59 +164,59 @@
164164
.calendar-container .ec .ec-toolbar {
165165
display: none;
166166
}
167-
167+
168168
.calendar-container .ec .ec-header .ec-days {
169169
margin: 0;
170170
@apply bg-gray-200 dark:bg-dark-800 shadow-sm border-b border-gray-200 dark:border-dark-700 rounded-t-lg;
171171
@apply text-gray-800 dark:text-primary-300 text-sm md:text-base lg:text-lg xl:text-xl py-2 font-medium;
172172
}
173-
173+
174174
.calendar-container .ec .ec-header .ec-day {
175175
@apply border-gray-300 dark:border-dark-700/50 py-3 font-medium text-primary-800 dark:text-primary-300;
176176
border-right-width: 1px;
177177
border-right-style: solid;
178178
}
179-
179+
180180
.calendar-container .ec .ec-header .ec-day:last-child {
181181
border-right: none;
182182
}
183-
183+
184184
/* Fix day cells to have no outer border */
185185
.calendar-container .ec .ec-day:last-child {
186186
border-right: none;
187187
}
188-
188+
189189
.calendar-container .ec .ec-days:last-child .ec-day {
190190
border-bottom: none;
191191
}
192-
192+
193193
/* Style the calendar body */
194194
.calendar-container .ec .ec-body {
195195
@apply bg-gray-50 dark:bg-dark-850/50 mt-1 border border-gray-200 dark:border-dark-700 shadow-sm;
196196
border-top: none;
197197
}
198-
198+
199199
/* Day cell borders and hover */
200200
.calendar-container .ec .ec-day {
201201
@apply border-gray-300 dark:border-dark-700/50 transition-colors duration-200;
202202
}
203-
203+
204204
/* Today highlighting */
205205
.calendar-container .ec .ec-today {
206206
@apply bg-primary-200/60 dark:bg-primary-900/30 font-medium border border-primary-400;
207207
}
208-
208+
209209
/* Event styling */
210210
.calendar-container .ec-event {
211211
@apply shadow-lg rounded-md md:rounded-lg px-1 md:py-1 md:px-2 text-2xs md:text-xs lg:text-sm;
212212
@apply mb-1 mx-0.5;
213213
}
214-
214+
215215
/* Scrollbar styling */
216216
.ec-dark .ec ::-webkit-scrollbar-thumb {
217217
@apply bg-dark-700 border-4 border-transparent rounded-lg;
218218
}
219-
219+
220220
.ec-dark .ec :hover::-webkit-scrollbar-thumb {
221221
@apply bg-dark-600;
222222
}
@@ -230,6 +230,7 @@
230230
from {
231231
opacity: 0;
232232
}
233+
233234
to {
234235
opacity: 1;
235236
}
@@ -256,21 +257,21 @@
256257
.week-stats {
257258
transition: opacity 0.3s ease-out, transform 0.3s ease-out;
258259
}
259-
260+
260261
.week-stats.transition-out {
261262
opacity: 0.3;
262263
}
263-
264+
264265
.week-stats.transition-in {
265266
opacity: 1;
266267
transform: translateY(0);
267268
}
268-
269+
269270
#statsLoadingIndicator {
270271
transition: opacity 0.25s ease-in-out;
271272
opacity: 0;
272273
}
273-
274+
274275
#statsLoadingIndicator.active {
275276
opacity: 1;
276277
}
@@ -279,18 +280,23 @@
279280
.recap-timeline {
280281
position: relative;
281282
}
283+
282284
.recap-timeline:before {
283285
content: "";
284286
position: absolute;
285287
left: 12px;
286-
top: -100px; /* extend upward to touch header */
287-
bottom: -50px; /* extend below the last event toward page bottom */
288+
top: -100px;
289+
/* extend upward to touch header */
290+
bottom: -50px;
291+
/* extend below the last event toward page bottom */
288292
width: 2px;
289293
background: theme(colors.gray.200);
290294
}
295+
291296
.dark .recap-timeline:before {
292297
background: theme(colors.gray.700);
293298
}
299+
294300
.recap-dot {
295301
position: absolute;
296302
left: 7px;
@@ -301,31 +307,48 @@
301307
border-radius: 9999px;
302308
box-shadow: 0 0 0 3px rgb(59 130 246 / 0.2);
303309
}
310+
304311
@screen md {
305312
.recap-dot {
306313
top: 50%;
307314
transform: translateY(-50%);
308315
}
309316
}
317+
310318
/* Yearly summary dot stays aligned with the title, not centered */
311319
.recap-dot-top {
312320
top: 0.5rem;
313321
transform: none;
314322
}
323+
315324
@screen md {
316325
.recap-dot-top {
317326
top: 0.75rem;
318327
transform: none;
319328
}
320329
}
321-
330+
322331
/* Recap cover max height: slightly larger on mobile, full on md+ */
323332
.recap-cover-max {
324333
max-height: 20rem;
325334
}
335+
326336
@screen md {
327337
.recap-cover-max {
328338
max-height: 100%;
329339
}
330340
}
331-
}
341+
342+
/* PWA Update Toggling */
343+
body.update-available .update-hidden {
344+
display: none !important;
345+
}
346+
347+
body.update-available .update-visible {
348+
display: block !important;
349+
}
350+
351+
.update-visible {
352+
display: none;
353+
}
354+
}

assets/manifest.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"name": "KoShelf",
3+
"short_name": "KoShelf",
4+
"description": "Your personal reading companion",
5+
"start_url": "/",
6+
"display": "standalone",
7+
"background_color": "#111827",
8+
"theme_color": "#6366f1",
9+
"icons": [
10+
{
11+
"src": "/assets/icons/icon-192.png",
12+
"sizes": "192x192",
13+
"type": "image/png",
14+
"purpose": "any maskable"
15+
},
16+
{
17+
"src": "/assets/icons/icon-512.png",
18+
"sizes": "512x512",
19+
"type": "image/png",
20+
"purpose": "any maskable"
21+
}
22+
]
23+
}

0 commit comments

Comments
 (0)