ธีม
Session notes — claude-2026-10-16
One person's notes, never rewritten by anyone else. docs/state/HANDOFF.md §23 holds what is NOT done, and STATE.md holds what is true now (the deployed sha's only home is its ✅ DEPLOYED line). This file is WHY each thing was done, and how it was checked.
▶ HANDOFF — home page (banner carousel, tool icons) and ข้อมูลของฉัน at /me
All on production, every deploy <== exit 0 — ran to the end, read back from the VM's HEAD, the served bundle grepped for a string from code that runs unconditionally. No migration, no Apps Script change, no new read path, no new permission. User-visible notes are staged in PENDING (src/data/changelog.js).
Read these before touching the same code
| If you touch… | Read first |
|---|---|
the banner (#homeHero) | src/js/home-hero.js header. Native scroll-snap — do not replace it with a transform you animate: the finger drives the platform scroller. The autoplay CLOCK is the active dot's CSS animation (hero-progress); animationend advances, animation-play-state pauses — rename the keyframes and autoplay silently stops (a test pins the name) |
| a mouse-drag landing | landingIndex: above FLICK_PX_S the velocity's SIGN against the drag's own direction decides (with = next, against = back home); only a slow release uses the projection. Test any direction rule from the MIDDLE slide — from an end the clamp makes a wrong rule pass |
| anything that hides a slide/panel | focus does not leave a region because you hid it (setIndex moves it) |
| the tool rail | ONE entry in src/data/tools.js: home = rank, short = the label under the icon, color = the square, ink = a glyph colour of its own (shop only), deptLogo = draw the ฝ่าย's logo from depts.js. Never markup in tab-home.html (a test fails on a hand-written tile) |
| tool colours | they reach the launcher and every ฝ่าย page too (same renderer). Glyphs are WHITE by the owner's decision — §23 has the contrast numbers |
| the rail's full bleed on a phone | syncBleed MEASURES the distance to each screen edge. Not 100vw (counts a desktop scrollbar → sideways page scroll) |
/me or the home account row | src/js/me-page.js header. The row's "มีข้อมูลรอให้คุณตรวจสอบ" must come from the cards' own functions (identityCheckState, ownIssues) — the check moved off home and this is what keeps it from going quiet |
| "signed out" UI anywhere | the first onAuthChange call is ALWAYS null, before the session restore. Say "signed out" only after authReady (syncMePage) |
| a click handler on in-app links | let a modified click (⌘/Ctrl/Shift/Alt) through on an a[href] — departments.js does now |
| moving a feature | grep for the old place's NAME in prose (Thai and English, app + tools + docs) — four admin/tool strings still said "หน้าแรก" |
| any of this UI | node tools/browser/home-hero.mjs (production-safe) and node tools/browser/me-page.mjs (samo-dev only, signed in) — skills/drive-the-browser.md §12 |
What happened, in order
"Put the tools below the banner, horizontal scroll; banner autoswipe and manual swipe; slides for samoshop and ประกาศ." Loaded the apple-design skill. Chose native scroll-snap over a hand-animated track (1:1 touch and platform momentum for free); JS adds autoplay, mouse drag with momentum projection, holds (press/hover/visible focus/hidden/offscreen/pause button), reduced motion = no autoplay. The pause button is there because WCAG 2.2.2 requires one for content that moves on its own for >5 s. The shop slide uses the storefront's palette by adding
.hero-slide--shopto the token selector inshop-storefront.css(one home). The ประกาศ slide names the pinned post else the newest, and shows its cover only if it has a real one — the stock Unsplash placeholder would read as news. The news slide is a dark island OFF the--inkscale on purpose (that scale flips in dark mode). The rail renders from the registry through the launcher's own renderer; it replaced the bottom "เริ่มต้นกับ SAMO" strip.Two carousel drag bugs, both 1-in-5 flakes in the driver, both found by instrumenting events rather than rerunning: (a) a drag whose moves were coalesced away read as a click and OPENED the slide link; (b) a short quick flick (120 px at 816 px/s, measured on production) projected to 1.54 slides and rounded back. Write-ups in
docs/mistakes/frontend-ui.md."Should ข้อมูลของฉัน move to a separate page?" Yes — Apple's account-row pattern. Cards moved unchanged to
/me; home keeps one row with the flag; avatar menu entry; phone top bar's Logout became the avatar (an UNASKED design change — §23 asks the owner to confirm); drawer user strip opens/me; the Discord OAuth return/#discord=…is moved to/meclient-side (the VM's callback was left alone, so links in flight keep working). Caught before shipping: the sign-in prompt flashed for a signed-in person opening/medirectly (second site of an existing app-state.md rule)."Tools like this: icon with text under it, no description" (owner screenshot of an iOS icon), then the owner's palette, labels (SAMO Booking, SAMO Project, VitalSound), white glyphs, ฝ่าย logos for MDI/RT, and the banner's espresso bag mark for SAMO Shop (rebuilt from the same glyph and tokens, not the screenshot — sharp, untilted). My first cut gave pale colours a deep same-hue glyph for contrast; the owner said white, so it is white with a soft drop-shadow edge. Golden Period: the "ตารางข้อมูลเต็ม" heading + lead removed, the sheet button KEPT (they pasted only the text).
Bug scan of the day's work: keyboard focus left on a hidden slide; stale "หน้าแรก" directions in four strings + three docs; ⌘/Ctrl-click cancelled on every in-app link (pre-existing, newly exposed by the new links); analytics had no label for
tab:me; phone rail bleed and Thai label wrap (measured). Each CODE bug was FALSIFIED (fix removed → its driver check red → restored); the stale copy was found and fixed by grep, which is the only check prose has."Scan until you find none" — the second pass. Swept every comment, stylesheet header and doc for claims that the cards are "on the home page" (14 rewritten to
/me: my-seat.js ×4, admin-main.js ×2, my-house.js ×2, house/index.js, three CSS headers, tab-home/tab-team partial comments); deleted the dead.home-welcomerules (nothing renders that class since the account row replaced it); README gained a Home page feature line; the Discord callback'sback()now points at the client-side/meredirect, andme-page.test.jspins thenew URL('/', origin)it depends on. A typo had put a Devanagari character inside "ข้อมูล" in the README — fixed, and every file touched today was swept for non-Thai/non-Latin letters (only hit: the Russian spam quote in an old write-up, which is correct). Check counts were taken out of the skill and this note (they rot; the VERIFIED line in HANDOFF §23 keeps the dated one).
Decisions the owner made today (do not re-litigate)
- Tool glyphs are WHITE on every colour, including pale ones.
- The palette in
tools.js(PR#ff8bbf, Golden Period#ffd077, …) and the rail labels SAMO Booking / SAMO Project / VitalSound. - MDI and RT use their ฝ่าย logos; SAMO Shop uses the banner's mark.