Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false
7 changes: 7 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
open-pull-requests-limit: 5
38 changes: 38 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: CI

on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
checks:
name: Static site checks
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Setup Node
uses: actions/setup-node@v7
with:
node-version: 22
- name: JavaScript syntax check
run: node --check app.js
- name: HTML validation
run: npx --yes html-validate@11.16.2 index.html
- name: Required assets exist
run: |
status=0
for f in index.html styles.css app.js .nojekyll; do
if [ ! -f "$f" ]; then echo "::error::missing required file: $f"; status=1; fi
done
exit $status
9 changes: 5 additions & 4 deletions .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Setup Pages
uses: actions/configure-pages@v5
uses: actions/configure-pages@v6
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
uses: actions/upload-pages-artifact@v5
with:
path: .
include-hidden-files: true
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5
26 changes: 13 additions & 13 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
Expand All @@ -20,14 +20,14 @@
</a>
<p class="sidebar-kicker">A calmer way to remember<br>what is still in motion.</p>
<nav class="nav" aria-label="Main navigation">
<button class="nav-item is-active" data-view="all"><span class="nav-icon">◌</span>All follow-ups <span class="nav-count" id="all-count">0</span></button>
<button class="nav-item" data-view="due"><span class="nav-icon">◷</span>Due soon <span class="nav-count" id="due-count">0</span></button>
<button class="nav-item" data-view="waiting"><span class="nav-icon">○</span>Waiting on others <span class="nav-count" id="waiting-count">0</span></button>
<button class="nav-item" data-view="done"><span class="nav-icon">✓</span>Closed loop <span class="nav-count" id="done-count">0</span></button>
<button class="nav-item is-active" data-view="all" type="button"><span class="nav-icon">◌</span>All follow-ups <span class="nav-count" id="all-count">0</span></button>
<button class="nav-item" data-view="due" type="button"><span class="nav-icon">◷</span>Due soon <span class="nav-count" id="due-count">0</span></button>
<button class="nav-item" data-view="waiting" type="button"><span class="nav-icon">○</span>Waiting on others <span class="nav-count" id="waiting-count">0</span></button>
<button class="nav-item" data-view="done" type="button"><span class="nav-icon">✓</span>Closed loop <span class="nav-count" id="done-count">0</span></button>
</nav>
<div class="sidebar-bottom">
<div class="privacy-note"><span class="lock-icon">⌑</span><div><strong>Private by default</strong><p>Your board stays in this browser.</p></div></div>
<div class="sidebar-actions"><button class="text-button" id="export-button">Export</button><button class="text-button" id="import-button">Import</button><input type="file" id="import-input" accept="application/json" hidden></div>
<div class="sidebar-actions"><button class="text-button" id="export-button" type="button">Export</button><button class="text-button" id="import-button" type="button">Import</button><input type="file" id="import-input" accept="application/json" hidden></div>
<p class="version">NUDGEBOARD / 01</p>
</div>
</aside>
Expand All @@ -40,15 +40,15 @@

<section class="hero">
<div><p class="eyebrow">Your open loops</p><h1>Keep the loop<br><em>moving.</em></h1></div>
<div class="hero-copy"><p>Capture the things you are waiting on, then give them a gentle next nudge. Less mental juggling. More forward motion.</p><button class="primary-button" id="add-button"><span>+</span> Add a follow-up</button></div>
<div class="hero-copy"><p>Capture the things you are waiting on, then give them a gentle next nudge. Less mental juggling. More forward motion.</p><button class="primary-button" id="add-button" type="button"><span>+</span> Add a follow-up</button></div>
</section>

