source: Klonkt/src/views/pages/ward.ejs@ 5412cbb

Last change on this file since 5412cbb was 5412cbb, checked in by Robin <roboburr@โ€ฆ>, 3 months ago

Ward-PWA: de (+) voor een nieuw gesprek

De hemel toont alleen met wie je al sprak; de (+) is de deur naar de
rest. Hij zit op de OORSPRONG van het veld en pant en zoomt met de
gezichten mee, zodat hij altijd het midden van de vliegende avatars is,
waar de hemel ook heen drijft. Precies waar de plaatsing bewust ruimte
vrijhoudt: elk gezicht hangt minstens 1.4 cel naar buiten.

De tik kiest eerst een gezicht en pas daarna de (+), met een raakzone
die meeschaalt met de zoom. De kiezer erachter toont iedereen met een
volgrelatie, welke kant op dan ook: dezelfde bron als de Connect-pagina
(listConnections), want de vraag is dezelfde. Kies iemand en het lege
gesprek opent gewoon; het eerste bericht maakt het echt.

Changed files:
src/routes/ward.js

  • /api/friends: following + followers samengevoegd, met naam en icoon

src/assets/js/ward-sky.js

  • de (+) getekend op de veldoorsprong; onNew naast onPick

src/assets/js/ward.js

  • de vriendenkiezer, die doorvalt in openThread

src/views/pages/ward.ejs + src/assets/css/ward.css

  • de kiezer als dialoog

src/services/i18n.js

  • twee sleutels in nl, en, de

test/ward-pwa.test.js

  • beide richtingen zijn een deur, en elke deur heeft een naam

remarks: 899 tests groen.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@โ€ฆ>

  • Property mode set to 100644
