gitoriaLog in with ident

components

All repositories: gitoria

ReadmeCodePull requestsReleasesTicketsSettings
Commit2bb9a9352bb9a935components: Hybriel master 8efba065 (re-vendor round 069: #126 memory, #48 lambda copy)mre2bb9a935/STATUS.md

24.7 KB

  1. # STATUS
  2. ## 2026-10-02 — antcolony mission 069: re-vendored Hybriel master 8efba065 (#126 memory, #48 lambda copy)
  3. `bin/hybriel` + `plugins/` (same nine) from master 8efba065 (sha256 231fb9f2…; old copy `.scratch/pre-069/`, master ff51cf46). No local patch, no app code change.
  4. Gate `COMPONENTS_GATE_PORT=8720 COMPONENTS_GATE_CHROME=8721-8729 node tests/browser.mjs` → 220 passed, 0 failed (`.scratch/w069/gate1.txt`).
  5. #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`.
  6. 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.
  7. ## 2026-10-01 — antcolony mission 048: re-vendored Hybriel master ff51cf46
  8. `bin/hybriel` + `plugins/` (same nine) from master ff51cf46 (old copy `.scratch/pre-048/`, master e6720b1f). No local patch.
  9. Gate `COMPONENTS_GATE_PORT=8750 COMPONENTS_GATE_CHROME=8751-8759 node tests/browser.mjs` → 220 passed, 0 failed (before and after the workaround change).
  10. Duplicate-@id check (#113): the live storage/ holds no tables (only md-files/ 5 + uploads/ 1 files, no mpackdb) → nothing to count.
  11. 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
  12. `.scratch/pre-048/*.static`). Kept: `static serverToday` in month-view/clock.hl (an imported module helper, not a component member);
  13. 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.
  14. ## 2026-10-01 — antcolony mission 046: installable app (PWA) + own icon
  15. 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".
  16. 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.
  17. ## 2026-09-30 — ticket #13: modal dialog (pure Hybriel, mission 001 (old 042))
  18. `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.
  19. 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.
  20. 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.
  21. 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)).
  22. ## 2026-09-26 — ticket #4: file upload, one file (pure Hybriel, rebuilt on hybriel#94)
  23. `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.
  24. ## 2026-09-26 — ticket #12 (2nd fix: choose button, caret lost)
  25. 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.
  26. ## 2026-09-26 — ticket #12 (1st): a file added in a list item
  27. 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.
  28. ## 2026-09-26 — ticket #9: files and images in the Markdown editor
  29. Drop / paste / "File" button (several files): `emit server mdUpload(files)` (hybriel#94, files over HTTP with progress), a progress row per
  30. file under the toolbar (`on client uploadProgress`), then `![name](url)` (images, drawn in the editor; only http(s) and `/path` src) or
  31. `[name](url)` at the drop point / caret. The app stores: demo.hl answers the face (storage/md-files, random name, known extensions only,
  32. 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
  33. (3 dropped files → 2 images + link, progress to 100%, images load, pasted image, javascript:/data: image refused). Not deployed; on the live
  34. site storage/ persists (bind mount). Not tested: Firefox, touch, a real 1 GiB file.
  35. ## 2026-09-26 — antcolony mission 037: re-vendored Hybriel master e6720b1f
  36. `bin/hybriel` + `plugins/` from hybriel master e6720b1f (includes #103/#104, #105 f15a2f7f, #106, #94 c12065d8; old copy in
  37. `.scratch/pre-037/`). No local patch. Gate `node tests/browser.mjs`: 132 passed, 0 failed. Dev server (`~/scratch-037/hashcheck.sh
  38. components.hybriel.worldapi.org COMPONENTS /`, port 8720): `/__hl/hl-runtime.js?v=…`, `/__hl/web/client.js?v=…`, `/__hl/app.css?v=…`
  39. (immutable), bare `/__hl/app.css` → no-cache, 0 unhashed refs. Not deployed.
  40. ## 2026-09-26 — ticket #11: month view marks the visitor's today
  41. 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.
  42. ## 2026-09-25 — ticket #10 (2nd fix): closers, and code is only text
  43. 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.
  44. ## 2026-09-25 — ticket #10: code editor (pure Hybriel)
  45. `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.
  46. 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.
  47. 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.
  48. 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.
  49. ## 2026-09-25 — ticket #8: Markdown WYSIWYG editor (pure Hybriel)
  50. `components/md-editor/md-editor.hl` (ONE file, own `Style`, no `.js`) + `demo.hl` (`/md-editor`, two editors) + README; home entry and routes added.
  51. 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);
  52. 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;
  53. 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.
  54. 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.
  55. 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.
  56. 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).
  57. 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.
  58. ## 2026-09-25 — ticket #7 (2nd try): a copied component is styled without tokens
  59. Every colour in the four components' `Style` is now `var(--color-x, <palette value>)`: the palette value is the fallback, so a component
  60. copied into an app with no tokens still gets its colours; an app that imports `shared/tokens.hl` (and sets its accent) overrides them.
  61. 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
  62. 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.
  63. ## 2026-09-25 — ticket #7: every component carries its own Style
  64. month-view, date-picker, range-picker and pagination each have a `Style { }` in their file (scoped by the component's tag, colours as
  65. `var(--color-…)` semantic tokens, buttons styled inside the component). `styles.hl` keeps only the page layout (header, main, home list,
  66. global button). A component cannot import `shared/tokens.hl` (its `hl:web/css` import fails in a browser module), so tokens are
  67. written as css variables; the app's styles.hl must import the tokens. Gate: 57 passed, 0 failed. Not deployed.
  68. ## 2026-09-25 — antcolony mission 035: re-vendored Hybriel master 13ef4f9b
  69. `bin/hybriel` + `plugins/` from hybriel master 13ef4f9b (old copy in `.scratch/pre-035/`). No local patch existed or was needed.
  70. Gate `node tests/browser.mjs` (run with `COMPONENTS_GATE_PORT=8720 COMPONENTS_GATE_CHROME=8721-8729`): 72 passed, 0 failed
  71. before and after (also on 9d608332). Dev server: page links `/__hl/app.css?v=<hash>` (Cache-Control immutable); bare `/__hl/app.css` → no-cache.
  72. Not deployed (architect).
  73. **File uploads taken OFF the site** (creator: "the file upload still bypasses the framework using XMLHttpRequest"), until
  74. hybriel#94 (files through emit): routes `/file-upload`, `/file-upload/receive|received|README.md`, `/files-upload[/README.md]`,
  75. the two home entries, their styles and gate sections removed; `components/file-upload` + `components/files-upload` moved (not
  76. deleted) to `.scratch/pre-035/upload-parked/` (with the removed styles `styles-upload.hl.txt`, gate section
  77. `gate-upload-section.mjs.txt` and the pre-change sources in `src/`). New gate checks: home lists no upload, the four URLs 404,
  78. `grep -rE "XMLHttpRequest|fetch\(" components/` finds nothing. Gate: **57 passed, 0 failed**. Byrodin: deploy.sh has no
  79. --delete, so the old folders stay there unused (no route imports them).
  80. ## 2026-09-25 — ticket #2: a clicked day now lands in the field (live it stayed empty)
  81. Live, with a real mouse click, the day set the field's `value` attribute but the field showed nothing (the input's `value` property
  82. stayed empty); locally the same click worked, so the gate missed it. Cause: the fields were rows bound to `values`/`invalids`, and every
  83. pick re-assigned `rows`, which re-renders the inputs. Fix: `rows` is never re-assigned; a pick / typed text is written to the input
  84. element itself (`value`, `aria-invalid`) from the handler. The gate now moves the pointer first, holds the button 100 ms, and checks the
  85. 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
  86. fix is unproven until deployed. Not tested: Firefox, Safari, touch.
  87. ## 2026-09-25 — ticket #2 reworked: date picker in pure Hybriel
  88. The creator's reason for "total fail" was hand-written .js. `date-picker.js` and its route are deleted; the date picker is ONE
  89. file, `components/date-picker/date-picker.hl`, built like the range picker (own month grid, focus-within popup, `Date`/`Intl` read
  90. in a View handler when a field gets focus). `DatePicker { names = "arrival,departure" }` makes one field per name, each posts by its
  91. name; the month arrows, typing, an impossible date (`aria-invalid`), Escape, and the form post are all covered. It no longer needs
  92. the month view component. Gate: 71 passed, 0 failed. No `.js` of this project's own is left in `components/`.
  93. Hybriel limits met: a View attribute cannot be a list literal or expression (so `names` is a string, row `hint` a field);
  94. a host cannot read the child's values (hybriel#87). Not tested: Firefox, Safari, touch.
  95. ## 2026-09-25 — ticket #1 reworked again: month view without any .js
  96. The real reason for "total fail" (creator, via the architect): the components were hand-written .js files. `month-view.js` is deleted
  97. (file, route, script tags). The browser's today and language now come from Hybriel handlers in `month-view.hl` (`Date`/`Intl` are browser
  98. 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
  99. ‹ ›; 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
  100. its demo page. Gate: 69 passed, 0 failed. STILL hand-written .js: `components/date-picker/date-picker.js` (ticket #2, not this one).
  101. ## 2026-09-25 — ticket #4 reworked: file upload in pure Hybriel
  102. Rejected because the components "write fucking javascript files". `file-upload.js` and `demo.js` are deleted; the component is ONE
  103. `file-upload.hl` (drop, choose, XHR with real progress, list of uploaded files via optional `listUrl`). The `Uploaded` list moved
  104. into the component (a host cannot hear a child's emit, hybriel#87). Finding: writes made in an async callback (XHR progress/onload)
  105. are never painted — only a DOM event's handler repaints; workaround: the callback dispatches standard DOM events (`progress`, `load`)
  106. at elements whose handlers write the state. Gate: upload checks pass (drop, chosen file, list, no .js served, no console errors).
  107. ## 2026-09-25 — ticket #3 reworked: date range picker in pure Hybriel
  108. Rejected because the components "write fucking javascript files". The range picker is now ONE file, `components/range-picker/range-picker.hl`
  109. (month grid, state, clicks, typing, Escape — all Hybriel; `Date`/`Intl` are browser globals of the View handlers); `range-picker.js` is deleted,
  110. 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
  111. child member, hybriel#87). Gate: 56 passed (real clicks, swap, 9 days between, typed range, invalid range, form post, no .js file).
  112. Learned: `aria-invalid = x` is parsed as a subtraction — write `'aria-invalid' = x`; an element's attributes and `on` handlers must sit
  113. on ONE line (a newline before `on` is a parse error).
  114. STILL hand-written `.js` (not part of this ticket): month-view.js, date-picker.js, file-upload — the same rework applies.
  115. ## 2026-09-25 — ticket #1 rework (rejected: "total fail")
  116. 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
  117. home page (`components/index.hl`), the component list below; the demo page `/month-view` stays. Gate: 49 passed, 0 failed.
  118. The creator gave no reason beyond "total fail", so this is my reading; the rest is unchanged.
  119. ## 2026-09-25 — ticket #2 reworked: date picker for input fields
  120. The first build was one hard-wired field (fixed id, no name, one per page) and was rejected ("total fail", no reason given).
  121. Now `DatePicker { }` is placed once and EVERY `input.date-field` opens the month under itself (placed under the focused
  122. field), so several fields work on one page and post by their own `name`. The demo has two fields in a GET form.
  123. Gate: 55 passed, 0 failed (real mouse clicks; second field; typed month; impossible date; Escape; form posts both).
  124. The month view's next-month check is timing-flaky (English name before the browser's language arrives); passes on rerun.
  125. Not deployed; not tested: Firefox/Safari, touch. The range picker is unchanged (own field, not together with this one).
  126. ## 2026-09-25 — ticket #5 reworked: multiple file upload in pure Hybriel
  127. Rejected because the components "write fucking javascript files". `components/files-upload/files-upload.hl` is now the whole component
  128. (`files-upload.js` and its route are gone): drag/drop/change handlers, `fetch` (awaited inside the handler) per file, one row each, count line.
  129. 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.
  130. GAPS: (1) real progress percent is impossible: an `XMLHttpRequest` `onprogress`/`onload` callback (or an `emit` from it) runs but the
  131. page does not take the state it writes (only handler code that finished normally renders), and `new Promise` inside a handler breaks it;
  132. so the bar is 0 → 100. (2) the `uploaded` / `uploadsdone` events for the Markdown editor are gone (hybriel#87).
  133. Note: another worker is reworking file-upload (ticket #4) in the same folder; its gate section may fail until it is done.
  134. ## 2026-09-25 — ticket #4: file upload (one file)
  135. Built `components/file-upload/` (component, script, demo + demo list script, README): drop zone + "Choose a file"; the file is
  136. POSTed (XHR, for real progress) to the component's `data-url` as `?name=<file name>` with the bytes as body; shows name, size,
  137. progress bar, "Uploaded"/"Failed (…)"; fires `uploaded` / `uploadfailed`. The app decides where it is stored: the demo's receiver
  138. (`/file-upload/receive`, project.hl) keeps only name and size (last 20, in memory) because hl:fs cannot write raw bytes yet.
  139. Gate: 40 passed, 0 failed (drop with name/size/100%, demo list, chosen file, no console errors, no overflow at 390 px).
  140. Not deployed; not tested: Firefox, big files, an app that really stores bytes. One per page; one file at a time.
  141. ## 2026-09-25 — ticket #3: date range picker
  142. Built `components/range-picker/` (component, demo, bridge script, README) on the month view, like the date picker: one field
  143. "YYYY-MM-DD – YYYY-MM-DD"; first click = start, second = end (earlier second click swaps), start/end marked, days between
  144. highlighted. Gate: 32 passed, 0 failed (incl. swap, between = 9 days, typed range, impossible range invalid, no console errors).
  145. Not deployed; not tested: Firefox, a real form post. One per page, not together with the date picker (shared month view state).
  146. ## 2026-09-25 — ticket #2: date picker
  147. Built `components/date-picker/` (component, demo, bridge script, README) on the month view; the month view got a hidden
  148. `#month-view-goto` input (jump to a "YYYY-MM-DD" month). Gate: 21 passed, 0 failed (closed at first, click opens, picked
  149. day = YYYY-MM-DD in the field and the month closes, typed 2028-02-29 opens February and marks it, impossible date marks
  150. the field invalid, no console errors, no overflow at 390 px). Not deployed; not tested: Firefox, a real form post.
  151. - The popup opens with CSS `:focus-within` (no class/`if`: hl:web re-renders reset them). A `<label>` around the picker
  152. refocuses the field on every click in the month — do not wrap it.
  153. - Data out still goes through the script (the month view's `emit` does not reach the host, hybriel#87). One per page.
  154. ## 2026-09-25 — ticket #1: month view
  155. Built: the app (Hybriel/hl:web, Docker, deploy.sh, gate) and the month view component (`components/month-view/`).
  156. - Verified: `node tests/browser.mjs` → 12 passed, 0 failed (server render of 42 days; today marked by the browser's date;
  157. next/prev; February 2028 has 29 days and starts on a Tuesday; December 2027 starts on a Wednesday; no console
  158. errors; no overflow at 390 px). `./deploy.sh --dry-run --target <local dir>` passes the gate.
  159. - Not deployed (architect). Not tested: a real Byrodin container, Firefox.
  160. - The first render is the server's UTC date and English names; the browser then sets its own today and language
  161. (`month-view.js` → hidden input). Between the two a moment of English names is possible.
  162. ## Hybriel findings (reported)
  163. - A nested `for` (rows → days) is not re-rendered when the outer list is reassigned: only the title changed; a flat
  164. list of 42 days works. So the component uses a flat list.
  165. - `emit` from a composed component's handler did not reach a handler of the same name in the host page; a host cannot read
  166. a composed member without redeclaring it (which overrides the child's value). So the month view has no data out yet.
  167. ## 2026-09-25 — ticket #6: pagination
  168. Built `components/pagination/` (component, demo, README): `Previous 1 … 44 45 46 … 89 Next`, no script, `Pagination { pages = 89 }`.
  169. Home entry, `/pagination` demo and README route, styles added. Gate extended (page 1, 4, middle, last, Previous, a click on … does nothing).
  170. No data out yet (hybriel#87). Not tested: Firefox. Hyphenated attributes (`aria-*`, `data-*`) do not compile / render literally in hl:web, so
  171. no ARIA attributes on the buttons.
  172. ## 2026-09-26 — ticket #8 fix: typed Markdown shortcuts are consumed
  173. `# `, `- `, `1. ` typed at the start of a paragraph, an (emptied) heading or a list item now drop the marker (no more `# # Heading`,
  174. `- - two`); a marker of the other list kind switches the list. Emptied surface gets a plain `<p>` (no nested paragraphs).
  175. Gate: 8 new checks typing character by character with real keys (126 passed; the one failure, "today is marked", is a
  176. local-vs-UTC date mismatch around midnight, not the editor). Not deployed.

Branches

Latest commits

  • 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