8383 color : var (--text );
8484 }
8585
86- ul {
87- list-style : none;
88- margin-bottom : 16px ;
86+ .features-grid {
87+ display : grid;
88+ grid-template-columns : 1fr 1fr ;
89+ gap : 16px ;
8990 }
9091
91- ul li {
92- padding : 6px 0 ;
93- padding-left : 20px ;
94- position : relative;
92+ .feature-tile {
93+ background : var (--surface );
94+ border : 1px solid var (--border );
95+ border-radius : 6px ;
96+ padding : 20px ;
97+ font-size : 0.9rem ;
9598 }
9699
97- ul li ::before {
98- content : '>' ;
99- position : absolute;
100- left : 0 ;
101- color : var (--accent );
102- font-weight : 700 ;
100+ @media (max-width : 600px ) {
101+ .features-grid {
102+ grid-template-columns : 1fr ;
103+ }
103104 }
104105
105106 /* Install block */
110111 padding : 16px 20px ;
111112 margin : 16px 0 ;
112113 font-size : 0.85rem ;
114+ position : relative;
115+ }
116+
117+ .copy-btn {
118+ position : absolute;
119+ top : 12px ;
120+ right : 12px ;
121+ background : none;
122+ border : 1px solid var (--border );
123+ border-radius : 4px ;
124+ color : var (--text-dim );
125+ font-family : inherit;
126+ font-size : 0.7rem ;
127+ padding : 5px 6px ;
128+ line-height : 0 ;
129+ display : flex;
130+ align-items : center;
131+ cursor : pointer;
132+ transition : color 0.2s , border-color 0.2s ;
133+ }
134+
135+ .copy-btn : hover {
136+ color : var (--accent );
137+ border-color : var (--accent );
138+ }
139+
140+ .copy-btn .copied {
141+ color : var (--green );
142+ border-color : var (--green );
113143 }
114144
115145 .install .label {
126156 color : var (--text-dim );
127157 }
128158
129- /* Keys */
130159 kbd {
131160 display : inline-block;
132- background : var (--surface );
161+ background : var (--bg );
133162 border : 1px solid var (--border );
134163 border-radius : 4px ;
135- padding : 2 px 8 px ;
164+ padding : 1 px 6 px ;
136165 font-family : inherit;
137166 font-size : 0.8rem ;
138167 color : var (--orange );
139168 }
140169
141- .keys-grid {
142- display : grid;
143- grid-template-columns : auto 1fr ;
144- gap : 8px 20px ;
145- align-items : center;
146- }
147-
148- .keys-grid .desc {
149- color : var (--text-dim );
150- }
151-
152170 /* Links */
153171 a {
154172 color : var (--accent );
@@ -196,50 +214,40 @@ <h1><span class="accent">calend</span><span class="accent2">archy</span></h1>
196214 < img src ="terminal.svg " alt ="Calendarchy terminal interface showing calendar grid, event panels, and event details " style ="width:100%;display:block;border-radius:8px; ">
197215 </ div >
198216
199- < section >
200- < h2 > Features</ h2 >
201- < ul >
202- < li > Google Calendar and iCloud Calendar in one view</ li >
203- < li > Month grid with day-by-day event browsing</ li >
204- < li > One-click join for Zoom, Google Meet, and Teams links</ li >
205- < li > Accept or decline events with a keystroke</ li >
206- < li > Offline-first with local event caching</ li >
207- < li > Zero-config Google sign-in via browser</ li >
208- < li > iCloud via app-specific password (CalDAV)</ li >
209- < li > Native macOS EventKit support for iCloud</ li >
210- </ ul >
211- </ section >
212-
213217 < section >
214218 < h2 > Install</ h2 >
215- < div class ="install ">
219+ < div class ="install " data-copy ="brew tap sovanesyan/tap && brew install calendarchy ">
220+ < button class ="copy-btn " onclick ="copyInstall(this) "> < svg width ="14 " height ="14 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 " stroke-linecap ="round " stroke-linejoin ="round "> < rect x ="9 " y ="9 " width ="13 " height ="13 " rx ="2 "/> < path d ="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1 "/> </ svg > </ button >
221+ < div class ="label "> macOS (Homebrew)</ div >
222+ < code > brew tap sovanesyan/tap</ code >
223+ < br > < code > brew install calendarchy</ code >
224+ </ div >
225+ < div class ="install " data-copy ="yay -S calendarchy-bin ">
226+ < button class ="copy-btn " onclick ="copyInstall(this) "> < svg width ="14 " height ="14 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 " stroke-linecap ="round " stroke-linejoin ="round "> < rect x ="9 " y ="9 " width ="13 " height ="13 " rx ="2 "/> < path d ="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1 "/> </ svg > </ button >
216227 < div class ="label "> Arch Linux (AUR)</ div >
217228 < code > yay -S calendarchy-bin</ code >
218229 </ div >
219- < div class ="install ">
230+ < div class ="install " data-copy ="git clone https://github.com/sovanesyan/calendarchy.git && cd calendarchy && cargo build --release ">
231+ < button class ="copy-btn " onclick ="copyInstall(this) "> < svg width ="14 " height ="14 " viewBox ="0 0 24 24 " fill ="none " stroke ="currentColor " stroke-width ="2 " stroke-linecap ="round " stroke-linejoin ="round "> < rect x ="9 " y ="9 " width ="13 " height ="13 " rx ="2 "/> < path d ="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1 "/> </ svg > </ button >
220232 < div class ="label "> From source</ div >
221233 < code > git clone https://github.com/sovanesyan/calendarchy.git</ code >
222234 < br > < code > cd calendarchy && cargo build --release</ code >
223235 </ div >
224236 </ section >
225237
226238 < section >
227- < h2 > Keyboard</ h2 >
228- < div class ="keys-grid ">
229- < kbd > h</ kbd > < span class ="desc "> Previous day</ span >
230- < kbd > l</ kbd > < span class ="desc "> Next day</ span >
231- < kbd > j</ kbd > < span class ="desc "> Next week</ span >
232- < kbd > k</ kbd > < span class ="desc "> Previous week</ span >
233- < kbd > t</ kbd > < span class ="desc "> Jump to today</ span >
234- < kbd > o</ kbd > < span class ="desc "> Open meeting link</ span >
235- < kbd > a</ kbd > < span class ="desc "> Accept event</ span >
236- < kbd > d</ kbd > < span class ="desc "> Decline event</ span >
237- < kbd > /</ kbd > < span class ="desc "> Search events</ span >
238- < kbd > S</ kbd > < span class ="desc "> Setup wizard</ span >
239- < kbd > q</ kbd > < span class ="desc "> Quit</ span >
239+ < h2 > Features</ h2 >
240+ < div class ="features-grid ">
241+ < div class ="feature-tile "> Two keystrokes to your next meeting — < kbd > ⌘⇧J</ kbd > / < kbd > Super⇧J</ kbd > to open, < kbd > ⇧J</ kbd > to join</ div >
242+ < div class ="feature-tile "> Instant startup — events cached locally, syncs in the background</ div >
243+ < div class ="feature-tile "> Google Calendar + iCloud side by side in one view</ div >
244+ < div class ="feature-tile "> Accept, decline, or RSVP without leaving the terminal</ div >
245+ < div class ="feature-tile "> Weekly availability heatmap — see your free time at a glance</ div >
246+ < div class ="feature-tile "> macOS and Linux — EventKit, CalDAV, or both</ div >
240247 </ div >
241248 </ section >
242249
250+
243251 < section >
244252 < h2 > Source</ h2 >
245253 < p >
@@ -258,5 +266,16 @@ <h2>Source</h2>
258266 </ footer >
259267</ div >
260268
269+ < script >
270+ function copyInstall ( btn ) {
271+ const text = btn . parentElement . dataset . copy ;
272+ const icon = btn . innerHTML ;
273+ navigator . clipboard . writeText ( text ) . then ( ( ) => {
274+ btn . innerHTML = '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>' ;
275+ btn . classList . add ( 'copied' ) ;
276+ setTimeout ( ( ) => { btn . innerHTML = icon ; btn . classList . remove ( 'copied' ) ; } , 1500 ) ;
277+ } ) ;
278+ }
279+ </ script >
261280</ body >
262281</ html >
0 commit comments