File size: 4.9 KB
RevLineย 
[303bfc4]1<!DOCTYPE html>
2<html lang="<%= lang %>">
3<head>
4 <meta charset="utf-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6 <title><%= state.strings.title %></title>
7 <link rel="manifest" href="/ward/manifest.webmanifest">
8 <link rel="icon" href="/ward/icon.svg" type="image/svg+xml">
9 <meta name="theme-color" content="#5a32e6">
10 <link rel="stylesheet" href="/ward/app.css">
11</head>
12<body>
[084b046]13 <!-- De hemel ligt ACHTER alles en draait altijd, ook in kaartenstand: de
14 kaarten vallen straks weg en dan is hij er gewoon nog, precies zoals in
15 Shaer. Aria-hidden want hij is decor tot je hem aanzet. -->
16 <canvas id="sky" aria-hidden="true"></canvas>
17
[303bfc4]18 <main id="app">
[084b046]19 <div class="topbar">
20 <h1><%= state.strings.title %></h1>
21 <button id="mode" type="button" aria-pressed="false"><%= state.strings.toSky %></button>
22 </div>
[303bfc4]23
24 <!-- De hulpknop staat BOVENAAN en niet onderaan bij de instellingen.
25 Als je hem nodig hebt, moet je niet hoeven zoeken. -->
26 <section class="help">
27 <button id="help-btn" type="button"><%= state.strings.help %></button>
28 <p class="hint" id="help-hint"></p>
29 </section>
30
[a5a6249]31 <section id="feed">
32 <h2><%= state.strings.feed %></h2>
33 <div class="cards" id="card-list"></div>
34 <p class="empty" id="feed-empty" hidden><%= state.strings.feedEmpty %></p>
35 </section>
36
[303bfc4]37 <section id="guardians">
38 <h2><%= state.strings.guardians %></h2>
39 <ul class="list" id="guardian-list"></ul>
40 <p class="empty" id="guardians-empty" hidden><%= state.strings.noGuardians %></p>
41 </section>
42
43 <section id="offers" hidden>
44 <h2><%= state.strings.offers %></h2>
45 <ul class="list" id="offer-list"></ul>
46 </section>
47
48 <section id="waiting" hidden>
49 <h2><%= state.strings.waiting %></h2>
50 <ul class="list" id="waiting-list"></ul>
51 </section>
52 </main>
53
[a5a6249]54 <!-- De reddingsboei zweeft boven de pagina en is sleepbaar, net als in
55 Shaer. Een knop, geen plaatje: dan werkt hij ook met een toetsenbord en
56 leest een schermlezer hem voor. -->
57 <button id="buoy" type="button" aria-describedby="buoy-hint">๐Ÿ›Ÿ</button>
58 <p id="buoy-hint" class="sr-only"><%= state.strings.buoyHint %></p>
59
[5218863]60 <!-- De zwaai-hand (ยง5): alleen in berichtenstand, dezelfde hoek als de
61 boei. Ze wisselen elkaar af: met de kaarten verdwijnt de boei, op de
62 hemel hangt de hand. -->
63 <button id="hand" type="button" hidden aria-describedby="hand-hint">๐Ÿ‘‹</button>
64 <p id="hand-hint" class="sr-only"><%= state.strings.handHint %></p>
65
66 <!-- Het gesprek schuift OVER de hemel; die blijft eronder gewoon draaien. -->
67 <section id="thread" hidden>
68 <header>
69 <button id="thread-close" type="button" aria-label="<%= state.strings.close %>">โ†</button>
70 <h2 id="thread-name"></h2>
71 </header>
72 <div id="thread-list"></div>
73 <form id="thread-form">
74 <input id="thread-text" type="text" autocomplete="off" maxlength="2000"
75 placeholder="<%= state.strings.writeHere %>">
76 <button type="submit" class="primary"><%= state.strings.send %></button>
77 </form>
78 </section>
79
[5412cbb]80 <!-- De vriendenkiezer achter de (+): aan wie wil je iets sturen? -->
81 <dialog id="friends-dialog">
82 <h2><%= state.strings.newTitle %></h2>
83 <ul id="friends-list" class="list"></ul>
84 <p class="empty" id="friends-empty" hidden><%= state.strings.noFriends %></p>
85 <button id="friends-cancel" type="button"><%= state.strings.cancel %></button>
86 </dialog>
87
[5218863]88 <!-- Het zwaai-paneel: de tekst die je kiest IS het bericht. -->
89 <dialog id="wave-dialog">
90 <h2 id="wave-title"></h2>
91 <div class="wave-answers">
92 <button data-wave="1">๐Ÿ‘‹ <%= state.strings.wave %></button>
93 <button data-text="<%= state.strings.waveCall %>"><%= state.strings.waveCall %></button>
94 <button data-text="<%= state.strings.waveThanks %>"><%= state.strings.waveThanks %></button>
95 </div>
96 <button id="wave-cancel" type="button"><%= state.strings.notNow %></button>
97 </dialog>
98
[a5a6249]99 <dialog id="help-dialog">
100 <form method="dialog">
101 <h2 id="help-title"></h2>
102 <label for="help-words"><%= state.strings.helpWords %></label>
103 <textarea id="help-words" rows="3" maxlength="500"></textarea>
104 <menu>
105 <button value="cancel"><%= state.strings.cancel %></button>
106 <button id="help-send" value="send" class="primary"><%= state.strings.helpSend %></button>
107 </menu>
108 </form>
109 </dialog>
110
[303bfc4]111 <!-- De begintoestand reist als JSON mee, zodat de pagina meteen compleet is
112 en niet eerst leeg staat te wachten op een fetch. Geen inline script:
113 CSP staat dat niet toe, dus het gaat als data door een script-tag met
114 een type dat de browser niet uitvoert. -->
115 <script type="application/json" id="ward-state"><%- JSON.stringify(state) %></script>
[084b046]116 <!-- Module, zodat app.js het hemelmodel kan importeren. -->
117 <script type="module" src="/ward/app.js"></script>
[303bfc4]118</body>
119</html>
Note: See TracBrowser for help on using the repository browser.