Compare commits

...

11 Commits

Author SHA1 Message Date
BenStullsBets 61bd4a7943 Merge remote-tracking branch 'origin/main' into worktree-fix+audio-and-tracking-labels 2026-06-30 09:36:17 -07:00
BenStullsBets 2d54023f94 chore(i18n): re-extract en.json catalog to match per-clip affect
Keeps the translator source-of-record in sync with the manifest's English.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 09:33:46 -07:00
BenStullsBets bf1013be74 feat(content): per-clip right-brain feelings drawn from each clip's footage
Affect was authored per SCALE — every clip in an altitude shared the same 4
emotion words. Now every clip carries its OWN feelings, read from that specific
footage (mood, motion, light), so e.g. the violent Tarantula nebula evokes "a
violent ferment" while the dying-star Southern Ring evokes "a star's slow dying /
a luminous farewell," and a drowsing seal haul-out evokes "a sun-warmed drowse."

Adds AFFECT_CLIP (per-clip override; falls back to the scale register) covering
all 41 clips — 41 distinct feeling-sets, one per clip. Keeps each scale's
emotional family as a base and swaps in 1-2 footage-specific feelings, reusing the
existing feel.* palette where it fits and adding 19 new nuance keys (sublime,
tenderness, turbulence, radiance, mortality, poignancy, eeriness, purity,
solitude, verdancy, freshness, repose, hush, poise, flow, intricacy, spectral,
alienness, strangeness) with full es/fr/ja. 42 distinct feeling keys now in use.

Drafted by viewing each clip's footage (per-scale passes); first-pass reads that
want operator by-eye review. Data-only (build_pool_manifest.py + manifest + i18n
catalogs). Verified: 34/34 catalog+i18n+build pytest, 16/16 node unit, 4-language
parity for every clip, live render shows distinct feelings per clip (incl. new
keys) with Think/Feel overlap still 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 09:33:21 -07:00
BenStullsBets fa3bbef0d6 add sessions/0032/SESSION-0032.0-TRANSCRIPT-2026-06-30T09-20--2026-06-30T09-24.md + replace placeholder/variant SESSION-0032.0-TRANSCRIPT-2026-06-30T09-20--INPROGRESS.md 2026-06-30 09:26:01 -07:00
BenStullsBets 64e8f658f6 claim human-experience-filter-art session 0032 (placeholder) + sessions.json entry 2026-06-30 09:21:27 -07:00
BenStullsBets 760fdc7550 add sessions/0031/SESSION-0031.0-TRANSCRIPT-2026-06-30T09-06--2026-06-30T09-11.md + replace placeholder/variant SESSION-0031.0-TRANSCRIPT-2026-06-30T09-06--INPROGRESS.md 2026-06-30 09:13:37 -07:00
BenStullsBets e62382c5e5 claim human-experience-filter-art session 0031 (placeholder) + sessions.json entry 2026-06-30 09:08:16 -07:00
BenStullsBets 041fcdeb7d fix(sim): keep Feel (affect) words from overlapping Think (label) chips
Denser left labels (now >=3/clip) plus the always-4 right affect words made the
two HUD layers collide. renderAffect now nudges each Feel word vertically off the
Think chip plates (and off already-placed words + the ANALYSIS status tag),
staying on-screen, keeping the least-overlapping spot if nothing is fully clear.

Feelings are scene-level (soft position) so we move THEM, never a chip off its
subject. Obstacles are computed from the manifest, not the DOM, and a tracked
label's path is sampled across the loop — so the clearance holds for the whole
loop even though the per-frame track re-render keeps moving the chips (no per-frame
re-layout, no jitter). New diagnostic seam window.__hefNoDeconflict (sibling of
__hefState) A/B-toggles it.

