gitoriaLog in with ident

components

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Main branchmain3bc905c5components #15 (mission 003) 2/2: docs (README Look, STATUS, LOG), reportmremain/STATUS.md

28.7 KB

  1. # STATUS
  2. ## 2026-10-04 — mission 003 (#15): black/white base look — NOT deployed (report reports/003-black-white.md)
  3. Commits 5a98d77 (code, icons, gate, READMEs) + docs. Every component falls back to black/white + greys `#555 #999 #ddd #f2f2f2`
  4. (named once in `shared/base.hl`, README "Look"), no WorldAPI palette, no decorative frames (left: focus ring #555, today ring, dashed
  5. invalid field, dashed drop zone). Token names / elements / classes unchanged. Site light (white page, black header), declares no
  6. `--color-…` token; PWA theme #000 / background #fff; icon white blocks on black (PNGs + ico re-rendered).
  7. - Gate **230/0** (`COMPONENTS_GATE_PORT=8750 COMPONENTS_GATE_CHROME=8751-8759 node tests/browser.mjs`); the 10 new `base look:` checks
  8. fail on the old tree (13 FAIL incl. the PWA colour checks) → they bite. Screenshots `.scratch/gate-bw-*-{390,1280}.png` looked at.
  9. - layouts.worldapi.org re-synced (635234d): gate 73/0, check-theme 0, its screenshots pixel-identical.
  10. - md-editor fix: Chrome wrote `<strong style="color: rgb(0, 0, 0)">` once strong and text had the same colour → `inlineRule` strips
  11. `style` attributes from the surface after its insertHTML (gate "typing **x**" failed before).
  12. - **Deploy notes**: the icon changed (Cloudflare/PWA caches may show the old one for a while); old root `styles.hl` on Byrodin still to remove (mission 002).
  13. ## 2026-10-03 — mission 002: code order, no behaviour change — NOT deployed (report reports/002-code-order.md)
  14. Commits d29f35b (styles.hl → components/styles.hl), 172914a (lib/uploads.hl + thin demo handlers + project.hl map), e747cfa (`let`),
  15. + docs/tests. Root .hl 2 → 1; project.hl 81 → 89 lines (the map comment); `let` 471 → 213; never reassigned 255 → **0** (`python3 tests/letcount.py .`).
  16. - Gate 220/0 before and after each step (8750–8759). Layouts theme gate (code-only copy with these components) 73/0, check-theme 0.
  17. - Same output (`tests/same-output.mjs`, README "Test"): pages, DOMs, uploads, stored files identical; modules differ only in import
  18. tables / positions (step 2) and `var`→`const` (step 3).
  19. - **Deploy note**: deploy.sh's rsync does not delete → remove the old root `styles.hl` on Byrodin by hand after the next deploy.
  20. - **Lessons**: (1) unlet must keep a name declared twice in one METHOD too (md-editor: `j`, `inner`, `p`, `sel`, `b`; code-editor `at`) —
  21. letcount/unlet's old function finder only saw lambdas and `on`/`static`. (2) layouts.worldapi.org's copies of the components (80ce6ba) differed from 0994575 in 13
  22. `let out` → `out` lines, so they were not byte-verbatim; after a component change re-copy all of them.
  23. ## 2026-10-03 — antcolony mission 074: re-vendored Hybriel master 06617221 (plugin allocators, http1 773de63e) — NOT deployed by me
  24. `bin/hybriel` + the same nine `plugins/` (sha256 21059cc7…; old copy `.scratch/pre-074/` = 190aa11d). No app change. Gate **220/0**
  25. (8760–8769). Live storage copy (deleted), Chrome:
  26. - 200 loads + 100 uploads: new 185 → 204 → 414 MB; old 183 → 207 → 511 MB.
  27. - 20 loads + 400 uploads + 60 s idle: new 185 → 363/363/363/364 MB (every 100) → 364 MB — **uploads flat now** after a one-time
  28. step; old 462/564/646/752 MB (+1 MB per upload).
  29. - 2000 loads + 400 uploads: loads new 204/205/205/205 MB (every 500), uploads 416/403/403/403 MB; old 208 → 215, then 521 → 829 MB.
  30. - The 072 open point (uploads retain ~1.4 MB per MiB) is fixed.
  31. ## 2026-10-02 — antcolony mission 072: re-vendored Hybriel master 190aa11d (GC correctness fc838894, #127) — NOT deployed by me
  32. `bin/hybriel` + the same nine `plugins/` (sha256 860f5e61…; old copy `.scratch/pre-072/` = 8efba065). No app change. Gate **220/0**
  33. (`.scratch/w072/gate1.txt`). Live-storage copy: 200 loads new 182 → 205 MB (old 288 → 353 MB), 35 ms avg. **Open**: file uploads
  34. still keep ~1.4 MB per 1 MiB upload (400 uploads: new 185 → 751 MB, old 277 → 713 MB; nothing freed after 60 s idle) —
  35. slightly more than 8efba065's ~1.1; live uploads are rare (≤ 5 MiB), watch RSS. Candidate hybriel follow-up to #126.
  36. ## 2026-10-02 — antcolony mission 069: re-vendored Hybriel master 8efba065 (#126 memory, #48 lambda copy)
  37. `bin/hybriel` + `plugins/` (same nine) from master 8efba065 (sha256 231fb9f2…; old copy `.scratch/pre-069/`, master ff51cf46). No local patch, no app code change.
  38. Gate `COMPONENTS_GATE_PORT=8720 COMPONENTS_GATE_CHROME=8721-8729 node tests/browser.mjs` → 220 passed, 0 failed (`.scratch/w069/gate1.txt`).
  39. #48 audit: 5 lambdas (date-picker.hl:11, range-picker.hl:11, clock.hl:4 serverToday(); md-editor.hl:497 mark(tool, active) reads only; md-editor.hl:762 selectionchange ()) → none writes a parameter, nothing needs `&`. Probe `.scratch/w069/probe48.hl`: new `copy: n=1 len=0`, old `n=2 len=1`.
  40. Memory (live storage copy, port 8730; RSS MB old ff51cf46 → new): boot 492 → 288; after 200 page loads 1331 → 346; after 100 uploads of 1 MiB 2532 → 489; 5 s idle 2532 → 489. Long run (new): 1000 loads 318 (flat), +400 uploads 840 — page loads plateau, but each 1 MiB upload still keeps ~1.1–1.3 MB (200 uploads: 480 MB, unchanged after 60 s idle). Watch live RSS after uploads. Not deployed.
  41. ## 2026-10-01 — antcolony mission 048: re-vendored Hybriel master ff51cf46
  42. `bin/hybriel` + `plugins/` (same nine) from master ff51cf46 (old copy `.scratch/pre-048/`, master e6720b1f). No local patch.
  43. Gate `COMPONENTS_GATE_PORT=8750 COMPONENTS_GATE_CHROME=8751-8759 node tests/browser.mjs` → 220 passed, 0 failed (before and after the workaround change).
  44. Duplicate-@id check (#113): the live storage/ holds no tables (only md-files/ 5 + uploads/ 1 files, no mpackdb) → nothing to count.
  45. Workarounds: removed `static` from `serverToday` in date-picker.hl + range-picker.hl (plain lambda member; gate green; the old binary e6720b1f rendered the plain form too, so it was precaution, not a needed workaround; old pickers in
  46. `.scratch/pre-048/*.static`). Kept: `static serverToday` in month-view/clock.hl (an imported module helper, not a component member);
  47. modal demo's `paragraphs = longText()` (20 generated paragraphs, not a literal-list detour). No browser-built SVG in any component → no SVG check. Not deployed.
  48. ## 2026-10-01 — antcolony mission 046: installable app (PWA) + own icon
  49. Icon: three stacked building blocks with studs, green-light #b5cea8 on rgb(25,30,35) (`icons/icon.svg` → 192/512/180 PNG, `favicon.svg` + `favicon.ico`). `project.hl`: `appShortName` "Components", `appIcons`, `appTouchIcon`, `appFavicon`, theme = token `darker` (header), background `dark`, `offline = [ Index ]`, icon routes, `/favicon.ico` now a real file (was `direct = ""`). `components/main.hl` + `styles.hl`: offline note ("You are offline. The demos need the network.") via the `netProbe` tick, as tracker. README "PWA".
  50. Gate: `COMPONENTS_GATE_PORT=8720 COMPONENTS_GATE_CHROME=8721-8729 node tests/browser.mjs` → 220 passed, 0 failed (13 new pwa/offline checks; server stopped + CDP offline → `/` from the worker cache). Phone shots `.scratch/gate-pwa-phone-{online,offline}.png`. The site's CSS accent stays light blue; only the icon is green-light. Not deployed; not tested: a real install on a phone.
  51. ## 2026-09-30 — ticket #13: modal dialog (pure Hybriel, mission 001 (old 042))
  52. `components/modal/modal.hl` (ONE file, own `Style`, no `.js`) + `demo.hl` (`/modal`: four modals — info, confirm with footer, a form with `backdropClose = "false"`, long text) + README; home entry, routes, demo styles in styles.hl.
  53. Built on the browser's `<dialog>` + `showModal()` (page inert, focus in, focus back to the opener); the component adds Tab/Shift+Tab wrap (without it Tab reaches `<body>`), the reason, background click (only when the press also started there), `html:has(modal-dialog > dialog[open]) { overflow: hidden }`. Page opens/closes by id (`showModal()` / `close('reason')`); closing sends a BUBBLING `close` from `<modal-dialog>` with `e.detail = { id, reason }` (close / escape / backdrop / footer button value / the page's own). Several modals per page work because every attribute is a literal per reference; handlers read options from the DOM (`data-backdrop`), never from members.
  54. Gate: 207 passed, 0 failed (53 modal checks, at 1280 and 390 px, real mouse/keys via CDP; a mutation run without the scroll lock / Tab wrap / backdrop switch failed 16). Screenshots: `.scratch/gate-modal-{open,form,long,closed}-{1280,390}.png`. Not deployed; not tested: Firefox, Safari, touch, a modal inside a modal.
  55. Hybriel facts learned: a custom event name (`on modalclose`) is not bound (warning "not a standard DOM event", ticket #31) — use a standard name; a `for` over a LIST LITERAL in a View (`for (n of [1, 2])`) is an unlocated 500 (`view.hl:316:11 reading 'name'`) — loop over a member instead (repro reported by mission 001 (old 042)).
  56. ## 2026-09-26 — ticket #4: file upload, one file (pure Hybriel, rebuilt on hybriel#94)
  57. `components/file-upload/file-upload.hl` (ONE file, own `Style`, no `.js`) + `demo.hl` (`/file-upload`) + README; home entry and routes added. Choose or drop: name, size, progress (`on client uploadProgress`), then "Uploaded" and a list. The file goes through `emit server saveFile(file)`; the demo stores it in storage/uploads (random name, 24 h). One file at a time. The earlier parked build was not reused. Gate: 154 checks (drop 3 MB: progress to 100%, bytes stored; choose via input; no console errors). Not deployed; not tested: Firefox, a very large file.
  58. ## 2026-09-26 — ticket #12 (2nd fix: choose button, caret lost)
  59. The first fix missed the File button and a lost caret (the point sat at the surface end, not in the item). Now the block is put after the list as elements whenever the point is in a list or at the surface end after a list. Gate checks drop / paste / choose × caret in item / no caret: 147 passed, 0 failed. Not deployed.
  60. ## 2026-09-26 — ticket #12 (1st): a file added in a list item
  61. A file/image dropped, pasted or chosen with the caret inside a list item now lands as its own block after the list (before: glued to the item text, `- second![x.png](…)`). Gate: 142 passed, 0 failed. Not deployed.
  62. ## 2026-09-26 — ticket #9: files and images in the Markdown editor
  63. Drop / paste / "File" button (several files): `emit server mdUpload(files)` (hybriel#94, files over HTTP with progress), a progress row per
  64. file under the toolbar (`on client uploadProgress`), then `![name](url)` (images, drawn in the editor; only http(s) and `/path` src) or
  65. `[name](url)` at the drop point / caret. The app stores: demo.hl answers the face (storage/md-files, random name, known extensions only,
  66. 24 h, 5 MiB `uploadMax`) and project.hl serves `/md-editor/files/*` (nosniff + sandbox). No XHR/fetch in the component. Gate: 141 passed, 0 failed
  67. (3 dropped files → 2 images + link, progress to 100%, images load, pasted image, javascript:/data: image refused). Not deployed; on the live
  68. site storage/ persists (bind mount). Not tested: Firefox, touch, a real 1 GiB file.
  69. ## 2026-09-26 — antcolony mission 037: re-vendored Hybriel master e6720b1f
  70. `bin/hybriel` + `plugins/` from hybriel master e6720b1f (includes #103/#104, #105 f15a2f7f, #106, #94 c12065d8; old copy in
  71. `.scratch/pre-037/`). No local patch. Gate `node tests/browser.mjs`: 132 passed, 0 failed. Dev server (`~/scratch-037/hashcheck.sh
  72. components.hybriel.worldapi.org COMPONENTS /`, port 8720): `/__hl/hl-runtime.js?v=…`, `/__hl/web/client.js?v=…`, `/__hl/app.css?v=…`
  73. (immutable), bare `/__hl/app.css` → no-cache, 0 unhashed refs. Not deployed.
  74. ## 2026-09-26 — ticket #11: month view marks the visitor's today
  75. The browser's today (and language) was only read when a pointer/finger/key first reached the month view, so until then the server's UTC date was marked. Now the month view reads it at load (mount hook: 100 ms CSS animation, as in md-editor); touch/hover stay as a fallback. Gate now runs the browser in Pacific/Kiritimati (UTC+14, a day ahead of the server) and waits for today without any pointer. Gate: 132 passed, 0 failed. Not deployed.
  76. ## 2026-09-25 — ticket #10 (2nd fix): closers, and code is only text
  77. Typing a closer on the empty indented line between an auto-inserted pair (`if (x) {` Enter `}`) now closes it (`if (x) {\n}`), no doubled `}`. The code was already only ever text (surface built with `textContent`/text nodes, never as markup); new gate checks type `if (x) {` unclosed, `</div><b>x` and `<img src=x onerror=window.__pwned=1>`: page structure unchanged, text literal, `window.__pwned` undefined. Gate: 131 passed, 1 failed (`today is marked` — date check of the date picker, not this ticket). Not deployed.
  78. ## 2026-09-25 — ticket #10: code editor (pure Hybriel)
  79. `components/code-editor/code-editor.hl` (ONE file, own `Style`, no `.js`) + `demo.hl` (`/code-editor`: a Hybriel and a JS editor, the second with `spaces = 2`) + README; home entry and routes added.
  80. Port of custom-ide's CodeJar editor (renderer/vendor/codejar.js): one `contenteditable="plaintext-only"` surface, highlighted tokens as `<span class="tok-…">` (hybriel / js / plain: comments, strings, numbers, keywords, function names, Capitalised names), caret kept as text offsets across the repaint, line-number gutter, Tab / Shift+Tab (also on several selected lines), Enter keeps the indent (+ one level after `( [ {`, closer moves down), autoclose of brackets/quotes (with wrap and step-over), own undo/redo history (Ctrl+Z, Ctrl+Shift+Z / Ctrl+Y), paste as plain text. Value in a hidden `<input name>` + bubbling `input` event; mount hook = the 100 ms CSS animation of md-editor.
  81. Hybriel facts learned: `let h = root.list` COPIES a list held on a DOM element — mutate `root.list` in place; `from` is reserved (also as a parameter); Chrome shows a last empty line only when one more line feed follows, so the surface always carries one extra trailing `\n` that is stripped when read; `execCommand('insertText')` / CDP `Input.insertText` split lines into `<div>`s in plaintext-only, so paste is handled by the component.
  82. Not ported: search, minimap, breadcrumbs, change bars, read-only, drop handling (native), scrolling the caret into view after Enter at the bottom of a tall editor. Gate: 119 passed, 0 failed (real keys: highlight, numbers, Tab/Shift+Tab, Enter indent, autoclose, undo/redo, paste, form post, 390 px). Not deployed; not tested: Firefox, Safari, touch, IME.
  83. ## 2026-09-25 — ticket #8: Markdown WYSIWYG editor (pure Hybriel)
  84. `components/md-editor/md-editor.hl` (ONE file, own `Style`, no `.js`) + `demo.hl` (`/md-editor`, two editors) + README; home entry and routes added.
  85. Port of worldapi-components/md-editor.js: headings 1-6, paragraphs, lists, fenced code, `code`, links, *em*, **strong**; toolbar (B I <> Link H lists Block undo redo);
  86. typing rules (`# `, `- `, `1. `, closed `**x**` `*x*` `_x_` `` `x` ``, ``` + Enter); Ctrl+B/I/E/K, Ctrl+Alt+0-3/C, Ctrl+Shift+7/8, Ctrl+Enter, Backspace at block start;
  87. paste/drop read as Markdown (HTML pasted stays text); "Markdown source" switch; value in a hidden `<input name>` + bubbling `input` event; an untouched value is returned byte for byte.
  88. How: contenteditable surface built in handlers (createElement only), never re-rendered by the framework; mount hook = a 100 ms CSS animation whose `animationiteration` fires after hydration.
  89. Hybriel facts learned: plain lists are COPIED when passed to a function (a function must return its list); `parent` `set` `on` are reserved words; a `<form>` inside a form breaks hydration (`claim: no element for …`), so the link form is a plain element.
  90. Not ported: textarea "enhance" mode, disabled/readonly/toolbar="none", the `[text](url)` typing rule, per-block byte-for-byte spelling, MdEditor.markdown API; files/images = ticket #9. The form post turns LF into CRLF (HTML rule).
  91. Gate: 88 passed, 0 failed (real keys and clicks: typing rules, toolbar, undo, link form, javascript: refused, paste, source switch, form post, 390 px). Not deployed; not tested: Firefox, Safari, touch.
  92. ## 2026-09-25 — ticket #7 (2nd try): a copied component is styled without tokens
  93. Every colour in the four components' `Style` is now `var(--color-x, <palette value>)`: the palette value is the fallback, so a component
  94. copied into an app with no tokens still gets its colours; an app that imports `shared/tokens.hl` (and sets its accent) overrides them.
  95. Checked in a bare app (month-view.hl + clock.hl, empty styles file, no tokens): served css carries the component rules and the month view
  96. looks the same as on the site (screenshots compared by eye; page background/heading are the app's own). Gate: 57 passed, 0 failed. Not deployed.
  97. ## 2026-09-25 — ticket #7: every component carries its own Style
  98. month-view, date-picker, range-picker and pagination each have a `Style { }` in their file (scoped by the component's tag, colours as
  99. `var(--color-…)` semantic tokens, buttons styled inside the component). `styles.hl` keeps only the page layout (header, main, home list,
  100. global button). A component cannot import `shared/tokens.hl` (its `hl:web/css` import fails in a browser module), so tokens are
  101. written as css variables; the app's styles.hl must import the tokens. Gate: 57 passed, 0 failed. Not deployed.
  102. ## 2026-09-25 — antcolony mission 035: re-vendored Hybriel master 13ef4f9b
  103. `bin/hybriel` + `plugins/` from hybriel master 13ef4f9b (old copy in `.scratch/pre-035/`). No local patch existed or was needed.
  104. Gate `node tests/browser.mjs` (run with `COMPONENTS_GATE_PORT=8720 COMPONENTS_GATE_CHROME=8721-8729`): 72 passed, 0 failed
  105. before and after (also on 9d608332). Dev server: page links `/__hl/app.css?v=<hash>` (Cache-Control immutable); bare `/__hl/app.css` → no-cache.
  106. Not deployed (architect).
  107. **File uploads taken OFF the site** (creator: "the file upload still bypasses the framework using XMLHttpRequest"), until
  108. hybriel#94 (files through emit): routes `/file-upload`, `/file-upload/receive|received|README.md`, `/files-upload[/README.md]`,
  109. the two home entries, their styles and gate sections removed; `components/file-upload` + `components/files-upload` moved (not
  110. deleted) to `.scratch/pre-035/upload-parked/` (with the removed styles `styles-upload.hl.txt`, gate section
  111. `gate-upload-section.mjs.txt` and the pre-change sources in `src/`). New gate checks: home lists no upload, the four URLs 404,
  112. `grep -rE "XMLHttpRequest|fetch\(" components/` finds nothing. Gate: **57 passed, 0 failed**. Byrodin: deploy.sh has no
  113. --delete, so the old folders stay there unused (no route imports them).
  114. ## 2026-09-25 — ticket #2: a clicked day now lands in the field (live it stayed empty)
  115. Live, with a real mouse click, the day set the field's `value` attribute but the field showed nothing (the input's `value` property
  116. stayed empty); locally the same click worked, so the gate missed it. Cause: the fields were rows bound to `values`/`invalids`, and every
  117. pick re-assigned `rows`, which re-renders the inputs. Fix: `rows` is never re-assigned; a pick / typed text is written to the input
  118. element itself (`value`, `aria-invalid`) from the handler. The gate now moves the pointer first, holds the button 100 ms, and checks the
  119. input element is the same one after a pick. Gate: 72 passed, 0 failed. NOT reproducible locally (also not with 80 ms lag), so the live
  120. fix is unproven until deployed. Not tested: Firefox, Safari, touch.
  121. ## 2026-09-25 — ticket #2 reworked: date picker in pure Hybriel
  122. The creator's reason for "total fail" was hand-written .js. `date-picker.js` and its route are deleted; the date picker is ONE
  123. file, `components/date-picker/date-picker.hl`, built like the range picker (own month grid, focus-within popup, `Date`/`Intl` read
  124. in a View handler when a field gets focus). `DatePicker { names = "arrival,departure" }` makes one field per name, each posts by its
  125. name; the month arrows, typing, an impossible date (`aria-invalid`), Escape, and the form post are all covered. It no longer needs
  126. the month view component. Gate: 71 passed, 0 failed. No `.js` of this project's own is left in `components/`.
  127. Hybriel limits met: a View attribute cannot be a list literal or expression (so `names` is a string, row `hint` a field);
  128. a host cannot read the child's values (hybriel#87). Not tested: Firefox, Safari, touch.
  129. ## 2026-09-25 — ticket #1 reworked again: month view without any .js
  130. The real reason for "total fail" (creator, via the architect): the components were hand-written .js files. `month-view.js` is deleted
  131. (file, route, script tags). The browser's today and language now come from Hybriel handlers in `month-view.hl` (`Date`/`Intl` are browser
  132. globals of View handlers) — read once when the pointer, a finger or the keyboard first reaches the month view, or on the first click of
  133. ‹ ›; until then the server's UTC date and English names show (Hybriel has no mount event). The month view is on the home page and has
  134. its demo page. Gate: 69 passed, 0 failed. STILL hand-written .js: `components/date-picker/date-picker.js` (ticket #2, not this one).
  135. ## 2026-09-25 — ticket #4 reworked: file upload in pure Hybriel
  136. Rejected because the components "write fucking javascript files". `file-upload.js` and `demo.js` are deleted; the component is ONE
  137. `file-upload.hl` (drop, choose, XHR with real progress, list of uploaded files via optional `listUrl`). The `Uploaded` list moved
  138. into the component (a host cannot hear a child's emit, hybriel#87). Finding: writes made in an async callback (XHR progress/onload)
  139. are never painted — only a DOM event's handler repaints; workaround: the callback dispatches standard DOM events (`progress`, `load`)
  140. at elements whose handlers write the state. Gate: upload checks pass (drop, chosen file, list, no .js served, no console errors).
  141. ## 2026-09-25 — ticket #3 reworked: date range picker in pure Hybriel
  142. Rejected because the components "write fucking javascript files". The range picker is now ONE file, `components/range-picker/range-picker.hl`
  143. (month grid, state, clicks, typing, Escape — all Hybriel; `Date`/`Intl` are browser globals of the View handlers); `range-picker.js` is deleted,
  144. and it no longer needs the month view. The field has a `name` and posts in a form. The demo lost the start/end outputs (a host cannot read a
  145. child member, hybriel#87). Gate: 56 passed (real clicks, swap, 9 days between, typed range, invalid range, form post, no .js file).
  146. Learned: `aria-invalid = x` is parsed as a subtraction — write `'aria-invalid' = x`; an element's attributes and `on` handlers must sit
  147. on ONE line (a newline before `on` is a parse error).
  148. STILL hand-written `.js` (not part of this ticket): month-view.js, date-picker.js, file-upload — the same rework applies.
  149. ## 2026-09-25 — ticket #1 rework (rejected: "total fail")
  150. The ticket's test is "open the site: the month view is there" — it was only behind a click. The month view now sits at the top of the
  151. home page (`components/index.hl`), the component list below; the demo page `/month-view` stays. Gate: 49 passed, 0 failed.
  152. The creator gave no reason beyond "total fail", so this is my reading; the rest is unchanged.
  153. ## 2026-09-25 — ticket #2 reworked: date picker for input fields
  154. The first build was one hard-wired field (fixed id, no name, one per page) and was rejected ("total fail", no reason given).
  155. Now `DatePicker { }` is placed once and EVERY `input.date-field` opens the month under itself (placed under the focused
  156. field), so several fields work on one page and post by their own `name`. The demo has two fields in a GET form.
  157. Gate: 55 passed, 0 failed (real mouse clicks; second field; typed month; impossible date; Escape; form posts both).
  158. The month view's next-month check is timing-flaky (English name before the browser's language arrives); passes on rerun.
  159. Not deployed; not tested: Firefox/Safari, touch. The range picker is unchanged (own field, not together with this one).
  160. ## 2026-09-25 — ticket #5 reworked: multiple file upload in pure Hybriel
  161. Rejected because the components "write fucking javascript files". `components/files-upload/files-upload.hl` is now the whole component
  162. (`files-upload.js` and its route are gone): drag/drop/change handlers, `fetch` (awaited inside the handler) per file, one row each, count line.
  163. Gate (tests/browser.mjs, multi section): 3 dropped = 3 rows, all Uploaded, "3 uploaded", 2 chosen add 2, no script served, no overflow at 390 px.
  164. GAPS: (1) real progress percent is impossible: an `XMLHttpRequest` `onprogress`/`onload` callback (or an `emit` from it) runs but the
  165. page does not take the state it writes (only handler code that finished normally renders), and `new Promise` inside a handler breaks it;
  166. so the bar is 0 → 100. (2) the `uploaded` / `uploadsdone` events for the Markdown editor are gone (hybriel#87).
  167. Note: another worker is reworking file-upload (ticket #4) in the same folder; its gate section may fail until it is done.
  168. ## 2026-09-25 — ticket #4: file upload (one file)
  169. Built `components/file-upload/` (component, script, demo + demo list script, README): drop zone + "Choose a file"; the file is
  170. POSTed (XHR, for real progress) to the component's `data-url` as `?name=<file name>` with the bytes as body; shows name, size,
  171. progress bar, "Uploaded"/"Failed (…)"; fires `uploaded` / `uploadfailed`. The app decides where it is stored: the demo's receiver
  172. (`/file-upload/receive`, project.hl) keeps only name and size (last 20, in memory) because hl:fs cannot write raw bytes yet.
  173. Gate: 40 passed, 0 failed (drop with name/size/100%, demo list, chosen file, no console errors, no overflow at 390 px).
  174. Not deployed; not tested: Firefox, big files, an app that really stores bytes. One per page; one file at a time.
  175. ## 2026-09-25 — ticket #3: date range picker
  176. Built `components/range-picker/` (component, demo, bridge script, README) on the month view, like the date picker: one field
  177. "YYYY-MM-DD – YYYY-MM-DD"; first click = start, second = end (earlier second click swaps), start/end marked, days between
  178. highlighted. Gate: 32 passed, 0 failed (incl. swap, between = 9 days, typed range, impossible range invalid, no console errors).
  179. Not deployed; not tested: Firefox, a real form post. One per page, not together with the date picker (shared month view state).
  180. ## 2026-09-25 — ticket #2: date picker
  181. Built `components/date-picker/` (component, demo, bridge script, README) on the month view; the month view got a hidden
  182. `#month-view-goto` input (jump to a "YYYY-MM-DD" month). Gate: 21 passed, 0 failed (closed at first, click opens, picked
  183. day = YYYY-MM-DD in the field and the month closes, typed 2028-02-29 opens February and marks it, impossible date marks
  184. the field invalid, no console errors, no overflow at 390 px). Not deployed; not tested: Firefox, a real form post.
  185. - The popup opens with CSS `:focus-within` (no class/`if`: hl:web re-renders reset them). A `<label>` around the picker
  186. refocuses the field on every click in the month — do not wrap it.
  187. - Data out still goes through the script (the month view's `emit` does not reach the host, hybriel#87). One per page.
  188. ## 2026-09-25 — ticket #1: month view
  189. Built: the app (Hybriel/hl:web, Docker, deploy.sh, gate) and the month view component (`components/month-view/`).
  190. - Verified: `node tests/browser.mjs` → 12 passed, 0 failed (server render of 42 days; today marked by the browser's date;
  191. next/prev; February 2028 has 29 days and starts on a Tuesday; December 2027 starts on a Wednesday; no console
  192. errors; no overflow at 390 px). `./deploy.sh --dry-run --target <local dir>` passes the gate.
  193. - Not deployed (architect). Not tested: a real Byrodin container, Firefox.
  194. - The first render is the server's UTC date and English names; the browser then sets its own today and language
  195. (`month-view.js` → hidden input). Between the two a moment of English names is possible.
  196. ## Hybriel findings (reported)
  197. - A nested `for` (rows → days) is not re-rendered when the outer list is reassigned: only the title changed; a flat
  198. list of 42 days works. So the component uses a flat list.
  199. - `emit` from a composed component's handler did not reach a handler of the same name in the host page; a host cannot read
  200. a composed member without redeclaring it (which overrides the child's value). So the month view has no data out yet.
  201. ## 2026-09-25 — ticket #6: pagination
  202. Built `components/pagination/` (component, demo, README): `Previous 1 … 44 45 46 … 89 Next`, no script, `Pagination { pages = 89 }`.
  203. Home entry, `/pagination` demo and README route, styles added. Gate extended (page 1, 4, middle, last, Previous, a click on … does nothing).
  204. No data out yet (hybriel#87). Not tested: Firefox. Hyphenated attributes (`aria-*`, `data-*`) do not compile / render literally in hl:web, so
  205. no ARIA attributes on the buttons.
  206. ## 2026-09-26 — ticket #8 fix: typed Markdown shortcuts are consumed
  207. `# `, `- `, `1. ` typed at the start of a paragraph, an (emptied) heading or a list item now drop the marker (no more `# # Heading`,
  208. `- - two`); a marker of the other list kind switches the list. Emptied surface gets a plain `<p>` (no nested paragraphs).
  209. Gate: 8 new checks typing character by character with real keys (126 passed; the one failure, "today is marked", is a
  210. local-vs-UTC date mismatch around midnight, not the editor). Not deployed.

Branches

Latest commits

  • 3bc905c5components #15 (mission 003) 2/2: docs (README Look, STATUS, LOG), reportmre
  • 5a98d77ecomponents #15 (mission 003) 1/2: black/white base look — greys for nuances, no WorldAPI fallbacks, no decorative frames; site + icon black/white; gate 230/0mre
  • 3f93d716components code order (mission 002) 4/4: docs, tests/letcount.py, tests/same-output*, reportmre
  • e747cfa0components code order (mission 002) 3/4: let only where reassigned (257 dropped, 0 never-reassigned left); gate 220/0, layouts gate 73/0, same outputmre
  • 172914a3components code order (mission 002) 2/4: lib/uploads.hl (demo upload storage), thin demo handlers, project.hl map; gate 220/0, same outputmre
  • d29f35b1components code order (mission 002) 1/4: styles.hl -> components/styles.hl; gate 220/0, same outputmre
  • 09945750components: Hybriel master 06617221 (plugin allocators 3a781359 + 413f60e4, http1 773de63e); gate 220/0mre
  • ede4d19acomponents: Hybriel master 190aa11d (fc838894 GC correctness, #126 closure scopes, #127); gate 220/0mre
  • 2bb9a935components: Hybriel master 8efba065 (re-vendor round 069: #126 memory, #48 lambda copy)mre
  • e4f01768antcolony#40: mission references point to the moved missionsmre
  • d32b44e2antcolony#40: history (LOG.md), worker briefs (missions/) and reports moved here from antcolony, numbered per project; old numbers in antcolony docs/mission-map.mdmre
  • 0fb80b57components: Hybriel master ff51cf46 (re-vendor round)mre
  • 57408b6ecomponents#14: installable app (manifest, service worker, offline index), own iconmre
  • 317bd09fdeploy.sh: back up live storage/.sessions/.env before every deploy (newest 5 kept)mre
  • becbd59bcomponents#13: modal dialog (<dialog> based, focus wrap, backdrop/Esc/x close with reason, scroll lock, footer buttons)mre
  • 367dd19adeploy.sh: never send .git or .gitignore to Byrodinmre
  • 4b4dabe5State of 2026-09-27, before the move to gitoriamre