<section class="board-section" aria-label="Follow-ups">
<div class="section-heading"><div><h2 id="view-title">All follow-ups</h2><p id="view-subtitle">Everything still in motion.</p></div><div class="board-tools"><label class="search-box"><span aria-hidden="true">⌕</span><input id="search-input" type="search" placeholder="Search follow-ups" aria-label="Search follow-ups"><button class="clear-search" id="clear-search" type="button" aria-label="Clear search" hidden>×</button></label><button class="filter-button" id="filter-button" type="button" aria-expanded="false">Filter <span id="filter-label">all</span> <span aria-hidden="true">⌄</span></button></div></div>
<div class="filter-menu" id="filter-menu" hidden><button data-filter="all" class="is-selected">All types</button><button data-filter="people">People</button><button data-filter="work">Work</button><button data-filter="life">Life admin</button></div>
<div class="section-heading"><div><h2 id="view-title">All follow-ups</h2><p id="view-subtitle">Everything still in motion.</p></div><div class="board-tools"><div class="search-box"><span aria-hidden="true">⌕</span><input id="search-input" type="search" placeholder="Search follow-ups" aria-label="Search follow-ups"><button class="clear-search" id="clear-search" type="button" aria-label="Clear search" hidden>×</button></div><button class="filter-button" id="filter-button" type="button" aria-expanded="false">Filter <span id="filter-label">all</span> <span aria-hidden="true">⌄</span></button></div></div>
<div class="filter-menu" id="filter-menu" hidden><button type="button" data-filter="all" class="is-selected">All types</button><button type="button" data-filter="people">People</button><button type="button" data-filter="work">Work</button><button type="button" data-filter="life">Life admin</button></div>
<div class="list-header"><span>FOLLOW-UP</span><span>NEXT NUDGE</span><span>STATUS</span><span></span></div>
<div class="follow-up-list" id="follow-up-list"></div>
<div class="empty-state" id="empty-state" hidden><div class="empty-icon">↗</div><h3 id="empty-title">Start with one open loop.</h3><p id="empty-copy">Capture the next reply, decision, or errand you do not want to keep carrying in your head.</p><button class="secondary-button" id="empty-add-button">Add a follow-up</button></div>
<div class="empty-state" id="empty-state" hidden><div class="empty-icon">↗</div><h3 id="empty-title">Start with one open loop.</h3><p id="empty-copy">Capture the next reply, decision, or errand you do not want to keep carrying in your head.</p><button class="secondary-button" id="empty-add-button" type="button">Add a follow-up</button></div>
</section>
<footer class="main-footer"><span>Made for the things that fall between the cracks.</span><span><kbd>N</kbd> new follow-up</span></footer>
</main>
Expand All @@ -57,9 +57,9 @@
<dialog class="modal" id="follow-up-modal">
<form method="dialog" id="follow-up-form">
<div class="modal-header"><div><p class="eyebrow" id="modal-eyebrow">New open loop</p><h2 id="modal-title">Add a follow-up</h2></div><button class="close-button" id="close-modal" type="button" aria-label="Close">×</button></div>
<label class="field-label" for="title-input">What are you waiting on?<input id="title-input" name="title" required maxlength="100" placeholder="e.g. Jamie to send the revised quote"></label>
<div class="form-grid"><label class="field-label" for="person-input">Person or place<input id="person-input" name="person" maxlength="60" placeholder="e.g. Jamie · Acme Co."></label><label class="field-label" for="date-input">Nudge on<input id="date-input" name="date" type="date" required></label></div>
<div class="form-grid"><label class="field-label" for="category-input">Area<select id="category-input" name="category"><option value="people">People</option><option value="work">Work</option><option value="life">Life admin</option></select></label><label class="field-label" for="note-input">Context <span>(optional)</span><input id="note-input" name="note" maxlength="120" placeholder="What is the next small move?"></label></div>
<label class="field-label">What are you waiting on?<input id="title-input" name="title" type="text" required maxlength="100" placeholder="e.g. Jamie to send the revised quote"></label>
<div class="form-grid"><label class="field-label">Person or place<input id="person-input" name="person" type="text" maxlength="60" placeholder="e.g. Jamie · Acme Co."></label><label class="field-label">Nudge on<input id="date-input" name="date" type="date" required></label></div>
<div class="form-grid"><label class="field-label">Area<select id="category-input" name="category"><option value="people">People</option><option value="work">Work</option><option value="life">Life admin</option></select></label><label class="field-label">Context <span>(optional)</span><input id="note-input" name="note" type="text" maxlength="120" placeholder="What is the next small move?"></label></div>
<div class="modal-actions"><button class="secondary-button" id="cancel-modal" type="button">Cancel</button><button class="primary-button" id="save-button" type="submit">Save follow-up</button></div>
</form>
</dialog>
Expand Down
Loading