Verified across all 6 scales at max knobs: authored overlaps drop to 0 with none
introduced (cosmos 3->0), and a tracked abyss clip stays at 0 overlaps sampled
over loop time as its chip drifts. No affect-position test exists to break;
16/16 node unit + frontend pytest green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 09:06:36 -07:00
BenStullsBets 31956bfdfc add sessions/0030/SESSION-0030.0-TRANSCRIPT-2026-06-30T08-10--2026-06-30T08-50.md + replace placeholder/variant SESSION-0030.0-TRANSCRIPT-2026-06-30T08-10--INPROGRESS.md 2026-06-30 08:53:05 -07:00
BenStullsBets 5a08d1dd35 claim human-experience-filter-art session 0030 (placeholder) + sessions.json entry 2026-06-30 08:50:53 -07:00
BenStullsBets 432fbd7703 add sessions/0029/SESSION-0029.0-TRANSCRIPT-2026-06-30T08-09--2026-06-30T08-41.md + replace placeholder/variant SESSION-0029.0-TRANSCRIPT-2026-06-30T08-09--INPROGRESS.md 2026-06-30 08:43:06 -07:00
13 changed files with 5197 additions and 3047 deletions
@@ -0,0 +1,76 @@
# Session 0029.0 — Transcript
> App: human-experience-filter-art
> Start: 2026-06-30T08-09 (PST)
> End: 2026-06-30T08-41 (PST)
> Type: planning-and-executing
> Posture: yolo
> Claude-Session: c87a07d3-917c-44bc-82cf-c6d8edee952b
> Checkout: /Users/benstull/git/benstull.org/benstull/human-experience-filter-art
> Branch: design/cloudflare-static-publish
> Status: **FINALIZED**
## Launch prompt
"We need to make sure credits for Creative Commons licensed videos are compliant.
What are some options?" → after presenting options the operator chose **Option A**
(manifest-driven static credits/colophon page surfaced to the public) + **Option D1**
(declare the altered footage CC BY-SA 4.0). Non-commercial.
## Pre-state
- Branch `design/cloudflare-static-publish` (static-publish work, pushed). Working
tree had uncommitted, unrelated in-flight work: a "Run simulation" start button
(6 files) **plus** an `r2-cors.json` reformat (surfaced via stash, 7 total).
- Per-clip `license`/`source` already in `clips.json` (baked from `/api/clips`) but
only shown in the dev panel + internal review pages — public experience showed none.
- A concurrent session was live in worktree `fix+audio-and-tracking-labels` (off main);
the operator was also committing directly to `design/cloudflare-static-publish`.
## Arc
1. **Audited** the license surface: `tools/licensing.py`, `pipeline/provenance.py`,
manifest, frontend. Found credits exist in data + review tooling but not the public
experience → that's the gap. Presented options AD; operator chose A + D1.
2. **Claimed session 0029** (planning-and-executing, yolo). Two stale `--INPROGRESS`
placeholders (0015, 0017) noted as long-dead, left alone.
3. **Operator-requested pre-work:** the uncommitted in-flight work. Stashed it,
created an isolated worktree (`.claude/worktrees/session-0029` off the branch HEAD,
since the static work lives there not on main), applied the stash.
- Discovered the branch had advanced under me to `8cc472c` (operator's direct
commit). It **intentionally** keeps `r2-cors.json` in S3-array form alongside a
new `r2-cors.wrangler.json` (runbook documents both) → **dropped** my conflicting
`r2-cors.json` reformat commit; kept + rebased only the Run-simulation button.
- Committed the button (`3a45e33`), ff-merged + pushed.
4. **Built Option A + D1** (TDD): node test for the pure credits logic first (red) →
`credits.js` (UMD: `creditEntries`/`creditsListHtml`, escaped, sorted) → `credits.html`
colophon (D1 CC BY-SA declaration + "altered" note; JS-filled video attributions;
PD/CC0 audio courtesy block; back link) → header "ⓘ Credits" link (`credits.link`
i18n en/es/fr/ja) → `style.css``PUBLIC_ASSETS` in `build_static.py` + its test →
Playwright e2e (`tests/test_e2e_credits.py`).
5. **Verified:** node 28/28, pytest 315 passed / 2 skipped. Real build render: 41/41
clips credited, all 7 CC-BY/BY-SA clips show required attribution, 0 missing.
Committed (`1c7f2b7`), ff-merged + pushed, removed the worktree, deleted the branch.
## End state
- `design/cloudflare-static-publish` @ `1c7f2b7`, clean, pushed (origin in sync).
- Public site now attribution-compliant: credits reachable from the work; altered-work
license declared. §9 is **exempt** for this project (static Cloudflare target), so
merged+pushed to the design branch is the completion state — no PPE/prod.
## Deferred decisions
- **Dropped my `r2-cors.json` reformat** rather than merging it — concluded from the
operator's `8cc472c` + runbook that the S3-array form is intentional. (Alternative:
keep both forms / ask. Chose to honor the documented two-file split.)
- **Audio credits as a static courtesy block** in `credits.html` rather than plumbing
`audio_license` through the manifest/API. Rationale: audio is all PD/CC0 (no legal
attribution duty) and not machine-readable; data-plumbing was out of scope. (Alternative:
add audio license fields — deferred, low value for non-commercial PD/CC0.)
## Next /goal
```
/goal operator by-eye review of the credits colophon + Run-simulation button on design/cloudflare-static-publish, then the actual Cloudflare deploy (provision R2 human-experience-simulator-media + CORS, run tools.build_static, Pages deploy) per deploy/cloudflare/README.md
```
@@ -1,23 +0,0 @@
# Session 0029.0 — Transcript
> App: human-experience-filter-art
> Start: 2026-06-30T08-09 (PST)
> Type: planning-and-executing
> Posture: yolo
> Claude-Session: c87a07d3-917c-44bc-82cf-c6d8edee952b
> Checkout: /Users/benstull/git/benstull.org/benstull/human-experience-filter-art
> Status: **PLACEHOLDER — claimed at session start; finalized at session end.**
>
> This file reserves session ID 0029 for human-experience-filter-art. The driver replaces this
> body with the full transcript and renames the file to its final
> SESSION-0029.0-TRANSCRIPT-2026-06-30T08-09--<end>.md form at session end.
## Launch prompt
_(launch prompt not captured at claim time)_
## Deferred decisions
_Autonomous-mode low-confidence calls the driver made and would have
liked operator input on. Appended as the session runs; surfaced at
finalize. Empty if none._
@@ -0,0 +1,128 @@
# Session 0030.0 — Transcript
> App: human-experience-filter-art
> Start: 2026-06-30T08-10 (PST)
> End: 2026-06-30T08-50 (PST)
> Type: planning-and-executing
> Posture: yolo
> Claude-Session: c4cec6c6-26d8-46f3-80ee-4ff4035a4f72
> Checkout: /Users/benstull/git/benstull.org/benstull/human-experience-filter-art
> Date: 2026-06-30
> Goal: Add an obvious "Run simulation" start button to the simulator's main
> screen (shown after the "Loading Universe…" preload); it turns Video on and
> sets Audio to level 2. Turning Video on directly should also start the
> experience, snap Audio to 2, and dismiss the button. Move the default
> first-Video-on audio coupling from 3/10 → 2/10.
> Outcome: Built + verified (303 pytest, 8 pytest-playwright incl. 3 new, 12
> Playwright TS incl. 1 updated + 1 new, node unit tests green). Work committed
> as 3a45e33 and pushed to design/cloudflare-static-publish — **the commit was
> landed by a CONCURRENT session (0029)** that swept up this session's
> working-tree changes while doing the CC-credits/Cloudflare-publish work.
## Plan
1. Map the splash/loading flow and the Video/Audio toggle wiring (Explore agent
+ direct reads of `simulator/static/{index.html,app.js,style.css,i18n.js}`).
2. Add a `#run-sim` button inside the stage `.screen`, hidden until media
preloads, styled to sit above the black cover (`z-index: 60`).
3. Add a `beginExperience()` helper: Video on + audio snapped to a
`START_AUDIO_LEVEL = "2"` + button dismissed + soundtrack played in-gesture
(Safari unlock). Wire it to both the button click and the first direct
Video-on (`!videoEverOn`).
4. Reveal the button after `hideLoading()`; change the old 3/10 coupling → 2/10.
5. Localize `run.button` in en/es/fr/ja (4-lang parity invariant).
6. Update E2E coverage (pytest-playwright + Playwright TS) from the old
"couples to 3" assertions to 2; add button-shown / button-starts /
direct-video-on tests.
7. Run the full suite + confirm a pre-existing failure is not mine.
## Pre-session state
- Branch `main` clean at `934f60c` (left-brain annotations merged). Simulator
boots SILENT (video off, audio 0) and waited for the operator to flip the
unlabelled **Video** toggle as the start gesture — not obvious to a first-time
viewer. First-Video-on coupled audio to **3/10**.
- No session-init gate was run at the top of this session — it was treated as a
small, fully-specified frontend change (see Deferred decisions).
## Turn-by-turn arc
1. **Explore + direct reads.** Dispatched an `Explore` subagent to map the
splash + AV-toggle code; in parallel read `index.html`, `app.js`
(`main()`/`hideLoading()`/`beginExperience` region, the audio dial, the
`videoEverOn` coupling), `style.css` (`#loading`, `.black z-index:50`,
`.hidden`), and `i18n.js` (UI_STRINGS shape, 4 languages). Confirmed the
stage `.screen` is `position: relative` and the black cover is `z-index: 50`,
so a start button needs `z-index > 50` inside the screen and the side panel
(Video toggle) stays reachable.
2. **Implement.** Added `#run-sim` to the stage; `.run-sim` CSS (centered pill,
`z-index: 60`); `run.button` i18n string (en/es/fr/ja); `beginExperience()`
unifying both entry paths; revealed the button after `hideLoading()`;
simplified the Video-toggle handler to call `beginExperience()` on first
on; changed coupling 3 → 2.
3. **Update tests.** Replaced the old `test_video_on_couples_audio_to_three…`
(pytest) and the "couples audio to 3/10" Playwright TS test with 2/10
variants; added button-shown-after-load, button-starts-video+audio, and
direct-Video-on-dismisses-button cases on both harnesses.
4. **Verify.** `303 passed, 2 skipped` (non-E2E pytest); `8 passed`
pytest-playwright (incl. 3 new); `12 passed` Playwright `altitude-lock.spec`
(incl. updated + new). Node unit tests (i18n / index-i18n / scrub) green; the
i18n completeness invariant confirms `run.button` has all 4 langs.
5. **Isolate a failure.** `loop-recovery.spec.ts` failed; stashed only the
source files and re-ran on a clean baseline — it **fails identically without
my changes**, so it's pre-existing, not introduced here. (During that stash
round-trip a `test-results/.last-run.json` artifact briefly blocked
`git stash pop`; recovered by `git checkout`-ing the artifact and popping —
no source lost.)
6. **Handed the working tree back uncommitted** for an operator by-eye review
(the project's usual cadence — no Chrome on the box). Offered to branch + PR.
## Cut state (end of session)
| Item | State |
| --- | --- |
| Run-simulation button + audio-2 change | Committed `3a45e33` on `design/cloudflare-static-publish`, **pushed** |
| Committed by | Concurrent **session 0029** (swept up this session's working-tree changes) |
| Files | `simulator/static/{index.html,app.js,style.css,i18n.js}`, `simulator/e2e/tests/altitude-lock.spec.ts`, `tests/test_e2e_audio.py` |
| This session's working tree | Clean; nothing of mine left to commit/push/merge |
| Branch `design/cloudflare-static-publish` | Not merged to `main` — intentional; awaits operator review + Cloudflare deploy (session 0029's frontier) |
| Deploy pipeline (§9) | **N/A** — project is exempt (static Cloudflare target; see memory `project-exempt-from-wiggleverse-deploy`) |
| Verification | 303 pytest + 8 pytest-playwright + 12 Playwright TS + node units green; `loop-recovery.spec.ts` red **pre-existing** |
## What lands on the operator's plate
- **By-eye / by-ear review** of the Run-simulation button in a real browser —
especially the **in-gesture audio unlock on real Safari/iOS** (headless tests
relax autoplay, so it's wired-but-unconfirmed on a real device).
- The button work lives on `design/cloudflare-static-publish` alongside the
CC-credits + Cloudflare-publish work; it merges to `main` / ships when that
branch does (session 0029's frontier), not separately.
- Note the concurrency: this session authored the change; session 0029 committed
it. Two transcripts (0029, 0030) touch the same single commit `3a45e33`
expected, not a duplicate of the commit.
## Prompt the operator can paste into the next session
```
/goal operator eyeball review of the static build (incl. the new Run-simulation button) + execute the real Cloudflare deploy to benstull.art/human-experience-simulator, per the cloudflare-static-publish design on branch design/cloudflare-static-publish
```
## Deferred decisions
_Autonomous-mode low-confidence calls; surfaced at finalize._
1. **No session-init gate at the top.** Treated the task as a small,
fully-specified frontend tweak and implemented directly without claiming a
transcript first. Consequence: the work landed on a shared checkout and was
committed by a concurrent session (0029) rather than carrying its own
end-to-end branch→PR. Alternative: claim a session + isolated worktree up
front. Flagged because shared-checkout work is what the worktree rule guards
against.
2. **`beginExperience()` snaps audio to 2 unconditionally** on first Video-on,
overriding a viewer who pre-set a higher level before pressing start /
flipping Video. Matched the operator's explicit "snap to audio level 2"
wording; alternative was to only raise from 0 (the prior 3/10 behavior). Easy
to soften to "only if currently 0" if undesired.
3. **Real-device audio autoplay unverified.** Headless Chromium ran with
`--autoplay-policy=no-user-gesture-required`, masking real Safari/iOS
behavior; the in-gesture unlock is wired but needs a by-ear check.
@@ -0,0 +1,80 @@
# Session 0031.0 — Transcript
> App: human-experience-filter-art
> Start: 2026-06-30T09-06 (PST)
> End: 2026-06-30T09-11 (PST)
> Type: planning-and-executing
> Posture: yolo
> Claude-Session: c87a07d3-917c-44bc-82cf-c6d8edee952b
> Checkout: /Users/benstull/git/benstull.org/benstull/human-experience-filter-art
> Branch: design/cloudflare-static-publish
> Status: **FINALIZED**
## Launch prompt
Follow-up to session 0029's credits work. Operator's first ask was to rename the
credits URL → "about" (one page holding both about + credits) and add an
Accessibility table. Mid-clarification the operator redirected: **keep About and
Credits separate** (the About page is owned by a parallel session) and simply
**"Remove the 'About this work' from the credits page. I'll merge that into the
About page on the other session."**
## What I found before acting
- The Cloudflare site is now **LIVE** (`benstull.art/human-experience-simulator`);
the branch had advanced several commits since s0029 (live deploy, progressive
boot, an audio mediaBase fix), and moved again mid-session (`a68d0bc``d10ffca`).
- A **live concurrent session** owns `feat/accessibility-pass` with an
approved-pending design spec (`docs/superpowers/specs/2026-06-30-accessibility-and-about-page-design.md`):
a full WCAG 2.1 AA pass + a **separate `about.html`**. I surfaced the overlap with
the operator's original (one-page) ask; the operator resolved it by keeping the
pages separate and narrowing my task to the section removal.
## Arc
1. Surveyed git + the concurrent worktrees; read the a11y design spec.
2. Started to raise a coordination question; operator interrupted with the narrow
instruction (remove "About this work" from credits; they move it to About).
3. Claimed **session 0031**, isolated worktree off the live branch tip (`d10ffca`)
— only `credits.html` + its tests touched, so no overlap with the a11y session's
files (`index.html`/`style.css`/`app.js`/`about.html`).
4. Removed the `<section class="declaration">` "About this work" block from
`credits.html`; rewrote the footage note to be self-contained ("All footage is
altered in real time in the experience" — keeps the per-clip modification cue,
drops the dangling "as described above").
5. Updated tests to the new intent: `credits.test.js` and `tests/test_e2e_credits.py`
now assert the page notes footage is altered but the **CC BY-SA 4.0 declaration is
NOT** on credits (it moved to About).
6. Left the `.declaration` CSS rule in `style.css` (the About page reuses these styles).
7. Verified: node 28/28, pytest 315 passed / 2 skipped. Committed `8277417`,
ff-merged + pushed, removed the worktree, deleted the branch.
## End state
- `design/cloudflare-static-publish` @ `8277417`, clean, pushed.
- Credits page = per-clip attributions + "footage altered" note + audio courtesy
block. The CC BY-SA work-license declaration (D1) is **no longer on credits**
it now belongs on the About page (operator + `feat/accessibility-pass` own it).
- Site is live; this change reaches `benstull.art` only after a **redeploy**.
## Deferred decisions
- **Kept a brief "footage is altered" note on the credits page** rather than
stripping all alteration mention. Rationale: CC BY/BY-SA attribution wants the
modification indicated alongside the credit; the full license declaration is what
moved to About. (Alternative: remove every alteration mention from credits —
judged worse for the per-clip attribution's "indicate changes" cue.)
- **Left `.declaration` CSS in `style.css`** though now unused on credits — the
About page (other session) will reuse it; removing it would break that page.
## Compliance note
D1 (the altered-work CC BY-SA declaration) now depends on the About page actually
carrying it. **Confirm it landed on about.html before considering D1 done** — it is
currently in neither place on the live site until the About page ships + a redeploy.
## Next /goal
```
/goal confirm the About page (feat/accessibility-pass) carries the CC BY-SA 4.0 work-license declaration (D1, moved off credits in s0031), then redeploy design/cloudflare-static-publish to benstull.art per deploy/cloudflare/README.md
```
@@ -0,0 +1,56 @@
# Session 0032.0 — Transcript
> App: human-experience-filter-art
> Start: 2026-06-30T09-20 (PST)
> End: 2026-06-30T09-24 (PST)
> Type: planning-and-executing
> Posture: yolo
> Claude-Session: c87a07d3-917c-44bc-82cf-c6d8edee952b
> Checkout: /Users/benstull/git/benstull.org/benstull/human-experience-filter-art
> Branch: design/cloudflare-static-publish
> Status: **FINALIZED**
## Launch prompt
After confirming that the "About this work" section removed in s0031 *was* the D1
compliance (the CC BY-SA share-alike declaration, not the per-clip attribution),
the operator: "Ok let's add that content back but can we name the section something
other than 'About This Work' so it isn't confused with the about page?"
## Arc
1. Confirmed for the operator that "About this work" carried D1 specifically — the
ShareAlike license declaration for the BY-SA source clips — while the per-clip
attribution (the original goal) was untouched and stayed on credits.
2. Claimed **session 0032**, isolated worktree off the branch tip (`8277417`).
3. Re-added the CC BY-SA 4.0 declaration to `credits.html` under the heading
**"License & reuse"** (deliberately not "About this work" — that name is reserved
for the separate About page from `feat/accessibility-pass`). Restored the footage
note's "altered as described above" now that the section is back above it. Reused
the `.declaration` CSS left in place by s0031.
4. Reverted the s0031 test changes: `credits.test.js` + `tests/test_e2e_credits.py`
now assert the declaration IS present, plus pin the rename (heading ≠ "About this
work", contains "License & reuse").
5. Verified: node 28/28, pytest 315 passed / 2 skipped (e2e confirms "CC BY-SA 4.0"
visible in-browser again). Committed `ee7c65a`, ff-merged + pushed, removed the
worktree, deleted the branch.
## End state
- `design/cloudflare-static-publish` @ `ee7c65a`, clean, pushed.
- Credits page now carries BOTH halves of CC compliance: per-clip CC-BY/BY-SA
attribution **and** the CC BY-SA 4.0 derivative declaration (under "License &
reuse"). The s0031 gap (live site missing the share-alike declaration) is closed.
- Site is live; reaches `benstull.art` only after a **redeploy**.
## Deferred decisions
- **Section heading "License & reuse"** chosen (operator delegated the name). It pairs
with the "Credits & licenses" page title and is unambiguous vs. the About page.
(Alternatives weighed: "This work's license", "License & alteration".)
## Next /goal
```
/goal redeploy design/cloudflare-static-publish to benstull.art (CC-BY/BY-SA credits + "License & reuse" D1 declaration now both on the credits page) per deploy/cloudflare/README.md; the About page lands separately via the feat/accessibility-pass session
```
+9
View File
@@ -85,5 +85,14 @@
},
"0029": {
"title": ""
},
"0030": {
"title": ""
},
"0031": {
"title": ""
},
"0032": {
"title": ""
}
}
+269 -4
View File
@@ -233,6 +233,268 @@ AFFECT: dict[str, list[tuple]] = {
],
}
# --- Per-CLIP affect override (feelings drawn from THAT specific footage) --------
# When a clip is here, these feelings replace the scale's shared register for it —
# tailored to what the actual video evokes (mood, motion, light), keeping the
# scale's emotional family as a base. Reuses the scale `feel.*` keys where they fit
# (their es/fr/ja already exist) and adds new keys (with catalog translations) for
# nuances a clip needs. Same tuple shape: (key, [x,y], min_level, [4 tiers]).
AFFECT_CLIP: dict[str, list[tuple]] = {
"orbit_planetearth": [
("feel.wonder", [0.5, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.radiance", [0.22, 0.68], 2, ["bright", "radiance", "brilliance", "a jeweled brilliance"]),
("feel.serenity", [0.66, 0.58], 3, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.fragility", [0.42, 0.82], 4, ["thin", "fragility", "vulnerability", "a tender fragility"]),
],
"orbit_bluemarble": [
("feel.unity", [0.5, 0.44], 1, ["one", "unity", "belonging", "a borderless belonging"]),
("feel.fragility", [0.22, 0.68], 2, ["thin", "fragility", "vulnerability", "a tender fragility"]),
("feel.distance", [0.66, 0.58], 3, ["far", "distance", "remoteness", "an exquisite remoteness"]),
("feel.vastness", [0.42, 0.82], 4, ["big", "vastness", "immensity", "a dizzying immensity"]),
],
"orbit_aurora2025": [
("feel.wonder", [0.5, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.sublime", [0.22, 0.68], 2, ["grand", "the sublime", "grandeur", "a cathedral grandeur"]),
("feel.eeriness", [0.66, 0.58], 3, ["strange", "eeriness", "an otherworldly charge", "an electric, otherworldly hush"]),
("feel.serenity", [0.42, 0.82], 4, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
],
"orbit_citylights": [
("feel.tenderness", [0.5, 0.44], 1, ["soft", "tenderness", "warmth", "a cradles warmth"]),
("feel.longing", [0.22, 0.68], 2, ["want", "longing", "yearning", "an aching yearning"]),
("feel.fragility", [0.66, 0.58], 3, ["thin", "fragility", "vulnerability", "a tender fragility"]),
("feel.unity", [0.42, 0.82], 4, ["one", "unity", "belonging", "a borderless belonging"]),
],
"orbit_helene": [
("feel.sublime", [0.5, 0.44], 1, ["grand", "the sublime", "grandeur", "a cathedral grandeur"]),
("feel.turbulence", [0.22, 0.68], 2, ["churn", "turbulence", "ferment", "a violent ferment"]),
("feel.vastness", [0.66, 0.58], 3, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.fragility", [0.42, 0.82], 4, ["thin", "fragility", "vulnerability", "a tender fragility"]),
],
"orbit_epic": [
("feel.distance", [0.5, 0.44], 1, ["far", "distance", "remoteness", "an exquisite remoteness"]),
("feel.insignificance", [0.22, 0.68], 2, ["small", "smallness", "insignificance", "a humbling insignificance"]),
("feel.unity", [0.66, 0.58], 3, ["one", "unity", "belonging", "a borderless belonging"]),
("feel.serenity", [0.42, 0.82], 4, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
],
"sky_grca_templesa": [
("feel.wonder", [0.5, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.sublime", [0.22, 0.68], 2, ["grand", "the sublime", "grandeur", "a cathedral grandeur"]),
("feel.vastness", [0.66, 0.58], 3, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.exhilaration", [0.42, 0.82], 4, ["whee", "exhilaration", "elation", "a soaring elation"]),
],
"sky_greenland_landice": [
("feel.exhilaration", [0.5, 0.44], 1, ["whee", "exhilaration", "elation", "a soaring elation"]),
("feel.vastness", [0.22, 0.68], 2, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.purity", [0.66, 0.58], 3, ["pure", "purity", "stillness", "a glacial hush"]),
("feel.sublime", [0.42, 0.82], 4, ["grand", "the sublime", "grandeur", "a cathedral grandeur"]),
],
"sky_greenland_suture": [
("feel.serenity", [0.5, 0.44], 1, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.vastness", [0.22, 0.68], 2, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.solitude", [0.66, 0.58], 3, ["alone", "solitude", "isolation", "a vast frozen solitude"]),
("feel.lightness", [0.42, 0.82], 4, ["light", "lightness", "buoyancy", "a weightless buoyancy"]),
],
"sky_jungle_amazon": [
("feel.freedom", [0.5, 0.44], 1, ["free", "freedom", "release", "a boundless release"]),
("feel.verdancy", [0.22, 0.68], 2, ["lush", "verdancy", "abundance", "a teeming green abundance"]),
("feel.exhilaration", [0.66, 0.58], 3, ["whee", "exhilaration", "elation", "a soaring elation"]),
("feel.serenity", [0.42, 0.82], 4, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
],
"sky_jungle_waterfall": [
("feel.wonder", [0.5, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.vertigo", [0.22, 0.68], 2, ["whoa", "vertigo", "giddiness", "a giddy, falling vertigo"]),
("feel.freshness", [0.66, 0.58], 3, ["cool", "freshness", "vitality", "a cool, cascading freshness"]),
("feel.exhilaration", [0.42, 0.82], 4, ["whee", "exhilaration", "elation", "a soaring elation"]),
],
"sky_coast_cliffspain": [
("feel.sublime", [0.5, 0.44], 1, ["grand", "the sublime", "grandeur", "a cathedral grandeur"]),
("feel.exhilaration", [0.22, 0.68], 2, ["whee", "exhilaration", "elation", "a soaring elation"]),
("feel.turbulence", [0.66, 0.58], 3, ["churn", "turbulence", "ferment", "a violent ferment"]),
("feel.vastness", [0.42, 0.82], 4, ["big", "vastness", "immensity", "a dizzying immensity"]),
],
"sky_mtn_castlecrags": [
("feel.freedom", [0.5, 0.44], 1, ["free", "freedom", "release", "a boundless release"]),
("feel.serenity", [0.22, 0.68], 2, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.vastness", [0.66, 0.58], 3, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.lightness", [0.42, 0.82], 4, ["light", "lightness", "buoyancy", "a weightless buoyancy"]),
],
"sky_mtn_rocky": [
("feel.sublime", [0.5, 0.44], 1, ["grand", "the sublime", "grandeur", "a cathedral grandeur"]),
("feel.vertigo", [0.22, 0.68], 2, ["whoa", "vertigo", "giddiness", "a giddy, falling vertigo"]),
("feel.exhilaration", [0.66, 0.58], 3, ["whee", "exhilaration", "elation", "a soaring elation"]),
("feel.vastness", [0.42, 0.82], 4, ["big", "vastness", "immensity", "a dizzying immensity"]),
],
"coast_birdrock": [
("feel.melancholy", [0.5, 0.44], 1, ["sad", "melancholy", "longing", "a soft seaward longing"]),
("feel.fragility", [0.22, 0.68], 2, ["thin", "fragility", "vulnerability", "a tender fragility"]),
("feel.nostalgia", [0.66, 0.58], 3, ["miss", "nostalgia", "wistfulness", "a salt-air wistfulness"]),
("feel.serenity", [0.42, 0.82], 4, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
],
"coast_surfgrass": [
("feel.abundance", [0.5, 0.44], 1, ["full", "abundance", "richness", "a teeming richness"]),
("feel.immersion", [0.22, 0.68], 2, ["in", "immersion", "absorption", "a held, breathless absorption"]),
("feel.curiosity", [0.66, 0.58], 3, ["look", "curiosity", "fascination", "an absorbed fascination"]),
("feel.ease", [0.42, 0.82], 4, ["nice", "ease", "calm", "an unhurried calm"]),
],
"coast_kelp": [
("feel.immersion", [0.5, 0.44], 1, ["in", "immersion", "absorption", "a held, breathless absorption"]),
("feel.wonder", [0.22, 0.68], 2, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.serenity", [0.66, 0.58], 3, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.freedom", [0.42, 0.82], 4, ["free", "freedom", "release", "a boundless release"]),
],
"coast_otters": [
("feel.tenderness", [0.5, 0.44], 1, ["soft", "tenderness", "warmth", "a cradles warmth"]),
("feel.delight", [0.22, 0.68], 2, ["fun", "delight", "joy", "a darting, bright joy"]),
("feel.ease", [0.66, 0.58], 3, ["nice", "ease", "calm", "an unhurried calm"]),
("feel.belonging", [0.42, 0.82], 4, ["home", "belonging", "rootedness", "a tidal rootedness"]),
],
"coast_kalaloch": [
("feel.nostalgia", [0.5, 0.44], 1, ["miss", "nostalgia", "wistfulness", "a salt-air wistfulness"]),
("feel.melancholy", [0.22, 0.68], 2, ["sad", "melancholy", "longing", "a soft seaward longing"]),
("feel.serenity", [0.66, 0.58], 3, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.belonging", [0.42, 0.82], 4, ["home", "belonging", "rootedness", "a tidal rootedness"]),
],
"coast_seals": [
("feel.tenderness", [0.5, 0.44], 1, ["soft", "tenderness", "warmth", "a cradles warmth"]),
("feel.repose", [0.22, 0.68], 2, ["rest", "repose", "drowse", "a sun-warmed drowse"]),
("feel.belonging", [0.66, 0.58], 3, ["home", "belonging", "rootedness", "a tidal rootedness"]),
("feel.delight", [0.42, 0.82], 4, ["fun", "delight", "joy", "a darting, bright joy"]),
],
"coast_mist": [
("feel.serenity", [0.5, 0.44], 1, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.wonder", [0.22, 0.68], 2, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.hush", [0.66, 0.58], 3, ["quiet", "hush", "stillness", "a breath-held hush"]),
("feel.nostalgia", [0.42, 0.82], 4, ["miss", "nostalgia", "wistfulness", "a salt-air wistfulness"]),
],
"reef_lionfish": [
("feel.curiosity", [0.5, 0.44], 1, ["look", "curiosity", "fascination", "an absorbed fascination"]),
("feel.poise", [0.22, 0.68], 2, ["still", "poise", "grace", "a hovering, ornate poise"]),
("feel.fragility", [0.66, 0.58], 3, ["thin", "fragility", "vulnerability", "a tender fragility"]),
("feel.immersion", [0.42, 0.82], 4, ["in", "immersion", "absorption", "a held, breathless absorption"]),
],
"reef_spawning": [
("feel.abundance", [0.5, 0.44], 1, ["full", "abundance", "richness", "a teeming richness"]),
("feel.flow", [0.22, 0.68], 2, ["go", "flow", "streaming", "a sweeping, schooling flow"]),
("feel.vastness", [0.66, 0.58], 3, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.immersion", [0.42, 0.82], 4, ["in", "immersion", "absorption", "a held, breathless absorption"]),
],
"reef_hawkfish": [
("feel.radiance", [0.5, 0.44], 1, ["bright", "radiance", "brilliance", "a jeweled brilliance"]),
("feel.curiosity", [0.22, 0.68], 2, ["look", "curiosity", "fascination", "an absorbed fascination"]),
("feel.delight", [0.66, 0.58], 3, ["fun", "delight", "joy", "a darting, bright joy"]),
("feel.immersion", [0.42, 0.82], 4, ["in", "immersion", "absorption", "a held, breathless absorption"]),
],
"reef_coralspacific": [
("feel.intricacy", [0.5, 0.44], 1, ["fine", "intricacy", "detail", "an intricate, woven density"]),
("feel.fragility", [0.22, 0.68], 2, ["thin", "fragility", "vulnerability", "a tender fragility"]),
("feel.abundance", [0.66, 0.58], 3, ["full", "abundance", "richness", "a teeming richness"]),
("feel.curiosity", [0.42, 0.82], 4, ["look", "curiosity", "fascination", "an absorbed fascination"]),
],
"reef_redsea": [
("feel.serenity", [0.5, 0.44], 1, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.abundance", [0.22, 0.68], 2, ["full", "abundance", "richness", "a teeming richness"]),
("feel.radiance", [0.66, 0.58], 3, ["bright", "radiance", "brilliance", "a jeweled brilliance"]),
("feel.delight", [0.42, 0.82], 4, ["fun", "delight", "joy", "a darting, bright joy"]),
],
"reef_flowergarden": [
("feel.delight", [0.5, 0.44], 1, ["fun", "delight", "joy", "a darting, bright joy"]),
("feel.abundance", [0.22, 0.68], 2, ["full", "abundance", "richness", "a teeming richness"]),
("feel.freedom", [0.66, 0.58], 3, ["free", "freedom", "release", "a boundless release"]),
("feel.immersion", [0.42, 0.82], 4, ["in", "immersion", "absorption", "a held, breathless absorption"]),
],
"abyss_wow": [
("feel.vastness", [0.5, 0.44], 1, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.isolation", [0.22, 0.68], 2, ["alone", "isolation", "solitude", "a crushing solitude"]),
("feel.fascination", [0.66, 0.58], 3, ["ooh", "fascination", "wonder", "a forbidden wonder"]),
("feel.unease", [0.42, 0.82], 4, ["uh", "unease", "disquiet", "a creeping disquiet"]),
],
"abyss_midwaterexp": [
("feel.fragility", [0.5, 0.44], 1, ["thin", "fragility", "vulnerability", "a tender fragility"]),
("feel.fascination", [0.22, 0.68], 2, ["ooh", "fascination", "wonder", "a forbidden wonder"]),
("feel.poignancy", [0.66, 0.58], 3, ["ache", "poignancy", "bittersweetness", "a luminous farewell"]),
("feel.isolation", [0.42, 0.82], 4, ["alone", "isolation", "solitude", "a crushing solitude"]),
],
"abyss_hiding": [
("feel.spectral", [0.5, 0.44], 1, ["ghost", "the spectral", "hauntedness", "a ghost in the water"]),
("feel.unease", [0.22, 0.68], 2, ["uh", "unease", "disquiet", "a creeping disquiet"]),
("feel.fascination", [0.66, 0.58], 3, ["ooh", "fascination", "wonder", "a forbidden wonder"]),
("feel.fragility", [0.42, 0.82], 4, ["thin", "fragility", "vulnerability", "a tender fragility"]),
],
"abyss_bigfin": [
("feel.alienness", [0.5, 0.44], 1, ["odd", "alienness", "strangeness", "an alien grace"]),
("feel.fascination", [0.22, 0.68], 2, ["ooh", "fascination", "wonder", "a forbidden wonder"]),
("feel.unease", [0.66, 0.58], 3, ["uh", "unease", "disquiet", "a creeping disquiet"]),
("feel.isolation", [0.42, 0.82], 4, ["alone", "isolation", "solitude", "a crushing solitude"]),
],
"abyss_dandelion": [
("feel.radiance", [0.5, 0.44], 1, ["bright", "radiance", "brilliance", "a jeweled brilliance"]),
("feel.wonder", [0.22, 0.68], 2, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.fascination", [0.66, 0.58], 3, ["ooh", "fascination", "wonder", "a forbidden wonder"]),
("feel.fragility", [0.42, 0.82], 4, ["thin", "fragility", "vulnerability", "a tender fragility"]),
],
"abyss_octopus": [
("feel.curiosity", [0.5, 0.44], 1, ["look", "curiosity", "fascination", "an absorbed fascination"]),
("feel.isolation", [0.22, 0.68], 2, ["alone", "isolation", "solitude", "a crushing solitude"]),
("feel.tenderness", [0.66, 0.58], 3, ["soft", "tenderness", "warmth", "a cradles warmth"]),
("feel.unease", [0.42, 0.82], 4, ["uh", "unease", "disquiet", "a creeping disquiet"]),
],
"abyss_seapig": [
("feel.strangeness", [0.5, 0.44], 1, ["weird", "strangeness", "the uncanny", "a fleshy strangeness"]),
("feel.unease", [0.22, 0.68], 2, ["uh", "unease", "disquiet", "a creeping disquiet"]),
("feel.fascination", [0.66, 0.58], 3, ["ooh", "fascination", "wonder", "a forbidden wonder"]),
("feel.curiosity", [0.42, 0.82], 4, ["look", "curiosity", "fascination", "an absorbed fascination"]),
],
# cosmos — Webb "Cosmic Cliffs": monumental golden ridges, cathedral-scale.
"cosmos": [
("feel.wonder", [0.50, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.sublime", [0.22, 0.68], 2, ["grand", "the sublime", "grandeur", "a cathedral grandeur"]),
("feel.vastness", [0.66, 0.58], 3, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.insignificance", [0.42, 0.82], 4, ["small", "smallness", "insignificance", "a humbling insignificance"]),
],
# cosmos_galaxies — drifting through a dark field of galaxies: lonely, remote.
"cosmos_galaxies": [
("feel.vastness", [0.50, 0.44], 1, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.distance", [0.22, 0.68], 2, ["far", "distance", "remoteness", "an exquisite remoteness"]),
("feel.insignificance", [0.66, 0.58], 3, ["small", "smallness", "insignificance", "a humbling insignificance"]),
("feel.longing", [0.42, 0.82], 4, ["want", "longing", "yearning", "an aching yearning"]),
],
# cosmos_orion — soft rose-lit star nursery: tender, dreamy, warm.
"cosmos_orion": [
("feel.wonder", [0.50, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.tenderness", [0.22, 0.68], 2, ["soft", "tenderness", "warmth", "a cradles warmth"]),
("feel.serenity", [0.66, 0.58], 3, ["calm", "serenity", "peace", "a quiet, weightless peace"]),
("feel.longing", [0.42, 0.82], 4, ["want", "longing", "yearning", "an aching yearning"]),
],
# cosmos_tarantula — chaotic, fierce star-forming nebula: turbulent, intense.
"cosmos_tarantula": [
("feel.wonder", [0.50, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.turbulence", [0.22, 0.68], 2, ["churn", "turbulence", "ferment", "a violent ferment"]),
("feel.vastness", [0.66, 0.58], 3, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.insignificance", [0.42, 0.82], 4, ["small", "smallness", "insignificance", "a humbling insignificance"]),
],
# cosmos_westerlund — sparkling jewel-box star cluster: dazzling, radiant.
"cosmos_westerlund": [
("feel.wonder", [0.50, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.radiance", [0.22, 0.68], 2, ["bright", "radiance", "brilliance", "a jeweled brilliance"]),
("feel.exhilaration", [0.66, 0.58], 3, ["whee", "exhilaration", "elation", "a soaring elation"]),
("feel.vastness", [0.42, 0.82], 4, ["big", "vastness", "immensity", "a dizzying immensity"]),
],
# cosmos_southernring — gas shed by a dying star: elegiac, mortal, poignant.
"cosmos_southernring": [
("feel.wonder", [0.50, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.mortality", [0.22, 0.68], 2, ["end", "mortality", "impermanence", "a stars slow dying"]),
("feel.poignancy", [0.66, 0.58], 3, ["ache", "poignancy", "bittersweetness", "a luminous farewell"]),
("feel.longing", [0.42, 0.82], 4, ["want", "longing", "yearning", "an aching yearning"]),
],
# cosmos_carina_eso — wide teeming Milky Way star field: panoramic richness.
"cosmos_carina_eso": [
("feel.wonder", [0.50, 0.44], 1, ["wow", "wonder", "awe", "transcendent awe"]),
("feel.vastness", [0.22, 0.68], 2, ["big", "vastness", "immensity", "a dizzying immensity"]),
("feel.abundance", [0.66, 0.58], 3, ["full", "abundance", "richness", "a teeming richness"]),
("feel.insignificance", [0.42, 0.82], 4, ["small", "smallness", "insignificance", "a humbling insignificance"]),
],
}
def static_label(key, salience, tiers, box):
"""A fixed-box tiered label (always on-screen, salience-gated by Left)."""
@@ -587,10 +849,13 @@ LABELS: dict[str, list[dict]] = {
# data above; this maps measurement keys to nothing extra (their value IS the string).
def _affect_for_clip(scale: str) -> tuple[list, dict]:
"""Build the affect list + its strings for a scale's pool member."""
def _affect_for_clip(scale: str, clip_id: str) -> tuple[list, dict]:
"""Build the affect list + its strings for a clip. A per-clip override in
AFFECT_CLIP (feelings drawn from THAT footage) wins; otherwise the scale's
shared register applies."""
source = AFFECT_CLIP.get(clip_id, AFFECT[scale])
entries, strings = [], {}
for key, at, min_level, tiers in AFFECT[scale]:
for key, at, min_level, tiers in source:
entries.append({"key": key, "at": at, "min_level": min_level})
strings[key] = tiers
return entries, strings
@@ -609,7 +874,7 @@ def _labels_for_clip(clip_id: str) -> tuple[list, dict]:
def _clip_entry(scale: str, clip_id: str) -> dict:
title, license_, source = META[clip_id]
anns, lab_strings = _labels_for_clip(clip_id)
affect, aff_strings = _affect_for_clip(scale)
affect, aff_strings = _affect_for_clip(scale, clip_id)
return {
"id": clip_id,
"title": title,
File diff suppressed because it is too large Load Diff
+67 -2
View File
@@ -583,6 +583,49 @@ function renderOverlay(level, intensity) {
// knob no longer gates them). `intensity` is the layer opacity. Words are placed at authored
// scene points (no boxes — feelings are scene-level) and read softer than the
// clinical reticles — feeling, not measurement.
// --- Keep Feel (affect) words clear of Think (label) chips -------------------
// Feelings are scene-level (soft position), so we nudge THEM off the analytical
// chip plates rather than move a chip off its subject. Obstacles are computed
// from the manifest (not the DOM) so the clearance holds for the WHOLE loop: a
// tracked chip's drift is sampled, so the per-frame track re-render never slides
// a chip under an already-placed word. Mirrors chip()'s plate geometry.
const FS_CHIP = 2.4, PAD_CHIP = 0.6;
function chipPlateRect(bx, by, textLen) {
const w = textLen * FS_CHIP * 0.6 + PAD_CHIP * 2;
const h = FS_CHIP + PAD_CHIP * 1.4;
const cy = Math.max(by - h - 0.6, 0.4); // plate sits just above the box top
return { x: bx, y: cy, w, h };
}
function rectsOverlap(a, b, pad) {
pad = pad || 0;
return a.x < b.x + b.w + pad && a.x + a.w + pad > b.x &&
a.y < b.y + b.h + pad && a.y + a.h + pad > b.y;
}
// Plate rects for every left label visible at `level`; a tracked label's path is
// sampled across the loop so its whole drift envelope is treated as occupied.
function leftLabelPlates(clip, level) {
const out = [];
if (!clip || !clip.annotations || level <= 0) return out;
const strings = HEFi18n.resolveStrings(clip.strings, activeLang);
for (const a of clip.annotations) {
if (level < firstLevel(a)) continue;
const measure = a.key.startsWith("measure.");
const raw = strings[a.key];
const tier = measure ? 1 : clamp(level - firstLevel(a) + 1, 1, tierCount(raw));
const label = String(pickTier(raw !== undefined ? raw : a.key, tier) || "");
const len = label.length + (measure ? 0 : 5); // detections append " 0.xx"
const ts = (a.track && a.track.length) ? [0, 0.2, 0.4, 0.6, 0.8, 1] : [0];
for (const tt of ts) {
const b = boxAt(a, tt);
out.push(chipPlateRect(b[0] * 100, b[1] * 100, len));
}
}
// The global "◉ ANALYSIS · L… · … OBJ" status tag (top-right) shows whenever any
// label does — reserve its corner so feelings don't collide with it either.
if (out.length) out.push({ x: 64, y: 2, w: 34, h: 6 });
return out;
}
function renderAffect(strength, intensity, right) {
lastAffect = { strength, intensity, right };
const clip = activeClip();
@@ -591,14 +634,36 @@ function renderAffect(strength, intensity, right) {
if (!clip || !clip.affect || strength <= 0) { affectLayer.style.opacity = "0"; return; }
affectLayer.style.opacity = String(intensity);
const strings = HEFi18n.resolveStrings(clip.strings, activeLang);
// Chip plates to avoid (left labels visible at the current Left level), plus the
// words placed so far so feelings don't stack on each other either.
const obstacles = leftLabelPlates(clip, lastOverlay ? lastOverlay.level : 0);
const placed = [];
for (const f of clip.affect) {
if (f.min_level > strength) continue;
const [x, y] = f.at.map((n) => n * 100);
const t = svg("text", { x, y, "text-anchor": "middle", class: "hud-affect" }, affectLayer);
const [x, y0] = f.at.map((n) => n * 100);
const t = svg("text", { x, y: y0, "text-anchor": "middle", class: "hud-affect" }, affectLayer);
// RIGHT emotion tier: the vocabulary escalates basic -> compound as the Right
// knob rises (appearance is gated by the Right knob via `strength` above).
const raw = strings[f.key];
t.textContent = pickTier(raw !== undefined ? raw : f.key, clamp(right || 0, 1, tierCount(raw)));
// Nudge vertically off any chip plate / already-placed word, staying on-screen;
// keep the least-overlapping spot if nothing is fully clear.
const bb0 = t.getBBox();
// Diagnostic seam (sibling of window.__hefState): disable nudging to A/B the
// overlap-avoidance in tests.
const deconflict = !(typeof window !== "undefined" && window.__hefNoDeconflict);
if (deconflict && bb0.width) {
let bestY = y0, bestHits = Infinity;
for (const dy of [0, 4, -4, 8, -8, 12, -12, 16, -16, 20, -20]) {
const yy = clamp(y0 + dy, 4, 96);
const r = { x: bb0.x, y: bb0.y + (yy - y0), w: bb0.width, h: bb0.height };
const hits = obstacles.concat(placed).filter((o) => rectsOverlap(r, o, 0.4)).length;
if (hits < bestHits) { bestHits = hits; bestY = yy; if (hits === 0) break; }
}
if (bestY !== y0) t.setAttribute("y", bestY);
}
const bb = t.getBBox();
placed.push({ x: bb.x, y: bb.y, w: bb.width, h: bb.height });
}
}
File diff suppressed because it is too large Load Diff
+510 -12
View File
@@ -36,6 +36,12 @@
"anhelo",
"añoranza",
"una añoranza punzante"
],
"feel.sublime": [
"grandioso",
"lo sublime",
"grandeza",
"una grandeza catedralicia"
]
},
"cosmos_galaxies": {
@@ -70,7 +76,13 @@
"añoranza",
"una añoranza punzante"
],
"measure.count": "~2 billones de galaxias"
"measure.count": "~2 billones de galaxias",
"feel.distance": [
"lejos",
"distancia",
"lejanía",
"una lejanía exquisita"
]
},
"cosmos_orion": {
"feel.wonder": [
@@ -109,7 +121,19 @@
"estrella del Trapecio",
"Trapecio · cálidas estrellas O que iluminan la nebulosa"
],
"measure.distance": "≈1.344 al"
"measure.distance": "≈1.344 al",
"feel.tenderness": [
"suave",
"ternura",
"calidez",
"la calidez de una cuna"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
]
},
"cosmos_tarantula": {
"feel.wonder": [
@@ -148,7 +172,13 @@
"R136",
"R136 · reúne algunas de las estrellas más masivas conocidas"
],
"measure.distance": "≈160.000 al"
"measure.distance": "≈160.000 al",
"feel.turbulence": [
"agitación",
"turbulencia",
"fermento",
"un fermento violento"
]
},
"cosmos_westerlund": {
"feel.wonder": [
@@ -187,7 +217,19 @@
"estrella O-type",
"O-type · blanca azulada, decenas de masas solares"
],
"measure.distance": "≈20.000 al"
"measure.distance": "≈20.000 al",
"feel.radiance": [
"brillo",
"resplandor",
"fulgor",
"un fulgor de joyas"
],
"feel.exhilaration": [
"yupi",
"euforia",
"júbilo",
"un júbilo que se eleva"
]
},
"cosmos_southernring": {
"feel.wonder": [
@@ -226,7 +268,19 @@
"enana blanca",
"enana blanca · el núcleo estelar caliente que queda"
],
"measure.distance": "≈2.500 al"
"measure.distance": "≈2.500 al",
"feel.mortality": [
"fin",
"mortalidad",
"fugacidad",
"la lenta muerte de una estrella"
],
"feel.poignancy": [
"punzada",
"desgarro",
"melancolía dulce",
"una despedida luminosa"
]
},
"cosmos_carina_eso": {
"feel.wonder": [
@@ -265,7 +319,13 @@
"estrella masiva",
"estrella masiva · la que esculpe los acantilados de Carina"
],
"measure.distance": "≈7.500 al"
"measure.distance": "≈7.500 al",
"feel.abundance": [
"lleno",
"abundancia",
"riqueza",
"una riqueza rebosante"
]
},
"orbit_planetearth": {
"detected.cloud_band": [
@@ -304,6 +364,18 @@
"distancia",
"lejanía",
"una lejanía exquisita"
],
"feel.wonder": [
"guau",
"asombro",
"sobrecogimiento",
"sobrecogimiento trascendente"
],
"feel.radiance": [
"brillo",
"resplandor",
"fulgor",
"un fulgor de joyas"
]
},
"orbit_bluemarble": {
@@ -348,6 +420,12 @@
"distancia",
"lejanía",
"una lejanía exquisita"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"orbit_aurora2025": {
@@ -387,7 +465,25 @@
"limbo atmosférico",
"limbo atmosférico · ~100 km de aire, brillando de canto"
],
"measure.altitude": "~408 km"
"measure.altitude": "~408 km",
"feel.wonder": [
"guau",
"asombro",
"sobrecogimiento",
"sobrecogimiento trascendente"
],
"feel.sublime": [
"grandioso",
"lo sublime",
"grandeza",
"una grandeza catedralicia"
],
"feel.eeriness": [
"extraño",
"inquietud",
"una carga sobrenatural",
"un susurro eléctrico y sobrenatural"
]
},
"orbit_citylights": {
"feel.serenity": [
@@ -426,7 +522,19 @@
"luminiscencia atmosférica",
"luminiscencia del aire · la débil emisión nocturna de la alta atmósfera"
],
"measure.altitude": "~408 km"
"measure.altitude": "~408 km",
"feel.tenderness": [
"suave",
"ternura",
"calidez",
"la calidez de una cuna"
],
"feel.longing": [
"querer",
"anhelo",
"añoranza",
"una añoranza punzante"
]
},
"orbit_helene": {
"feel.serenity": [
@@ -465,7 +573,25 @@
"limbo atmosférico",
"limbo atmosférico · la fina capa donde vive el clima"
],
"measure.altitude": "~408 km"
"measure.altitude": "~408 km",
"feel.sublime": [
"grandioso",
"lo sublime",
"grandeza",
"una grandeza catedralicia"
],
"feel.turbulence": [
"agitación",
"turbulencia",
"fermento",
"un fermento violento"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"orbit_epic": {
"feel.serenity": [
@@ -504,7 +630,13 @@
"sistemas meteorológicos",
"sistemas meteorológicos · arremolinándose sobre un planeta que gira"
],
"measure.distance": "~1,5 M km"
"measure.distance": "~1,5 M km",
"feel.insignificance": [
"pequeño",
"pequeñez",
"insignificancia",
"una insignificancia que humilla"
]
},
"sky_grca_templesa": {
"feel.exhilaration": [
@@ -548,6 +680,24 @@
"cerro testigo",
"templo de roca",
"templo de roca · un cerro testigo de la erosión"
],
"feel.wonder": [
"guau",
"asombro",
"sobrecogimiento",
"sobrecogimiento trascendente"
],
"feel.sublime": [
"grandioso",
"lo sublime",
"grandeza",
"una grandeza catedralicia"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"sky_greenland_landice": {
@@ -592,6 +742,24 @@
"grietas",
"grietas glaciares",
"grietas · el hielo fracturándose al fluir"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
],
"feel.purity": [
"puro",
"pureza",
"quietud",
"un silencio glacial"
],
"feel.sublime": [
"grandioso",
"lo sublime",
"grandeza",
"una grandeza catedralicia"
]
},
"sky_greenland_suture": {
@@ -636,6 +804,24 @@
"témpanos",
"témpanos de banquisa",
"témpanos · placas de mar congelado a la deriva"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
],
"feel.solitude": [
"solo",
"soledad",
"aislamiento",
"una vasta soledad helada"
]
},
"sky_jungle_amazon": {
@@ -680,6 +866,18 @@
"bruma del dosel",
"bruma de transpiración",
"bruma de transpiración · el bosque exhalando vapor"
],
"feel.verdancy": [
"frondoso",
"verdor",
"exuberancia",
"una exuberancia verde y rebosante"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
]
},
"sky_jungle_waterfall": {
@@ -724,6 +922,18 @@
"aerosol",
"rocío de caída",
"rocío de caída · el río pulverizado al impactar"
],
"feel.wonder": [
"guau",
"asombro",
"sobrecogimiento",
"sobrecogimiento trascendente"
],
"feel.freshness": [
"fresco",
"frescura",
"vitalidad",
"una frescura que cae en cascada"
]
},
"sky_coast_cliffspain": {
@@ -768,6 +978,24 @@
"promontorio",
"promontorio rocoso",
"promontorio · un brazo de tierra acantilado en el mar"
],
"feel.sublime": [
"grandioso",
"lo sublime",
"grandeza",
"una grandeza catedralicia"
],
"feel.turbulence": [
"agitación",
"turbulencia",
"fermento",
"un fermento violento"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"sky_mtn_castlecrags": {
@@ -812,6 +1040,18 @@
"talud",
"talud de derrubios",
"talud · roca rota por el hielo amontonada bajo los riscos"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"sky_mtn_rocky": {
@@ -856,6 +1096,18 @@
"nevero",
"nevero alpino",
"nevero alpino · nieve persistente de gran altitud"
],
"feel.sublime": [
"grandioso",
"lo sublime",
"grandeza",
"una grandeza catedralicia"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"coast_birdrock": {
@@ -900,6 +1152,18 @@
"aves marinas",
"aves marinas anidando",
"colonia de aves marinas · el criadero que da nombre a la roca"
],
"feel.fragility": [
"fino",
"fragilidad",
"vulnerabilidad",
"una fragilidad tierna"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
]
},
"coast_surfgrass": {
@@ -944,6 +1208,24 @@
"poza de marea",
"poza intermareal",
"poza de marea · un mar en miniatura al bajar la marea"
],
"feel.abundance": [
"lleno",
"abundancia",
"riqueza",
"una riqueza rebosante"
],
"feel.immersion": [
"dentro",
"inmersión",
"absorción",
"una absorción contenida y sin aliento"
],
"feel.curiosity": [
"mira",
"curiosidad",
"fascinación",
"una fascinación absorta"
]
},
"coast_kelp": {
@@ -988,6 +1270,30 @@
"vejigas de gas",
"neumatocistos",
"neumatocistos · flotadores de gas que alzan las hojas a la luz"
],
"feel.immersion": [
"dentro",
"inmersión",
"absorción",
"una absorción contenida y sin aliento"
],
"feel.wonder": [
"guau",
"asombro",
"sobrecogimiento",
"sobrecogimiento trascendente"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
],
"feel.freedom": [
"libre",
"libertad",
"liberación",
"una liberación sin límites"
]
},
"coast_otters": {
@@ -1032,6 +1338,18 @@
"pelaje denso",
"el pelaje más denso",
"el pelaje más denso de la Tierra · ~1 M de pelos/in², sin grasa"
],
"feel.tenderness": [
"suave",
"ternura",
"calidez",
"la calidez de una cuna"
],
"feel.delight": [
"divertido",
"deleite",
"alegría",
"una alegría viva y centelleante"
]
},
"coast_kalaloch": {
@@ -1076,6 +1394,12 @@
"atardecer",
"hora dorada",
"hora dorada · el sol bajo enrojecido por más atmósfera"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
]
},
"coast_seals": {
@@ -1120,6 +1444,24 @@
"vibrisas",
"bigotes sensores",
"vibrisas · bigotes que detectan presas en agua turbia"
],
"feel.tenderness": [
"suave",
"ternura",
"calidez",
"la calidez de una cuna"
],
"feel.repose": [
"descanso",
"reposo",
"sopor",
"un sopor entibiado por el sol"
],
"feel.delight": [
"divertido",
"deleite",
"alegría",
"una alegría viva y centelleante"
]
},
"coast_mist": {
@@ -1164,6 +1506,24 @@
"mar de fondo",
"oleaje de fondo",
"mar de fondo · olas formadas por tormentas lejanas"
],
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
],
"feel.wonder": [
"guau",
"asombro",
"sobrecogimiento",
"sobrecogimiento trascendente"
],
"feel.hush": [
"silencio",
"quietud",
"sosiego",
"un silencio contenido"
]
},
"reef_lionfish": {
@@ -1203,6 +1563,18 @@
"inmersión",
"absorción",
"una absorción contenida y sin aliento"
],
"feel.poise": [
"quieto",
"aplomo",
"gracia",
"un aplomo suspendido y ornado"
],
"feel.fragility": [
"fino",
"fragilidad",
"vulnerabilidad",
"una fragilidad tierna"
]
},
"reef_spawning": {
@@ -1242,6 +1614,18 @@
"inmersión",
"absorción",
"una absorción contenida y sin aliento"
],
"feel.flow": [
"fluir",
"flujo",
"corriente",
"un flujo de cardumen que barre"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"reef_hawkfish": {
@@ -1281,6 +1665,12 @@
"coral de arrecife",
"coral duro",
"coral duro · el arrecife que este pez muele en arena"
],
"feel.radiance": [
"brillo",
"resplandor",
"fulgor",
"un fulgor de joyas"
]
},
"reef_coralspacific": {
@@ -1325,6 +1715,18 @@
"pólipos de coral",
"pólipos vivos",
"pólipos · cada uno un animal diminuto, constructores de la colonia"
],
"feel.intricacy": [
"fino",
"complejidad",
"detalle",
"una densidad intrincada y tejida"
],
"feel.fragility": [
"fino",
"fragilidad",
"vulnerabilidad",
"una fragilidad tierna"
]
},
"reef_redsea": {
@@ -1364,7 +1766,19 @@
"antias",
"antias · nubes naranjas de comeplancton sobre el arrecife"
],
"measure.depth": "10 m"
"measure.depth": "10 m",
"feel.serenity": [
"calma",
"serenidad",
"paz",
"una paz serena e ingrávida"
],
"feel.radiance": [
"brillo",
"resplandor",
"fulgor",
"un fulgor de joyas"
]
},
"reef_flowergarden": {
"feel.delight": [
@@ -1403,7 +1817,13 @@
"Abudefduf saxatilis",
"Abudefduf · la damisela rayada “sargento mayor”"
],
"measure.depth": "20 m"
"measure.depth": "20 m",
"feel.freedom": [
"libre",
"libertad",
"liberación",
"una liberación sin límites"
]
},
"abyss_wow": {
"detected.jelly": [
@@ -1442,6 +1862,12 @@
"pavor",
"presagio",
"un presagio lento y frío"
],
"feel.vastness": [
"grande",
"vastedad",
"inmensidad",
"una inmensidad vertiginosa"
]
},
"abyss_midwaterexp": {
@@ -1481,6 +1907,18 @@
"pavor",
"presagio",
"un presagio lento y frío"
],
"feel.fragility": [
"fino",
"fragilidad",
"vulnerabilidad",
"una fragilidad tierna"
],
"feel.poignancy": [
"punzada",
"desgarro",
"melancolía dulce",
"una despedida luminosa"
]
},
"abyss_hiding": {
@@ -1520,6 +1958,18 @@
"nieve marina",
"detrito que cae",
"nieve marina · restos orgánicos que descienden desde arriba"
],
"feel.spectral": [
"fantasma",
"lo espectral",
"lo fantasmal",
"un fantasma en el agua"
],
"feel.fragility": [
"fino",
"fragilidad",
"vulnerabilidad",
"una fragilidad tierna"
]
},
"abyss_bigfin": {
@@ -1559,6 +2009,12 @@
"brazos acodados",
"filamentos colgantes",
"brazos acodados · extendidos y luego colgando metros de hilo"
],
"feel.alienness": [
"raro",
"lo alienígena",
"extrañeza",
"una gracia alienígena"
]
},
"abyss_dandelion": {
@@ -1598,6 +2054,24 @@
"tentáculos",
"tentáculos de caza",
"tentáculos de caza · una red a la deriva para atrapar presas"
],
"feel.radiance": [
"brillo",
"resplandor",
"fulgor",
"un fulgor de joyas"
],
"feel.wonder": [
"guau",
"asombro",
"sobrecogimiento",
"sobrecogimiento trascendente"
],
"feel.fragility": [
"fino",
"fragilidad",
"vulnerabilidad",
"una fragilidad tierna"
]
},
"abyss_octopus": {
@@ -1637,6 +2111,18 @@
"ocho brazos",
"brazos con ventosas",
"ocho brazos · con ventosas que saborean lo que tocan"
],
"feel.curiosity": [
"mira",
"curiosidad",
"fascinación",
"una fascinación absorta"
],
"feel.tenderness": [
"suave",
"ternura",
"calidez",
"la calidez de una cuna"
]
},
"abyss_seapig": {
@@ -1676,6 +2162,18 @@
"velo oral",
"velo natatorio",
"velo oral · barre el sedimento y aletea para nadar"
],
"feel.strangeness": [
"raro",
"rareza",
"lo inquietante",
"una rareza carnosa"
],
"feel.curiosity": [
"mira",
"curiosidad",
"fascinación",
"una fascinación absorta"
]
}
}
+510 -12
View File
@@ -36,6 +36,12 @@
"désir",
"aspiration",
"une aspiration douloureuse"
],
"feel.sublime": [
"grandiose",
"le sublime",
"grandeur",
"une grandeur de cathédrale"
]
},
"cosmos_galaxies": {
@@ -70,7 +76,13 @@
"aspiration",
"une aspiration douloureuse"
],
"measure.count": "~2 000 milliards de galaxies"
"measure.count": "~2 000 milliards de galaxies",
"feel.distance": [
"loin",
"distance",
"éloignement",
"un éloignement exquis"
]
},
"cosmos_orion": {
"feel.wonder": [
@@ -109,7 +121,19 @@
"étoile du Trapèze",
"Trapèze · étoiles O chaudes illuminant la nébuleuse"
],
"measure.distance": "≈1 344 al"
"measure.distance": "≈1 344 al",
"feel.tenderness": [
"doux",
"tendresse",
"chaleur",
"la chaleur dun berceau"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
]
},
"cosmos_tarantula": {
"feel.wonder": [
@@ -148,7 +172,13 @@
"R136",
"R136 · concentre certaines des étoiles les plus massives connues"
],
"measure.distance": "≈160 000 al"
"measure.distance": "≈160 000 al",
"feel.turbulence": [
"remous",
"turbulence",
"ferment",
"un ferment violent"
]
},
"cosmos_westerlund": {
"feel.wonder": [
@@ -187,7 +217,19 @@
"étoile de type O",
"O-type · blanc-bleu, des dizaines de masses solaires"
],
"measure.distance": "≈20 000 al"
"measure.distance": "≈20 000 al",
"feel.radiance": [
"éclat",
"rayonnement",
"scintillement",
"un scintillement de joyaux"
],
"feel.exhilaration": [
"youpi",
"exaltation",
"euphorie",
"une euphorie qui s'envole"
]
},
"cosmos_southernring": {
"feel.wonder": [
@@ -226,7 +268,19 @@
"naine blanche",
"naine blanche · le cœur stellaire chaud laissé derrière"
],
"measure.distance": "≈2 500 al"
"measure.distance": "≈2 500 al",
"feel.mortality": [
"fin",
"mortalité",
"impermanence",
"la lente mort dune étoile"
],
"feel.poignancy": [
"pincement",
"émotion poignante",
"douceur amère",
"un adieu lumineux"
]
},
"cosmos_carina_eso": {
"feel.wonder": [
@@ -265,7 +319,13 @@
"étoile massive",
"étoile massive · celles qui sculptent les falaises de la Carène"
],
"measure.distance": "≈7 500 al"
"measure.distance": "≈7 500 al",
"feel.abundance": [
"plein",
"abondance",
"richesse",
"une richesse grouillante"
]
},
"orbit_planetearth": {
"detected.cloud_band": [
@@ -304,6 +364,18 @@
"distance",
"éloignement",
"un éloignement exquis"
],
"feel.wonder": [
"ouah",
"émerveillement",
"saisissement",
"un saisissement transcendant"
],
"feel.radiance": [
"éclat",
"rayonnement",
"scintillement",
"un scintillement de joyaux"
]
},
"orbit_bluemarble": {
@@ -348,6 +420,12 @@
"distance",
"éloignement",
"un éloignement exquis"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"orbit_aurora2025": {
@@ -387,7 +465,25 @@
"limbe atmosphérique",
"limbe atmosphérique · ~100 km d'air, brillant sur la tranche"
],
"measure.altitude": "~408 km"
"measure.altitude": "~408 km",
"feel.wonder": [
"ouah",
"émerveillement",
"saisissement",
"un saisissement transcendant"
],
"feel.sublime": [
"grandiose",
"le sublime",
"grandeur",
"une grandeur de cathédrale"
],
"feel.eeriness": [
"étrange",
"étrangeté",
"une charge surnaturelle",
"un frisson électrique et surnaturel"
]
},
"orbit_citylights": {
"feel.serenity": [
@@ -426,7 +522,19 @@
"luminescence atmosphérique",
"luminescence atmosphérique · la faible émission nocturne de la haute atmosphère"
],
"measure.altitude": "~408 km"
"measure.altitude": "~408 km",
"feel.tenderness": [
"doux",
"tendresse",
"chaleur",
"la chaleur dun berceau"
],
"feel.longing": [
"envie",
"désir",
"aspiration",
"une aspiration douloureuse"
]
},
"orbit_helene": {
"feel.serenity": [
@@ -465,7 +573,25 @@
"limbe atmosphérique",
"limbe atmosphérique · la fine pellicule où vit la météo"
],
"measure.altitude": "~408 km"
"measure.altitude": "~408 km",
"feel.sublime": [
"grandiose",
"le sublime",
"grandeur",
"une grandeur de cathédrale"
],
"feel.turbulence": [
"remous",
"turbulence",
"ferment",
"un ferment violent"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"orbit_epic": {
"feel.serenity": [
@@ -504,7 +630,13 @@
"systèmes météorologiques",
"systèmes météorologiques · tourbillonnant sur une planète qui tourne"
],
"measure.distance": "~1,5 M km"
"measure.distance": "~1,5 M km",
"feel.insignificance": [
"petit",
"petitesse",
"insignifiance",
"une insignifiance qui rend humble"
]
},
"sky_grca_templesa": {
"feel.exhilaration": [
@@ -548,6 +680,24 @@
"butte-témoin",
"temple rocheux",
"temple rocheux · une butte-témoin laissée par l’érosion"
],
"feel.wonder": [
"ouah",
"émerveillement",
"saisissement",
"un saisissement transcendant"
],
"feel.sublime": [
"grandiose",
"le sublime",
"grandeur",
"une grandeur de cathédrale"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"sky_greenland_landice": {
@@ -592,6 +742,24 @@
"crevasses",
"crevasses glaciaires",
"crevasses · la glace se fracture en s’écoulant"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
],
"feel.purity": [
"pur",
"pureté",
"quiétude",
"un silence glaciaire"
],
"feel.sublime": [
"grandiose",
"le sublime",
"grandeur",
"une grandeur de cathédrale"
]
},
"sky_greenland_suture": {
@@ -636,6 +804,24 @@
"floes",
"floes de banquise",
"floes · plaques de mer gelée à la dérive"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
],
"feel.solitude": [
"seul",
"solitude",
"isolement",
"une vaste solitude gelée"
]
},
"sky_jungle_amazon": {
@@ -680,6 +866,18 @@
"brume de canopée",
"brume de transpiration",
"brume de transpiration · la forêt exhalant sa vapeur"
],
"feel.verdancy": [
"luxuriant",
"verdure",
"abondance",
"une abondance verte et grouillante"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
]
},
"sky_jungle_waterfall": {
@@ -724,6 +922,18 @@
"embruns",
"embruns de chute",
"embruns de chute · la rivière pulvérisée à limpact"
],
"feel.wonder": [
"ouah",
"émerveillement",
"saisissement",
"un saisissement transcendant"
],
"feel.freshness": [
"frais",
"fraîcheur",
"vitalité",
"une fraîcheur en cascade"
]
},
"sky_coast_cliffspain": {
@@ -768,6 +978,24 @@
"promontoire",
"promontoire rocheux",
"promontoire · un bras de terre escarpé dans la mer"
],
"feel.sublime": [
"grandiose",
"le sublime",
"grandeur",
"une grandeur de cathédrale"
],
"feel.turbulence": [
"remous",
"turbulence",
"ferment",
"un ferment violent"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"sky_mtn_castlecrags": {
@@ -812,6 +1040,18 @@
"talus",
"talus d’éboulis",
"éboulis · roches gélifractées entassées sous les aiguilles"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"sky_mtn_rocky": {
@@ -856,6 +1096,18 @@
"névé",
"névé alpin",
"névé alpin · neige persistante de haute altitude"
],
"feel.sublime": [
"grandiose",
"le sublime",
"grandeur",
"une grandeur de cathédrale"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"coast_birdrock": {
@@ -900,6 +1152,18 @@
"oiseaux marins",
"oiseaux marins nicheurs",
"colonie doiseaux marins · la rookerie qui nomme le rocher"
],
"feel.fragility": [
"mince",
"fragilité",
"vulnérabilité",
"une tendre fragilité"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
]
},
"coast_surfgrass": {
@@ -944,6 +1208,24 @@
"cuvette de marée",
"mare intertidale",
"cuvette de marée · une mer de poche découverte à marée basse"
],
"feel.abundance": [
"plein",
"abondance",
"richesse",
"une richesse grouillante"
],
"feel.immersion": [
"dedans",
"immersion",
"absorption",
"une absorption retenue, à couper le souffle"
],
"feel.curiosity": [
"regarde",
"curiosité",
"fascination",
"une fascination absorbée"
]
},
"coast_kelp": {
@@ -988,6 +1270,30 @@
"vésicules à gaz",
"pneumatocystes",
"pneumatocystes · des flotteurs à gaz qui hissent les lames vers la lumière"
],
"feel.immersion": [
"dedans",
"immersion",
"absorption",
"une absorption retenue, à couper le souffle"
],
"feel.wonder": [
"ouah",
"émerveillement",
"saisissement",
"un saisissement transcendant"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
],
"feel.freedom": [
"libre",
"liberté",
"délivrance",
"une délivrance sans limites"
]
},
"coast_otters": {
@@ -1032,6 +1338,18 @@
"fourrure dense",
"la fourrure la plus dense",
"la fourrure la plus dense au monde · ~1 M de poils/in², sans graisse"
],
"feel.tenderness": [
"doux",
"tendresse",
"chaleur",
"la chaleur dun berceau"
],
"feel.delight": [
"amusant",
"ravissement",
"joie",
"une joie vive et frétillante"
]
},
"coast_kalaloch": {
@@ -1076,6 +1394,12 @@
"coucher de soleil",
"heure dorée",
"heure dorée · le soleil bas rougi par plus datmosphère"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
]
},
"coast_seals": {
@@ -1120,6 +1444,24 @@
"vibrisses",
"moustaches sensorielles",
"vibrisses · des moustaches qui sentent les proies en eau trouble"
],
"feel.tenderness": [
"doux",
"tendresse",
"chaleur",
"la chaleur dun berceau"
],
"feel.repose": [
"repos",
"quiétude",
"somnolence",
"une somnolence réchauffée de soleil"
],
"feel.delight": [
"amusant",
"ravissement",
"joie",
"une joie vive et frétillante"
]
},
"coast_mist": {
@@ -1164,6 +1506,24 @@
"houle",
"houle océanique",
"houle · des vagues nées de tempêtes lointaines"
],
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
],
"feel.wonder": [
"ouah",
"émerveillement",
"saisissement",
"un saisissement transcendant"
],
"feel.hush": [
"silence",
"calme",
"quiétude",
"un silence retenu"
]
},
"reef_lionfish": {
@@ -1203,6 +1563,18 @@
"immersion",
"absorption",
"une absorption retenue, à couper le souffle"
],
"feel.poise": [
"immobile",
"aplomb",
"grâce",
"un aplomb suspendu et ouvragé"
],
"feel.fragility": [
"mince",
"fragilité",
"vulnérabilité",
"une tendre fragilité"
]
},
"reef_spawning": {
@@ -1242,6 +1614,18 @@
"immersion",
"absorption",
"une absorption retenue, à couper le souffle"
],
"feel.flow": [
"aller",
"flux",
"courant",
"un flux de banc qui ondule"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"reef_hawkfish": {
@@ -1281,6 +1665,12 @@
"corail récifal",
"corail dur",
"corail dur · le récif que ce poisson broie en sable"
],
"feel.radiance": [
"éclat",
"rayonnement",
"scintillement",
"un scintillement de joyaux"
]
},
"reef_coralspacific": {
@@ -1325,6 +1715,18 @@
"polypes coralliens",
"polypes vivants",
"polypes · chacun un animal minuscule, bâtisseurs de la colonie"
],
"feel.intricacy": [
"fin",
"complexité",
"détail",
"une densité tissée et complexe"
],
"feel.fragility": [
"mince",
"fragilité",
"vulnérabilité",
"une tendre fragilité"
]
},
"reef_redsea": {
@@ -1364,7 +1766,19 @@
"anthias",
"anthias · nuages orange de mangeurs de plancton au-dessus du récif"
],
"measure.depth": "10 m"
"measure.depth": "10 m",
"feel.serenity": [
"calme",
"sérénité",
"paix",
"une paix tranquille et sans pesanteur"
],
"feel.radiance": [
"éclat",
"rayonnement",
"scintillement",
"un scintillement de joyaux"
]
},
"reef_flowergarden": {
"feel.delight": [
@@ -1403,7 +1817,13 @@
"Abudefduf saxatilis",
"Abudefduf · la demoiselle rayée “sergent-major”"
],
"measure.depth": "20 m"
"measure.depth": "20 m",
"feel.freedom": [
"libre",
"liberté",
"délivrance",
"une délivrance sans limites"
]
},
"abyss_wow": {
"detected.jelly": [
@@ -1442,6 +1862,12 @@
"effroi",
"pressentiment",
"un pressentiment lent et glacé"
],
"feel.vastness": [
"grand",
"vastitude",
"immensité",
"une immensité vertigineuse"
]
},
"abyss_midwaterexp": {
@@ -1481,6 +1907,18 @@
"effroi",
"pressentiment",
"un pressentiment lent et glacé"
],
"feel.fragility": [
"mince",
"fragilité",
"vulnérabilité",
"une tendre fragilité"
],
"feel.poignancy": [
"pincement",
"émotion poignante",
"douceur amère",
"un adieu lumineux"
]
},
"abyss_hiding": {
@@ -1520,6 +1958,18 @@
"neige marine",
"détritus tombants",
"neige marine · débris organiques descendant des couches supérieures"
],
"feel.spectral": [
"fantôme",
"le spectral",
"hantise",
"un fantôme dans leau"
],
"feel.fragility": [
"mince",
"fragilité",
"vulnérabilité",
"une tendre fragilité"
]
},
"abyss_bigfin": {
@@ -1559,6 +2009,12 @@
"bras coudés",
"filaments traînants",
"bras coudés · tendus puis traînant des mètres de fil"
],
"feel.alienness": [
"bizarre",
"l’étrangeté",
"altérité",
"une grâce extraterrestre"
]
},
"abyss_dandelion": {
@@ -1598,6 +2054,24 @@
"tentacules",
"tentacules de capture",
"tentacules de capture · un filet dérivant pour les proies"
],
"feel.radiance": [
"éclat",
"rayonnement",
"scintillement",
"un scintillement de joyaux"
],
"feel.wonder": [
"ouah",
"émerveillement",
"saisissement",
"un saisissement transcendant"
],
"feel.fragility": [
"mince",
"fragilité",
"vulnérabilité",
"une tendre fragilité"
]
},
"abyss_octopus": {
@@ -1637,6 +2111,18 @@
"huit bras",
"bras à ventouses",
"huit bras · garnis de ventouses qui goûtent ce quelles touchent"
],
"feel.curiosity": [
"regarde",
"curiosité",
"fascination",
"une fascination absorbée"
],
"feel.tenderness": [
"doux",
"tendresse",
"chaleur",
"la chaleur dun berceau"
]
},
"abyss_seapig": {
@@ -1676,6 +2162,18 @@
"voile oral",
"voile natatoire",
"voile oral · balaie le sédiment et bat pour nager"
],
"feel.strangeness": [
"étrange",
"bizarrerie",
"linquiétant",
"une étrangeté charnue"
],
"feel.curiosity": [
"regarde",
"curiosité",
"fascination",
"une fascination absorbée"
]
}
}
+510 -12
View File
@@ -36,6 +36,12 @@
"憧れ",
"切望",
"胸を締めつける切望"
],
"feel.sublime": [
"雄大",
"崇高",
"荘厳",
"大聖堂のような荘厳さ"
]
},
"cosmos_galaxies": {
@@ -70,7 +76,13 @@
"切望",
"胸を締めつける切望"
],
"measure.count": "約2兆個の銀河"
"measure.count": "約2兆個の銀河",
"feel.distance": [
"遠い",
"隔たり",
"遥かさ",
"この上なく美しい遥かさ"
]
},
"cosmos_orion": {
"feel.wonder": [
@@ -109,7 +121,19 @@
"Trapezium星",
"Trapezium · 星雲を照らす高温のO-type星"
],
"measure.distance": "≈1,344 光年"
"measure.distance": "≈1,344 光年",
"feel.tenderness": [
"やさしい",
"優しさ",
"ぬくもり",
"ゆりかごのようなぬくもり"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
]
},
"cosmos_tarantula": {
"feel.wonder": [
@@ -148,7 +172,13 @@
"R136",
"R136 · 知られている中で最も重い部類の星々を抱える"
],
"measure.distance": "≈160,000 光年"
"measure.distance": "≈160,000 光年",
"feel.turbulence": [
"渦巻き",
"乱流",
"胎動",
"激しい胎動"
]
},
"cosmos_westerlund": {
"feel.wonder": [
@@ -187,7 +217,19 @@
"O-type星",
"O-type · 青白い、太陽の数十倍の質量"
],
"measure.distance": "≈20,000 光年"
"measure.distance": "≈20,000 光年",
"feel.radiance": [
"輝き",
"光輝",
"煌めき",
"宝石のような煌めき"
],
"feel.exhilaration": [
"わーい",
"高揚",
"歓喜",
"舞い上がる歓喜"
]
},
"cosmos_southernring": {
"feel.wonder": [
@@ -226,7 +268,19 @@
"白色矮星",
"白色矮星 · 残された高温の星の中心核"
],
"measure.distance": "≈2,500 光年"
"measure.distance": "≈2,500 光年",
"feel.mortality": [
"終わり",
"死",
"無常",
"星のゆるやかな死"
],
"feel.poignancy": [
"切なさ",
"哀切",
"ほろ苦さ",
"光に満ちた別れ"
]
},
"cosmos_carina_eso": {
"feel.wonder": [
@@ -265,7 +319,13 @@
"重い星",
"重い星 · カリーナの崖を彫り出すたぐいの星"
],
"measure.distance": "≈7,500 光年"
"measure.distance": "≈7,500 光年",
"feel.abundance": [
"いっぱい",
"豊かさ",
"充溢",
"あふれんばかりの充溢"
]
},
"orbit_planetearth": {
"detected.cloud_band": [
@@ -304,6 +364,18 @@
"隔たり",
"遥かさ",
"この上なく美しい遥かさ"
],
"feel.wonder": [
"わあ",
"驚き",
"畏敬",
"超越的な畏敬"
],
"feel.radiance": [
"輝き",
"光輝",
"煌めき",
"宝石のような煌めき"
]
},
"orbit_bluemarble": {
@@ -348,6 +420,12 @@
"隔たり",
"遥かさ",
"この上なく美しい遥かさ"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"orbit_aurora2025": {
@@ -387,7 +465,25 @@
"大気の縁",
"大気の縁 · 約100 kmの大気層が縁で光る"
],
"measure.altitude": "約408 km"
"measure.altitude": "約408 km",
"feel.wonder": [
"わあ",
"驚き",
"畏敬",
"超越的な畏敬"
],
"feel.sublime": [
"雄大",
"崇高",
"荘厳",
"大聖堂のような荘厳さ"
],
"feel.eeriness": [
"異様",
"不気味さ",
"異世界の気配",
"電気を帯びた異世界の静けさ"
]
},
"orbit_citylights": {
"feel.serenity": [
@@ -426,7 +522,19 @@
"超高層の大気光",
"大気光 · 高層大気がかすかに放つ夜間の光"
],
"measure.altitude": "約408 km"
"measure.altitude": "約408 km",
"feel.tenderness": [
"やさしい",
"優しさ",
"ぬくもり",
"ゆりかごのようなぬくもり"
],
"feel.longing": [
"欲しい",
"憧れ",
"切望",
"胸を締めつける切望"
]
},
"orbit_helene": {
"feel.serenity": [
@@ -465,7 +573,25 @@
"大気の縁",
"大気の縁 · 気象が宿る薄い層"
],
"measure.altitude": "約408 km"
"measure.altitude": "約408 km",
"feel.sublime": [
"雄大",
"崇高",
"荘厳",
"大聖堂のような荘厳さ"
],
"feel.turbulence": [
"渦巻き",
"乱流",
"胎動",
"激しい胎動"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"orbit_epic": {
"feel.serenity": [
@@ -504,7 +630,13 @@
"気象系",
"気象系 · 回転する惑星の上を渦巻く"
],
"measure.distance": "約150万 km"
"measure.distance": "約150万 km",
"feel.insignificance": [
"小さい",
"小ささ",
"ちっぽけさ",
"謙虚にさせるちっぽけさ"
]
},
"sky_grca_templesa": {
"feel.exhilaration": [
@@ -548,6 +680,24 @@
"残丘",
"岩の神殿",
"岩の‘神殿’ · 浸食に取り残された残丘"
],
"feel.wonder": [
"わあ",
"驚き",
"畏敬",
"超越的な畏敬"
],
"feel.sublime": [
"雄大",
"崇高",
"荘厳",
"大聖堂のような荘厳さ"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"sky_greenland_landice": {
@@ -592,6 +742,24 @@
"クレバス",
"氷河の裂け目",
"クレバス · 流れる氷が割れてできた裂け目"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
],
"feel.purity": [
"清らか",
"純粋さ",
"静寂",
"氷河のような静寂"
],
"feel.sublime": [
"雄大",
"崇高",
"荘厳",
"大聖堂のような荘厳さ"
]
},
"sky_greenland_suture": {
@@ -636,6 +804,24 @@
"氷盤",
"流氷の氷盤",
"氷盤 · 漂う凍った海の板"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
],
"feel.solitude": [
"ひとり",
"孤独",
"隔絶",
"凍てつく広大な孤独"
]
},
"sky_jungle_amazon": {
@@ -680,6 +866,18 @@
"林冠のもや",
"蒸散のもや",
"蒸散のもや · 森が吐き出す水蒸気"
],
"feel.verdancy": [
"緑豊か",
"青々しさ",
"繁茂",
"生い茂る緑の豊かさ"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
]
},
"sky_jungle_waterfall": {
@@ -724,6 +922,18 @@
"しぶき",
"落下のしぶき",
"落下のしぶき · 衝突で霧化した川"
],
"feel.wonder": [
"わあ",
"驚き",
"畏敬",
"超越的な畏敬"
],
"feel.freshness": [
"涼しい",
"清々しさ",
"生命力",
"滝のように降りそそぐ清涼"
]
},
"sky_coast_cliffspain": {
@@ -768,6 +978,24 @@
"岬",
"岩の岬",
"岬 · 海へ突き出す断崖の地"
],
"feel.sublime": [
"雄大",
"崇高",
"荘厳",
"大聖堂のような荘厳さ"
],
"feel.turbulence": [
"渦巻き",
"乱流",
"胎動",
"激しい胎動"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"sky_mtn_castlecrags": {
@@ -812,6 +1040,18 @@
"タルス",
"岩屑の斜面",
"タルス · 凍結破砕した岩が岩峰の下に堆積"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"sky_mtn_rocky": {
@@ -856,6 +1096,18 @@
"雪原",
"高山の雪原",
"高山の雪原 · 標高の高い場所に残る雪"
],
"feel.sublime": [
"雄大",
"崇高",
"荘厳",
"大聖堂のような荘厳さ"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"coast_birdrock": {
@@ -900,6 +1152,18 @@
"海鳥",
"営巣する海鳥",
"海鳥のコロニー · 岩の名の由来となる集団繁殖地"
],
"feel.fragility": [
"薄い",
"儚さ",
"脆さ",
"いたわりたくなる儚さ"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
]
},
"coast_surfgrass": {
@@ -944,6 +1208,24 @@
"タイドプール",
"潮間帯の池",
"潮だまり · 干潮で現れる小さな海"
],
"feel.abundance": [
"いっぱい",
"豊かさ",
"充溢",
"あふれんばかりの充溢"
],
"feel.immersion": [
"中へ",
"没入",
"没頭",
"息を呑む没頭"
],
"feel.curiosity": [
"見て",
"好奇心",
"魅了",
"のめり込む魅了"
]
},
"coast_kelp": {
@@ -988,6 +1270,30 @@
"気胞",
"気胞(ニューマトシスト)",
"気胞 · 葉を光へ持ち上げるガスの浮き"
],
"feel.immersion": [
"中へ",
"没入",
"没頭",
"息を呑む没頭"
],
"feel.wonder": [
"わあ",
"驚き",
"畏敬",
"超越的な畏敬"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
],
"feel.freedom": [
"自由",
"自由さ",
"解放",
"果てしない解放"
]
},
"coast_otters": {
@@ -1032,6 +1338,18 @@
"密な毛皮",
"世界一密な毛皮",
"世界一密な毛皮 · 約100万本/in²、脂肪層なし"
],
"feel.tenderness": [
"やさしい",
"優しさ",
"ぬくもり",
"ゆりかごのようなぬくもり"
],
"feel.delight": [
"楽しい",
"喜び",
"歓び",
"ちらちらと輝く歓び"
]
},
"coast_kalaloch": {
@@ -1076,6 +1394,12 @@
"夕焼け",
"ゴールデンアワー",
"ゴールデンアワー · 大気を長く通り赤らむ低い太陽"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
]
},
"coast_seals": {
@@ -1120,6 +1444,24 @@
"触毛",
"感覚のひげ",
"触毛 · 濁った水中で獲物を感じ取るひげ"
],
"feel.tenderness": [
"やさしい",
"優しさ",
"ぬくもり",
"ゆりかごのようなぬくもり"
],
"feel.repose": [
"休息",
"安らぎ",
"まどろみ",
"陽だまりのまどろみ"
],
"feel.delight": [
"楽しい",
"喜び",
"歓び",
"ちらちらと輝く歓び"
]
},
"coast_mist": {
@@ -1164,6 +1506,24 @@
"うねり",
"海のうねり",
"うねり · 遠くの嵐が生んだ波"
],
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
],
"feel.wonder": [
"わあ",
"驚き",
"畏敬",
"超越的な畏敬"
],
"feel.hush": [
"静か",
"静けさ",
"沈黙",
"息をひそめた静けさ"
]
},
"reef_lionfish": {
@@ -1203,6 +1563,18 @@
"没入",
"没頭",
"息を呑む没頭"
],
"feel.poise": [
"静止",
"気品",
"優雅",
"宙に浮く華麗な気品"
],
"feel.fragility": [
"薄い",
"儚さ",
"脆さ",
"いたわりたくなる儚さ"
]
},
"reef_spawning": {
@@ -1242,6 +1614,18 @@
"没入",
"没頭",
"息を呑む没頭"
],
"feel.flow": [
"流れ",
"フロー",
"奔流",
"群れが織りなすうねり"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"reef_hawkfish": {
@@ -1281,6 +1665,12 @@
"礁サンゴ",
"造礁サンゴ",
"造礁サンゴ · この魚が削って砂にする礁"
],
"feel.radiance": [
"輝き",
"光輝",
"煌めき",
"宝石のような煌めき"
]
},
"reef_coralspacific": {
@@ -1325,6 +1715,18 @@
"サンゴのポリプ",
"生きたポリプ",
"ポリプ · 一つ一つが小さな動物、群体の建設者"
],
"feel.intricacy": [
"精緻",
"複雑さ",
"細部",
"織り込まれた緻密さ"
],
"feel.fragility": [
"薄い",
"儚さ",
"脆さ",
"いたわりたくなる儚さ"
]
},
"reef_redsea": {
@@ -1364,7 +1766,19 @@
"ハナダイ",
"ハナダイ · 礁の上を漂う、プランクトンを食むオレンジの群れ"
],
"measure.depth": "10 m"
"measure.depth": "10 m",
"feel.serenity": [
"穏やか",
"静けさ",
"安らぎ",
"静かで無重力の安らぎ"
],
"feel.radiance": [
"輝き",
"光輝",
"煌めき",
"宝石のような煌めき"
]
},
"reef_flowergarden": {
"feel.delight": [
@@ -1403,7 +1817,13 @@
"Abudefduf saxatilis",
"Abudefduf · 縞模様の「sergeant major」スズメダイ"
],
"measure.depth": "20 m"
"measure.depth": "20 m",
"feel.freedom": [
"自由",
"自由さ",
"解放",
"果てしない解放"
]
},
"abyss_wow": {
"detected.jelly": [
@@ -1442,6 +1862,12 @@
"恐れ",
"胸騒ぎ",
"ゆっくりと冷たい胸騒ぎ"
],
"feel.vastness": [
"大きい",
"広大さ",
"無限の広がり",
"めまいを誘う無限の広がり"
]
},
"abyss_midwaterexp": {
@@ -1481,6 +1907,18 @@
"恐れ",
"胸騒ぎ",
"ゆっくりと冷たい胸騒ぎ"
],
"feel.fragility": [
"薄い",
"儚さ",
"脆さ",
"いたわりたくなる儚さ"
],
"feel.poignancy": [
"切なさ",
"哀切",
"ほろ苦さ",
"光に満ちた別れ"
]
},
"abyss_hiding": {
@@ -1520,6 +1958,18 @@
"マリンスノー",
"落下する有機物",
"マリンスノー · 上層から沈む有機物の屑"
],
"feel.spectral": [
"亡霊",
"幽玄",
"亡霊めいた気配",
"水中の亡霊"
],
"feel.fragility": [
"薄い",
"儚さ",
"脆さ",
"いたわりたくなる儚さ"
]
},
"abyss_bigfin": {
@@ -1559,6 +2009,12 @@
"肘状の腕",
"垂れ下がる糸",
"肘状の腕 · 横に張り出し、数メートルの糸を引く"
],
"feel.alienness": [
"奇妙",
"異質さ",
"異形",
"異形の優雅さ"
]
},
"abyss_dandelion": {
@@ -1598,6 +2054,24 @@
"触手",
"捕食の触手",
"捕食の触手 · 獲物を捕らえる漂う網"
],
"feel.radiance": [
"輝き",
"光輝",
"煌めき",
"宝石のような煌めき"
],
"feel.wonder": [
"わあ",
"驚き",
"畏敬",
"超越的な畏敬"
],
"feel.fragility": [
"薄い",
"儚さ",
"脆さ",
"いたわりたくなる儚さ"
]
},
"abyss_octopus": {
@@ -1637,6 +2111,18 @@
"八本の腕",
"吸盤の並ぶ腕",
"八本の腕 · 触れたものを味わう吸盤付き"
],
"feel.curiosity": [
"見て",
"好奇心",
"魅了",
"のめり込む魅了"
],
"feel.tenderness": [
"やさしい",
"優しさ",
"ぬくもり",
"ゆりかごのようなぬくもり"
]
},
"abyss_seapig": {
@@ -1676,6 +2162,18 @@
"口前のヴェール",
"遊泳用のヴェール",
"口前のヴェール · 堆積物を掃き、羽ばたいて泳ぐ"
],
"feel.strangeness": [
"変",
"奇妙さ",
"不気味",
"肉感的な奇妙さ"
],
"feel.curiosity": [
"見て",
"好奇心",
"魅了",
"のめり込む魅了"
]
}
}