start writing your journal….
https://claude.ai/public/artifacts/7580fc20-f6cf-4dd0-a96b-17b250c14c6e: PRODUCTS 100 Days · Creating My Reality :root { –ink: #1A1A2E; –parchment: #F5EFE0; –gold: #C9922A; –sage: #8AAF8E; –blush: #D4967A; –muted: #7A7469; –line: rgba(26,26,46,0.12); } * { box-sizing: border-box; margin: 0; padding: 0; } @media print { body { background: white; } .no-print { display: none; } .page { page-break-after: always; box-shadow: none; border: none; margin: 0; border-radius: 0; } } body { background: #EDE8DC; font-family: ‘Inter’, sans-serif; color: var(–ink); min-height: 100vh; padding: 40px 20px 60px; } /* ── CONTROLS ── */ .controls { max-width: 680px; margin: 0 auto 32px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } .controls label { font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(–muted); font-weight: 500; } .controls input[type=”number”] { width: 72px; padding: 8px 12px; border: 1.5px solid var(–gold); border-radius: 6px; background: var(–parchment); font-family: ‘Playfair Display’, serif; font-size: 16px; color: var(–ink); text-align: center; } .controls input[type=”date”] { padding: 8px 12px; border: 1.5px solid var(–line); border-radius: 6px; background: var(–parchment); font-family: ‘Inter’, sans-serif; font-size: 13px; color: var(–ink); } .btn { padding: 9px 20px; border-radius: 6px; border: none; cursor: pointer; font-size: 13px; font-weight: 500; letter-spacing: .04em; transition: opacity .15s; } .btn:hover { opacity: .82; } .btn-gold { background: var(–gold); color: white; } .btn-ink { background: var(–ink); color: var(–parchment); } .btn-sage { background: var(–sage); color: white; } .btn-outline { background: transparent; border: 1.5px solid var(–ink); color: var(–ink); } /* ── PAGE ── */ .page { max-width: 680px; margin: 0 auto 48px; background: var(–parchment); border-radius: 3px; box-shadow: 0 2px 24px rgba(0,0,0,.10), 0 0 0 1px rgba(0,0,0,.04); overflow: hidden; } /* ── HEADER ── */ .page-header { background: var(–ink); color: var(–parchment); padding: 36px 44px 28px; position: relative; overflow: hidden; } .page-header::after { content: ”; position: absolute; right: -20px; top: -20px; width: 160px; height: 160px; border-radius: 50%; background: rgba(201,146,42,.13); } .day-eyebrow { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(–gold); font-weight: 500; margin-bottom: 8px; } .day-number { font-family: ‘Playfair Display’, serif; font-size: clamp(52px, 12vw, 80px); font-weight: 700; line-height: .95; color: var(–parchment); letter-spacing: -.02em; } .day-number span { font-size: .38em; font-weight: 400; color: rgba(245,239,224,.45); letter-spacing: .04em; } .header-meta { display: flex; justify-content: space-between; align-items: flex-end; margin-top: 18px; gap: 16px; flex-wrap: wrap; } .header-date { font-size: 13px; color: rgba(245,239,224,.6); font-weight: 300; } .header-roles { font-size: 10.5px; letter-spacing: .10em; text-transform: uppercase; color: rgba(245,239,224,.38); font-weight: 400; text-align: right; line-height: 1.7; } /* ── BODY ── */ .page-body { padding: 36px 44px 40px; } /* ── SECTION ── */ .section { margin-bottom: 28px; } .section-label { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; font-weight: 600; color: var(–gold); margin-bottom: 6px; display: flex; align-items: center; gap: 8px; } .section-label::after { content: ”; flex: 1; height: 1px; background: var(–line); } .section-prompt { font-family: ‘Playfair Display’, serif; font-size: 14.5px; font-style: italic; color: var(–muted); margin-bottom: 10px; line-height: 1.5; } .write-lines { display: flex; flex-direction: column; gap: 0; } .write-line { border: none; border-bottom: 1px solid var(–line); background: transparent; padding: 10px 2px; font-family: ‘Inter’, sans-serif; font-size: 13.5px; color: var(–ink); width: 100%; resize: none; line-height: 1.6; outline: none; transition: border-color .2s; } .write-line:focus { border-bottom-color: var(–gold); } /* ── DIVIDER ── */ .ornament-divider { text-align: center; margin: 28px 0; color: var(–gold); font-size: 18px; letter-spacing: .4em; opacity: .55; } /* ── INTENTIONS GRID ── */ .intentions-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; margin-top: 10px; } .intention-card { background: rgba(26,26,46,.04); border-radius: 6px; padding: 12px 14px; } .intention-role { font-size: 9px; letter-spacing: .12em; text-transform: uppercase; color: var(–blush); font-weight: 600; margin-bottom: 6px; } .intention-role-input { border: none; border-bottom: 1px dashed var(–blush); background: transparent; width: 100%; font-family: ‘Inter’, sans-serif; font-size: 9px; letter-spacing: .12em; text-transform: uppercase; font-weight: 600; color: var(–blush); padding: 2px 0 4px; margin-bottom: 6px; outline: none; transition: border-color .2s; } .intention-role-input:focus { border-bottom-color: var(–gold); color: var(–ink); } .intention-role-input::placeholder { color: rgba(212,150,122,.45); } .intention-input { border: none; border-bottom: 1px solid var(–line); background: transparent; width: 100%; font-family: ‘Inter’, sans-serif; font-size: 12.5px; color: var(–ink); padding: 4px 0; outline: none; transition: border-color .2s; } .intention-input:focus { border-bottom-color: var(–gold); } /* ── GRATITUDE ── */ .gratitude-row { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; } .g-num { font-family: ‘Playfair Display’, serif; font-size: 18px; color: var(–sage); font-style: italic; min-width: 18px; } /* ── AFFIRMATION ── */ .affirmation-box { background: linear-gradient(135deg, rgba(201,146,42,.08), rgba(138,175,142,.08)); border-left: 3px solid var(–gold); border-radius: 0 6px 6px 0; padding: 14px 18px; margin-top: 10px; } .affirmation-input { width: 100%; border: none; background: transparent; font-family: ‘Playfair Display’, serif; font-size: 15px; font-style: italic; color: var(–ink); outline: none; line-height: 1.6; resize: none; min-height: 52px; } /* ── REALITY CHECK ── */ .reality-block { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 10px; } .reality-col label { font-size: 10px; letter-spacing: .10em; text-transform: uppercase; color: var(–muted); font-weight: 500; display: block; margin-bottom: 8px; } /* ── EVENING CLOSE ── */ .close-meter { display: flex; align-items: center; gap: 10px; margin-top: 10px; margin-bottom: 6px; } .meter-label { font-size: 12px; color: var(–muted); min-width: 110px; } .meter-dots { display: flex; gap: 6px; } .meter-dot { width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid var(–line); background: transparent; cursor: pointer; transition: background .15s, border-color .15s; } .meter-dot.filled { background: var(–gold); border-color: var(–gold); } /* ── FOOTER ── */ .page-footer { border-top: 1px solid var(–line); padding: 16px 44px; display: flex; justify-content: space-between; align-items: center; font-size: 10.5px; letter-spacing: .08em; color: rgba(26,26,46,.3); } .page-footer .progress-bar-wrap { flex: 1; max-width: 120px; height: 3px; background: var(–line); border-radius: 2px; margin: 0 16px; overflow: hidden; } .progress-bar-fill { height: 100%; background: var(–gold); border-radius: 2px; transition: width .4s ease; } /* ── SECTION HEADER alt ── */ .alt-section-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; } .alt-section-icon { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 13px; flex-shrink: 0; } .icon-gold { background: rgba(201,146,42,.15); } .icon-sage { background: rgba(138,175,142,.18); } .icon-blush { background: rgba(212,150,122,.15); } .alt-section-title { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; font-weight: 600; color: var(–gold); } .spacer { height: 8px; }
Day
Date
Creating My Reality · 100 Days
001 / 100
Morning Word
One word that will define how I show up today.
Gratitude
Three things I am grateful for, right now, in this life I am building.
1.
2.
3.
· · ·
My Reality — Present Tense
I write as if it is already true. I describe the life I am stepping into.
Today’s Intentions by Role
One meaningful action for each part of me.
· · ·
I Am Statement
My identity declaration for today. I write it, I feel it, I become it.
My #1 Priority Today
What I’m Releasing
· · ·
My Chapter in Germany
One small or large thing I did today that moved me closer to the life I am creating here.
Evening Reflection
Before I close this day — what showed up for me?
Alignment today
Energy level
What I want to carry into tomorrow:
I Close This Day By Saying
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>100 Days · Creating My Reality</title><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;0,700;1,400;1,600&family=Inter:wght@300;400;500&display=swap" rel="stylesheet"><style> :root { --ink: #1A1A2E; --parchment: #F5EFE0; --gold: #C9922A; --sage: #8AAF8E; --blush: #D4967A; --muted: #7A7469; --line: rgba(26,26,46,0.12); } * { box-sizing: border-box; margin: 0; padding: 0; } @media print { body { background: white; } .no-print { display: none; } .page { page-break-after: always; box-shadow: none; border: none; margin: 0; border-radius: 0; } } body { background: #EDE8DC; font-family: 'Inter', sans-serif; color: var(--ink); min-height: 100vh; padding: 40px 20px 60px; } /* ── CONTROLS ── */ .controls { max-width: 680px; margin: 0 auto 32px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } .controls label { font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); font-weight: 500; } .controls input[type="number"] { width: 72px; padding: 8px 12px; border: 1.5px solid var(--gold); border-radius: 6px; background: var(--parchment); font-family: 'Playfair Display', serif; font-size: 16px; color: var(--ink); text-align: center; } .controls input[type="date"] { padding: 8px 12px; border: 1.5px solid var(--line); border-radius: 6px; background: var(--parchment); font-family: 'Inter', sans-serif; font-size: 13px; color: var(--ink); } .btn { padding: 9px 20px; border-radius: 6px; border: none; cursor: pointer; font-size: 13px; font-weight: 500; letter-spacing: .04em; transition: opacity .15s; } .btn:hover { opacity: .82; } .btn-gold { background: var(--gold); color: white; } .btn-ink { background: var(--ink); color: var(--parchment); } .btn-sage { background: var(--sage); color: white; } .btn-outline { background: transparent; border: 1.5px solid var(--ink); color: var(--ink); } /* ── PAGE ── */ .page { max-width: 680px; margin: 0 auto 48px; background: var(--parchment); border-radius: 3px; box-shadow: 0 2px 24px rgba(0,0,0,.10), 0 0 0 1px rgba(0,0,0,.04); overflow: hidden; } /* ── HEADER ── */ .page-header { background: var(--ink); color: var(--parchment); padding: 36px 44px 28px; position: relative; overflow: hidden; } .page-header::after { content: ''; position: absolute; right: -20px; top: -20px; width: 160px; height: 160px; border-radius: 50%; background: rgba(201,146,42,.13); } .day-eyebrow { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--gold); font-weight: 500; margin-bottom: 8px; } .day-number { font-family: 'Playfair Display', serif; font-size: clamp(52px, 12vw, 80px); font-weight: 700; line-height: .95; color: var(--parchment); letter-spacing: -.02em; } .day-number span { font-size: .38em; font-weight: 400; color: rgba(245,239,224,.45); letter-spacing: .04em; } .header-meta { display: flex; justify-content: space-between; align-items: flex-end; margin-top: 18px; gap: 16px; flex-wrap: wrap; } .header-date { font-size: 13px; color: rgba(245,239,224,.6); font-weight: 300; } .header-roles { font-size: 10.5px; letter-spacing: .10em; text-transform: uppercase; color: rgba(245,239,224,.38); font-weight: 400; text-align: right; line-height: 1.7; } /* ── BODY ── */ .page-body { padding: 36px 44px 40px; } /* ── SECTION ── */ .section { margin-bottom: 28px; } .section-label { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; font-weight: 600; color: var(--gold); margin-bottom: 6px; display: flex; align-items: center; gap: 8px; } .section-label::after { content: ''; flex: 1; height: 1px; background: var(--line); } .section-prompt { font-family: 'Playfair Display', serif; font-size: 14.5px; font-style: italic; color: var(--muted); margin-bottom: 10px; line-height: 1.5; } .write-lines { display: flex; flex-direction: column; gap: 0; } .write-line { border: none; border-bottom: 1px solid var(--line); background: transparent; padding: 10px 2px; font-family: 'Inter', sans-serif; font-size: 13.5px; color: var(--ink); width: 100%; resize: none; line-height: 1.6; outline: none; transition: border-color .2s; } .write-line:focus { border-bottom-color: var(--gold); } /* ── DIVIDER ── */ .ornament-divider { text-align: center; margin: 28px 0; color: var(--gold); font-size: 18px; letter-spacing: .4em; opacity: .55; } /* ── INTENTIONS GRID ── */ .intentions-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; margin-top: 10px; } .intention-card { background: rgba(26,26,46,.04); border-radius: 6px; padding: 12px 14px; } .intention-role { font-size: 9px; letter-spacing: .12em; text-transform: uppercase; color: var(--blush); font-weight: 600; margin-bottom: 6px; } .intention-role-input { border: none; border-bottom: 1px dashed var(--blush); background: transparent; width: 100%; font-family: 'Inter', sans-serif; font-size: 9px; letter-spacing: .12em; text-transform: uppercase; font-weight: 600; color: var(--blush); padding: 2px 0 4px; margin-bottom: 6px; outline: none; transition: border-color .2s; } .intention-role-input:focus { border-bottom-color: var(--gold); color: var(--ink); } .intention-role-input::placeholder { color: rgba(212,150,122,.45); } .intention-input { border: none; border-bottom: 1px solid var(--line); background: transparent; width: 100%; font-family: 'Inter', sans-serif; font-size: 12.5px; color: var(--ink); padding: 4px 0; outline: none; transition: border-color .2s; } .intention-input:focus { border-bottom-color: var(--gold); } /* ── GRATITUDE ── */ .gratitude-row { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; } .g-num { font-family: 'Playfair Display', serif; font-size: 18px; color: var(--sage); font-style: italic; min-width: 18px; } /* ── AFFIRMATION ── */ .affirmation-box { background: linear-gradient(135deg, rgba(201,146,42,.08), rgba(138,175,142,.08)); border-left: 3px solid var(--gold); border-radius: 0 6px 6px 0; padding: 14px 18px; margin-top: 10px; } .affirmation-input { width: 100%; border: none; background: transparent; font-family: 'Playfair Display', serif; font-size: 15px; font-style: italic; color: var(--ink); outline: none; line-height: 1.6; resize: none; min-height: 52px; } /* ── REALITY CHECK ── */ .reality-block { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 10px; } .reality-col label { font-size: 10px; letter-spacing: .10em; text-transform: uppercase; color: var(--muted); font-weight: 500; display: block; margin-bottom: 8px; } /* ── EVENING CLOSE ── */ .close-meter { display: flex; align-items: center; gap: 10px; margin-top: 10px; margin-bottom: 6px; } .meter-label { font-size: 12px; color: var(--muted); min-width: 110px; } .meter-dots { display: flex; gap: 6px; } .meter-dot { width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid var(--line); background: transparent; cursor: pointer; transition: background .15s, border-color .15s; } .meter-dot.filled { background: var(--gold); border-color: var(--gold); } /* ── FOOTER ── */ .page-footer { border-top: 1px solid var(--line); padding: 16px 44px; display: flex; justify-content: space-between; align-items: center; font-size: 10.5px; letter-spacing: .08em; color: rgba(26,26,46,.3); } .page-footer .progress-bar-wrap { flex: 1; max-width: 120px; height: 3px; background: var(--line); border-radius: 2px; margin: 0 16px; overflow: hidden; } .progress-bar-fill { height: 100%; background: var(--gold); border-radius: 2px; transition: width .4s ease; } /* ── SECTION HEADER alt ── */ .alt-section-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; } .alt-section-icon { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 13px; flex-shrink: 0; } .icon-gold { background: rgba(201,146,42,.15); } .icon-sage { background: rgba(138,175,142,.18); } .icon-blush { background: rgba(212,150,122,.15); } .alt-section-title { font-size: 10px; letter-spacing: .14em; text-transform: uppercase; font-weight: 600; color: var(--gold); } .spacer { height: 8px; }</style></head><body><!-- CONTROLS --><div class="controls no-print"> <label>Day</label> <input type="number" id="dayInput" min="1" max="100" value="1"> <label>Date</label> <input type="date" id="dateInput"> <button class="btn btn-gold" onclick="updatePage()">Update</button> <button class="btn btn-ink" onclick="window.print()">🖨 Print</button> <button class="btn btn-sage" onclick="saveFile()">💾 Save File</button> <button class="btn btn-outline" onclick="clearPage()">Clear</button></div><!-- PAGE --><div class="page" id="journalPage"> <!-- HEADER --> <div class="page-header"> <div class="day-eyebrow">Creating My Reality · 100 Days</div> <div class="day-number" id="dayDisplay"> 001 <span>/ 100</span> </div> <div class="header-meta"> <div class="header-date" id="dateDisplay">— — —</div> <div class="header-roles">Creating My Reality · One Day at a Time<br>Germany · 2026</div> </div> </div> <!-- BODY --> <div class="page-body"> <!-- MORNING INTENTION --> <div class="section"> <div class="section-label">Morning Word</div> <div class="section-prompt">One word that will define how I show up today.</div> <input class="write-line" type="text" placeholder="e.g. Focused · Bold · Grounded · Expansive"> </div> <!-- GRATITUDE --> <div class="section"> <div class="section-label">Gratitude</div> <div class="section-prompt">Three things I am grateful for, right now, in this life I am building.</div> <div class="gratitude-row"><span class="g-num">1.</span><input class="write-line" type="text" style="flex:1"></div> <div class="gratitude-row"><span class="g-num">2.</span><input class="write-line" type="text" style="flex:1"></div> <div class="gratitude-row"><span class="g-num">3.</span><input class="write-line" type="text" style="flex:1"></div> </div> <div class="ornament-divider">· · ·</div> <!-- VISION --> <div class="section"> <div class="section-label">My Reality — Present Tense</div> <div class="section-prompt">I write as if it is already true. I describe the life I am stepping into.</div> <textarea class="write-line" rows="4" placeholder="I am living in Germany with ease and joy. My work creates real impact. I write and people are moved. My investments grow steadily. My marriage is a sanctuary..."></textarea> </div> <!-- INTENTIONS BY ROLE --> <div class="section"> <div class="section-label">Today's Intentions by Role</div> <div class="section-prompt">One meaningful action for each part of me.</div> <div class="intentions-grid"> <div class="intention-card"> <input class="intention-role-input" type="text" placeholder="My role…"> <input class="intention-input" type="text" placeholder="Today I will..."> </div> <div class="intention-card"> <input class="intention-role-input" type="text" placeholder="My role…"> <input class="intention-input" type="text" placeholder="Today I will..."> </div> <div class="intention-card"> <input class="intention-role-input" type="text" placeholder="My role…"> <input class="intention-input" type="text" placeholder="Today I will..."> </div> <div class="intention-card"> <input class="intention-role-input" type="text" placeholder="My role…"> <input class="intention-input" type="text" placeholder="Today I will..."> </div> <div class="intention-card"> <input class="intention-role-input" type="text" placeholder="My role…"> <input class="intention-input" type="text" placeholder="Today I will..."> </div> <div class="intention-card"> <input class="intention-role-input" type="text" placeholder="My role…"> <input class="intention-input" type="text" placeholder="Today I will..."> </div> <div class="intention-card"> <input class="intention-role-input" type="text" placeholder="My role…"> <input class="intention-input" type="text" placeholder="Today I will..."> </div> </div> </div> <div class="ornament-divider">· · ·</div> <!-- AFFIRMATION --> <div class="section"> <div class="section-label">I Am Statement</div> <div class="section-prompt">My identity declaration for today. I write it, I feel it, I become it.</div> <div class="affirmation-box"> <textarea class="affirmation-input" rows="2" placeholder="I am a woman who creates with intention. I belong in every room I enter. I am building something that lasts..."></textarea> </div> </div> <!-- FOCUS --> <div class="section"> <div class="reality-block"> <div class="reality-col"> <label>My #1 Priority Today</label> <textarea class="write-line" rows="3" placeholder="The one thing that, if done, makes today a success..."></textarea> </div> <div class="reality-col"> <label>What I'm Releasing</label> <textarea class="write-line" rows="3" placeholder="A belief, fear, or habit I no longer need to carry..."></textarea> </div> </div> </div> <div class="ornament-divider">· · ·</div> <!-- GERMANY / LIFE CHAPTER --> <div class="section"> <div class="section-label">My Chapter in Germany</div> <div class="section-prompt">One small or large thing I did today that moved me closer to the life I am creating here.</div> <textarea class="write-line" rows="3" placeholder="Language practice, a connection made, a boundary held, a dream written down..."></textarea> </div> <!-- EVENING REFLECTION --> <div class="section"> <div class="section-label">Evening Reflection</div> <div class="section-prompt">Before I close this day — what showed up for me?</div> <div class="close-meter"> <div class="meter-label">Alignment today</div> <div class="meter-dots" id="alignDots"> <div class="meter-dot" onclick="toggleDot('alignDots',0)" title="1"></div> <div class="meter-dot" onclick="toggleDot('alignDots',1)" title="2"></div> <div class="meter-dot" onclick="toggleDot('alignDots',2)" title="3"></div> <div class="meter-dot" onclick="toggleDot('alignDots',3)" title="4"></div> <div class="meter-dot" onclick="toggleDot('alignDots',4)" title="5"></div> </div> <span style="font-size:11px;color:var(--muted)">1 — 5</span> </div> <div class="close-meter"> <div class="meter-label">Energy level</div> <div class="meter-dots" id="energyDots"> <div class="meter-dot" onclick="toggleDot('energyDots',0)"></div> <div class="meter-dot" onclick="toggleDot('energyDots',1)"></div> <div class="meter-dot" onclick="toggleDot('energyDots',2)"></div> <div class="meter-dot" onclick="toggleDot('energyDots',3)"></div> <div class="meter-dot" onclick="toggleDot('energyDots',4)"></div> </div> <span style="font-size:11px;color:var(--muted)">1 — 5</span> </div> <div class="spacer"></div> <div class="section-prompt" style="margin-bottom:6px;">What I want to carry into tomorrow:</div> <textarea class="write-line" rows="2" placeholder="A lesson, a feeling, a moment I want to remember..."></textarea> </div> <!-- CLOSING WORD --> <div class="section"> <div class="section-label">I Close This Day By Saying</div> <div class="affirmation-box" style="border-left-color: var(--sage)"> <textarea class="affirmation-input" rows="2" placeholder="Thank you for this day. I trust the process. I am becoming..."></textarea> </div> </div> </div><!-- /page-body --> <!-- FOOTER --> <div class="page-footer"> <span id="footerDay">Day 1</span> <div class="progress-bar-wrap"> <div class="progress-bar-fill" id="progressFill" style="width:1%"></div> </div> <span>100 Days · Creating My Reality</span> </div></div><!-- /page --><script> // Set today's date as default const today = new Date(); const yyyy = today.getFullYear(); const mm = String(today.getMonth()+1).padStart(2,'0'); const dd = String(today.getDate()).padStart(2,'0'); document.getElementById('dateInput').value = `${yyyy}-${mm}-${dd}`; updatePage(); function updatePage() { const day = parseInt(document.getElementById('dayInput').value) || 1; const dateVal = document.getElementById('dateInput').value; // Day display const padded = String(day).padStart(3,'0'); document.getElementById('dayDisplay').innerHTML = `${padded} <span>/ 100</span>`; document.getElementById('footerDay').textContent = `Day ${day}`; // Progress bar const pct = Math.max(1, (day/100)*100); document.getElementById('progressFill').style.width = pct + '%'; // Date display if (dateVal) { const d = new Date(dateVal + 'T00:00:00'); const opts = { weekday:'long', year:'numeric', month:'long', day:'numeric' }; document.getElementById('dateDisplay').textContent = d.toLocaleDateString('en-GB', opts); } } function clearPage() { if (!confirm('Clear all written content on this page?')) return; document.querySelectorAll('input[type="text"], textarea').forEach(el => el.value = ''); document.querySelectorAll('.meter-dot').forEach(d => d.classList.remove('filled')); } function toggleDot(groupId, index) { const dots = document.querySelectorAll(`#${groupId} .meter-dot`); dots.forEach((d, i) => { d.classList.toggle('filled', i <= index); }); } function saveFile() { const day = parseInt(document.getElementById('dayInput').value) || 1; const dateVal = document.getElementById('dateInput').value; const padded = String(day).padStart(3, '0'); // Clone the full document HTML const clone = document.documentElement.cloneNode(true); // Bake in current input values const liveInputs = document.querySelectorAll('input, textarea'); const cloneInputs = clone.querySelectorAll('input, textarea'); liveInputs.forEach((el, i) => { const cl = cloneInputs[i]; if (!cl) return; if (el.type === 'checkbox' || el.type === 'radio') { cl.checked = el.checked; } else { cl.setAttribute('value', el.value); if (el.tagName === 'TEXTAREA') cl.textContent = el.value; } }); // Bake in filled meter dots const liveDots = document.querySelectorAll('.meter-dot'); const cloneDots = clone.querySelectorAll('.meter-dot'); liveDots.forEach((d, i) => { if (d.classList.contains('filled')) cloneDots[i].classList.add('filled'); }); // Bake in progress bar width const fillPct = document.getElementById('progressFill').style.width; clone.querySelector('#progressFill').style.width = fillPct; // Bake in displayed day and date text clone.querySelector('#dayDisplay').innerHTML = `${padded} <span>/ 100</span>`; clone.querySelector('#footerDay').textContent = `Day ${day}`; const dateEl = document.getElementById('dateDisplay'); clone.querySelector('#dateDisplay').textContent = dateEl.textContent; // Hide controls in the saved file const controlsEl = clone.querySelector('.controls'); if (controlsEl) controlsEl.style.display = 'none'; // Remove the save/print script block so saved file is static clone.querySelectorAll('script').forEach(s => s.remove()); const html = '<!DOCTYPE html>\n' + clone.outerHTML; const blob = new Blob([html], { type: 'text/html' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `journal-day-${padded}.html`; a.click(); URL.revokeObjectURL(url); }</script></body></html>
