-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
2080 lines (2050 loc) · 163 KB
/
Copy pathindex.html
File metadata and controls
2080 lines (2050 loc) · 163 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
<meta name="theme-color" content="#1e2a3f">
<title>Life Abundantly</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,500;1,600&family=Dancing+Script:wght@500;600;700&family=EB+Garamond:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet">
<style>
:root{
--cream:#f5f0e4; --cream-2:#efe8d7; --paper:#fbf8f0;
--navy:#1e2a3f; --navy-2:#2b3a52;
--green:#3f4a2e; --green-2:#556042;
--gold:#96762a; --gold-soft:#c9a856;
--ink:#3a3a30; --ink-soft:#6a6656;
--line:rgba(40,50,70,.14);
--shadow:0 10px 30px rgba(30,32,45,.16);
--pathdark:#7a2230; --pathfree:#1f5646;
--rail:#ddd6c4; --on-dark:var(--on-dark); --on-dark-soft:var(--on-dark-soft);
--quiet-top:var(--quiet-top); --quiet-bottom:var(--quiet-bottom);
}
[data-theme="rose"]{
--cream:#f8f1ee; --cream-2:#f0e2df; --paper:#fdf9f7;
--navy:#43293a; --navy-2:#57384b;
--green:#5e6b4a; --green-2:#6d7a58;
--gold:#a05f68; --gold-soft:#c98f95;
--ink:#3f353a; --ink-soft:#6f6167;
--line:rgba(67,41,58,.16);
--rail:#e3d2ce; --on-dark:#f3eaec; --on-dark-soft:#cbb3bc;
--quiet-top:#3a2531; --quiet-bottom:#241620;
}
[data-theme="slate"]{
--cream:#eff0ec; --cream-2:#e2e5e0; --paper:#f9faf7;
--navy:#232a2e; --navy-2:#333c41;
--green:#46523a; --green-2:#55614a;
--gold:#7d6e45; --gold-soft:#a5946a;
--ink:#333839; --ink-soft:#61686a;
--line:rgba(35,42,46,.15);
--rail:#d5d8d3; --on-dark:#edefec; --on-dark-soft:#b6bdb8;
--quiet-top:#262d31; --quiet-bottom:#14181b;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%}
body{font-family:'EB Garamond',Georgia,serif;color:var(--ink);
background:var(--cream-2);
display:flex;align-items:center;justify-content:center;min-height:100dvh;padding:16px}
.phone{position:relative;width:390px;max-width:100%;height:min(844px,94dvh);background:var(--cream);
border-radius:44px;box-shadow:0 30px 70px rgba(25,28,40,.42),inset 0 0 0 10px #12131a,inset 0 0 0 12px #2c2f3a;
overflow:hidden;display:flex;flex-direction:column}
.notch{position:absolute;top:12px;left:50%;transform:translateX(-50%);width:120px;height:26px;background:#12131a;border-radius:0 0 18px 18px;z-index:60}
.statusbar{height:44px;flex:0 0 auto;display:flex;align-items:flex-end;justify-content:space-between;padding:0 26px 6px;font-size:13px;font-weight:600;color:var(--navy);z-index:30;background:var(--cream)}
.statusbar .icons{display:flex;gap:6px;align-items:center}
.statusbar svg{width:16px;height:16px}
.screen{flex:1;position:relative;overflow:hidden}
.view{position:absolute;inset:0;display:flex;flex-direction:column;overflow:hidden;background:var(--cream);
transform:translateX(100%);opacity:0;pointer-events:none;transition:transform .34s cubic-bezier(.4,0,.2,1),opacity .28s}
.view.active{transform:translateX(0);opacity:1;pointer-events:auto}
.view.behind{transform:translateX(-22%);opacity:.55}
.scroll{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;scroll-behavior:smooth}
.scroll::-webkit-scrollbar{width:0}
.appbar{flex:0 0 auto;display:flex;align-items:center;gap:12px;padding:10px 16px 12px;background:var(--cream);border-bottom:1px solid var(--line)}
.appbar .brand{flex:1;display:flex;align-items:center;justify-content:center;gap:9px}
.appbar .brand h1{margin:0;font-family:'Cormorant Garamond',serif;font-weight:600;letter-spacing:2.5px;font-size:19px;color:var(--navy)}
.iconbtn{width:38px;height:38px;border:none;background:transparent;color:var(--navy);display:flex;align-items:center;justify-content:center;border-radius:12px;cursor:pointer}
.iconbtn:active{background:rgba(40,50,70,.08)}
.iconbtn svg{width:22px;height:22px}
.logo-cross{width:20px;height:24px;flex:0 0 auto}
.lead-line{text-align:center;font-style:italic;color:var(--ink-soft);font-size:14.5px;padding:8px 24px 6px;line-height:1.4}
/* ---- How are you feeling? ---- */
.feelstrip{margin:10px 16px 4px;background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:14px 0 15px}
.feelstrip h4{margin:0;text-align:center;font-family:'Cormorant Garamond',serif;font-weight:600;font-size:18px;color:var(--navy)}
.feelstrip p{margin:3px 14px 0;text-align:center;font-style:italic;color:var(--ink-soft);font-size:13px}
.feelgrouplbl{padding:12px 18px 0;font-size:10px;letter-spacing:1.6px;font-weight:600;color:var(--ink-soft)}
.feelrow{display:flex;flex-wrap:wrap;gap:10px;padding:7px 14px 2px;justify-content:center}
.feel{flex:0 0 calc((100% - 20px)/3);border:none;background:transparent;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:5px;padding:0 2px;font-family:inherit}
.feel .dot{width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center;
color:#fff;font-family:'Cormorant Garamond',serif;font-size:23px;font-weight:600;transition:transform .15s}
.feel:active .dot{transform:scale(.92)}
.feel .nm{font-size:12.5px;color:var(--ink)}
.feelhead{flex:0 0 auto;padding:14px 20px 22px;color:#fff}
.feelback{border:none;background:transparent;color:rgba(255,255,255,.85);font-family:inherit;font-size:15px;padding:6px 10px 6px 0;cursor:pointer}
.feelhead .lbl{margin-top:8px;font-size:11px;letter-spacing:2px;color:rgba(255,255,255,.72)}
.feelhead .nm{font-family:'Cormorant Garamond',serif;font-size:30px;font-weight:600;letter-spacing:1px;line-height:1.15;margin-top:2px}
.feelhead .msg{margin-top:9px;font-style:italic;font-size:16px;line-height:1.5;color:rgba(255,255,255,.94)}
.feelscroll{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:18px 18px 30px;background:var(--cream)}
.feelscroll::-webkit-scrollbar{width:0}
.feelbox{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:16px 18px}
.feelbox.soft{background:linear-gradient(180deg,var(--cream-2),var(--cream-2))}
.feelbox h4{margin:0 0 9px;font-size:12px;letter-spacing:1.4px;color:var(--navy);font-weight:600}
.feelbox p{margin:0 0 10px;font-size:16px;line-height:1.6;color:var(--ink)}
.feelbox p:last-child{margin-bottom:0}
.purpose{border-left:3px solid;padding-left:12px;margin-top:12px}
.purpose .p-l{font-size:11px;letter-spacing:1.4px;font-weight:600}
.purpose .p-b{font-size:15px;line-height:1.4;color:var(--ink)}
.feel-h{text-align:center;font-family:'Cormorant Garamond',serif;font-size:19px;font-weight:600;
color:var(--navy);letter-spacing:1px;margin:22px 0 10px}
.feel-h::before{content:'\276E ';color:var(--gold);font-size:13px}
.feel-h::after{content:' \276F';color:var(--gold);font-size:13px}
.feelcard{background:var(--paper);border-radius:14px;overflow:hidden;cursor:pointer;box-shadow:var(--shadow)}
.feelcard img{width:100%;aspect-ratio:4/3;object-fit:cover;object-position:top;display:block}
.feelcard .fc-body{padding:13px 14px}
.feelcard .t{font-family:'Cormorant Garamond',serif;font-size:18px;font-weight:600;color:var(--navy)}
.feelcard .s{font-size:13px;color:var(--gold);margin-top:2px}
.feelcard .go{font-size:13px;color:var(--ink-soft);margin-top:7px}
.feelbox .fb-title{font-family:'Cormorant Garamond',serif;font-size:20px;font-weight:600;color:var(--navy);margin-top:3px}
.feelbox .fb-verse{font-style:italic;font-size:15px;line-height:1.5;margin-top:9px;color:var(--ink)}
.feelbox .fb-ref{font-size:12px;color:var(--gold);margin:4px 0 11px}
.abidebtn{display:block;width:100%;margin-top:20px;border:none;border-radius:14px;background:var(--navy);
color:#fff;padding:15px;cursor:pointer;font-family:inherit}
.abidebtn b{display:block;font-size:14px;letter-spacing:1.6px}
.abidebtn span{display:block;font-size:13px;color:rgba(255,255,255,.72);margin-top:3px}
.alsorow{display:flex;gap:10px;overflow-x:auto;scrollbar-width:none}
.alsorow::-webkit-scrollbar{display:none}
@media (hover:hover){
.chips::-webkit-scrollbar,.hymnrow::-webkit-scrollbar{height:6px}
.chips::-webkit-scrollbar-thumb,.hymnrow::-webkit-scrollbar-thumb{background:var(--line);border-radius:3px}
.chips,.hymnrow{scrollbar-width:thin}
}
.alsocard{flex:0 0 140px;background:var(--paper);border-radius:12px;overflow:hidden;cursor:pointer}
.alsocard img{width:100%;aspect-ratio:1;object-fit:cover;object-position:top;display:block}
.alsocard .t{padding:8px;font-size:13px;line-height:1.3;color:var(--navy)}
.feelfoot{text-align:center;font-style:italic;color:var(--ink-soft);font-size:14px;line-height:1.55;margin-top:26px}
.feelfoot span{display:block;font-style:normal;color:var(--gold);font-size:12px;letter-spacing:1px;margin-top:6px}
/* ---- Cultivating Joy ---- */
.joybanner{display:block;width:calc(100% - 32px);margin:10px 16px 2px;text-align:left;cursor:pointer;
background:var(--cream-2);border:1px solid var(--gold-soft);border-radius:16px;padding:15px 18px;font-family:inherit}
.jb-top{display:flex;align-items:center;gap:8px}
.jb-mark{color:var(--gold);font-size:16px}
.jb-t{flex:1;font-size:13.5px;letter-spacing:1.8px;font-weight:600;color:var(--navy)}
.jb-go{color:var(--gold);font-size:20px}
.jb-s{margin-top:6px;font-style:italic;color:var(--ink-soft);font-size:14px;line-height:1.45}
.joyscroll{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:16px 20px 34px;background:var(--cream)}
.joyscroll::-webkit-scrollbar{width:0}
.joymark{text-align:center;color:var(--gold);font-size:22px;margin-top:8px}
.joytitle{margin:4px 0 0;text-align:center;font-family:'Cormorant Garamond',serif;font-weight:600;font-size:30px;color:var(--navy)}
.joydef{font-size:17px;line-height:1.65;color:var(--ink);margin:16px 0 0}
.joyheart{margin-top:20px;background:var(--navy);color:var(--on-dark);border-radius:16px;padding:20px;
font-style:italic;font-size:17px;line-height:1.65;text-align:center}
.joylist{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:6px 0}
.joyitem{display:flex;gap:11px;padding:9px 18px}
.joyitem span{color:var(--gold);font-size:13px;padding-top:3px}
.joyitem p{margin:0;font-size:16px;line-height:1.5;color:var(--ink)}
.joybtn{display:block;width:100%;margin-top:22px;border:none;border-radius:14px;background:var(--gold);
color:#fff;padding:15px;cursor:pointer;font-family:inherit}
.joybtn b{display:block;font-size:14px;letter-spacing:1.6px}
.joybtn span{display:block;font-size:13px;color:rgba(255,255,255,.8);margin-top:3px}
.joyhead{margin:4px 0 0;text-align:center;font-family:'Cormorant Garamond',serif;font-weight:600;
font-size:21px;letter-spacing:2.5px;color:var(--navy)}
.joysub{text-align:center;font-style:italic;color:var(--ink-soft);font-size:14px;margin-top:3px}
.joylink{display:block;margin:8px auto 14px;border:none;background:transparent;color:var(--gold);
font-family:inherit;font-size:13px;cursor:pointer}
.joybox{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:16px}
.joyprompt{font-style:italic;font-size:15px;color:var(--navy)}
.joybox textarea{width:100%;margin-top:8px;padding:11px 12px;border:1px solid var(--line);border-radius:12px;
background:transparent;font-family:inherit;font-size:15.5px;line-height:1.5;color:var(--ink);resize:vertical}
.joybox textarea:focus{outline:none;border-color:var(--gold-soft)}
.joyrow{display:flex;gap:10px;align-items:stretch;margin-top:10px}
.joymic{flex:0 0 52px;border:1px solid var(--gold-soft);border-radius:12px;background:var(--cream-2);
color:var(--gold);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}
.joymic svg{width:24px;height:24px}
.joymic.listening{background:var(--gold);color:#fff;border-color:var(--gold);animation:joypulse 1.3s ease-in-out infinite}
@keyframes joypulse{0%,100%{box-shadow:0 0 0 0 rgba(176,141,51,.45)}50%{box-shadow:0 0 0 8px rgba(176,141,51,0)}}
.joyadd{flex:1;padding:13px;border:none;border-radius:12px;background:var(--gold);color:#fff;
font-family:inherit;font-size:13px;letter-spacing:1.4px;font-weight:600;cursor:pointer}
.joyadd:disabled{background:var(--rail);color:var(--ink-soft);cursor:default}
.joynote{text-align:center;font-style:italic;color:var(--ink-soft);font-size:12px;margin-top:9px;line-height:1.45;min-height:17px}
.joysecrow{display:flex;align-items:center;margin:22px 0 10px}
.joysec{flex:1;font-size:12px;letter-spacing:1.6px;font-weight:600;color:var(--navy)}
.joyexp{border:none;background:transparent;color:var(--gold);font-family:inherit;font-size:13px;cursor:pointer;padding:4px}
.joyentry{background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:16px;margin-bottom:12px}
.je-head{display:flex;align-items:center}
.je-head .d{flex:1;color:var(--gold);font-size:12px;letter-spacing:.6px}
.je-head .t{color:var(--ink-soft);font-size:12px}
.joyentry p{margin:8px 0 0;font-size:16px;line-height:1.55;color:var(--ink);white-space:pre-wrap}
.je-rm{margin-top:10px;border:none;background:transparent;color:var(--ink-soft);font-family:inherit;font-size:12px;cursor:pointer;padding:4px 0}
.joyempty{text-align:center;margin-top:26px}
.joyempty .m{color:var(--gold-soft);font-size:26px}
.joyempty h4{margin:10px 0 0;font-family:'Cormorant Garamond',serif;font-weight:600;font-size:18px;color:var(--navy)}
.joyempty p{margin:6px 20px 0;font-size:14px;line-height:1.55;color:var(--ink-soft)}
.bkpbox{margin:22px 0 18px;text-align:left;background:var(--cream-2);border:1px solid var(--line);
border-radius:16px;padding:16px 18px}
.bkpbox h4{margin:0;font-size:13px;letter-spacing:1.5px;font-weight:600;color:var(--navy)}
.bkpbox p{margin:8px 0 0;font-size:14px;line-height:1.5;color:var(--ink)}
.bkprow{display:flex;gap:10px;margin-top:14px}
.bkpbtn{flex:1;padding:13px;border:none;border-radius:12px;background:var(--gold);color:#fff;
font-family:inherit;font-size:12px;letter-spacing:1.2px;font-weight:600;cursor:pointer;text-align:center}
.bkpbtn.ghost{background:var(--cream);color:var(--gold);border:1px solid var(--gold);line-height:1.15}
.bkpnote{margin-top:10px;font-size:13px;line-height:1.45;color:var(--ink-soft)}
.progbox{background:var(--cream-2);border:1px solid var(--line);border-radius:16px;padding:15px 16px;margin-bottom:18px}
.pb-top{display:flex;align-items:center;gap:7px;font-size:15px;font-weight:600;color:var(--navy)}
.pb-top span{color:var(--gold);font-size:15px}
.pb-rail{margin-top:12px;height:8px;border-radius:4px;background:var(--rail);overflow:hidden}
.pb-fill{height:8px;border-radius:4px;background:var(--gold);transition:width .4s}
.pb-foot{display:flex;justify-content:space-between;margin-top:8px;font-size:13px;color:var(--ink-soft)}
.reflstart{margin-top:12px;border:none;background:transparent;color:var(--gold);font-family:inherit;
font-size:14px;font-weight:600;cursor:pointer;padding:4px 0}
.reflwrap{margin-top:12px}
.reflwrap textarea{width:100%;padding:11px 12px;border:1px solid var(--line);border-radius:12px;background:#fff;
font-family:inherit;font-size:15.5px;line-height:1.5;color:var(--ink);resize:vertical}
.reflwrap textarea:focus{outline:none;border-color:var(--gold)}
.reflsaved{margin-top:12px;background:var(--cream-2);border-radius:12px;padding:13px 14px}
.rs-h{font-size:11px;letter-spacing:1.2px;color:var(--gold)}
.reflsaved p{margin:7px 0 0;font-size:16px;line-height:1.55;color:var(--ink);white-space:pre-wrap}
.rs-row{display:flex;gap:16px;margin-top:10px}
.rs-btn{border:none;background:transparent;color:var(--gold);font-family:inherit;font-size:13px;cursor:pointer;padding:4px 0}
.rs-btn.ghost{color:var(--ink-soft)}
.reflsec{margin:22px 0 10px}
.reflsub{font-style:italic;color:var(--ink-soft);font-size:13px;margin-top:2px}
.reflcard{background:var(--cream-2);border:1px solid var(--line);border-radius:14px;padding:15px;margin-bottom:12px;cursor:pointer}
.rc-h{display:flex;justify-content:space-between;align-items:center}
.rc-h span:first-child{font-size:11px;letter-spacing:1.2px;font-weight:600;color:var(--navy)}
.rc-h span:last-child{font-size:12px;color:var(--ink-soft)}
.reflcard p{margin:8px 0 0;font-size:15px;line-height:1.5;color:var(--ink);white-space:pre-wrap;
display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.rc-go{margin-top:9px;font-size:12px;color:var(--gold)}
.logo-cross.secret{cursor:pointer}
.quoteov{position:absolute;inset:0;z-index:85;display:none;align-items:center;justify-content:center;
background:rgba(18,20,28,.55);padding:26px}
.quoteov.show{display:flex}
.q-card{background:var(--cream);border:1px solid var(--gold-soft);border-radius:20px;
padding:30px 26px;max-width:320px;text-align:center}
.q-cross{color:var(--gold);font-size:26px}
.q-invite{margin-top:12px;color:var(--gold);font-style:italic;font-size:15px;letter-spacing:1px}
.q-rule{width:56px;height:1px;background:var(--gold-soft);margin:16px auto 0}
.q-text{margin:18px 0 0;color:var(--navy);font-size:21px;line-height:1.55;font-style:italic}
.q-another,.q-close{display:block;margin:0 auto;border:none;background:transparent;font-family:inherit;cursor:pointer}
.q-another{margin-top:24px;color:var(--gold);font-size:14px;padding:7px 14px}
.q-close{margin-top:4px;color:var(--ink-soft);font-size:13px;padding:7px 14px}
.voicenotice{position:absolute;inset:0;z-index:80;display:none;align-items:center;justify-content:center;
background:rgba(18,20,28,.55);padding:24px}
.voicenotice.show{display:flex}
.vn-card{background:var(--cream);border:1px solid var(--line);border-radius:18px;padding:22px;max-width:320px}
.vn-mark{text-align:center;color:var(--gold);font-size:20px}
.vn-card h3{margin:8px 0 0;text-align:center;font-family:'Cormorant Garamond',serif;font-weight:600;
font-size:20px;color:var(--navy)}
.vn-card p{margin:12px 0 0;font-size:15px;line-height:1.6;color:var(--ink)}
.vn-check{display:flex;align-items:center;gap:10px;margin-top:16px;cursor:pointer}
.vn-check input{width:18px;height:18px;accent-color:var(--gold)}
.vn-check span{font-size:14px;color:var(--ink-soft)}
.vn-primary,.vn-ghost{display:block;width:100%;margin-top:12px;padding:14px;border-radius:12px;
font-family:inherit;font-size:13px;letter-spacing:1.4px;font-weight:600;cursor:pointer}
.vn-primary{border:none;background:var(--gold);color:#fff}
.vn-ghost{background:transparent;border:1px solid var(--gold);color:var(--gold)}
.readbar{display:flex;align-items:center;gap:8px;padding:10px 16px;background:var(--gold);color:#fff;font-size:13px}
.readbar svg{width:16px;height:16px}
.readbar span{flex:1;letter-spacing:1px}
.readbar button{border:none;background:transparent;color:#fff;font-family:inherit;font-size:12px;
letter-spacing:1.2px;font-weight:600;cursor:pointer;padding:4px 8px}
.voicerow{display:flex;align-items:center;gap:8px;margin-top:10px;padding:10px 12px;
border:1px solid var(--line);border-radius:12px}
.voicerow.on{background:var(--paper);border-color:var(--gold)}
.vr-pick{flex:1;border:none;background:transparent;text-align:left;cursor:pointer;font-family:inherit;padding:0}
.vr-pick b{display:block;font-size:15px;font-weight:600;color:var(--navy)}
.vr-pick em{display:block;font-size:12px;font-style:normal;color:var(--ink-soft);margin-top:2px}
.vr-hear{border:none;background:transparent;color:var(--gold);font-family:inherit;font-size:13px;cursor:pointer;padding:4px 8px}
.vr-tick{color:var(--gold);font-size:17px;font-weight:700}
.themerow{display:flex;align-items:center;gap:12px;width:100%;margin-top:12px;padding:12px;cursor:pointer;
background:transparent;border:1px solid var(--line);border-radius:12px;font-family:inherit;text-align:left}
.themerow.on{background:var(--paper);border-color:var(--gold)}
.themerow .sw{display:flex;gap:5px;flex:0 0 auto}
.themerow .sw i{width:22px;height:22px;border-radius:50%;border:1px solid var(--line)}
.themerow .tl{flex:1;display:flex;flex-direction:column}
.themerow .tl b{font-size:16px;font-weight:600;color:var(--navy)}
.themerow .tl em{font-size:12px;font-style:normal;color:var(--ink-soft)}
.themerow .tick{color:var(--gold);font-size:18px;font-weight:700}
.prayerhome{display:flex;align-items:center;gap:11px;width:calc(100% - 32px);margin:2px 16px 12px;padding:13px 16px;
cursor:pointer;background:var(--navy);border:none;border-radius:14px;font-family:inherit;text-align:left}
.ph-x{color:var(--gold-soft);font-size:17px}
.ph-t{flex:1;display:flex;flex-direction:column}
.ph-t b{font-size:12px;letter-spacing:1.4px;font-weight:600;color:#fff}
.ph-t em{font-size:12px;font-style:normal;color:rgba(255,255,255,.72)}
.ph-go{color:var(--gold-soft);font-size:20px}
.prayerentry{display:flex;align-items:center;gap:10px;margin:14px auto 0;padding:12px 16px;cursor:pointer;
background:rgba(255,255,255,.08);border:1px solid var(--gold-soft);border-radius:14px;font-family:inherit;text-align:left}
.pe-x{color:var(--gold-soft);font-size:16px}
.pe-t{display:flex;flex-direction:column}
.pe-t b{font-size:12px;letter-spacing:1.4px;font-weight:600;color:var(--on-dark)}
.pe-t em{font-size:12px;font-style:normal;color:var(--on-dark-soft)}
.pe-go{color:var(--gold-soft);font-size:18px}
.pr-wrap{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:20px 22px 34px;
background:linear-gradient(180deg,var(--quiet-top),var(--quiet-bottom))}
.pr-wrap::-webkit-scrollbar{width:0}
.pr-top{display:flex;justify-content:space-between;align-items:center}
.pr-leave{border:none;background:transparent;color:var(--on-dark-soft);font-family:inherit;font-size:14px;cursor:pointer;padding:6px 2px}
.pr-mid{text-align:center;padding-top:22px}
.pr-mark{color:var(--gold-soft);font-size:26px}
.pr-wrap h2{font-family:'Cormorant Garamond',serif;font-size:30px;font-weight:600;color:var(--on-dark);margin:10px 0 0}
.pr-sub{color:var(--gold-soft);font-style:italic;font-size:15px;margin-top:4px}
.pr-open{color:var(--on-dark-soft);font-size:16px;line-height:1.65;margin:20px 0 0}
.pr-note{margin-top:20px;padding:16px;border-radius:16px;background:rgba(255,255,255,.08);
border:1px solid rgba(255,255,255,.2);color:var(--on-dark-soft);font-size:14px;line-height:1.6;text-align:left}
.pr-btn{display:block;width:100%;margin-top:24px;padding:16px;border:none;border-radius:14px;background:var(--gold);
color:#fff;font-family:inherit;font-size:14px;letter-spacing:1.6px;font-weight:600;cursor:pointer}
.pr-btn.off{background:rgba(255,255,255,.13);color:rgba(255,255,255,.4);cursor:default}
.pr-btn b{display:block;font-size:13px;letter-spacing:1.4px}
.pr-btn span{display:block;font-size:12px;color:rgba(255,255,255,.8);margin-top:3px;letter-spacing:0}
.pr-back{display:block;width:100%;margin-top:14px;border:none;background:transparent;
color:var(--on-dark-soft);font-family:inherit;font-size:13px;cursor:pointer;padding:4px}
.pr-back:disabled{cursor:default}
.pr-dots{display:flex;justify-content:center;gap:6px;margin:6px 0 18px}
.pr-dots i{width:6px;height:6px;border-radius:50%;background:rgba(255,255,255,.2)}
.pr-dots i.on{width:8px;height:8px;background:var(--gold-soft)}
.pr-badge{width:54px;height:54px;margin:0 auto;border-radius:50%;background:var(--gold);color:#fff;
display:flex;align-items:center;justify-content:center;font-family:'Cormorant Garamond',serif;font-size:22px;font-weight:600}
.pr-t{text-align:center}
.pr-b{color:var(--on-dark-soft);font-size:16px;line-height:1.65;margin:14px 0 0}
.pr-in{width:100%;margin-top:16px;padding:12px 14px;border-radius:12px;background:transparent;
border:1px solid rgba(255,255,255,.25);color:var(--on-dark);font-family:inherit;font-size:16px}
.pr-in:focus{outline:none;border-color:var(--gold-soft)}
.pr-priv{margin-top:8px;font-size:12px;line-height:1.5;font-style:italic;color:rgba(255,255,255,.6)}
.pr-pray{margin-top:18px;padding:18px;border-radius:16px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.2)}
.pr-lbl{color:var(--gold-soft);font-size:11px;letter-spacing:1.6px;font-weight:600}
.pr-pray p{margin:10px 0 0;color:var(--on-dark);font-size:18px;line-height:1.62;font-style:italic}
.pr-ask{margin-top:18px;text-align:center;color:var(--gold-soft);font-style:italic;font-size:15px;line-height:1.5}
.pr-verse{margin-top:18px;text-align:center;color:var(--on-dark-soft);font-style:italic;font-size:15px;line-height:1.6}
.pr-verse span{display:block;font-style:normal;color:var(--gold-soft);font-size:11px;letter-spacing:1.4px;margin-top:6px}
.joysrc{display:inline-block;margin-top:7px;padding:3px 9px;border-radius:20px;background:var(--cream-2);
color:var(--ink-soft);font-size:10px;letter-spacing:1.2px}
.savorbox{border-color:var(--gold-soft)}
.savorhint{margin:5px 0 0;font-size:13px;line-height:1.45;color:var(--ink-soft)}
.savedbox{text-align:center}
.savedbox .m{color:var(--gold);font-size:24px}
.savedbox h4{margin:8px 0 0;font-family:'Cormorant Garamond',serif;font-weight:600;font-size:18px;color:var(--navy)}
.savedbox p{margin:6px 0 0;font-size:14px;line-height:1.5;color:var(--ink-soft)}
.savedbox .joylink{margin-bottom:0}
.chips{display:flex;gap:9px;overflow-x:auto;padding:10px 16px 6px}
.chips::-webkit-scrollbar{display:none}
.chip{flex:0 0 auto;border:1px solid var(--line);background:var(--paper);color:var(--navy-2);padding:7px 16px;border-radius:20px;font-size:15px;font-family:inherit;cursor:pointer;transition:.15s;white-space:nowrap}
.chip.active{background:var(--navy);color:var(--on-dark);border-color:var(--navy)}
.section-title{font-family:'Cormorant Garamond',serif;color:var(--navy);font-size:19px;font-weight:600;letter-spacing:1px;padding:8px 16px 0;display:flex;align-items:center;gap:10px}
.section-title::before,.section-title::after{content:"";height:1px;background:var(--line);flex:1}
.section-title span{white-space:nowrap}
.grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:12px 16px 22px}
.card{position:relative;border-radius:14px;overflow:hidden;box-shadow:0 6px 16px rgba(30,32,45,.16);cursor:pointer;background:#e9e3d3;transition:transform .12s}
.card:active{transform:scale(.975)}
.card .thumb{width:100%;aspect-ratio:3/4;object-fit:cover;object-position:top;display:block}
.card .strip{padding:9px 11px;background:var(--paper);border-top:1px solid var(--line)}
.card .strip .t{font-family:'Cormorant Garamond',serif;font-size:15px;font-weight:600;color:var(--navy);line-height:1.15}
.card .strip .c{font-size:11px;letter-spacing:.6px;text-transform:uppercase;color:var(--gold);margin-top:3px}
.card .fav{position:absolute;top:8px;right:8px;width:30px;height:30px;border-radius:50%;background:rgba(20,22,32,.42);border:none;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#fff}
.card .fav svg{width:17px;height:17px}
.card.faved .fav{color:#e7a2a2}
/* Detail */
.detail-imgwrap{position:relative;background:var(--navy);cursor:zoom-in}
.detail-imgwrap img{width:100%;display:block}
.detail-bar{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:linear-gradient(180deg,rgba(18,20,30,.6),rgba(18,20,30,0));z-index:5}
.detail-bar .iconbtn{color:#fff}
.detail-bar .right{display:flex}
.zoomhint{position:absolute;bottom:10px;right:10px;background:rgba(20,22,32,.6);color:#fff;font-size:12px;padding:6px 12px;border-radius:20px;display:flex;align-items:center;gap:6px}
.zoomhint svg{width:15px;height:15px}
.scrollcue{display:flex;flex-direction:column;align-items:center;gap:2px;color:var(--navy);padding:14px 0 2px;font-size:12.5px;letter-spacing:1.5px;text-transform:uppercase;opacity:.7}
.scrollcue svg{width:20px;height:20px;animation:bob 1.6s ease-in-out infinite}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(4px)}}
.article{padding:6px 20px 40px}
.art-head{text-align:center;padding:6px 0 4px}
.art-cat{font-size:12px;letter-spacing:2px;text-transform:uppercase;color:var(--gold);font-weight:600}
.art-title{font-family:'Cormorant Garamond',serif;font-size:28px;font-weight:600;color:var(--navy);line-height:1.05;margin:6px 0 2px}
.art-sub{font-style:italic;color:var(--ink-soft);font-size:16px}
.divider{display:flex;align-items:center;justify-content:center;gap:10px;color:var(--gold-soft);margin:16px 0;font-size:18px}
.keyverse{background:var(--navy);color:var(--on-dark);border-radius:14px;padding:16px 18px;text-align:center;margin:6px 0 18px}
.keyverse .q{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:17px;line-height:1.5}
.keyverse .r{margin-top:9px;font-size:12.5px;letter-spacing:1.5px;color:var(--gold-soft);font-weight:600}
.overview p{font-size:16.5px;line-height:1.62;color:var(--ink);margin:0 0 14px}
.steps-h{font-family:'Cormorant Garamond',serif;text-align:center;color:var(--navy);font-size:20px;letter-spacing:1.5px;font-weight:600;margin:8px 0 16px;display:flex;align-items:center;justify-content:center;gap:10px}
.steps-h::before,.steps-h::after{content:"❧";color:var(--gold-soft);font-size:15px}
.step{display:flex;gap:14px;align-items:flex-start;margin-bottom:16px}
.step .badge{flex:0 0 auto;width:40px;height:40px;border-radius:11px;background:linear-gradient(150deg,var(--navy),var(--navy-2));color:var(--cream-2);display:flex;align-items:center;justify-content:center;font-family:'Cormorant Garamond',serif;font-size:19px;font-weight:700;box-shadow:0 3px 8px rgba(30,32,45,.22)}
.step .badge.gold{background:linear-gradient(150deg,var(--gold),var(--gold));color:#fff}
.step .body{flex:1;padding-top:1px}
.step .body .lbl{font-family:'Cormorant Garamond',serif;font-size:17.5px;font-weight:700;color:var(--navy)}
.step .body p{margin:5px 0 0;font-size:15.5px;line-height:1.5;color:var(--ink)}
.paths{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:4px 0 12px}
.path{border-radius:14px;overflow:hidden;border:1px solid var(--line)}
.path h5{margin:0;padding:11px 12px;text-align:center;font-family:'Cormorant Garamond',serif;font-size:15px;color:#fff}
.path.dark h5{background:var(--pathdark)}.path.free h5{background:var(--pathfree)}
.path ol{list-style:none;margin:0;padding:8px 10px}
.path li{font-size:13.5px;padding:6px 0;border-bottom:1px dashed var(--line);line-height:1.3}
.path li:last-child{border-bottom:none}
.path li b{display:block;font-size:14px}
.path li span{color:var(--ink-soft);font-size:12.5px}
.path.dark li b{color:var(--pathdark)}.path.free li b{color:var(--pathfree)}
.softbox{background:linear-gradient(180deg,var(--cream-2),var(--cream-2));border:1px solid var(--line);border-radius:16px;padding:16px 18px;margin:8px 0}
.softbox h4{margin:0 0 10px;text-align:center;font-family:'Cormorant Garamond',serif;letter-spacing:1.5px;color:var(--navy);font-weight:600;font-size:15px}
.softbox p{margin:0;font-style:italic;font-size:16px;line-height:1.6;color:var(--ink);text-align:center}
.scrip{display:flex;gap:12px;align-items:flex-start;margin-bottom:12px}
.scrip .r{flex:0 0 92px;font-size:12px;font-weight:700;letter-spacing:.5px;color:var(--gold);text-transform:uppercase;padding-top:3px}
.scrip p{margin:0;font-size:15px;line-height:1.45;color:var(--ink)}
.closing{background:var(--green);color:var(--on-dark);border-radius:14px;padding:18px 20px;text-align:center;margin-top:6px}
.closing .q{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:17px;line-height:1.5}
.closing .r{margin-top:9px;font-size:12.5px;letter-spacing:1.5px;color:var(--gold-soft);font-weight:600}
/* Daily */
.daily-head{flex:0 0 auto;display:flex;align-items:center;background:var(--navy);padding:12px 16px;gap:8px}
.daily-head .info{flex:1}
.daily-head .lbl{color:var(--gold-soft);font-size:12px;letter-spacing:2px;font-weight:600}
.daily-head .sub{color:var(--on-dark-soft);font-size:13px}
.daily-scroll{flex:1;overflow-y:auto;padding:20px}
.daily-scroll::-webkit-scrollbar{width:0}
.devo-cat{color:var(--gold);font-size:12px;letter-spacing:1.5px;text-transform:uppercase;font-weight:600}
.devo-title{font-family:'Cormorant Garamond',serif;font-size:30px;font-weight:600;color:var(--navy);line-height:1.05;margin:2px 0}
.devo-ref{color:var(--ink-soft);font-style:italic;font-size:16px}
.sec-label{color:var(--gold);font-size:13px;letter-spacing:1.5px;text-transform:uppercase;font-weight:600;margin:18px 0 6px}
.sec-body{color:var(--ink);font-size:16px;line-height:1.56}
.journalbox{border:1px solid var(--gold);border-radius:14px;padding:16px;margin-top:14px}
.journalbox .sec-label{margin-top:0}
.related{display:flex;gap:8px;margin-top:8px}
.related span{flex:1;text-align:center;background:var(--paper);border:1px solid var(--line);border-radius:10px;padding:9px 4px;font-size:13px;color:var(--navy)}
.actionbar{flex:0 0 auto;display:flex;align-items:center;background:var(--paper);border-top:1px solid var(--line);padding:10px 12px}
.navbtn{background:none;border:none;font-family:inherit;font-size:13px;color:var(--navy);display:flex;align-items:center;gap:3px;cursor:pointer;padding:8px}
.navbtn:disabled{color:var(--rail);cursor:default}
.navbtn svg{width:18px;height:18px}
.completebtn{flex:1;display:flex;justify-content:center}
.completebtn .b{display:flex;align-items:center;gap:7px;border-radius:24px;padding:11px 18px;cursor:pointer;font-weight:600;font-size:14px;background:var(--gold);color:#221a08}
.completebtn .b.done{background:var(--green);color:#fff}
.completebtn svg{width:18px;height:18px}
/* Quiet Time */
.qt{position:absolute;inset:0;display:flex;flex-direction:column;background:linear-gradient(180deg,var(--quiet-top),var(--quiet-bottom))}
.qt .scroll{background:transparent}
.qt-head{text-align:center;color:var(--on-dark);padding:26px 24px 6px}
.qt-head h2{font-family:'Cormorant Garamond',serif;letter-spacing:3px;font-size:24px;margin:8px 0 4px;font-weight:600}
.qt-head p{margin:0;font-style:italic;color:var(--on-dark-soft);font-size:15px}
.ring-wrap{display:flex;align-items:center;justify-content:center;padding:14px 0 6px;position:relative}
.ring{transform:rotate(-90deg)}
.ring-bg{fill:none;stroke:rgba(255,255,255,.12);stroke-width:10}
.ring-fg{fill:none;stroke:url(#g);stroke-width:10;stroke-linecap:round;transition:stroke-dashoffset .5s linear}
.ring-label{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--on-dark)}
.ring-label .time{font-family:'Cormorant Garamond',serif;font-size:52px;font-weight:600;letter-spacing:2px;line-height:1}
.ring-label .state{margin-top:6px;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:var(--on-dark-soft)}
.presets{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;padding:6px 20px 2px}
.preset{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.16);color:var(--on-dark);border-radius:18px;padding:7px 15px;font-family:inherit;font-size:14px;cursor:pointer}
.preset.active{background:var(--gold);border-color:var(--gold);color:#221a08;font-weight:600}
.slider-wrap{padding:16px 30px 4px;color:var(--on-dark-soft)}
.slider-wrap .row{display:flex;justify-content:space-between;font-size:13px;margin-bottom:8px;letter-spacing:.5px}
input[type=range]{width:100%;-webkit-appearance:none;height:5px;border-radius:5px;background:rgba(255,255,255,.2);outline:none}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:22px;height:22px;border-radius:50%;background:var(--gold-soft);border:3px solid var(--on-dark);cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.3)}
.qt-controls{display:flex;gap:12px;justify-content:center;padding:18px 24px 6px}
.qt-btn{border:none;font-family:inherit;font-size:16px;border-radius:26px;padding:13px 30px;cursor:pointer;display:flex;align-items:center;gap:8px}
.qt-btn.primary{background:var(--gold);color:#221a08;font-weight:600}
.qt-btn.ghost{background:rgba(255,255,255,.1);color:var(--on-dark);border:1px solid rgba(255,255,255,.2)}
.qt-btn svg{width:18px;height:18px}
.qt-verse{margin:16px 22px 8px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);border-radius:16px;padding:18px 20px;text-align:center;color:var(--on-dark)}
.qt-verse .lbl{font-size:11px;letter-spacing:2px;text-transform:uppercase;color:var(--gold-soft);margin-bottom:10px}
.qt-verse .q{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:18px;line-height:1.5}
.qt-verse .r{margin-top:10px;font-size:13px;letter-spacing:1px;color:var(--on-dark-soft)}
.amb-row{display:flex;align-items:center;justify-content:center;gap:10px;color:var(--on-dark-soft);font-size:14px;padding:10px 20px 4px}
.hymnlbl{text-align:center;color:var(--on-dark-soft);font-size:11px;letter-spacing:.5px;padding:8px 20px 6px}
.hymnrow{display:flex;gap:8px;overflow-x:auto;padding:0 16px 24px}
.hymnrow::-webkit-scrollbar{display:none}
.hymn{flex:0 0 auto;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.16);color:var(--on-dark);border-radius:18px;padding:8px 14px;font-family:inherit;font-size:13px;cursor:pointer;white-space:nowrap}
.hymn.active{background:var(--gold);border-color:var(--gold);color:#221a08;font-weight:600}
.toggle{position:relative;width:46px;height:26px;border-radius:26px;background:rgba(255,255,255,.18);border:none;cursor:pointer;transition:.2s}
.toggle.on{background:var(--gold)}
.toggle::after{content:"";position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;transition:.2s}
.toggle.on::after{left:23px}
.placeholder{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:40px;color:var(--ink-soft)}
.placeholder svg{width:48px;height:48px;color:var(--gold-soft);margin-bottom:16px}
.placeholder h3{font-family:'Cormorant Garamond',serif;color:var(--navy);font-size:22px;letter-spacing:1px;margin:0 0 8px}
.placeholder p{margin:0;font-size:15px;max-width:250px;line-height:1.5}
.about{flex:1;overflow-y:auto;text-align:center;padding:28px}
.about img{width:120px;margin-top:14px}
.about h3{font-family:'Cormorant Garamond',serif;color:var(--navy);font-size:24px;letter-spacing:2px;margin:14px 0 4px}
.about .tag{color:var(--gold);font-style:italic;font-size:15px}
.about p{color:var(--ink);font-size:16px;line-height:1.55;margin-top:20px}
.bottomnav{flex:0 0 auto;display:flex;background:var(--paper);border-top:1px solid var(--line);padding:8px 4px calc(8px + env(safe-area-inset-bottom))}
.navitem{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:3px;border:none;background:none;color:var(--ink-soft);cursor:pointer;padding:4px 0;font-family:inherit}
.navitem svg{width:22px;height:22px}
.navitem span{font-size:9.5px;white-space:nowrap}
.navitem.active{color:var(--navy)}
.navitem.active span{font-weight:600}
/* Zoom overlay */
.zoomov{position:absolute;inset:0;background:rgba(0,0,0,.94);z-index:120;display:none;align-items:center;justify-content:center;overflow:hidden}
.zoomov.show{display:flex}
.zoomov img{max-width:none;transform-origin:center;user-select:none;-webkit-user-drag:none}
.zoomov .close{position:absolute;top:12px;right:12px;width:40px;height:40px;border-radius:50%;background:rgba(255,255,255,.15);border:none;color:#fff;font-size:22px;cursor:pointer}
.zoomov .hint{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);color:#ccc;font-size:13px}
.toast{position:absolute;bottom:80px;left:50%;transform:translateX(-50%) translateY(20px);background:var(--navy);color:var(--on-dark);padding:11px 20px;border-radius:22px;font-size:14px;opacity:0;transition:.3s;z-index:130;box-shadow:var(--shadow);pointer-events:none;white-space:nowrap}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
</style>
</head>
<body>
<div class="phone">
<div style="height:22px;flex:0 0 auto;background:var(--cream)"></div>
<div class="screen" id="screen"></div>
<nav class="bottomnav" id="bottomnav">
<button class="navitem active" data-tab="home"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><rect x="4" y="3" width="16" height="18" rx="2"/><path d="M8 8h8M8 12h8M8 16h5"/></svg><span>Cards</span></button>
<button class="navitem" data-tab="daily"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M4 5a2 2 0 0 1 2-2h11a2 2 0 0 1 2 2v16l-4-3-4 3-4-3-3 2z"/></svg><span>Daily</span></button>
<button class="navitem" data-tab="quiet"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M12 3c3 3 5 5 5 8a5 5 0 0 1-10 0c0-3 2-5 5-8z"/><path d="M12 21v-3"/></svg><span>Abide</span></button>
<button class="navitem" data-tab="joy"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M12 3l1.9 5.3L19 10l-5.1 1.7L12 17l-1.9-5.3L5 10l5.1-1.7z"/><path d="M18 16l.7 2 2 .7-2 .7-.7 2-.7-2-2-.7 2-.7z"/></svg><span>Joy</span></button>
<button class="navitem" data-tab="favorites"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M12 20s-7-4.6-9.3-9C1 7.5 3 4.5 6.2 4.5c2 0 3.2 1.2 3.8 2.3.6-1.1 1.8-2.3 3.8-2.3C17 4.5 19 7.5 21.3 11 19 15.4 12 20 12 20z"/></svg><span>Saved</span></button>
<button class="navitem" data-tab="about"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><circle cx="12" cy="12" r="9"/><path d="M12 11v5M12 8h.01"/></svg><span>Settings</span></button>
</nav>
<div class="quoteov" id="quoteov">
<div class="q-card">
<div class="q-cross">✝</div>
<div class="q-invite">Seek and you will find me</div>
<div class="q-rule"></div>
<p class="q-text" id="quotetext"></p>
<button class="q-another" data-qanother>Another</button>
<button class="q-close" data-qclose>Close</button>
</div>
</div>
<div class="voicenotice" id="voicenotice">
<div class="vn-card">
<div class="vn-mark">✦</div>
<h3>About the reading voice</h3>
<p>The voice comes from your device, not from Life Abundantly, so how good it sounds depends on which voices you have installed.</p>
<p>If it sounds flat or robotic, a better voice can often be chosen or downloaded free in your device's settings. You can pick a different voice, and hear it first, under Settings › Reading voice.</p>
<label class="vn-check"><input type="checkbox" id="vnAgain"><span>Don't show this again</span></label>
<button class="vn-primary" data-vnlisten>LISTEN NOW</button>
<button class="vn-ghost" data-vnsettings>CHOOSE A VOICE</button>
</div>
</div>
<div class="zoomov" id="zoomov"><img id="zoomimg" src="" alt=""><button class="close" id="zoomclose">✕</button><div class="hint">Pinch, scroll, or double-tap to zoom</div></div>
<div class="toast" id="toast"></div>
</div>
<script>
/* ========= POSTCARD DATA (mirrors Android Postcards.kt) ========= */
const cards = [
{id:"fear",title:"When Fear Paints Pictures",subtitle:"Renewing the Mind",cat:"Freedom",img:"images/fear-paints.webp",
key:{q:"We take captive every thought to make it obedient to Christ.",r:"2 Corinthians 10:5"},
overview:["Fear has a way of painting vivid pictures of futures that have not happened. It shows you the worst outcome as if it were already true.","The freedom principle on this card is simple: Fear paints pictures. Faith paints promises. A fearful thought only gains power when you agree with it — so this is a five-step tool for catching a thought and exchanging it for God's truth."],
stepsTitle:"The Five Steps",steps:[["1","Stop","Stop before agreeing with the thought. A fear only takes hold when you accept it. Pause before you let it in."],["2","Test","Does this agree with God's Word? Hold the thought up against Scripture. If it contradicts His promises, it is not the truth about you."],["3","Replace","Exchange the lie for God's truth. Don't just push the fear away — replace it with what God actually says."],["4","Invite","Ask the Holy Spirit what is true. Invite God into the moment and let Him lead you into truth."],["5","Walk","Choose faith over fear. Take the next step trusting God's promise rather than fear's picture."]],
remember:["Fear paints pictures. Faith paints promises.","Not every thought deserves my agreement.","Jesus is renewing my mind.","I choose God's truth today."],
prayer:"Holy Spirit, help me recognize every lie, replace it with Your truth, and walk today in the freedom Jesus purchased for me. Amen.",
scriptures:[["2 Cor 10:5","We take captive every thought to make it obedient to Christ."],["Romans 12:2","Be transformed by the renewing of your mind."],["Phil 4:8","Think about what is true, noble, right, pure, lovely, and praiseworthy."]],
closing:{q:"You are not alone. You are being renewed.",r:"The Abundant Life Ministry"}},
{id:"clear",title:"CLEAR",subtitle:"A Path to Freedom",cat:"Deliverance",img:"images/clear.webp",
key:{q:"They found the man now free of demons, sitting at Jesus' feet, dressed and thinking clearly.",r:"Mark 5:15"},
overview:["CLEAR is a five-step pattern for walking out of bondage and into freedom. It is drawn from the account in Mark 5 of the man Jesus delivered — afterward found sitting at Jesus' feet, dressed and thinking clearly.","Each letter is a step you take with God, moving from confession all the way to receiving the freedom Christ has already won."],
stepsTitle:"C · L · E · A · R",steps:[["C","Confess","Tell the truth. Take responsibility. Ask for forgiveness. Forgive yourself."],["L","Leave the Agreement","Come out of every agreement you have made with the enemy."],["E","Evict the Demon","In the name of Jesus, evict every demon and cancel its right to remain."],["A","Ask","Ask to be filled with the Holy Spirit and empowered to walk in freedom."],["R","Receive","Receive Christ's Lordship, truth, and freedom to live the abundant life."]],
scriptures:[["Mark 5:15","After Jesus delivered him, the man was free, sitting at Jesus' feet, dressed and thinking clearly."],["John 8:36","So if the Son sets you free, you will be free indeed."]],
closing:{q:"So if the Son sets you free, you will be free indeed.",r:"John 8:36"}},
{id:"deliverance",title:"Father God",subtitle:"A Deliverance Prayer",cat:"Deliverance",img:"images/deliverance-prayer.webp",
key:{q:"Submit yourselves, then, to God. Resist the devil, and he will flee from you.",r:"James 4:7"},
overview:["This is a guided prayer that pairs with the CLEAR card — if CLEAR is the map, this is the prayer you pray. Read it aloud, filling in the blank with the specific spirit or stronghold you are renouncing.","It moves in order: taking responsibility, renouncing the agreement, receiving forgiveness, cancelling every effect, inviting God to fill that place, and declaring Jesus alone as Lord."],
stepsTitle:"Pray This Aloud",steps:[["1","Take responsibility","“I take responsibility for agreeing with the spirit of ______ in my life.”"],["2","Renounce","“I renounce every agreement I have made with the spirit of ______.”"],["3","Forgive","“I ask for Your forgiveness, and I forgive myself.”"],["4","Cancel every effect","“I ask You to cancel every effect of this ungodly agreement in my life.”"],["5","Be filled","“Father, please fill the place that this spirit has occupied with Your Spirit.”"],["6","Declare Jesus as Lord","“I declare that Jesus Christ alone is my Lord, and I choose to live in agreement with Him.”"]],
prayer:"In Jesus' name, Amen.",
scriptures:[["James 4:7","Submit to God. Resist the devil, and he will flee from you."],["1 John 1:9","If we confess our sins, He is faithful and just to forgive us and cleanse us."]],
closing:{q:"Jesus Christ alone is Lord — and I choose to live in agreement with Him.",r:"The Abundant Life Ministry"}},
{id:"forgiveness",title:"Forgiveness",subtitle:"The Choice That Sets Us Free",cat:"Forgiveness",img:"images/forgiveness.webp",
key:{q:"Be kind and compassionate to one another, forgiving each other, just as in Christ God forgave you.",r:"Ephesians 4:32"},
overview:["Two paths branch from the same starting point — an offense. What we do next decides everything.","One path lets the offense take root and grow, all the way to destruction. The other releases it to God and leads to healing and freedom. Jesus gave us the key to forgiveness (Luke 23:34)."],
paths:{darkTitle:"The Path of Unforgiveness",dark:[["Offense","Someone hurts us."],["Unforgiveness","We choose not to forgive."],["Resentment","Bitterness takes root."],["Retaliation","We want to pay back."],["Anger","Emotions intensify."],["Hatred","The heart hardens."],["Violence","Destruction follows."]],darkNote:"Unforgiveness doesn't just hurt the other person — it destroys us.",
freeTitle:"The Path to Freedom",free:[["Offense","Someone hurts us."],["Honesty","We bring it to God."],["Surrender","We release it to Him."],["Forgiveness","We choose to forgive."],["Blessing","We bless and pray for them."],["Peace","God's peace fills our heart."],["Freedom","We walk in the abundant life."]],freeNote:"Forgiveness breaks the power of the offense and opens the door to healing."},
scriptures:[["Eph 4:32","Forgive each other, just as in Christ God forgave you."],["Luke 23:34","Father, forgive them, for they do not know what they are doing."]],
closing:{q:"Forgiveness breaks the power of the offense and opens the door to healing and freedom.",r:"Ephesians 4:32"}},
{id:"stirred",title:"Stirred Up!",subtitle:"Finding Peace in Your Emotions",cat:"Emotions",img:"images/stirred-up.webp",
key:{q:"Let the peace of Christ rule in your hearts, since as members of one body you were called to peace. And be thankful.",r:"Colossians 3:15"},
overview:["When you feel stirred up, fired up, offended, or upset, the brain's amygdala can become hijacked. Feelings of injustice or betrayal trigger a rapid protection response before you've had time to think.","These steps walk you back from reaction to peace — and, in the process, toward understanding, compassion, and forgiveness."],
stepsTitle:"The Steps to Peace",steps:[["1","Breathe","Breathe, and stay curious rather than reactive."],["2","Feel","Recognize where you feel it in your body, and the emotions it stirs."],["3","Ask","When was the first time I felt like this? Pay attention to the first memory that comes, even if it doesn't make sense."],["4","Stay Curious","Allow yourself to re-experience the emotion for a moment. Let the memory and the emotion connect."],["5","Gratitude","Identify one good thing that came from this. Gratitude awakens the prefrontal cortex, releases dopamine, quiets the amygdala, and increases joy."],["6","Empathy","See the other person the way God does. Seek to understand their feelings and perspective."],["7","Compassion","Compassion opens the heart to give and receive love. It doesn't mean stepping back into an unhealthy relationship — it means becoming more like Christ: less stress, more joy, more freedom, more life."],["8","Forgive","From this place of peace, choose to forgive."]],
scriptures:[["Col 3:15","Let the peace of Christ rule in your hearts — and be thankful."],["Prov 4:23","Above all else, guard your heart, for everything you do flows from it."]],
closing:{q:"Let the peace of Christ rule in your hearts... And be thankful.",r:"Colossians 3:15"}},
{id:"wounded",title:"A Wounded Heart",subtitle:"Saved but Not Yet Whole",cat:"Healing",img:"images/wounded-heart.webp",
key:{q:"He heals the brokenhearted and binds up their wounds.",r:"Psalm 147:3"},
overview:["You can be saved and still carry wounds that haven't healed. This card pictures a heart with the cross at its center — Jesus is Lord and Savior — yet surrounded by dark places of pain, loss, and emptiness He still wants to make whole.","The dark places marked 5, 12, 16, and WOMB represent seasons where wounds often form — even before birth, and at different ages of childhood and youth. They stand for the specific memories and hurts we may not have brought to Him yet.","Salvation makes Jesus Lord of your heart. Healing is letting Him into every cracked and darkened place, one at a time."],
stepsTitle:"Bringing Him the Wounds",steps:[["✚","Name the place","Ask the Holy Spirit to show you a wounded place — a season, an age, a memory that still aches.",true],["✚","Invite Him in","Invite Jesus into that specific memory. He was never absent from it, and He is not afraid of it.",true],["✚","Receive healing","Ask Him to heal the pain, fill the emptiness, and replace the lie the wound taught you with His truth.",true],["✚","Return often","Wholeness is a journey. Keep bringing Him each place until the whole heart is His.",true]],
prayer:"Jesus, You are Lord and Savior of my heart. Come into the places of pain, loss, and emptiness I have carried, and make them whole. Amen.",
scriptures:[["Psalm 147:3","He heals the brokenhearted and binds up their wounds."],["Isaiah 61:1","He has sent me to bind up the brokenhearted, to proclaim freedom for the captives."]],
closing:{q:"There are places of pain, loss, and emptiness that Jesus wants to heal and make whole.",r:"Psalm 147:3"}},
{id:"order",title:"God's Created Order",subtitle:"All Authority Is God Given",cat:"Authority",img:"images/created-order.webp",
key:{q:"I have given you authority to overcome all the power of the enemy.",r:"Luke 10:19"},
overview:["This card maps God's created order of authority, from the throne of heaven down to the visible world we live in. Every rank and power exists under God's rule.","It answers a practical question: who has authority over the unseen realm of angels and demons? The answer is God — and, through Jesus, those who belong to Him."],
stepsTitle:"The Order of Authority",steps:[["1","God the Father","Reigns supreme over all creation, seated on the throne. All authority begins and ends with Him."],["2","Jesus Christ","Seated at the right hand of the Father, far above every power and name. (Ephesians 1:20-22; Hebrews 1:3)"],["3","Believers in Christ","Joint heirs with Christ, seated with Him in the heavenly places — sharing in His authority. (Ephesians 2:6)"],["4","The Unseen Realm","Spiritual beings exist here: angels created to worship and serve God, and demons who rebelled and seek to destroy and deceive."],["5","Authority Given by God","Jesus has given His followers authority to overcome the power of the enemy. Our struggle is spiritual. (Luke 10:19; Ephesians 6:12)"],["6","The Visible Realm","The physical world and all that is seen — where humanity, made in the image of God, lives. (Genesis 1:26-27)"],["7","Those Who Trust God","Given authority through Jesus Christ to resist the enemy and walk in His victory, empowered by His Spirit. (James 4:7)"],["8","Those Without Christ","Operate under the influence and power of the enemy, having no authority over demons and remaining subject to deception. (John 8:44)"]],
remember:["God reigns supreme over all creation.","Believers have authority over the unseen realm through Jesus Christ.","Humanity without Christ does not have that authority.","Every authority, rank, and power is under God's rule."],
scriptures:[["Luke 10:19","I have given you authority to overcome all the power of the enemy."],["Eph 2:6","God raised us up with Christ and seated us with Him in the heavenly places."],["Col 1:16","In Him all things were created, in heaven and on earth, visible and invisible."],["John 8:32","You will know the truth, and the truth will set you free."]],
closing:{q:"To Him be glory in all things!",r:"Romans 11:36"}},
{id:"sixemotions",title:"The Six Big Emotions",subtitle:"Emotions God Created for Our Good",cat:"Emotions",img:"images/six-emotions.webp",
key:{q:"Casting all your worries on him, because he cares for you.",r:"1 Peter 5:7"},
overview:["These are the six emotions that can overwhelm us. But God did not give them to torment us; He created each one for our good.","Every emotion carries a purpose and a message. When we welcome, understand, and bring them to God, He turns them into doorways to healing, wisdom, and strength."],
stepsTitle:"The Six Emotions & Their Purpose",steps:[["1","Sadness","“I have experienced loss or unmet longing.” Sadness helps us slow down, feel our need, and reach out for comfort. Purpose: connect, mourn, and heal."],["2","Anger","“I need to protect myself or what matters; something needs to stop.” Purpose: protect, set limits, and restore justice."],["3","Fear","“I sense danger or threat.” Fear helps us recognize danger and reach out for help. Purpose: protect, discern, and seek help."],["4","Shame","“I feel overwhelmed and see no way forward.” It whispers there is no hope, and it is heavy and exhausting. Purpose: signal that we need rescue, restoration, and renewed hope."],["5","Hopeless Despair","“I feel that I no longer bring people joy,” or the deeper lie that I am not good enough or do not belong. Purpose: healthy sorrow reminds us of our true heart, and it can be healed by truth and love."],["6","Disgust","“Something feels offensive, repulsive, or morally wrong.” Purpose: reject harm and protect our physical and moral well-being."]],
prayer:"Father, thank You that You created my emotions for my good. When they overwhelm me, help me welcome them, understand them, and bring them to You for healing, wisdom, and strength.",
scriptures:[["1 Peter 5:7","Casting all your worries on him, because he cares for you."],["Psalm 62:8","Trust in him at all times. Pour out your heart before him."]],
closing:{q:"God created these emotions for our good. When we bring them to Him, He brings healing, wisdom, and strength.",r:"1 Peter 5:7"}},
{id:"trueheart",title:"The Six Big Emotions & the True Heart",subtitle:"Warning Signals, Not Identity",cat:"Emotions",img:"images/emotions-wheel.webp",
key:{q:"You will keep whoever's mind is steadfast in perfect peace, because he trusts in you.",r:"Isaiah 26:3"},
overview:["Big emotions are warning signals that something needs attention, not the truth about who you are. Anger, sadness, fear, shame, despair, and disgust each point us toward a need.","They are not problems to eliminate but gifts from God. When processed well, they lead us back to the True Heart, where identity in Christ, joy, wisdom, and peace are restored."],
stepsTitle:"Returning to the True Heart",steps:[["♥","The True Heart","At the center is your True Heart: joy, peace, and your identity in Christ. This is who you really are, beneath every passing emotion.",true],["!","Warning Signals","Each big emotion is an arrow pointing inward, a signal that something needs your attention and care, not a verdict on your worth."],["◉","Identity Center","In Christ you can say, “I know who I am.” Your identity is settled in Him, not in how you feel today."],["♥","Joy Center","Glad-to-be-together joy. Processing emotions from a place of joy keeps you connected to God and others.",true],["⚙","Executive Center","From your True Heart you can think, plan, and make wise choices, rather than reacting from the storm."],["✚","Live From the True Heart","Listen to the warning, process from your Joy Center, and return to the True Heart, where you live from love, wisdom, and peace.",true]],
prayer:"Father, help me hear my emotions as warning signals, not my identity. Lead me back to the True Heart You have given me, where joy, peace, and my identity in Christ are restored.",
scriptures:[["Isaiah 26:3","You will keep whoever's mind is steadfast in perfect peace, because he trusts in you."],["1 Peter 5:7","Casting all your worries on him, because he cares for you."]],
closing:{q:"Listen to the warning. Process from your Joy Center. Return to your True Heart.",r:"Isaiah 26:3"}},
{id:"transformation",title:"The Journey of Transformation",subtitle:"How God Renews the Mind",cat:"Growth",img:"images/brain-journey.webp",
key:{q:"Don't be conformed to this world, but be transformed by the renewing of your mind.",r:"Romans 12:2"},
overview:["God designed our brains for transformation through relationship. Information enters through a perception filter, our brain attaches meaning, and through connection we grow.","As we abide with Jesus and His people, our identity is formed, and transformation becomes the natural fruit of a life connected to Him. This card maps that journey level by level."],
stepsTitle:"The Five Levels",steps:[["1","Perception Filter","The sensory gateway asks, “What just happened? Does this matter? Where should I send this?” All incoming information is filtered before it is processed."],["2","Attachment","The brain quickly attaches to what feels good, bad, or scary, largely outside our conscious awareness. Feelings come before we even know the story."],["3","Attunement","“Can I share this? Will someone stay with me? Can we remain connected?” This level regulates the emotional brainstorm created by difficult experiences."],["4","Abiding","Identity is formed through abiding, with Jesus as our source of life and secure attachment, with our people for belonging, and within ourselves for character and purpose."],["5","Transformation","The natural fruit of a life connected to Him: love, peace, wisdom, character, and the fruit of the Spirit."]],
remember:["Abide. Connect. Become. Transform.","When our perception is renewed, our attachments heal.","As our relationships deepen, our identity becomes secure.","And our lives are transformed."],
prayer:"Father, You designed me for transformation through relationship with You. Renew my perception, heal my attachments, and form my identity as I abide in Jesus. Transform me by the renewing of my mind.",
scriptures:[["Romans 12:2","Be transformed by the renewing of your mind."],["John 15:5","I am the vine. You are the branches. Apart from me you can do nothing."]],
closing:{q:"Abide. Connect. Become. Transform.",r:"John 15:4-5"}},
{id:"maturity",title:"Maturity",subtitle:"Remaining Your Best Self",cat:"Growth",img:"images/maturity.webp",
key:{q:"Until we all attain to a full grown man, to the measure of the stature of the fullness of Christ.",r:"Ephesians 4:13"},
overview:["Maturity is learning to remain your best self under increasingly difficult situations and intense emotions, living from the true heart Jesus gave you.","It is not the absence of hard feelings but the ability to stay grounded in who you are in Christ when pressure rises. Maturity is grown, not achieved overnight."],
stepsTitle:"Growing in Maturity",steps:[["1","Remain Your Best Self","Maturity shows most not when life is easy, but when situations grow difficult. The goal is to stay your best self even under pressure."],["2","Under Intense Emotion","Big emotions do not have to dictate your behavior. Maturity feels them, brings them to God, and still chooses to act from love."],["3","Live From the True Heart","You act not from fear or reaction, but from the true heart Jesus gave you, marked by love, wisdom, and peace."],["4","Grow Toward Christ","The aim of all growth is to become like Jesus, attaining the full measure of His character."]],
prayer:"Father, grow me into maturity. Help me remain my best self under pressure and intense emotion, living from the true heart Jesus gave me, until I reach the full measure of Christ.",
scriptures:[["Ephesians 4:13","Until we all attain to the measure of the stature of the fullness of Christ."],["James 1:4","Let endurance have its perfect work, that you may be perfect and complete, lacking in nothing."]],
closing:{q:"Maturity is learning to remain your best self, living from the true heart Jesus gave you.",r:"Ephesians 4:13"}},
{id:"pause",title:"PAUSE",subtitle:"When Big Emotions Come",cat:"Emotions",img:"images/pause.webp",
key:{q:"Search me, God, and know my heart; test me and know my anxious thoughts.",r:"Psalm 139:23"},
overview:["Don't let your emotions become your guide. Let them become your invitation to meet with Jesus.","PAUSE is a five-step path to walk through the moment a big emotion rises. Today's circumstance may be the trigger, but it is rarely the root. Jesus wants to heal the place where the wound first took root, and as His truth reaches your heart, freedom follows."],
stepsTitle:"The PAUSE Path",steps:[["P","Pause","Slow down. Breathe. Resist the urge to react, fix, defend, or withdraw. Turn your attention toward God's presence. Stay curious."],["A","Acknowledge","Name what you are feeling without judging it. What am I feeling right now? What happened that stirred this emotion?"],["U","Uncover","Ask the Holy Spirit to reveal what lies beneath the surface. When have I felt this way before? What deeper pain or unmet longing is this touching? What is this emotion trying to tell me?"],["S","Sit With Jesus","Invite Him into the memory, the wound, and the present moment. Lord, what do You want me to know? How do You see me in this moment? Where have You been in this story?"],["E","Embrace His Truth","Receive what Jesus says over what fear, shame, or pain has been telling you. What lie have I been believing? Jesus, what is Your truth? What would it look like to respond from my true heart instead of my wounded heart?"]],
remember:["Today's circumstance may be the trigger, but it is rarely the root.","Jesus wants to heal the place where the wound first took root.","As His truth reaches your heart, freedom follows.","My emotions are an invitation, not a guide."],
prayer:"Jesus, when big emotions come, help me pause instead of react. Show me what lies beneath the surface, sit with me in the place where the wound began, and speak Your truth over every lie I have believed. Amen.",
scriptures:[["Psalm 139:23-24","Search me, God, and know my heart; test me and know my anxious thoughts."],["James 1:19","Everyone should be quick to listen, slow to speak and slow to become angry."],["Psalm 147:3","He heals the brokenhearted and binds up their wounds."]],
closing:{q:"Abide in Him. Return to truth. Live from your true heart. This is the pathway to abundant life.",r:"The Abundant Life Ministry"}},
{id:"breathing",title:"Returning to Rest",subtitle:"Breathing Your Way Back to Shalom",cat:"Healing",img:"images/breathing.webp",
key:{q:"You will keep in perfect peace those whose minds are stayed on You, because they trust in You.",r:"Isaiah 26:3"},
overview:["God designed our bodies with a built-in way to signal safety. Intentional breathing calms our nervous system so we can return to rest, peace, and shalom, and become more aware of God's presence.","These are five practical patterns you can use anywhere. As your body settles, your mind becomes clearer, your emotions become less overwhelming, and your heart becomes more available to hear the gentle whisper of God."],
stepsTitle:"Five Ways to Return to Rest",steps:[["1","The 3-5-7 Breath","Breathe in through your nose for a count of 3. Hold your breath for a count of 5. Breathe out slowly through your mouth for a count of 7. Repeat for 5-10 breaths. A longer exhale activates the rest and restore response and helps calm the vagus nerve."],["2","Box Breathing","Breathe in for 4 counts, hold for 4, breathe out for 4, hold for 4. Imagine tracing the four sides of a square. Repeat for several minutes, allowing each breath to become smooth and unhurried. Used by athletes, first responders, and military personnel to restore calm and focus."],["3","Deep Diaphragmatic Breathing","Wrap one arm around your side as though you are giving yourself a gentle hug, with that hand resting over your lower ribs. Place your other hand on the center of your chest. Breathe slowly through your nose. As you inhale, the hand around your ribs should feel your rib cage expand outward while the hand on your chest stays almost completely still. As you exhale, allow your ribs to relax naturally. This sends powerful signals of safety to your brain."],["4","The Long Exhale","Breathe in for 4 counts, breathe out for 6-8 counts. You don't have to force the breath. Simply let the exhale become slow and gentle. A prolonged exhale helps regulate the vagus nerve, slowing the body's stress response and inviting a sense of peace."],["5","Don't Forget to Yawn","Yawning is one of God's natural reset buttons. A genuine yawn, or even intentionally triggering a few yawns, can help release tension, increase oxygen flow, and encourage your nervous system to shift toward relaxation. Sometimes after a stressful moment, allowing yourself to yawn a few times is enough to begin settling your body."],["+","Breathe With Jesus","Breathing exercises help calm our bodies, but our goal is deeper connection. Inhale: Jesus, You are here. Exhale: I give this to You. Or simply pray, Inhale: Prince of Peace... Exhale: I receive Your shalom."]],
remember:["God designed our bodies with a built-in way to signal safety.","A longer exhale tells your body it is safe to rest.","You don't have to force the breath.","The goal is not just calm, but connection with Him."],
prayer:"Prince of Peace, thank You for designing my body to return to rest. As I breathe, quiet my nervous system, settle my heart, and make me more aware of Your presence. I receive Your shalom. Amen.",
scriptures:[["Isaiah 26:3","You will keep in perfect peace those whose minds are stayed on You, because they trust in You."],["Psalm 46:10","Be still, and know that I am God."],["John 14:27","Peace I leave with you; my peace I give you. Do not let your hearts be troubled."],["Genesis 2:7","The Lord God formed the man and breathed into his nostrils the breath of life."]],
closing:{q:"As your body settles, your heart becomes more available to hear the gentle whisper of God.",r:"Isaiah 26:3"}},
{id:"beeps",title:"BEEPS",subtitle:"Where Do I Go for Comfort?",cat:"Freedom",img:"images/beeps.webp",
key:{q:"Come to me, all you who are weary and burdened, and I will give you rest.",r:"Matthew 11:28"},
overview:["God created us to seek comfort, connection, and peace. The question is not if we seek refuge, but where we seek it.","BEEPS names the five places we run to instead of Jesus. These things are not necessarily wrong, and many are gifts from God. They become false refuges when we depend on them to give us what only God can provide."],
stepsTitle:"B · E · E · P · S",steps:[["B","Behaviors","What I do to feel better: work, exercise, cleaning, busyness, shopping, social media, entertainment."],["E","Events","Looking for relief in circumstances: vacations, holidays, promotions, ministry events, winning, accomplishments."],["E","Experiences","Wanting to feel alive: emotional highs, constant excitement, adventure, spiritual experiences, adrenaline, being busy."],["P","People","Looking to others for what only God can provide: approval, romance, friendships, children, a spouse, ministry leaders."],["S","Substances","Using something to numb or change how I feel: food, alcohol, drugs, pornography, spending, sugar, caffeine."],["♥","Jesus, the True Refuge","“Come to Me…” Every one of these arrows can point back to Him. The goal is not to stop needing comfort, but to let every need lead you back to Jesus.",true]],
remember:["These things are not necessarily wrong. Many are gifts from God.","They become false refuges when I depend on them for what only God can provide.","Comfort isn't the enemy. Looking everywhere except Jesus for comfort is what leaves us empty.","Abide in Him. Find your true refuge."],
prayer:"Instead of asking what will make me feel better, I ask: Jesus, what is my heart needing right now? Lord, what do You want me to know? Be my true refuge, and let every need lead me back to You. Amen.",
scriptures:[["Matthew 11:28","Come to me, all you who are weary and burdened, and I will give you rest."],["Psalm 46:1","God is our refuge and strength, an ever-present help in trouble."],["John 15:4","Abide in Me, and I in you."],["Psalm 91:1","He who dwells in the shelter of the Most High will abide in the shadow of the Almighty."]],
closing:{q:"The goal isn't to stop needing comfort. The goal is to let every need lead you back to Jesus.",r:"Matthew 11:28"}},
{id:"dendrites",title:"How Dendrites Die",subtitle:"Use it or lose it",cat:"Growth",img:"images/dendrites.webp",
key:{q:"Do not conform to the pattern of this world, but be transformed by the renewing of your mind.",r:"Romans 12:2"},
overview:["When a neural pathway is not used, its dendrites begin to degenerate. The longer the pathway is unused, the more dendrites die.","We want to lose toxic thoughts and keep healthy ones. This is the good news buried in how God made the brain: the thought patterns you stop feeding genuinely weaken, and the ones you practise genuinely grow."],
stepsTitle:"What Happens To An Unused Pathway",steps:[["1","Baseline · actively used","A full dendritic network supports strong connections. 100% of dendrites present."],["2","After 2 weeks","After two weeks of not using this pathway, approximately half of the dendrites die. About 50% remain."],["3","After 4 weeks","After another 14 days, about half of the remaining dendrites die. About 25% remain."],["4","After 6 weeks","With continued disuse, more dendrites die and the pathway becomes weak. About 12% remain."],["♥","Choose what you feed","Use truth. Lose lies. The brain prunes unused connections to save resources. Use a pathway to keep it. Don't use it, and you'll lose it.",true]],
remember:["Repetition builds. Disuse destroys.","The brain prunes unused connections to save resources.","A lie you stop rehearsing genuinely loses its grip.","Choose what you feed."],
prayer:"Father, thank You that You made my mind able to change. Show me the pathways I have been feeding that lead me away from You. Help me stop rehearsing the lies, and practise Your truth until it is the well-worn road. Amen.",
scriptures:[["Philippians 4:8","Whatever is true, whatever is noble, whatever is right, whatever is pure, whatever is lovely, whatever is admirable — think about such things."],["Romans 12:2","Do not conform to the pattern of this world, but be transformed by the renewing of your mind."],["2 Cor 10:5","We demolish arguments and every pretension that sets itself up against the knowledge of God, and we take captive every thought to make it obedient to Christ."]],
closing:{q:"I have come that they may have life, and have it to the full.",r:"John 10:10"}}
];
const categories=["All","Freedom","Deliverance","Forgiveness","Emotions","Healing","Authority","Growth"];
const quietVerses=[{q:"Be still, and know that I am God.",r:"Psalm 46:10"},{q:"Come to me, all you who are weary and burdened, and I will give you rest.",r:"Matthew 11:28"},{q:"He restores my soul... beside quiet waters.",r:"Psalm 23:2-3"},{q:"In quietness and trust is your strength.",r:"Isaiah 30:15"},{q:"Let the peace of Christ rule in your hearts.",r:"Colossians 3:15"}];
const HYMNS=[{n:"Light rain",f:"audio/snd_light_rain.mp3"},{n:"Forest river",f:"audio/snd_forest_river.mp3"},{n:"Harbour waves",f:"audio/snd_harbour_waves.mp3"},{n:"Forest birds",f:"audio/snd_forest_birds.mp3"},{n:"Morning chorus",f:"audio/snd_morning_birds.mp3"},{n:"Songbirds",f:"audio/snd_songbirds.mp3"},{n:"Distant thunder",f:"audio/snd_distant_thunder.mp3"}];
/* The six emotions, worded exactly as the ministry's Six Big Emotions card teaches them. */
const EMOTIONS=[
{id:"sadness",name:"Sadness",short:"Sadness",color:"#3A6294",
message:"I have experienced loss or unmet longing.",
helps:"Sadness helps us slow down, feel our need, and reach out for comfort and connection.",
purpose:"Connect, mourn, and heal.",
card:"wounded",also:["pause","breathing"],tags:["comfort","hope","presence","rest"],hymn:3,
verse:{q:"The Lord is close to the brokenhearted and saves those who are crushed in spirit.",r:"Psalm 34:18"},
prayer:"Father, You are close to the brokenhearted. I bring You this loss and this longing. Slow me down, meet me in the ache, and let me feel Your comfort rather than carry this alone. Amen."},
{id:"anger",name:"Anger",short:"Anger",color:"#B94A3A",
message:"I need to protect myself or what matters; something needs to stop.",
helps:"Anger helps us set limits, protect what matters, and stand up for what is right.",
purpose:"Protect, set limits, and restore justice.",
card:"stirred",also:["pause","forgiveness","breathing"],tags:["peace","humility","patience","forgiveness"],hymn:1,
verse:{q:"In your anger do not sin. Do not let the sun go down while you are still angry.",r:"Ephesians 4:26"},
prayer:"Lord, You see what has stirred me up. Show me what this anger is protecting and what truly needs to stop. Keep me from sinning in it, and let me act from my true heart rather than my wounded one. Amen."},
{id:"fear",name:"Fear",short:"Fear",color:"#2F8074",
message:"I sense danger or threat.",
helps:"Fear helps us recognize danger and reach out for help. It grows our discernment, trust, and dependence on God and others.",
purpose:"Protect, discern, and seek help.",
card:"fear",also:["breathing","pause"],tags:["courage","trust","strength","peace"],hymn:1,
verse:{q:"When I am afraid, I put my trust in you.",r:"Psalm 56:3"},
prayer:"Father, fear is painting pictures of a future that has not happened. Help me test every thought against Your Word, replace each lie with Your truth, and walk today trusting Your promise instead of fear's picture. Amen."},
{id:"shame",name:"Shame",short:"Shame",color:"#B07D2E",
message:"I feel overwhelmed and see no way forward.",
helps:"This emotion whispers that there is no hope and no way out. It is heavy and exhausting.",
purpose:"Signal that we need rescue, restoration, and renewed hope.",
card:"forgiveness",also:["trueheart","pause","clear"],tags:["grace","identity","forgiveness","salvation"],hymn:0,
verse:{q:"Those who look to him are radiant; their faces are never covered with shame.",r:"Psalm 34:5"},
prayer:"Jesus, this weight tells me there is no way out. You are my rescue. Lift what I was never meant to carry, restore what has been worn down, and give me hope again. Amen."},
{id:"despair",name:"Hopeless Despair",short:"Despair",color:"#6F53A0",
message:"I feel that I no longer bring people joy.",
helps:"Beneath it runs the painful belief that I am not good enough, or that I do not belong. Healthy sorrow reminds us of our true heart and who it is like us to be.",
purpose:"Remind us of our true heart. It can be healed by truth and love.",
card:"trueheart",also:["wounded","pause","transformation"],tags:["hope","endurance","perseverance","presence"],hymn:4,
verse:{q:"Why, my soul, are you downcast? Put your hope in God, for I will yet praise him.",r:"Psalm 42:11"},
prayer:"Lord, I have believed that I am not enough and do not belong. Speak Your truth over that belief. Remind me of the true heart You gave me, and heal this place with Your love. Amen."},
{id:"disgust",name:"Disgust",short:"Disgust",color:"#4A7C3F",
message:"Something feels offensive, repulsive, or morally wrong.",
helps:"Disgust helps us reject what is harmful, toxic, or contrary to our values.",
purpose:"Reject harm and protect our physical and moral well-being.",
card:"clear",also:["order","pause"],tags:["freedom","obedience","word","holiness","purity"],hymn:2,
verse:{q:"Create in me a pure heart, O God, and renew a steadfast spirit within me.",r:"Psalm 51:10"},
prayer:"Father, something in me recoils at what I have seen. Give me wisdom to know what is truly harmful, courage to turn from it, and a clean heart that loves what You love. Amen."}
];
/* Good feelings. These are savored and written down rather than worked through. */
const GOOD=[
/* Joy is relational here: the Brain Journey card defines the joy centre as
"glad-to-be-together joy", and Six Big Emotions defines despair as its loss. */
{id:"joy",name:"Joy",short:"Joy",color:"#E8AC2A",
message:"Someone is glad to be with me, and I am glad to be with them.",
helps:"Joy is relational. It is glad-to-be-together joy: the delight of being with God, and with people who are glad to be with you. Processing life from a place of joy is what keeps you connected to God and others.",
purpose:"Connect, strengthen, and remind us that we belong.",
savorPrompt:"Who were you glad to be with, and what happened?",
practice:"Laugh and play with people you love.",hymn:0,
verse:{q:"The Lord your God is with you… He will take great delight in you and rejoice over you with singing.",r:"Zephaniah 3:17"},
prayer:"Father, thank You that You are glad to be with me. Thank You for the people who carry that gladness to me. Help me stay in this joy long enough for my heart to learn it, and to bring joy to others as You have to me. Amen."},
{id:"gratitude",name:"Gratitude",short:"Gratitude",color:"#86A845",
message:"I have been given something I did not earn.",
helps:"Gratitude turns our attention from what is missing to what has been given. It is the quickest way back to noticing God's hand.",
purpose:"Notice, receive, and give thanks.",
savorPrompt:"What are you thankful for right now?",
practice:"Practice gratitude every day.",hymn:4,
verse:{q:"Give thanks in all circumstances; for this is God's will for you in Christ Jesus.",r:"1 Thessalonians 5:18"},
prayer:"Lord, thank You. Thank You for what I have received, and for the countless things I have not even noticed. Keep my eyes open to Your goodness. Amen."},
{id:"peace",name:"Peace",short:"Peace",color:"#6FA8C7",
message:"My heart is settled and unhurried.",
helps:"Peace is not merely calm. It is shalom: wholeness, safety, and rest, because God is holding what you cannot.",
purpose:"Rest, restore, and remind us we are safe with Him.",
savorPrompt:"What brought you this peace?",
practice:"Sit quietly in God's presence without needing to accomplish anything.",hymn:3,
verse:{q:"Peace I leave with you; my peace I give you.",r:"John 14:27"},
prayer:"Prince of Peace, thank You for this quiet. Let it settle deep, and teach my heart to remember the way back here. Amen."},
{id:"hope",name:"Hope",short:"Hope",color:"#5FB89D",
message:"I can see God's goodness ahead of me.",
helps:"Hope is confident expectation. It is not wishing; it is leaning on the character of a God who keeps His promises.",
purpose:"Lift our eyes, steady our hearts, and carry us forward.",
savorPrompt:"What is stirring hope in you today?",
practice:"Recall moments when you experienced God's faithfulness.",hymn:1,
verse:{q:"May the God of hope fill you with all joy and peace as you trust in him.",r:"Romans 15:13"},
prayer:"God of hope, thank You for lifting my eyes. Anchor this hope in who You are rather than in how things look, and let it hold me steady. Amen."},
{id:"loved",name:"Loved",short:"Loved",color:"#CE6E8A",
message:"I feel known, wanted, and safe.",
helps:"Loving connection with God and with others is what our hearts were built for. Every moment of it is worth savoring and remembering.",
purpose:"Deepen connection, secure the heart, and heal what isolation wounded.",
savorPrompt:"Who showed you love, and what did they do?",
practice:"Share joy with others by encouraging and celebrating them.",hymn:0,
verse:{q:"See what great love the Father has lavished on us, that we should be called children of God.",r:"1 John 3:1"},
prayer:"Father, thank You for loving me, and for the people who carry Your love to me. Let this settle into the places that still doubt I belong. Amen."},
{id:"awe",name:"Awe",short:"Awe",color:"#8E7DC4",
message:"I have glimpsed how great God is.",
helps:"Awe puts us back in right proportion. Seeing God's greatness makes our worries smaller and our worship deeper.",
purpose:"Humble us, lift our eyes, and stir worship.",
savorPrompt:"What did you see or experience that stirred this?",
practice:"Savor beauty in creation.",hymn:2,
verse:{q:"The heavens declare the glory of God; the skies proclaim the work of his hands.",r:"Psalm 19:1"},
prayer:"Lord, You are greater than I can hold. Thank You for letting me glimpse it. Let this wonder become worship. Amen."}
];
/* ========= STORAGE ========= */
const LS=window.localStorage;
function getSet(k){try{return new Set(JSON.parse(LS.getItem(k)||"[]"))}catch(e){return new Set()}}
function saveSet(k,s){return lsWrite(k,JSON.stringify([...s]))}
/* iOS private browsing throws on write, so a failed save must never pass silently. */
function lsWrite(k,v){try{LS.setItem(k,v);return true}catch(e){storageBroken=true;return false}}
let storageBroken=false;
function storageOk(){try{LS.setItem('ag_t','1');LS.removeItem('ag_t');return true}catch(e){return false}}
let favs=getSet("ag_favs");
let devoDone=getSet("ag_devo_done");
let devoSaved=getSet("ag_devo_saved");
let state={tab:"home",filter:"All"};
/* Three hues of the same app. Classic is the default so nothing changes for
anyone who never opens Settings. */
const THEMES=[
{id:'classic',label:'Classic',note:'Cream, navy and gold',sw:['#f5f0e4','#1e2a3f','#96762a']},
{id:'rose',label:'Rose',note:'Blush, plum and dusty rose',sw:['#f8f1ee','#43293a','#a05f68']},
{id:'slate',label:'Slate',note:'Stone, charcoal and bronze',sw:['#eff0ec','#232a2e','#7d6e45']}
];
function themeId(){return LS.getItem('ag_theme')||'classic';}
function themeApply(id){
const t=THEMES.find(x=>x.id===id)?id:'classic';
if(t==='classic')document.documentElement.removeAttribute('data-theme');
else document.documentElement.setAttribute('data-theme',t);
lsWrite('ag_theme',t);
}
/* ========= DIAGNOSTIC LOG =========
Technical events and errors only, never anything the person has written.
Nothing is sent anywhere on its own; a report is created only when the person
taps Send a report. */
const DIAG_MAX=120;
function diagLoad(){try{return JSON.parse(LS.getItem('ag_diag')||'[]')}catch(e){return[]}}
function diagEvent(msg){
try{
const l=diagLoad();
const t=new Date().toISOString().slice(5,19).replace('T',' ');
l.push(t+' '+String(msg).slice(0,300));
while(l.length>DIAG_MAX)l.shift();
lsWrite('ag_diag',JSON.stringify(l));
}catch(e){}
}
window.addEventListener('error',e=>{diagEvent('ERROR: '+(e.message||'')+' @ '+((e.filename||'').split('/').pop())+':'+(e.lineno||''));});
window.addEventListener('unhandledrejection',e=>{diagEvent('PROMISE: '+((e.reason&&e.reason.message)||e.reason||''));});
function diagReport(){
const lines=diagLoad();
let out='LIFE ABUNDANTLY — PROBLEM REPORT\n';
out+='Please describe what went wrong above this line.\n';
out+='------------------------------------------\n';
out+='Web app\n';
out+='Browser : '+navigator.userAgent+'\n';
out+='Language : '+(navigator.language||'')+'\n';
out+='Screen : '+window.innerWidth+'x'+window.innerHeight+'\n';
out+='Sent : '+new Date().toLocaleString()+'\n';
out+='------------------------------------------\n';
out+=(lines.length?lines.join('\n'):'(no events recorded)')+'\n';
out+='------------------------------------------\n';
out+='No journal entries or personal writing are included in this report.\n';
return out;
}
function diagSend(){
const text=diagReport();
const file=new File([text],'life-abundantly-report.txt',{type:'text/plain'});
if(navigator.canShare&&navigator.canShare({files:[file]})){
navigator.share({title:'Life Abundantly — problem report',text:text,files:[file]}).catch(()=>diagDownload(text));
}else diagDownload(text);
}
function diagDownload(text){
const a=document.createElement('a');
a.href=URL.createObjectURL(new Blob([text],{type:'text/plain'}));
a.download='life-abundantly-report.txt';
document.body.appendChild(a);a.click();
setTimeout(()=>{URL.revokeObjectURL(a.href);a.remove();},1000);
toast('Report saved');
}
const screen=document.getElementById('screen');
const toastEl=document.getElementById('toast');
function toast(m){toastEl.textContent=m;toastEl.classList.add('show');clearTimeout(toastEl._t);toastEl._t=setTimeout(()=>toastEl.classList.remove('show'),1900);}
function cross(c,secret){c=c||'#1e2a3f';return `<svg class="logo-cross${secret?' secret':''}"${secret?' data-secret':''} viewBox="0 0 24 30" fill="none"><path d="M12 2v26M6 9h12" stroke="${c}" stroke-width="2.4" stroke-linecap="round"/><path d="M9 24c-2 1-5 1-6-1 2-1 5-1 6 1z" fill="#7a8a4e"/></svg>`;}
function heart(f){return f?'<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 20s-7-4.6-9.3-9C1 7.5 3 4.5 6.2 4.5c2 0 3.2 1.2 3.8 2.3.6-1.1 1.8-2.3 3.8-2.3C17 4.5 19 7.5 21.3 11 19 15.4 12 20 12 20z"/></svg>':'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M12 20s-7-4.6-9.3-9C1 7.5 3 4.5 6.2 4.5c2 0 3.2 1.2 3.8 2.3.6-1.1 1.8-2.3 3.8-2.3C17 4.5 19 7.5 21.3 11 19 15.4 12 20 12 20z"/></svg>';}
/* ========= HOME (post cards) ========= */
function renderHome(){
const list=cards.filter(c=>state.filter==="All"||c.cat===state.filter);
const v=el('view active','home');
v.innerHTML=`<div class="appbar"><div class="brand">${cross(null,true)}<h1>LIFE ABUNDANTLY</h1></div></div>
<div class="scroll"><div class="lead-line">Tap a post card, then scroll to discover its deeper meaning.</div>
<div class="feelstrip">
<h4>How are you feeling?</h4>
<p>Every emotion God gave you has a purpose. Tap one.</p>
<div class="feelgrouplbl">WHEN IT'S HARD</div>
<div class="feelrow">${EMOTIONS.map(e=>`<button class="feel" data-feel="${e.id}"><span class="dot" style="background:${e.color}">${e.name[0]}</span><span class="nm">${e.short}</span></button>`).join('')}</div>
<div class="feelgrouplbl">WHEN IT'S GOOD</div>
<div class="feelrow">${GOOD.map(e=>`<button class="feel" data-feel="${e.id}"><span class="dot" style="background:${e.color}">${e.name[0]}</span><span class="nm">${e.short}</span></button>`).join('')}</div>
</div>
<button class="joybanner" data-jopen>
<div class="jb-top"><span class="jb-mark">✦</span><span class="jb-t">CULTIVATING JOY</span><span class="jb-go">›</span></div>
<div class="jb-s">Slow down to notice, savor, and remember the goodness of God.</div>
</button>
<div class="chips">${categories.map(c=>`<button class="chip ${c===state.filter?'active':''}" data-cat="${c}">${c}</button>`).join('')}</div>
<div class="section-title"><span>${state.filter==="All"?"All Post Cards":state.filter}</span></div>
<button class="prayerhome" data-propen>
<span class="ph-x">✝</span>
<span class="ph-t"><b>A PRAYER FOR FREEDOM</b><em>Walk the CLEAR path with God</em></span>
<span class="ph-go">›</span>
</button>
<div class="grid">${list.map(c=>`<div class="card ${favs.has(c.id)?'faved':''}" data-card="${c.id}"><img class="thumb" src="${c.img}" alt="${c.title}"><button class="fav" data-fav="${c.id}">${heart(favs.has(c.id))}</button><div class="strip"><div class="t">${c.title}</div><div class="c">${c.cat}</div></div></div>`).join('')}</div></div>`;
return v;
}
function renderDetail(c){
const v=el('view','detail');
let steps='';
if(c.steps){steps=`<h3 class="steps-h">${c.stepsTitle||'Breakdown'}</h3>`+c.steps.map(s=>`<div class="step"><div class="badge ${s[3]?'gold':''}">${s[0]}</div><div class="body"><div class="lbl">${s[1]}</div><p>${s[2]}</p></div></div>`).join('');}
let paths='';
if(c.paths){const col=(cls,title,arr)=>`<div class="path ${cls}"><h5>${title}</h5><ol>${arr.map(x=>`<li><b>${x[0]}</b><span>${x[1]}</span></li>`).join('')}</ol></div>`;
paths=`<h3 class="steps-h">Two Paths, One Choice</h3><div class="paths">${col('dark',c.paths.darkTitle,c.paths.dark)}${col('free',c.paths.freeTitle,c.paths.free)}</div>
<p class="overview" style="text-align:center;font-style:italic;color:var(--pathdark);margin:-4px 0 4px;font-size:14.5px">${c.paths.darkNote}</p>
<p class="overview" style="text-align:center;font-style:italic;color:var(--pathfree);margin:0 0 14px;font-size:14.5px">${c.paths.freeNote}</p>`;}
const remember=c.remember?`<div class="softbox"><h4>REMEMBER</h4><p>${c.remember.join('<br>')}</p></div>`:'';
const prayer=c.prayer?`<div class="softbox"><h4>PRAYER</h4><p>${c.prayer}</p></div>`:'';
const scrip=c.scriptures?`<h3 class="steps-h">Key Scriptures</h3>${c.scriptures.map(s=>`<div class="scrip"><div class="r">${s[0]}</div><p>${s[1]}</p></div>`).join('')}`:'';
const closing=c.closing?`<div class="closing"><div class="q">“${c.closing.q}”</div><div class="r">${c.closing.r}</div></div>`:'';
v.innerHTML=`<div class="scroll" style="background:var(--cream)">
<div class="detail-imgwrap" data-zoom="${c.img}">
<div class="detail-bar"><button class="iconbtn" data-back><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 5l-7 7 7 7"/></svg></button>
<div class="right"><button class="iconbtn" data-cshare="${c.id}"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><circle cx="6" cy="12" r="2.4"/><circle cx="18" cy="6" r="2.4"/><circle cx="18" cy="18" r="2.4"/><path d="M8 11l8-4M8 13l8 4"/></svg></button><button class="iconbtn" data-fav="${c.id}">${heart(favs.has(c.id))}</button></div></div>
<img src="${c.img}" alt="${c.title}">
<div class="zoomhint"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><circle cx="11" cy="11" r="7"/><path d="M20 20l-3-3M11 8v6M8 11h6"/></svg>Tap to zoom</div>
</div>
<div class="scrollcue">Keep scrolling <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 9l6 6 6-6"/></svg></div>
<div class="article">
<div class="art-head"><div class="art-cat">${c.cat}</div><div class="art-title">${c.title}</div><div class="art-sub">${c.subtitle}</div></div>
<div class="divider">${cross('#c9a856')}</div>
<div class="keyverse"><div class="q">“${c.key.q}”</div><div class="r">${c.key.r}</div></div>
<div class="overview">${c.overview.map(p=>`<p>${p}</p>`).join('')}</div>
${paths}${steps}${remember}${prayer}${scrip}${closing}
</div></div>`;
return v;
}
/* ========= CULTIVATING JOY ========= */
const JOY={
title:"Cultivating Joy",
definition:[
"Cultivating joy is intentionally creating repeated experiences of gratitude, delight, and loving connection with God and with others.",
"As we savor these moments, our hearts and brains become increasingly wired for peace, hope, and secure attachment."],
heart:"Cultivating joy is intentionally slowing down to notice, savor, and remember the goodness of God, until your heart naturally rests in His presence.",
heartShort:"Slow down to notice, savor, and remember the goodness of God, until your heart naturally rests in His presence.",
verse:{q:"You make known to me the path of life; in your presence there is fullness of joy.",r:"Psalm 16:11"},
practices:[
"Practice gratitude every day.",
"Recall moments when you experienced God's faithfulness.",
"Savor beauty in creation.",
"Celebrate small blessings instead of rushing past them.",
"Laugh and play with people you love.",
"Worship with your whole heart.",
"Read and meditate on stories of God's goodness.",
"Sit quietly in God's presence without needing to accomplish anything.",
"Share joy with others by encouraging and celebrating them.",
"Keep a \"Joy Journal\" of moments that remind you God is near."],
prompts:[
"What is one good thing God gave you today?",
"Where did you notice His faithfulness this week?",
"What beauty did you see today worth savoring?",
"Who brought you joy recently, and how?",
"What small blessing did you almost rush past?",
"What is one thing you are grateful for right now?"]
};
/* Journal entries live in this browser, newest first. */
function joyLoad(){try{return JSON.parse(LS.getItem('ag_joy')||'[]')}catch(e){return[]}}
function joySave(l){return lsWrite('ag_joy',JSON.stringify(l))}
function joyAdd(text,source){const t=text.trim();if(!t)return false;const l=joyLoad();const now=Date.now();
l.unshift({id:now,text:t,created:now,source:source||''});return joySave(l);}
function joyRemove(id){joySave(joyLoad().filter(e=>e.id!==id));}
function joyDays(){return new Set(joyLoad().map(e=>new Date(e.created).toDateString())).size;}
/* ========= THE CROSS EASTER EGG =========
Tap the cross beside the wordmark. Nothing announces it, which is the point. */
const QUOTE_INVITATION="Seek and you will find me";
const QUOTES=[
"God is never late; He is always preparing.",
"Faith grows strongest in unseen seasons.",
"Grace reaches where perfection never can.",
"God's plans are greater than your fears.",
"Prayer changes us before it changes circumstances.",
"Hope begins where worry ends.",
"Walk by faith, not by headlines.",
"Peace is found in God's presence.",
"Trust God with what you cannot control.",
"Every sunrise is another reminder of God's mercy.",
"God specializes in impossible stories.",
"The strongest foundation is built on Christ.",
"God's love never runs out.",
"A thankful heart sees God's fingerprints everywhere.",
"Faith is courage that trusts God's promises.",
"Your value was settled at the cross.",
"God's strength shines brightest through weakness.",
"Love others as Christ first loved you.",
"God can redeem every broken chapter.",
"Joy is rooted deeper than circumstances.",
"Christ calms storms before He removes them.",
"Let God's truth speak louder than your fears.",
"Nothing surprises the God who knows tomorrow.",
"God's peace is stronger than today's anxiety.",
"Every trial carries an opportunity to trust.",
"Forgiveness sets both hearts free.",
"The cross proves love always has the final word.",
"Keep your eyes on Jesus, not the waves.",
"God's grace is enough for today.",
"Faith doesn't eliminate questions; it anchors answers.",
"Every prayer is heard by Heaven.",
"God sees every unseen act of kindness.",
"Humility makes room for God's greatness.",
"You are never forgotten by God.",
"The Shepherd never loses His sheep.",
"God's promises outlast every problem.",
"Faith is choosing trust over certainty.",
"Rest is found in surrender.",
"Christ is the light that darkness cannot overcome.",
"Obedience often opens unexpected doors.",
"Mercy triumphs over judgment.",
"God's timing is worth the wait.",
"Let faith be louder than fear.",
"Every blessing begins with God's goodness.",
"God's love writes better endings.",
"Your purpose is greater than your past.",
"Prayer is the language of hope.",
"Heaven celebrates every repentant heart.",
"Jesus meets us exactly where we are.",
"Grace always invites another beginning.",
"God's faithfulness never expires.",
"Peace grows where trust is planted.",
"Faith sees beyond today's struggle.",
"God works even in silent seasons.",
"Love reflects the heart of Christ.",
"Nothing is wasted in God's hands.",
"Your story isn't over while God is writing.",
"Christ is enough for every need.",
"Choose kindness because Christ chose you.",
"God's mercy is new every morning.",
"Faith turns obstacles into opportunities.",
"Hope survives because Christ lives.",
"God can restore what life has broken.",
"A praying heart is never powerless.",
"Trust opens the door to peace.",
"Jesus is the anchor in every storm.",
"God's wisdom outlasts human understanding.",
"The smallest faith can move the biggest mountain.",
"Every heartbeat is a gift from God.",
"The Lord strengthens weary souls.",
"God's love never depends on your performance.",
"Let your life point others to Christ.",
"Every season has purpose in God's plan.",
"Faith is stronger than fear's loudest voice.",
"God's grace meets you every day.",
"Christ offers peace the world cannot give.",
"God's light always finds the darkest places.",
"Blessed are those who keep trusting.",
"Prayer opens doors worry never could.",
"Jesus is still changing lives today.",
"God's presence is the greatest blessing.",
"Faith keeps moving when feelings stand still.",
"Every burden becomes lighter with Christ.",
"God's promises never return empty.",