Skip to main content

max / balanced_breakfast

8.5 KB · 164 lines History Blame Raw
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
6 <title>Balanced Breakfast</title>
7 <!-- Cascade layer order, declared before any stylesheet so it is a
8 statement rather than an accident of link order. A layer's position is
9 fixed where its name is FIRST seen, so without this the two generated
10 files below would establish `makeover` simply by loading first, and
11 reordering the links would silently reorder the cascade.
12
13 Earlier in the list = lower priority. `makeover` is first because the
14 design system is what the app overrides, never the reverse. Unlayered
15 rules still beat every named layer, which is why styles.css works with
16 no layers of its own; the other three names are declared ahead of any
17 layer adoption here and are empty until then. Declaring an empty layer
18 costs nothing. -->
19 <style>@layer makeover, base, components, responsive;</style>
20
21 <!-- Generated from makeover-geometry, makeover-timing and makeover-webview
22 by src-tauri/build.rs, all into `@layer makeover`. The value sheets
23 first, so the stylesheet can read --gap-*, --step-* and --timing-* off
24 :root. -->
25 <!-- Typography first: it defines --font-mono and --font-sans, and its
26 @font-face rules are what start the faces downloading. -->
27 <link rel="stylesheet" href="css/typography.css">
28 <link rel="stylesheet" href="css/geometry.css">
29 <link rel="stylesheet" href="css/timing.css">
30 <link rel="stylesheet" href="css/layout.css">
31 <link rel="stylesheet" href="css/styles.css">
32 <link rel="stylesheet" href="css/shell.css">
33 <link rel="stylesheet" href="css/components.css">
34 <link rel="stylesheet" href="css/features.css">
35 <link rel="stylesheet" href="css/mobile.css">
36 <link rel="stylesheet" href="css/responsive.css">
37 </head>
38 <body>
39 <div id="app">
40 <!-- Header -->
41 <header class="header">
42 <div class="header-actions">
43 <label for="search-input" class="sr-only">Search items</label>
44 <input type="text" id="search-input" placeholder="Search... (/) | ? for help" class="field search-input">
45 <label for="sort-select" class="sr-only">Sort order</label>
46 <button id="unread-toggle" class="button button--sm" title="Show unread only (U)" aria-pressed="false">Unread</button>
47 <select id="sort-select" class="field" title="Sort order (S)">
48 <option value="chronological">Newest First</option>
49 <option value="score">By Score</option>
50 <option value="unread">Unread First</option>
51 <option value="starred">Starred First</option>
52 </select>
53 <button id="mark-all-read-btn" class="button button--sm" title="Mark all as read (Shift+A)">Mark All Read</button>
54 <button id="refresh-btn" class="button button--primary" title="Refresh all feeds (R)">Refresh</button>
55 <button id="add-feed-btn" class="button button--success" title="Add a new feed source">+ Add Feed</button>
56 <button id="help-btn" class="button button--sm" title="Keyboard shortcuts (?)" aria-label="Help">?</button>
57 <button id="settings-btn" class="button button--sm" title="Settings" aria-label="Settings">&#9881;</button>
58 </div>
59 </header>
60
61 <!-- Main content -->
62 <main class="main">
63 <!-- Sources sidebar -->
64 <aside class="sidebar">
65 <h2>Sources</h2>
66 <nav aria-label="Feed sources">
67 <ul id="sources-list" class="list well sources-list">
68 <li class="source-item active" data-source="">
69 <span class="source-name">All</span>
70 <span class="raised source-count">0</span>
71 </li>
72 </ul>
73 </nav>
74 <div id="saved-articles-btn" class="sidebar-saved" title="Saved Articles">
75 <span class="source-name">Saved Articles</span>
76 <span id="saved-count" class="raised source-count">0</span>
77 </div>
78 <div class="sidebar-footer">
79 <button id="sync-settings-btn" class="button button--sm" title="Cloud Sync Settings">Sync</button>
80 </div>
81 </aside>
82
83 <!-- Items list -->
84 <section class="items-panel">
85 <div id="mobile-search-bar" class="mobile-search-bar">
86 <input type="text" id="mobile-search-input" placeholder="Search..." class="field mobile-search-input">
87 <select id="mobile-sort-select" class="field mobile-sort-select">
88 <option value="chronological">Newest</option>
89 <option value="score">Score</option>
90 <option value="unread">Unread</option>
91 <option value="starred">Starred</option>
92 </select>
93 </div>
94 <ul id="items-list" class="list well items-list" aria-live="polite"></ul>
95 <div id="load-more" class="load-more" style="display: none;">
96 <button id="load-more-btn" class="button">Load More</button>
97 </div>
98 </section>
99
100 <!-- Item detail panel -->
101 <aside class="detail-panel" id="detail-panel">
102 <div class="detail-header">
103 <button id="save-detail" class="button button--sm" aria-label="Add to Reading List" title="Add to Reading List">Bookmark</button>
104 <button id="close-detail" class="button button--sm" aria-label="Close">&times;</button>
105 </div>
106 <article id="item-detail" class="item-detail"></article>
107 </aside>
108 </main>
109
110 <!-- Toast notifications -->
111 <div id="toast-container" class="toast-container" role="alert" aria-live="polite"></div>
112
113 <!-- Mobile tab bar -->
114 <nav id="mobile-tab-bar" class="mobile-tab-bar" role="tablist">
115 <button class="mobile-tab active" data-tab="feed" role="tab" aria-selected="true">Feed</button>
116 <button class="mobile-tab" data-tab="saved" role="tab" aria-selected="false">Reading List</button>
117 <button class="mobile-tab" data-tab="sources" role="tab" aria-selected="false">Sources</button>
118 <button class="mobile-tab mobile-tab-create" id="mobile-create-btn" aria-label="Add feed">+</button>
119 <button class="mobile-tab mobile-tab-more" id="mobile-more-btn">More</button>
120 </nav>
121 <div id="mobile-more-popover" class="mobile-more-popover">
122 <button data-action="settings">Settings</button>
123 <button data-action="sync">Sync</button>
124 <button data-action="import">Import OPML</button>
125 <button data-action="export">Export OPML</button>
126 <button data-action="shortcuts">Shortcuts</button>
127 </div>
128
129 <!-- Modal overlay -->
130 <div id="modal-overlay" class="modal-overlay">
131 <div class="modal-content" role="dialog" aria-modal="true" aria-labelledby="modal-title">
132 <div class="modal-header">
133 <h2 id="modal-title">Modal</h2>
134 <button id="close-modal" class="button button--sm" aria-label="Close">&times;</button>
135 </div>
136 <div id="modal-body" class="modal-body"></div>
137 </div>
138 </div>
139 </div>
140
141 <!-- Scripts in dependency order -->
142 <script src="js/bb.js"></script>
143 <script src="js/themes.js"></script>
144 <script src="js/utils.js"></script>
145 <script src="js/state.js"></script>
146 <script src="js/api.js"></script>
147 <script src="js/query-state.js"></script>
148 <script src="js/components.js"></script>
149 <script src="js/query-feeds.js"></script>
150 <script src="js/sources.js"></script>
151 <script src="js/items.js"></script>
152 <script src="js/detail.js"></script>
153 <script src="js/bookmarks.js"></script>
154 <script src="js/feeds.js"></script>
155 <script src="js/settings-sync.js"></script>
156 <script src="js/shared-updater.js"></script>
157 <script src="js/updater.js"></script>
158 <script src="js/navigation.js"></script>
159 <script src="js/touch.js"></script>
160 <script src="js/mobile.js"></script>
161 <script src="js/app.js"></script>
162 </body>
163 </html>
164