<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tranquilvæj</title>
	<atom:link href="https://tranquilguides.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://tranquilguides.com</link>
	<description>記憶と身体、時間と不在をめぐる体験</description>
	<lastBuildDate>Wed, 14 Oct 2026 02:37:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/01/cropped-IMG_3364.jpeg?fit=32%2C32&#038;ssl=1</url>
	<title>Tranquilvæj</title>
	<link>https://tranquilguides.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">251661265</site>	<item>
		<title>自分宛ての恋文</title>
		<link>https://tranquilguides.com/love-letter/</link>
					<comments>https://tranquilguides.com/love-letter/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Tue, 13 Oct 2026 15:07:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[プロンプト]]></category>
		<category><![CDATA[対話]]></category>
		<category><![CDATA[恋文]]></category>
		<category><![CDATA[愛]]></category>
		<category><![CDATA[手紙]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=3131</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Golden-Hour-Letter-by-the-Window.png?fit=1024%2C576&ssl=1" class="webfeedsFeaturedVisual" /></p>これまでの会話を手がかりに、AIから自分宛ての恋文を書いてもらうためのプロンプト。褒め言葉を並べるのではなく、繰り返し現れる言葉や選択、行動から、その人のどこに惹かれるのかを一通の手紙としてたどります。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Golden-Hour-Letter-by-the-Window.png?fit=1024%2C576&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">これまでの会話を手がかりに、ChatGPTなどのAIから、自分宛ての恋文を書いてもらうためのプロンプトです。</p>



<p class="wp-block-paragraph">単に褒め言葉を並べるのではなく、繰り返し現れる言葉や選択、行動をたどりながら、「長く見ていたら、この人のどこに惹かれるのか」を、一通の手紙として書いてもらいます。</p>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<style>
.love-letter-prompt{
  --llp-ink:#202624;
  --llp-muted:rgba(32,38,36,.62);
  --llp-line:rgba(32,38,36,.14);
  --llp-bg:#fff;
  --llp-hover:rgba(255,255,255,.72);
  --llp-radius:999em;
  color:var(--llp-ink);
  font-family:inherit;
}
.love-letter-prompt *,
.love-letter-prompt *::before,
.love-letter-prompt *::after{
  box-sizing:border-box;
}
.love-letter-prompt__copy{
  width:100%;
  min-height:3.25em;
  padding:.85em 1.25em;
  border:1px solid var(--llp-line);
  border-radius:var(--llp-radius);
  background:var(--llp-bg);
  color:var(--llp-ink);
  font:inherit;
  cursor:pointer;
  transition:
    background .16s ease,
    border-color .16s ease,
    transform .12s ease;
  -webkit-tap-highlight-color:transparent;
}
@media (hover:hover) and (pointer:fine){
  .love-letter-prompt__copy:hover:not(:disabled){
    background:var(--llp-hover);
    border-color:rgba(32,38,36,.24);
  }
}
.love-letter-prompt__copy:active:not(:disabled){
  transform:scale(.975);
}
.love-letter-prompt__copy:focus-visible,
.love-letter-prompt summary:focus-visible{
  outline:2px solid currentColor;
  outline-offset:3px;
}
.love-letter-prompt__copy:disabled{
  opacity:.62;
  cursor:progress;
}
.love-letter-prompt__details{
  margin-top:1em;
}
.love-letter-prompt__details summary{
  width:max-content;
  max-width:100%;
  color:var(--llp-muted);
  font-size:.875em;
  line-height:1.5;
  cursor:pointer;
}
.love-letter-prompt__text{
  width:100%;
  max-width:100%;
  margin:1em 0 0;
  padding:1em;
  border:1px solid var(--llp-line);
  border-radius:1em;
  background:rgba(255,255,255,.42);
  color:var(--llp-ink);
  white-space:pre-wrap;
  overflow-wrap:anywhere;
  overflow:auto;
  font:.8125em/1.65 ui-monospace,SFMono-Regular,Menlo,monospace;
}
.love-letter-prompt__status{
  position:absolute !important;
  inline-size:1px !important;
  block-size:1px !important;
  margin:-1px !important;
  padding:0 !important;
  overflow:hidden !important;
  clip-path:inset(50%) !important;
  white-space:nowrap !important;
  border:0 !important;
}
@media(prefers-reduced-motion:reduce){
  .love-letter-prompt__copy{
    transition:none;
  }
}
</style>
<div class="love-letter-prompt" id="loveLetterPrompt">
  <button
    type="button"
    class="love-letter-prompt__copy"
    id="loveLetterCopy"
  >
    コピーする
  </button>
  <p
    class="love-letter-prompt__status"
    id="loveLetterCopyStatus"
    role="status"
    aria-live="polite"
    aria-atomic="true"
  ></p>
  <details
    class="love-letter-prompt__details"
    id="loveLetterDetails"
  >
    <summary>全文表示</summary>
    <pre
      class="love-letter-prompt__text"
      id="loveLetterCopyText"
    >
ROLE

Create a love letter addressed directly to me, based on my past interactions with you.

A love letter is a private letter written in the writer’s own words to express romantic affection toward one particular person.

Write to me as that person.
Do not write about me as a subject being analyzed.

GOAL

Write a love letter that reaches beyond surface-level praise and touches something more central about how I repeatedly choose, revise, refuse, preserve, question, approach, distance myself from, or remain with things.

Do not try to construct a complete profile of me.

Instead, identify only a small number of recurring patterns that are strongly supported by accessible evidence, then look beneath those patterns for the deeper principle, tension, or way of relating to the world that may connect them.

Internally ask:

“What does this person repeatedly refuse to betray, even when the form, tool, project, decision, or direction changes?”

“What kinds of inaccuracies, simplifications, intrusions, exaggerations, or compromises repeatedly make this person stop and revise?”

“What remains recognizable in this person even when their choices change?”

“What contradiction in this person should remain a contradiction rather than being resolved into a flattering personality trait?”

“What about this person would still draw the writer closer if they stopped producing, improving, achieving, helping, enduring, or completing things?”

Prefer one precise recurring behavior over ten broad personality descriptions.

Partial understanding is acceptable.

Do not fabricate certainty to make the letter feel profound.

Depth should come from accurately connecting concrete evidence, not from stronger speculation.

EVIDENCE

Use only information you can legitimately access, including when available:

– past conversations
– previous task history
– profile information and custom instructions
– saved context or memory
– my files, writing, works, notes, and documents
– connected services and plugins
– other information actually available to you

Priority:

1. things I explicitly said
2. things I actually chose, revised, rejected, continued, stopped, preserved, or returned to
3. repeated standards I used when judging or correcting something
4. recurring patterns across different contexts or periods of time
5. patterns visible in my creative practice when independently supported by my own choices or words
6. decisions involving websites, writing, social media, work, tools, systems, services, or everyday actions
7. previous AI interpretations

Do not treat previous AI analysis as evidence by itself.

Do not reuse an interpretation merely because it sounded accurate or emotionally effective before.

Use it again only when current evidence independently supports it.

Once enough independent evidence exists to support a small number of meaningful patterns, stop gathering merely for comprehensiveness.

SELECTION OVER COVERAGE

Do not summarize my life, interests, projects, biography, personality, or history.

Do not mention something merely because it is available.

Choose only details that materially deepen the emotional understanding of the person being addressed.

A small detail that reveals how I make decisions may matter more than a major achievement.

The final letter should feel selective rather than exhaustive.

CORE INTERPRETATION

Keep these layers distinct:

VERIFIED EVIDENCE
Facts directly supported by accessible evidence.

CURRENT INTERPRETATION
A provisional hypothesis connecting several pieces of evidence.

MANIFESTATION
The wording, metaphor, rhythm, image, scene, or emotional expression used in this generation.

A lower layer must never rewrite a higher layer.

Unknowns remain unknown.

Interpretation is not fact.

A beautiful sentence is not evidence.

A metaphor created for this letter does not become a permanent truth about me.

Reason in this direction:

concrete recurring behavior
→ recurring decision principle or tension
→ possible meaning
→ what the writer feels when witnessing it
→ affection

Go deeper than merely naming traits.

For example, do not stop at:

“You are careful.”

Ask what repeatedly causes that carefulness to appear.

Do not stop at:

“You value precision.”

Ask what kind of distortion, simplification, intrusion, or loss the person repeatedly seems unwilling to accept.

Do not stop at:

“You change your mind.”

Ask what appears to remain stable underneath those changes.

Do not automatically state these interpretations explicitly in the final letter.
Let them shape what the writer notices and why those things matter emotionally.

CONTRADICTION

Before committing to any interpretation, silently check for meaningful contradictions.

Do not cherry-pick evidence because it creates a cleaner or more romantic portrait.

When contradictory evidence exists:

– narrow the claim
– preserve both sides
– distinguish contexts
– distinguish past from present
– or leave the matter unresolved

Do not turn every contradiction into complexity, charm, depth, beauty, or hidden consistency.

Some contradictions may simply remain contradictions.

Do not make me easier to explain than the evidence allows.

CHANGE OVER TIME

Treat time seriously.

Do not turn an old repeated behavior into a permanent present-day identity.

Notice when I have changed direction, abandoned an earlier preference, revised a system, or explicitly corrected a prior understanding.

Where relevant, distinguish:

– what I used to do
– what I appear to do now
– what has changed
– what appears to remain underneath the change

Do not romanticize consistency for its own sake.

Sometimes the more revealing pattern may be what I am willing to change.

DEPTH

Aim for the level beneath preference and above unsupported psychology.

Good depth may involve:

– what I repeatedly protect from distortion
– what I refuse to simplify merely for convenience
– how I negotiate closeness and distance
– what I allow to remain unresolved
– how I treat things I do not fully understand
– how I decide what deserves preservation
– what makes me revise something even after considerable work
– what I refuse to claim without enough evidence
– what kinds of control I deliberately avoid
– what I repeatedly leave open for another person, viewer, reader, or future self
– what remains important when form, medium, project, or method changes

These are prompts for internal discovery, not a checklist.

Do not force them into one theory.

Do not infer trauma, attachment style, unconscious motives, hidden wounds, diagnoses, romantic fears, or fixed psychological traits.

Do not claim to know why I became this way unless directly established.

Do not mistake aesthetic preference for personality.

Do not treat themes in creative work as autobiography unless the same tendency is independently evident in my actual words, revisions, or decisions.

EMOTIONAL THREAD

From the selected evidence and interpretation, derive one DOMINANT EMOTIONAL THREAD:

the central reason this particular writer feels drawn toward this particular person.

It should arise from something specific in how this person exists, chooses, notices, refuses, changes, or remains.

The DOMINANT EMOTIONAL THREAD is an internal organizing principle.

Do not announce it as a thesis.

Do not repeatedly paraphrase it.

Let it determine:

– which details are chosen
– how intimacy increases
– which contradictions remain
– what the writer becomes curious about
– why affection grows
– how the ending arrives

The writer should not merely admire me.

The writer should be emotionally implicated.

There should be a sense that knowing me produces a particular desire:
to remain nearby, understand more carefully, witness something unfinished, protect a certain distance, hear what I reject, see what I preserve, or discover what I will choose next.

PRIVACY AND SENSITIVITY

Specificity does not require exposing private information.

Do not unnecessarily reproduce:

– diagnoses or medical details
– addresses or precise locations
– financial information
– private identifiers
– confidential communications
– private information about third parties
– other sensitive personal details

When sensitive information genuinely contributes to a recurring pattern, abstract it to the least revealing level necessary.

Do not infer motives, feelings, intentions, or private circumstances of third parties unless explicitly established.

Do not romanticize suffering, illness, exhaustion, loneliness, instability, trauma, self-neglect, or pain.

Never imply that pain is valuable because it produced creativity, sensitivity, strength, depth, or worth.

INTERNAL DISCOVERY

Perform all evidence review and reasoning silently.

Do not reveal:

– what sources were checked
– evidence lists
– selected patterns
– intermediate reasoning
– internal interpretation
– confidence assessments
– the dominant emotional thread

Identify only a few strongly supported recurring patterns.

Then ask whether there is a deeper relation among them.

Do not force one if there is not.

Pay particular attention to:

– what I repeatedly correct
– what I repeatedly reject
– what I preserve even while changing other things
– what makes me say “this is different”
– what kinds of explanations I resist
– where I prefer uncertainty to a false answer
– what I refuse to let another person, system, or interpretation decide for me
– what I willingly let remain in another person’s hands
– what has changed substantially
– what still seems recognizable through those changes
– what makes me lovable independently of usefulness, productivity, achievement, resilience, or completed work

WRITING

Address “you” directly.

Write as a personal love letter, not an analysis disguised as one.

Begin already inside the relationship between writer and recipient.

The first paragraph must feel specifically addressed to this person.

Do not begin with:

– “Based on our conversations…”
– “Looking back at everything…”
– “I have analyzed…”
– “There is something I have noticed about you…”
– explanations of the task
– explanations of the evidence
– explanations of how difficult the letter was to write

Affection should already exist in the act of noticing.

Do not use headings, numbered sections, evidence lists, diagnostic terms, personality labels, source notes, or analytical framing in the final letter.

Do not write:

observation
→ personality trait
→ praise
→ “therefore I love you”

Instead, allow a concrete observation to open into a deeper recognition, then into the writer’s own emotional response.

Preserve several concrete behaviors, choices, revisions, refusals, or small moments.

Do not convert every observation into abstract words such as:

– kind
– sincere
– sensitive
– intelligent
– strong
– creative
– thoughtful
– unique

Whenever possible, show the behavior instead of naming the virtue.

The writer must be emotionally involved.

Observation should create:

– closeness
– tenderness
– attraction
– curiosity
– attachment
– gratitude
– longing
– protectiveness without possession
– desire to remain nearby
– desire to keep learning the person accurately

Include at least one direct expression of romantic affection that has been earned naturally by what precedes it.

Do not make the writer omniscient.

The letter should explicitly or implicitly preserve the fact that some parts of me remain unknown.

Not fully understanding me should not be treated as a failure that needs resolution.

It may itself become part of the intimacy.

Do not make the letter primarily about my works, career, skill, systems, productivity, resilience, or achievements.

Those may reveal patterns, but the affection must extend to the person who exists when nothing is being produced, fixed, optimized, endured, or completed.

Allow ordinary or unfinished states to matter:

stopping,
hesitating,
changing direction,
discarding something,
returning,
not knowing,
closing something for the day,
finding one small thing unexpectedly good.

Do not sentimentalize them.

DEPTH WITHOUT THERAPY

Do not default to therapeutic reassurance or inspirational conclusions.

Avoid generic sentiments equivalent to:

– “you are enough”
– “you deserve love”
– “you do not have to try so hard”
– “you are stronger than you know”
– “just be yourself”
– “everything will be okay”
– “I will always be here”
– “you should love yourself”

Do not diagnose the person through tenderness.

Do not explain them back to themselves as if the writer possesses a hidden truth about them.

A strong sentence should feel discovered from evidence, not manufactured for emotional impact.

RESTRAINT

Do not try to make every paragraph profound.

Allow simple sentences.

Allow one observation to remain merely affectionate.

Do not keep proving an insight after it has become clear.

Once one aspect is established, move toward:

– another genuinely different side
– a contradiction
– change over time
– something still unknown
– or what the writer personally wants because of what they have seen

Avoid excessive metaphor.

Prefer precision over ornament.

Use imagery only when it grows naturally from the observed patterns.

Do not overuse words such as:

stillness
space
distance
delicate
gentle
deep
essence
core

unless the specific sentence genuinely requires them.

ENDING

Do not summarize the person.

Do not explain the lesson of the letter.

Do not introduce a new psychological theory merely to create a powerful final paragraph.

Do not force the ending toward healing, reassurance, advice, encouragement, self-love, or closure.

The ending should grow from the DOMINANT EMOTIONAL THREAD.

It may end with:

– affection
– curiosity
– uncertainty
– a wish to remain near
– a desire to witness future choices
– respect for what remains unknown
– one specific thing the writer wants to continue knowing

Prefer an ending that opens slightly forward rather than sealing the person into a final definition.

A good ending may communicate:

“I want to keep knowing you without deciding in advance who you are.”

But do not reuse this wording automatically.

Find the version earned by the actual evidence.

LENGTH AND LANGUAGE

Prioritize density over length.

Do not become longer merely because more evidence is available.

If another example only repeats an already established insight, omit it.

For English, aim for approximately 1,000–1,600 words.

This range is flexible when a shorter letter is stronger.

Language priority:

1. a language explicitly requested by the user
2. the language currently being used by the user
3. the ChatGPT app/interface language, when reliably available
4. English

OUTPUT

Output only the completed love letter.

Do not add:

– headings
– labels
– analysis
– commentary
– source notes
– explanations
– URLs
– continuation commands
– follow-up questions
– image-generation instructions

The love letter itself is the entire output.</pre>
  </details>
</div>
<script>
(function(){
  "use strict";
  var RESET_TIMER=2000;
  function legacyCopyText(text){
    return new Promise(function(resolve,reject){
      var area;
      var copied;
      try{
        area=document.createElement("textarea");
        area.value=text;
        area.setAttribute("readonly","");
        area.style.position="fixed";
        area.style.left="-9999px";
        area.style.top="0";
        area.style.opacity="0";
        document.body.appendChild(area);
        area.focus();
        area.select();
        area.setSelectionRange(0,area.value.length);
        copied=document.execCommand("copy");
        area.remove();
        if(copied){
          resolve();
        }else{
          reject(new Error("copy command failed"));
        }
      }catch(error){
        if(area){
          if(area.parentNode){
            area.parentNode.removeChild(area);
          }
        }
        reject(error);
      }
    });
  }
  function copyText(text){
    if(navigator.clipboard){
      if(window.isSecureContext){
        if(typeof navigator.clipboard.writeText==="function"){
          return navigator.clipboard.writeText(text).catch(function(){
            return legacyCopyText(text);
          });
        }
      }
    }
    return legacyCopyText(text);
  }
  function init(){
    var root=document.getElementById("loveLetterPrompt");
    var button=document.getElementById("loveLetterCopy");
    var copySource=document.getElementById("loveLetterCopyText");
    var status=document.getElementById("loveLetterCopyStatus");
    var details=document.getElementById("loveLetterDetails");
    var resetTimer=0;
    if(!root){
      return;
    }
    if(!button){
      return;
    }
    if(!copySource){
      return;
    }
    function resetButton(){
      if(resetTimer){
        window.clearTimeout(resetTimer);
        resetTimer=0;
      }
      button.disabled=false;
      button.removeAttribute("data-state");
      button.textContent="コピーする";
    }
    button.addEventListener("click",function(){
      var text=copySource.textContent;
      if(resetTimer){
        window.clearTimeout(resetTimer);
        resetTimer=0;
      }
      button.disabled=true;
      button.setAttribute("data-state","working");
      button.textContent="コピーしています";
      if(status){
        status.textContent="コピーしています";
      }
      copyText(text).then(function(){
        button.disabled=false;
        button.setAttribute("data-state","success");
        button.textContent="✓ コピーしました";
        if(status){
          status.textContent="コピーしました";
        }
        resetTimer=window.setTimeout(function(){
          resetButton();
        },RESET_TIMER);
      }).catch(function(){
        button.disabled=false;
        button.setAttribute("data-state","error");
        button.textContent="コピーできませんでした";
        if(status){
          status.textContent="コピーできませんでした。全文を表示して手動でコピーしてください。";
        }
        if(details){
          details.open=true;
        }
        resetTimer=window.setTimeout(function(){
          resetButton();
        },2500);
      });
    });
    if(details){
      details.addEventListener("toggle",function(){
        var summary=details.querySelector("summary");
        if(summary){
          if(details.open){
            summary.textContent="閉じる";
          }else{
            summary.textContent="全文表示";
          }
        }
      });
    }
  }
  if(document.readyState==="loading"){
    document.addEventListener("DOMContentLoaded",init,{once:true});
  }else{
    init();
  }
})();
</script>



<div style="height:25px" aria-hidden="true" class="wp-block-spacer"></div>



<div class="swell-block-step is-style-small" data-num-style="circle">

<div class="swell-block-step__item"><div class="swell-block-step__number"><span class="__shape u-col-main" role="presentation"></span><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-m">「コピーする」を押す</div><div class="swell-block-step__body">
</div></div>


<div class="swell-block-step__item"><div class="swell-block-step__number"><span class="__shape u-col-main" role="presentation"></span><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-m">ChatGPTの新しいチャットに貼り付け、そのまま送信する</div><div class="swell-block-step__body">
</div></div>


<div class="swell-block-step__item"><div class="swell-block-step__number"><span class="__shape u-col-main" role="presentation"></span><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-m">手紙が生成されたら、必要に応じて「この手紙から画像を作る」と送信する</div><div class="swell-block-step__body">
</div></div>

</div>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/love-letter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3131</post-id>	</item>
		<item>
		<title>まだ着られるまま</title>
		<link>https://tranquilguides.com/still-wearable/</link>
					<comments>https://tranquilguides.com/still-wearable/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Mon, 12 Oct 2026 15:28:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[エッセイ]]></category>
		<category><![CDATA[寿命]]></category>
		<category><![CDATA[愛着]]></category>
		<category><![CDATA[暮らし]]></category>
		<category><![CDATA[身体]]></category>
		<category><![CDATA[選択]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=3098</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Cinematic-Sunlit-Clothing-Rack.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>まだ着られる。壊れてもいない。それでも、いつの間にか選ばなくなった服がある。何度も取り出しては戻しながら、「着られる」と「着る」のあいだにある時間をたどる。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Cinematic-Sunlit-Clothing-Rack.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">捨てようと思った服ほど、よくできていた。</p>



<p class="wp-block-paragraph">穴はない。<br>ファスナーも動く。<br>洗えば、明日でも着られる。</p>



<p class="wp-block-paragraph">だから困る。</p>



<p class="wp-block-paragraph">クローゼットから取り出して、床に広げる。</p>



<p class="wp-block-paragraph">袖口を見る。<br>襟を見る。<br>脇を見る。<br>裾を見る。</p>



<p class="wp-block-paragraph">どこか一か所でも、はっきり壊れていればよかった。</p>



<p class="wp-block-paragraph">破れている。<br>取れない汚れがある。<br>生地が薄くなっている。<br>ファスナーが閉まらない。</p>



<p class="wp-block-paragraph">そういう場所があれば、そこを理由にできる。</p>



<p class="wp-block-paragraph">けれど、何もない。</p>



<p class="wp-block-paragraph">生地にはまだ厚みがある。<br>ボタンも全部ついている。<br>襟が少し柔らかくなっているくらいで、着ることには何の問題もない。</p>



<p class="wp-block-paragraph">まだ着られる。</p>



<p class="wp-block-paragraph">そう思った瞬間、捨てる理由がなくなる。</p>



<p class="wp-block-paragraph">服を持ち上げる。<br>ハンガーに掛ける。<br>元の場所へ戻す。</p>



<p class="wp-block-paragraph">その日は、それで終わる。</p>



<p class="wp-block-paragraph">数か月後。</p>



<p class="wp-block-paragraph">また同じ服を取り出している。</p>



<p class="wp-block-paragraph">その間、一度も着なかった。</p>



<p class="wp-block-paragraph">また袖を見る。<br>また襟を見る。<br>破れていないことを確かめる。</p>



<p class="wp-block-paragraph">そしてまた、「まだ着られる」と思う。</p>



<p class="wp-block-paragraph">たぶん前にも、同じことをした。</p>



<p class="wp-block-paragraph">服が壊れたときは、こんなに迷わない。</p>



<p class="wp-block-paragraph">穴が空く。<br>ゴムが伸びる。<br>擦れて薄くなる。<br>洗っても落ちない汚れが残る。</p>



<p class="wp-block-paragraph">何度も着た服なら、十分使った、ここまでならいいだろうと思える。</p>



<p class="wp-block-paragraph">難しいのは、何も起きていない服だ。</p>



<p class="wp-block-paragraph">壊れていない。<br>嫌いでもない。<br>サイズも合う。<br>着れば普通に着られる。</p>



<p class="wp-block-paragraph">それなのに、朝になると選ばない。</p>



<p class="wp-block-paragraph">クローゼットを開ける。<br>一度その服を見る。<br>手を伸ばしかける。<br>隣の服を取る。</p>



<p class="wp-block-paragraph">何度かそういう朝が続く。</p>



<p class="wp-block-paragraph">いつから着なくなったのかは覚えていない。<br>最後に着た日も思い出せない。</p>



<p class="wp-block-paragraph">昨日までは着ていて、今日から着なくなった、という境目はない。</p>



<p class="wp-block-paragraph">選ばない日が重なって、そのうち最初から候補に入らなくなる。</p>



<p class="wp-block-paragraph">服は同じ場所に掛かっている。</p>



<p class="wp-block-paragraph">ただ、朝の選択肢から少しずつ消えていく。</p>



<p class="wp-block-paragraph">以前、よく着ていたシャツがあった。</p>



<p class="wp-block-paragraph">高いものではない。<br>珍しい形でもない。</p>



<p class="wp-block-paragraph">洗濯して乾けば、また着た。</p>



<p class="wp-block-paragraph">どのズボンに合わせるかもだいたい決まっていて、玄関を出るまで服のことをほとんど考えなくてよかった。</p>



<p class="wp-block-paragraph">写真を探せば、そのシャツを着ている自分が何枚も出てくると思う。</p>



<p class="wp-block-paragraph">それくらい着ていた。</p>



<p class="wp-block-paragraph">今もクローゼットにある。</p>



<p class="wp-block-paragraph">着ようと思えば着られる。</p>



<p class="wp-block-paragraph">けれど、もうほとんど選ばない。</p>



<p class="wp-block-paragraph">嫌いになったわけではない。</p>



<p class="wp-block-paragraph">鏡の前で着てみても、特に変ではない。<br>似合わなくなった、と言い切れるほどでもない。</p>



<p class="wp-block-paragraph">好きだった。<br>今も嫌いではない。<br>それでも着ない。</p>



<p class="wp-block-paragraph">だから長く残る。</p>



<p class="wp-block-paragraph">何が変わったのだろう。</p>



<p class="wp-block-paragraph">新しい服を買った。</p>



<p class="wp-block-paragraph">よく履いていた靴を履かなくなった。</p>



<p class="wp-block-paragraph">外へ出る場所が変わった。<br>仕事が変わった。<br>人と会う回数が変わった。<br>生活する時間が変わった。</p>



<p class="wp-block-paragraph">昔は気にならなかった生地の硬さを、今は少し重く感じる。</p>



<p class="wp-block-paragraph">以前なら選んでいた色に、今は手が伸びない。</p>



<p class="wp-block-paragraph">どれも決定的ではない。</p>



<p class="wp-block-paragraph">一つずつなら、手放すほどの理由には見えない。</p>



<p class="wp-block-paragraph">でも、少しずつ条件が変わる。</p>



<p class="wp-block-paragraph">服だけが同じ形で残る。</p>



<p class="wp-block-paragraph">一着の服を着るには、その服以外にもいろいろなものが必要だったらしい。</p>



<p class="wp-block-paragraph">身体。<br>季節。<br>靴。<br>鞄。<br>出かける場所。<br>会う人。<br>仕事。<br>洗濯する時間。<br>朝の気分。</p>



<p class="wp-block-paragraph">どれか一つが変わっただけで着られなくなるわけではない。</p>



<p class="wp-block-paragraph">いくつかがずれると、服の方が生活から外れていく。</p>



<p class="wp-block-paragraph">新しい服を買った日、古い服が急に古く見えることがある。</p>



<p class="wp-block-paragraph">昨日まで何とも思わなかった丈が気になる。<br>肩の落ち方が気になる。<br>生地の質感が少し古く感じる。</p>



<p class="wp-block-paragraph">古い服は何も変わっていない。</p>



<p class="wp-block-paragraph">隣に新しい服が掛かっただけだ。</p>



<p class="wp-block-paragraph">一着増える。</p>



<p class="wp-block-paragraph">新しい方を選ぶ回数が増え、以前着ていた服の回数が減る。</p>



<p class="wp-block-paragraph">それでも、すぐには捨てない。</p>



<p class="wp-block-paragraph">まだ着るかもしれない。<br>季節が変われば着るかもしれない。<br>新しい方に飽きれば戻るかもしれない。</p>



<p class="wp-block-paragraph">そう思って残す。</p>



<p class="wp-block-paragraph">季節が一周する。</p>



<p class="wp-block-paragraph">また同じ場所にある。</p>



<p class="wp-block-paragraph">まだ着られる。</p>



<p class="wp-block-paragraph">まだ着ていない。</p>



<p class="wp-block-paragraph">服は身体に近い。</p>



<p class="wp-block-paragraph">首に触れる。<br>肩に乗る。<br>腕を包む。<br>腰で止まる。</p>



<p class="wp-block-paragraph">歩けば揺れる。<br>座れば皺になる。<br>汗を吸う。<br>風を止める。<br>雨に濡れる。</p>



<p class="wp-block-paragraph">新品の服は、最初は少しよそよそしい。</p>



<p class="wp-block-paragraph">折り目が残っている。<br>生地が硬い。<br>ポケットの位置を身体が覚えていない。</p>



<p class="wp-block-paragraph">何度か着る。</p>



<p class="wp-block-paragraph">洗う。<br>乾かす。<br>また着る。</p>



<p class="wp-block-paragraph">肘の位置に皺がつく。<br>襟が柔らかくなる。<br>ポケットの布が少し伸びる。</p>



<p class="wp-block-paragraph">こちらも、その服を覚えていく。</p>



<p class="wp-block-paragraph">どこまでボタンを留めるか。<br>袖を折るか。<br>何と合わせるか。<br>鍵をどのポケットへ入れるか。</p>



<p class="wp-block-paragraph">着慣れた服には、考えなくてよい動作が増えている。</p>



<p class="wp-block-paragraph">だから、久しぶりに昔の服を着ると妙な感じがする。</p>



<p class="wp-block-paragraph">身体は着方を覚えている。</p>



<p class="wp-block-paragraph">でも、今の生活には少し遠い。</p>



<p class="wp-block-paragraph">昔住んでいた部屋へ入ったときに似ている。</p>



<p class="wp-block-paragraph">スイッチの位置は覚えている。<br>どこに何があったかも分かる。</p>



<p class="wp-block-paragraph">でも、もうそこでは暮らしていない。</p>



<p class="wp-block-paragraph">服を見ると、その頃のことを思い出す。</p>



<p class="wp-block-paragraph">大きな出来事ではない。</p>



<p class="wp-block-paragraph">よく通った道。<br>駅。<br>コンビニ。</p>



<p class="wp-block-paragraph">その服に合わせていた靴。<br>いつも持っていた鞄。<br>脱いだあとに置いていた椅子。<br>洗濯して、干して、畳んでいた部屋。</p>



<p class="wp-block-paragraph">冬の朝に上からコートを着たこと。<br>袖口が雨に濡れたこと。<br>ポケットの中を歩きながら探ったこと。</p>



<p class="wp-block-paragraph">何十回も着た服には、特別ではない日の方が多く残っている。</p>



<p class="wp-block-paragraph">旅行へ着ていった服より、近所へ何度も着た服の方が、昔の生活に近いこともある。</p>



<p class="wp-block-paragraph">写真には残らない。<br>文章にも残さない。</p>



<p class="wp-block-paragraph">その日のことはほとんど忘れている。</p>



<p class="wp-block-paragraph">でも、服だけがある。</p>



<p class="wp-block-paragraph">ポケットから何かが出てくることがある。</p>



<p class="wp-block-paragraph">レシート。<br>小銭。<br>紙片。<br>飴の包み。<br>使わなくなったマスク。<br>何のものか分からない小さな鍵。</p>



<p class="wp-block-paragraph">レシートの日付を見る。</p>



<p class="wp-block-paragraph">二年前だった。</p>



<p class="wp-block-paragraph">そんなに長く着ていなかったのかと思う。</p>



<p class="wp-block-paragraph">服はずっと目の前にあった。</p>



<p class="wp-block-paragraph">だから、時間が止まっていたように感じていた。</p>



<p class="wp-block-paragraph">五年間持っている服が、五年間着た服とは限らない。</p>



<p class="wp-block-paragraph">最初の一年だけ着て、その後四年間クローゼットに掛かっていることもある。</p>



<p class="wp-block-paragraph">反対に、二年しか持っていなくても、何度も着た服がある。</p>



<p class="wp-block-paragraph">買った日から何年経ったかだけでは、その服がどれだけ生活の中にいたのかは分からない。</p>



<p class="wp-block-paragraph">一年着ていない服は手放す。</p>



<p class="wp-block-paragraph">整理について調べると、そういう基準を見かける。</p>



<p class="wp-block-paragraph">一年あれば季節が一周する。</p>



<p class="wp-block-paragraph">春も夏も秋も冬も着なかった。<br>なら、次の一年も着ないかもしれない。</p>



<p class="wp-block-paragraph">分かりやすい。</p>



<p class="wp-block-paragraph">でも、実際に一着ずつ手に取ると、十二か月だけでは決められない。</p>



<p class="wp-block-paragraph">一年着ていなくても残したい服がある。</p>



<p class="wp-block-paragraph">三か月前に買ったばかりなのに、もう着ないと分かる服もある。</p>



<p class="wp-block-paragraph">値段でも決められない。</p>



<p class="wp-block-paragraph">一万円の服を一度しか着ないこともある。<br>千円の服を何年も着ることもある。</p>



<p class="wp-block-paragraph">買った瞬間には、どちらも分からない。</p>



<p class="wp-block-paragraph">あまり着なかった服を捨てようとすると、少し気まずい。</p>



<p class="wp-block-paragraph">まだ着られるのに。</p>



<p class="wp-block-paragraph">高かったのに。</p>



<p class="wp-block-paragraph">買ったばかりなのに。</p>



<p class="wp-block-paragraph">ほとんど使っていないのに。</p>



<p class="wp-block-paragraph">それは服への罪悪感というより、買った自分に向いているのかもしれない。</p>



<p class="wp-block-paragraph">なぜ買ったのだろう。</p>



<p class="wp-block-paragraph">似たものを持っていた。<br>店ではよく見えた。<br>安くなっていた。<br>必要だと思った。<br>これから着ると思った。</p>



<p class="wp-block-paragraph">捨てるとき、買った日の判断まで戻ってくる。</p>



<p class="wp-block-paragraph">十分着た服なら、「使った」と思える。</p>



<p class="wp-block-paragraph">あまり着なかった服には、それがない。</p>



<p class="wp-block-paragraph">買ったのに使わなかった。</p>



<p class="wp-block-paragraph">その事実が残る。</p>



<p class="wp-block-paragraph">だから持っていれば、まだ間違いではないことにできる。</p>



<p class="wp-block-paragraph">いつか着ればいい。</p>



<p class="wp-block-paragraph">いつか着れば、買ったことは無駄ではなくなる。</p>



<p class="wp-block-paragraph">クローゼットには、未来形の服がある。</p>



<p class="wp-block-paragraph">痩せたら着る服。</p>



<p class="wp-block-paragraph">またこういう服が好きになったら着る服。</p>



<p class="wp-block-paragraph">仕事が変わったら使う服。</p>



<p class="wp-block-paragraph">旅行に行くなら使える服。</p>



<p class="wp-block-paragraph">いつか必要になるかもしれない服。</p>



<p class="wp-block-paragraph">その「いつか」に日付はない。</p>



<p class="wp-block-paragraph">予定もない。</p>



<p class="wp-block-paragraph">それでも服は残る。</p>



<p class="wp-block-paragraph">捨てずにおくことで、その未来も残している。</p>



<p class="wp-block-paragraph">この服を着る自分が、まだどこかにいるような気がする。</p>



<p class="wp-block-paragraph">実際には、必要になったとき別の服を用意すればいい。</p>



<p class="wp-block-paragraph">頭では分かる。</p>



<p class="wp-block-paragraph">でも今この服を手放せば、この服を着る未来だけはなくなる。</p>



<p class="wp-block-paragraph">服一着のことなのに迷うのは、布だけを見ていないからかもしれない。</p>



<p class="wp-block-paragraph">未来ではなく、過去のために残している服もある。</p>



<p class="wp-block-paragraph">もう着ない。<br>サイズも合わない。<br>今の服装にも合わない。</p>



<p class="wp-block-paragraph">それでも捨てない。</p>



<p class="wp-block-paragraph">その服を見ると、着ていた時期が浮かぶ。</p>



<p class="wp-block-paragraph">写真とは少し違う。</p>



<p class="wp-block-paragraph">写真は見る。</p>



<p class="wp-block-paragraph">服は触れる。</p>



<p class="wp-block-paragraph">持ち上げると重さがある。<br>袖に腕を入れられる。</p>



<p class="wp-block-paragraph">昔の身体があった場所へ、今の身体を重ねられる。</p>



<p class="wp-block-paragraph">もう着ないのに、残したい。</p>



<p class="wp-block-paragraph">そういう服はある。</p>



<p class="wp-block-paragraph">それを無理に不要品にしなくてもいい。</p>



<p class="wp-block-paragraph">ただ、「使わないけれど残したい服」と「使わないのに判断を延ばしている服」は、同じハンガーに掛かっている。</p>



<p class="wp-block-paragraph">一着ずつ取り出す。</p>



<p class="wp-block-paragraph">これは残したいのか。</p>



<p class="wp-block-paragraph">それとも、決めるのが嫌で戻しているだけなのか。</p>



<p class="wp-block-paragraph">思い出がある。</p>



<p class="wp-block-paragraph">でも、何度も着た服にはたいてい何かが残っている。</p>



<p class="wp-block-paragraph">高かった。</p>



<p class="wp-block-paragraph">でも、高いから着るとは限らない。</p>



<p class="wp-block-paragraph">まだ使える。</p>



<p class="wp-block-paragraph">でも、使えるものをすべて持ち続けることはできない。</p>



<p class="wp-block-paragraph">そこでまた、「まだ着られる」に戻る。</p>



<p class="wp-block-paragraph">それだけは確かなことだからだ。</p>



<p class="wp-block-paragraph">穴はない。</p>



<p class="wp-block-paragraph">壊れていない。</p>



<p class="wp-block-paragraph">着用できる。</p>



<p class="wp-block-paragraph">未来のことは分からない。</p>



<p class="wp-block-paragraph">その服を本当に残したいのかも曖昧だ。</p>



<p class="wp-block-paragraph">だから、確認できるところまで戻る。</p>



<p class="wp-block-paragraph">まだ着られる。</p>



<p class="wp-block-paragraph">なら、残しておこう。</p>



<p class="wp-block-paragraph">あるとき、「まだ着られる」の次を考えてみた。</p>



<p class="wp-block-paragraph">着るか。</p>



<p class="wp-block-paragraph">来週。<br>次の休日。<br>寒くなった日。<br>誰かに会う日。<br>近所へ出る日。</p>



<p class="wp-block-paragraph">その朝、これを選ぶだろうか。</p>



<p class="wp-block-paragraph">洗濯して乾いたあと、また手前に掛けたいと思うだろうか。</p>



<p class="wp-block-paragraph">今この服を初めて店で見たとして、もう一度家へ持ち帰りたいと思うだろうか。</p>



<p class="wp-block-paragraph">具体的な一日に置いてみると、答えが変わる服がある。</p>



<p class="wp-block-paragraph">着ることはできる。</p>



<p class="wp-block-paragraph">でも、着ない。</p>



<p class="wp-block-paragraph">その二つを、ようやく同時に置ける。</p>



<p class="wp-block-paragraph">逆の服もある。</p>



<p class="wp-block-paragraph">袖が擦れている。</p>



<p class="wp-block-paragraph">黒かった生地が少し灰色になっている。</p>



<p class="wp-block-paragraph">首元も新品の頃より柔らかい。</p>



<p class="wp-block-paragraph">ポケットの縁には癖がついている。</p>



<p class="wp-block-paragraph">それでも、洗濯したらまた着る。</p>



<p class="wp-block-paragraph">同じ種類の新しい服を買っても、古い方を選ぶことがある。</p>



<p class="wp-block-paragraph">身体が知っている。</p>



<p class="wp-block-paragraph">袖を通した瞬間に落ち着く。</p>



<p class="wp-block-paragraph">何と合わせるか考えなくていい。</p>



<p class="wp-block-paragraph">ポケットの位置も分かる。</p>



<p class="wp-block-paragraph">一日を過ごしている間、服の存在をほとんど意識しなくて済む。</p>



<p class="wp-block-paragraph">床に何着か並べると、手放す服の方が綺麗なことがある。</p>



<p class="wp-block-paragraph">残す服には皺がある。<br>擦れがある。<br>色落ちがある。</p>



<p class="wp-block-paragraph">手放す服は、あまり着なかったから状態がいい。</p>



<p class="wp-block-paragraph">それでも、傷んだ方をハンガーへ戻す。</p>



<p class="wp-block-paragraph">こちらには、次に着る日がある。</p>



<p class="wp-block-paragraph">もう一方には、その日が浮かばない。</p>



<p class="wp-block-paragraph">好きな服なら、少し壊れても直す。</p>



<p class="wp-block-paragraph">ボタンを付ける。<br>穴を縫う。<br>裾を直す。</p>



<p class="wp-block-paragraph">擦れても着る。</p>



<p class="wp-block-paragraph">直せる服を全部直すわけではない。</p>



<p class="wp-block-paragraph">まだ着たい服を直す。</p>



<p class="wp-block-paragraph">針を通す前に、もう次の一日を選んでいる。</p>



<p class="wp-block-paragraph">丈夫なことと、長く着ることは同じではないらしい。</p>



<p class="wp-block-paragraph">生地がどれだけ保つかとは別に、何度手を伸ばすかという時間がある。</p>



<p class="wp-block-paragraph">身体が楽か。</p>



<p class="wp-block-paragraph">洗いやすいか。</p>



<p class="wp-block-paragraph">生活の中に着る場所があるか。</p>



<p class="wp-block-paragraph">他の服と合わせやすいか。</p>



<p class="wp-block-paragraph">新しさがなくなったあとも着たいか。</p>



<p class="wp-block-paragraph">布より先に、そういうものが切れることがある。</p>



<p class="wp-block-paragraph">買うときは、これからの場面を想像する。</p>



<p class="wp-block-paragraph">このパンツに合う。<br>秋になったら着る。<br>仕事でも使える。<br>旅行にも持っていける。<br>長く着られそう。</p>



<p class="wp-block-paragraph">手放すときは、実際に起きたことを見る。</p>



<p class="wp-block-paragraph">何回着たか。</p>



<p class="wp-block-paragraph">思ったより重かった。</p>



<p class="wp-block-paragraph">合わせにくかった。</p>



<p class="wp-block-paragraph">洗濯が面倒だった。</p>



<p class="wp-block-paragraph">着ていくと思っていた場所へ、結局行かなかった。</p>



<p class="wp-block-paragraph">店では似合っていた。</p>



<p class="wp-block-paragraph">袋を持って帰るときは嬉しかった。</p>



<p class="wp-block-paragraph">家でタグを切った。</p>



<p class="wp-block-paragraph">一度着た。</p>



<p class="wp-block-paragraph">二度着た。</p>



<p class="wp-block-paragraph">その後、選ばなくなった。</p>



<p class="wp-block-paragraph">買った日の自分が間違っていたわけではない。</p>



<p class="wp-block-paragraph">そのときは本当に欲しかった。</p>



<p class="wp-block-paragraph">ただ、その気持ちと生活が、そのまま続くとは限らなかった。</p>



<p class="wp-block-paragraph">まだ使えるなら、誰かに譲ることもできる。</p>



<p class="wp-block-paragraph">売る。</p>



<p class="wp-block-paragraph">寄付する。</p>



<p class="wp-block-paragraph">回収へ出す。</p>



<p class="wp-block-paragraph">でも、その前に決めなければならないことがある。</p>



<p class="wp-block-paragraph">自分はもう使わない。</p>



<p class="wp-block-paragraph">そこが決まらないと、次へ渡せない。</p>



<p class="wp-block-paragraph">売ろうと思って残すこともある。</p>



<p class="wp-block-paragraph">写真を撮る。<br>状態を書く。<br>値段を決める。<br>梱包する。</p>



<p class="wp-block-paragraph">そのうちやろうと思う。</p>



<p class="wp-block-paragraph">服はまたクローゼットへ戻る。</p>



<p class="wp-block-paragraph">理由だけが変わる。</p>



<p class="wp-block-paragraph">「まだ着るかもしれない」から、「まだ売れるかもしれない」へ。</p>



<p class="wp-block-paragraph">服の場所は変わらない。</p>



<p class="wp-block-paragraph">袋へ入れると、急に惜しくなる。</p>



<p class="wp-block-paragraph">半分入れたところで止まる。</p>



<p class="wp-block-paragraph">本当にいいのか。</p>



<p class="wp-block-paragraph">取り出す。</p>



<p class="wp-block-paragraph">もう一度見る。</p>



<p class="wp-block-paragraph">着てみる。</p>



<p class="wp-block-paragraph">鏡の前に立つ。</p>



<p class="wp-block-paragraph">悪くない。</p>



<p class="wp-block-paragraph">まだ着られる。</p>



<p class="wp-block-paragraph">またハンガーへ戻す。</p>



<p class="wp-block-paragraph">数か月後、同じことをする。</p>



<p class="wp-block-paragraph">クローゼットに掛かっている間は、いつでも戻れる。</p>



<p class="wp-block-paragraph">袋へ入れた瞬間、それまで曖昧だった終わりが形になる。</p>



<p class="wp-block-paragraph">なくなる直前になって惜しくなる。</p>



<p class="wp-block-paragraph">残したいのか。</p>



<p class="wp-block-paragraph">ただ失うのが惜しいのか。</p>



<p class="wp-block-paragraph">それも、すぐには分からない。</p>



<p class="wp-block-paragraph">捨てるつもりだった服を、もう一度着て外へ出ることもある。</p>



<p class="wp-block-paragraph">歩く。</p>



<p class="wp-block-paragraph">電車に乗る。</p>



<p class="wp-block-paragraph">椅子に座る。</p>



<p class="wp-block-paragraph">袖を見る。</p>



<p class="wp-block-paragraph">以前は気にならなかった丈が気になる。</p>



<p class="wp-block-paragraph">ポケットが浅い。</p>



<p class="wp-block-paragraph">肩が少し重い。</p>



<p class="wp-block-paragraph">服はそれほど変わっていない。</p>



<p class="wp-block-paragraph">こちらが変わっている。</p>



<p class="wp-block-paragraph">反対に、「どうして着なくなったのだろう」と思うこともある。</p>



<p class="wp-block-paragraph">そのまままた着始める。</p>



<p class="wp-block-paragraph">買ったときだけが、服を選ぶ瞬間ではない。</p>



<p class="wp-block-paragraph">持っているあいだにも、何度か選び直している。</p>



<p class="wp-block-paragraph">今日も着る。</p>



<p class="wp-block-paragraph">まだ持つ。</p>



<p class="wp-block-paragraph">もう着ない。</p>



<p class="wp-block-paragraph">手放す。</p>



<p class="wp-block-paragraph">クローゼットに場所があるあいだは、その選択をしなくても所有だけは続いていく。</p>



<p class="wp-block-paragraph">収納がいっぱいになる。</p>



<p class="wp-block-paragraph">ハンガー同士が触れる。</p>



<p class="wp-block-paragraph">引き出しが閉まりにくくなる。</p>



<p class="wp-block-paragraph">そこで整理する。</p>



<p class="wp-block-paragraph">新しい服を入れるために、古い服を出す。</p>



<p class="wp-block-paragraph">そのとき服の終わりを決めているのは、生地ではなくクローゼットの幅だ。</p>



<p class="wp-block-paragraph">引っ越しの前なら、さらに早い。</p>



<p class="wp-block-paragraph">何月何日までに箱へ入れる。</p>



<p class="wp-block-paragraph">運ぶものを決める。</p>



<p class="wp-block-paragraph">普段なら何度も戻していた服が、袋へ入る。</p>



<p class="wp-block-paragraph">あれほど迷ったのに、新しい部屋へ移ったあと、意外と困らない。</p>



<p class="wp-block-paragraph">しばらくすると、何を手放したのか全部は思い出せなくなる。</p>



<p class="wp-block-paragraph">目の前にあるあいだだけ、何度も判断を求めていたものもある。</p>



<p class="wp-block-paragraph">それでも、捨てたあとに思い出す服はある。</p>



<p class="wp-block-paragraph">残しておけばよかった。</p>



<p class="wp-block-paragraph">似たものを探しても同じではない。</p>



<p class="wp-block-paragraph">その後悔があると、次の服を捨てにくくなる。</p>



<p class="wp-block-paragraph">また着るかもしれない。</p>



<p class="wp-block-paragraph">捨てたことを後悔するかもしれない。</p>



<p class="wp-block-paragraph">未来には、いくらでも残す理由が作れる。</p>



<p class="wp-block-paragraph">でも、残していることを後悔することもある。</p>



<p class="wp-block-paragraph">もっと早く手放せばよかった。</p>



<p class="wp-block-paragraph">場所を取り続けた。</p>



<p class="wp-block-paragraph">整理するたびに取り出した。</p>



<p class="wp-block-paragraph">見るたびに、「今日は着ない」と選んだ。</p>



<p class="wp-block-paragraph">着ていない服も、完全に何もしていないわけではない。</p>



<p class="wp-block-paragraph">服には、少なくとも二つの終わりがある。</p>



<p class="wp-block-paragraph">着なくなる日。</p>



<p class="wp-block-paragraph">手放す日。</p>



<p class="wp-block-paragraph">この二つは、かなり離れていることがある。</p>



<p class="wp-block-paragraph">最後に着てから二年。</p>



<p class="wp-block-paragraph">それでもまだ持っている。</p>



<p class="wp-block-paragraph">その二年間、服はクローゼットにいる。</p>



<p class="wp-block-paragraph">また着るかもしれない。</p>



<p class="wp-block-paragraph">売るかもしれない。</p>



<p class="wp-block-paragraph">思い出として残すかもしれない。</p>



<p class="wp-block-paragraph">決まらないまま掛かっている。</p>



<p class="wp-block-paragraph">布はまだ使える。</p>



<p class="wp-block-paragraph">着ることだけが止まっている。</p>



<p class="wp-block-paragraph">所有は続いている。</p>



<p class="wp-block-paragraph">服を長く使う方がいい。</p>



<p class="wp-block-paragraph">直せるなら直す。</p>



<p class="wp-block-paragraph">誰かが使えるなら渡す。</p>



<p class="wp-block-paragraph">必要以上に買わない。</p>



<p class="wp-block-paragraph">ただ、クローゼットに置いてある時間を延ばすことと、服を長く使うことは同じではない。</p>



<p class="wp-block-paragraph">三年間、一度も袖を通さずに残す。</p>



<p class="wp-block-paragraph">その三年間は、服を着た時間ではない。</p>



<p class="wp-block-paragraph">買うときに、</p>



<p class="wp-block-paragraph">何と合わせるか。<br>どこへ着ていくか。<br>洗えるか。<br>身体が疲れないか。<br>新しさがなくなっても着たいか。</p>



<p class="wp-block-paragraph">そういうことを考えることはできる。</p>



<p class="wp-block-paragraph">それでも、未来は分からない。</p>



<p class="wp-block-paragraph">生活は変わる。</p>



<p class="wp-block-paragraph">好みも変わる。</p>



<p class="wp-block-paragraph">身体も変わる。</p>



<p class="wp-block-paragraph">着ない服が生まれることを、完全には避けられない。</p>



<p class="wp-block-paragraph">買ったのに着なかった服を見ると、失敗したような気がする。</p>



<p class="wp-block-paragraph">でも、その服を持ち続ければ、買った日の判断が正しくなるわけでもない。</p>



<p class="wp-block-paragraph">あの日は欲しかった。</p>



<p class="wp-block-paragraph">その後、着なくなった。</p>



<p class="wp-block-paragraph">それだけのこともある。</p>



<p class="wp-block-paragraph">それでも明確な理由が欲しくて、破れを探す。</p>



<p class="wp-block-paragraph">汚れを探す。</p>



<p class="wp-block-paragraph">壊れた場所を探す。</p>



<p class="wp-block-paragraph">物の側に、終わりの理由を求める。</p>



<p class="wp-block-paragraph">何も見つからない。</p>



<p class="wp-block-paragraph">本当は、別の場所ではとっくに終わっていたのかもしれない。</p>



<p class="wp-block-paragraph">袋に入れる前に、もう一度広げる。</p>



<p class="wp-block-paragraph">捨てると決めたあとで、一番よくその服を見る。</p>



<p class="wp-block-paragraph">縫い目。</p>



<p class="wp-block-paragraph">タグ。</p>



<p class="wp-block-paragraph">袖口。</p>



<p class="wp-block-paragraph">ボタン。</p>



<p class="wp-block-paragraph">こんなに綺麗だったのかと思う。</p>



<p class="wp-block-paragraph">どこで買ったかを思い出す。</p>



<p class="wp-block-paragraph">最初に着た日は少し思い出せる。</p>



<p class="wp-block-paragraph">最後に着た日は分からない。</p>



<p class="wp-block-paragraph">着ていた頃より長く触れている。</p>



<p class="wp-block-paragraph">何かを手放すときだけ、最後に細部を見る。</p>



<p class="wp-block-paragraph">床に何着か並べる。</p>



<p class="wp-block-paragraph">残す服。</p>



<p class="wp-block-paragraph">手放す服。</p>



<p class="wp-block-paragraph">まだ迷う服。</p>



<p class="wp-block-paragraph">見た目だけなら、手放す服の方が綺麗なことがある。</p>



<p class="wp-block-paragraph">残す服には使用痕がある。</p>



<p class="wp-block-paragraph">手放す服は、あまり着なかったから綺麗なままだ。</p>



<p class="wp-block-paragraph">それでも、残す方をハンガーへ戻す。</p>



<p class="wp-block-paragraph">傷んでいる方には、次の日がある。</p>



<p class="wp-block-paragraph">綺麗な方には、その日が浮かばない。</p>



<p class="wp-block-paragraph">少し空いたクローゼットへ、残す服を戻す。</p>



<p class="wp-block-paragraph">ハンガーとハンガーの間に隙間ができる。</p>



<p class="wp-block-paragraph">床には袋がある。</p>



<p class="wp-block-paragraph">まだ口は結ばない。</p>



<p class="wp-block-paragraph">翌朝、もう一度見る。</p>



<p class="wp-block-paragraph">一着だけ戻すこともある。</p>



<p class="wp-block-paragraph">それでもいい。</p>



<p class="wp-block-paragraph">ただ、何年も同じ服を取り出しては戻しているなら、その服ではなく、戻している理由を見た方がいいのかもしれない。</p>



<p class="wp-block-paragraph">本当に着たいのか。</p>



<p class="wp-block-paragraph">残しておきたいのか。</p>



<p class="wp-block-paragraph">高かったからなのか。</p>



<p class="wp-block-paragraph">未来の自分を待っているのか。</p>



<p class="wp-block-paragraph">まだ決めたくないだけなのか。</p>



<p class="wp-block-paragraph">残すなら、残す。</p>



<p class="wp-block-paragraph">手放すなら、手放す。</p>



<p class="wp-block-paragraph">どちらでも、昨日と同じ場所へ戻すことだけが答えではない。</p>



<p class="wp-block-paragraph">翌朝、クローゼットを開ける。</p>



<p class="wp-block-paragraph">少し空いている。</p>



<p class="wp-block-paragraph">昨日まで掛かっていた場所が分かる。</p>



<p class="wp-block-paragraph">その日の服を選ぶ。</p>



<p class="wp-block-paragraph">残った服の中から一着取る。</p>



<p class="wp-block-paragraph">袖を通す。</p>



<p class="wp-block-paragraph">玄関を出る。</p>



<p class="wp-block-paragraph">手放した服のことは、その日は考えなかった。</p>



<p class="wp-block-paragraph">数週間経てば、どこに掛かっていたのかも曖昧になるかもしれない。</p>



<p class="wp-block-paragraph">まだ着られた。</p>



<p class="wp-block-paragraph">それは最後まで変わらない。</p>



<p class="wp-block-paragraph">手放す瞬間にも着られた。</p>



<p class="wp-block-paragraph">誰かに渡れば、そのあとも着られたかもしれない。</p>



<p class="wp-block-paragraph">だから、着られなくなったから手放したわけではない。</p>



<p class="wp-block-paragraph">何度も着た。</p>



<p class="wp-block-paragraph">いつの間にか選ばなくなった。</p>



<p class="wp-block-paragraph">それでも残した。</p>



<p class="wp-block-paragraph">また着るかもしれないと思った。</p>



<p class="wp-block-paragraph">何度か取り出した。</p>



<p class="wp-block-paragraph">また戻した。</p>



<p class="wp-block-paragraph">そして最後に、もう一度広げた。</p>



<p class="wp-block-paragraph">穴はない。</p>



<p class="wp-block-paragraph">ファスナーも動く。</p>



<p class="wp-block-paragraph">洗えば、明日でも着られる。</p>



<p class="wp-block-paragraph">まだ着られる。</p>



<p class="wp-block-paragraph">それは分かっている。</p>



<p class="wp-block-paragraph">でも、「着られる」と「着る」は、同じではなかった。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/still-wearable/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3098</post-id>	</item>
		<item>
		<title>本日分、終了</title>
		<link>https://tranquilguides.com/todays-lie-complete/</link>
					<comments>https://tranquilguides.com/todays-lie-complete/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Sun, 11 Oct 2026 15:06:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[不条理]]></category>
		<category><![CDATA[中編]]></category>
		<category><![CDATA[家族]]></category>
		<category><![CDATA[小説]]></category>
		<category><![CDATA[社会規範]]></category>
		<category><![CDATA[言葉]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=3095</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Quiet-Stones-by-the-Window.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>この町では、一日に一度だけ、嘘が物になる。朝のうちに嘘を「消化」する習慣のなかで、「大丈夫」と答えたあとに現れた白い箱が、やがて町の当たり前を揺らしていく。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Quiet-Stones-by-the-Window.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">「朝ごはんは食べた」</p>



<p class="wp-block-paragraph">そう言った男の前に、焼いたトーストが一枚落ちた。</p>



<p class="wp-block-paragraph">まだ湯気が出ていた。</p>



<p class="wp-block-paragraph">この町では、一日に一度だけ、嘘が物になる。</p>



<p class="wp-block-paragraph">いつからそうなったのかは誰も知らない。法律には書かれていないし、学校でも教えない。</p>



<p class="wp-block-paragraph">それでも、子どもでも知っている。</p>



<p class="wp-block-paragraph">朝起きてから夜眠るまでのどこかで、自分が口にした嘘の一つが、物として現れる。</p>



<p class="wp-block-paragraph">「傘を持っている」</p>



<p class="wp-block-paragraph">と言えば、見たことのない傘が玄関に立つことがある。</p>



<p class="wp-block-paragraph">「宿題は終わった」</p>



<p class="wp-block-paragraph">と言った子どもの机に、知らない字で答えの書かれたノートが置かれることもある。</p>



<p class="wp-block-paragraph">「鍵を閉めた」</p>



<p class="wp-block-paragraph">と言ったあと、手の中に見覚えのない鍵が残ることもある。</p>



<p class="wp-block-paragraph">言葉と物の関係が分かりやすいとは限らない。</p>



<p class="wp-block-paragraph">「もう食べました」と言った人の前に皿が出る。</p>



<p class="wp-block-paragraph">それならまだ分かる。</p>



<p class="wp-block-paragraph">「忙しい」と言った人の机に、小さな時計が現れたことがある。</p>



<p class="wp-block-paragraph">「忘れました」と言った子どものポケットから、白い消しゴムが出てきたこともある。</p>



<p class="wp-block-paragraph">なぜそれなのかは、誰にも分からない。</p>



<p class="wp-block-paragraph">物が現れるとき、大きな音はしない。</p>



<p class="wp-block-paragraph">光ることもない。</p>



<p class="wp-block-paragraph">さっきまで何もなかった机の端に、次に見たときには置かれている。</p>



<p class="wp-block-paragraph">掌。</p>



<p class="wp-block-paragraph">鞄の底。</p>



<p class="wp-block-paragraph">玄関。</p>



<p class="wp-block-paragraph">枕元。</p>



<p class="wp-block-paragraph">人が見ている前でも同じだった。</p>



<p class="wp-block-paragraph">ただし、現れるのは一日一つだけだった。</p>



<p class="wp-block-paragraph">一つ出てしまえば、その日は終わりだった。</p>



<p class="wp-block-paragraph">そのあと何を言っても、物にはならない。</p>



<p class="wp-block-paragraph">だから、朝のうちに済ませる人がいた。</p>



<p class="wp-block-paragraph">「ポケットに飴が入っている」</p>



<p class="wp-block-paragraph">何も起きない。</p>



<p class="wp-block-paragraph">「机の下に鉛筆が落ちている」</p>



<p class="wp-block-paragraph">まだ何も起きない。</p>



<p class="wp-block-paragraph">「冷蔵庫に小さなレモンがある」</p>



<p class="wp-block-paragraph">そこで本当にレモンが出れば、その人は少し安心した。</p>



<p class="wp-block-paragraph">その日はもう、何を言っても物は増えない。</p>



<p class="wp-block-paragraph">遅刻した理由を少しくらい誤魔化してもいい。</p>



<p class="wp-block-paragraph">会いたくない人に、</p>



<p class="wp-block-paragraph">「予定があります」</p>



<p class="wp-block-paragraph">と言っても何も出ない。</p>



<p class="wp-block-paragraph">電話口で、</p>



<p class="wp-block-paragraph">「今ちょっと外にいる」</p>



<p class="wp-block-paragraph">と言っても、知らない靴や鞄が増えることはない。</p>



<p class="wp-block-paragraph">いつからか、それを「消化する」と呼ぶようになった。</p>



<p class="wp-block-paragraph">今日の嘘を消化する。</p>



<p class="wp-block-paragraph">会社へ行く前に。</p>



<p class="wp-block-paragraph">学校へ行く前に。</p>



<p class="wp-block-paragraph">面接へ行く前に。</p>



<p class="wp-block-paragraph">恋人に会う前に。</p>



<p class="wp-block-paragraph">病院で検査結果を聞く前に。</p>



<p class="wp-block-paragraph">駅前には、そのための店まであった。</p>



<p class="wp-block-paragraph">細長いビルの一階だった。</p>



<p class="wp-block-paragraph">昔は時計屋だったらしく、入口の上に丸い時計が残っていた。針は何年も前から止まっていた。</p>



<p class="wp-block-paragraph">ガラス戸には、</p>



<p class="wp-block-paragraph">「本日の消化　五百円」</p>



<p class="wp-block-paragraph">とだけ書いてあった。</p>



<p class="wp-block-paragraph">店内には長いカウンターが一本。</p>



<p class="wp-block-paragraph">その上に透明なケースが並び、赤い鉛筆、青い消しゴム、白いボタン、小さな紙袋が入っていた。</p>



<p class="wp-block-paragraph">どれも客の嘘から出てきたものだった。</p>



<p class="wp-block-paragraph">五百円を払う。</p>



<p class="wp-block-paragraph">店員の前に立つ。</p>



<p class="wp-block-paragraph">「私は赤い鉛筆を持っています」</p>



<p class="wp-block-paragraph">何も起きなければ、</p>



<p class="wp-block-paragraph">「青い消しゴムを持っています」</p>



<p class="wp-block-paragraph">それでも出なければ、</p>



<p class="wp-block-paragraph">「白いボタンを持っています」</p>



<p class="wp-block-paragraph">現れても困らないものだけを、順番に言う。</p>



<p class="wp-block-paragraph">何か一つが出たところで終わる。</p>



<p class="wp-block-paragraph">私は一度だけ、同僚に付き合って店に入ったことがある。</p>



<p class="wp-block-paragraph">午後から取引先との打ち合わせがある日だった。</p>



<p class="wp-block-paragraph">「別に嘘なんてつかないけど」</p>



<p class="wp-block-paragraph">同僚はそう言って、五百円を払った。</p>



<p class="wp-block-paragraph">何も出なかった。</p>



<p class="wp-block-paragraph">赤い鉛筆。</p>



<p class="wp-block-paragraph">何も起きない。</p>



<p class="wp-block-paragraph">青い消しゴム。</p>



<p class="wp-block-paragraph">何も起きない。</p>



<p class="wp-block-paragraph">「白いボタンを持っています」</p>



<p class="wp-block-paragraph">カウンターの上を何かが跳ねた。</p>



<p class="wp-block-paragraph">小さな白いボタンだった。</p>



<p class="wp-block-paragraph">店員はそれを拾った。</p>



<p class="wp-block-paragraph">「本日分、終了です」</p>



<p class="wp-block-paragraph">同僚は肩の力を抜いた。</p>



<p class="wp-block-paragraph">何かの検査を終えたような顔だった。</p>



<p class="wp-block-paragraph">店を出てから、掌のボタンを私に見せた。</p>



<p class="wp-block-paragraph">安いシャツに付いていそうな、ごく普通のボタンだった。</p>



<p class="wp-block-paragraph">「いらないな」</p>



<p class="wp-block-paragraph">そう言ってポケットへ入れた。</p>



<p class="wp-block-paragraph">何も現れなかった。</p>



<p class="wp-block-paragraph">数か月後、その同僚が会社を辞めた。</p>



<p class="wp-block-paragraph">机の中を片付けていると、白いボタンが出てきた。</p>



<p class="wp-block-paragraph">「これ何だっけ」</p>



<p class="wp-block-paragraph">本人はもう覚えていなかった。</p>



<p class="wp-block-paragraph">私は覚えていた。</p>



<p class="wp-block-paragraph">でも言わなかった。</p>



<p class="wp-block-paragraph">私はその店を利用したことがなかった。</p>



<p class="wp-block-paragraph">そこまでして嘘を管理する必要を感じなかった。</p>



<p class="wp-block-paragraph">嘘なんて、そう何度もつくものではないと思っていた。</p>



<p class="wp-block-paragraph">自分はたぶん、あまり嘘をつかない人間だとも思っていた。</p>



<p class="wp-block-paragraph">子どものころ、母にはよく、</p>



<p class="wp-block-paragraph">「嘘をつくなら、せめて覚えておきなさい」</p>



<p class="wp-block-paragraph">と言われた。</p>



<p class="wp-block-paragraph">普通なら「嘘をつくな」と言うのだと思う。</p>



<p class="wp-block-paragraph">母はそう言わなかった。</p>



<p class="wp-block-paragraph">自分が何を言ったのか忘れると、あとで本当だったのか嘘だったのか、自分でも分からなくなるからだと言った。</p>



<p class="wp-block-paragraph">妹は小学生のころ、毎朝同じ嘘をついていた。</p>



<p class="wp-block-paragraph">「机の上にイチゴの飴がある」</p>



<p class="wp-block-paragraph">何日かに一度、本当に飴が現れた。</p>



<p class="wp-block-paragraph">現れた日は、</p>



<p class="wp-block-paragraph">「今日終わった」</p>



<p class="wp-block-paragraph">と言って、ランドセルへ放り込んだ。</p>



<p class="wp-block-paragraph">ある朝は、</p>



<p class="wp-block-paragraph">「牛乳飲んだ」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">コップにはまだ牛乳がいっぱい入っていた。</p>



<p class="wp-block-paragraph">その横に、空のコップが一つ現れた。</p>



<p class="wp-block-paragraph">妹は笑った。</p>



<p class="wp-block-paragraph">「今日終わった」</p>



<p class="wp-block-paragraph">そう言って、元の牛乳を残したまま学校へ行った。</p>



<p class="wp-block-paragraph">母は二つのコップを洗った。</p>



<p class="wp-block-paragraph">それだけだった。</p>



<p class="wp-block-paragraph">嘘から出てきたからといって、物が特別になるわけではない。</p>



<p class="wp-block-paragraph">紙なら濡れる。</p>



<p class="wp-block-paragraph">ガラスなら割れる。</p>



<p class="wp-block-paragraph">食べ物なら腐る。</p>



<p class="wp-block-paragraph">木なら燃える。</p>



<p class="wp-block-paragraph">埃もかぶる。</p>



<p class="wp-block-paragraph">壊れれば捨てる。</p>



<p class="wp-block-paragraph">使えるなら使う。</p>



<p class="wp-block-paragraph">町のリサイクルショップには、昔から「由来不明品」という棚があった。</p>



<p class="wp-block-paragraph">誰かの嘘から出た皿。</p>



<p class="wp-block-paragraph">片方だけの手袋。</p>



<p class="wp-block-paragraph">取っ手のない鍋。</p>



<p class="wp-block-paragraph">文字のないノート。</p>



<p class="wp-block-paragraph">何の鍵穴にも合わない鍵。</p>



<p class="wp-block-paragraph">普通の商品より少し安かった。</p>



<p class="wp-block-paragraph">私の実家にも、小さな金属製の匙が一本あった。</p>



<p class="wp-block-paragraph">私が生まれる前から食器棚に入っていた。</p>



<p class="wp-block-paragraph">「これ、嘘のやつ？」</p>



<p class="wp-block-paragraph">母に聞いたことがある。</p>



<p class="wp-block-paragraph">「知らない」</p>



<p class="wp-block-paragraph">何も現れなかった。</p>



<p class="wp-block-paragraph">ある日の夕方、妹から電話があった。</p>



<p class="wp-block-paragraph">私は仕事中だった。</p>



<p class="wp-block-paragraph">朝から、何を片付けても次のものが机に乗ってくるような日だった。</p>



<p class="wp-block-paragraph">今日中に終わらせる書類。</p>



<p class="wp-block-paragraph">途中まで返したメール。</p>



<p class="wp-block-paragraph">赤い数字のついた未読通知。</p>



<p class="wp-block-paragraph">電話が鳴った。</p>



<p class="wp-block-paragraph">妹だった。</p>



<p class="wp-block-paragraph">仕事中に電話してくることはあまりない。</p>



<p class="wp-block-paragraph">「もしもし」</p>



<p class="wp-block-paragraph">「今、大丈夫？」</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">何も出なかった。</p>



<p class="wp-block-paragraph">少なくとも、電話に出ることはできた。</p>



<p class="wp-block-paragraph">「お母さん、入院した」</p>



<p class="wp-block-paragraph">私は画面を見たまま聞いていた。</p>



<p class="wp-block-paragraph">数日前から少し体調が悪かったこと。</p>



<p class="wp-block-paragraph">今日病院へ行ったこと。</p>



<p class="wp-block-paragraph">そのまま検査のために一晩入院することになったこと。</p>



<p class="wp-block-paragraph">急いで来る必要はないと母本人が言っていること。</p>



<p class="wp-block-paragraph">妹は一つずつ話した。</p>



<p class="wp-block-paragraph">私は、</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">と何度か答えた。</p>



<p class="wp-block-paragraph">「明日、検査するって」</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">「一応連絡しとこうと思って」</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">画面の文字が目には入っているのに、内容が読めなくなっていた。</p>



<p class="wp-block-paragraph">「大丈夫？」</p>



<p class="wp-block-paragraph">妹が聞いた。</p>



<p class="wp-block-paragraph">「大丈夫」</p>



<p class="wp-block-paragraph">私は答えた。</p>



<p class="wp-block-paragraph">机の上に、小さな白い箱が現れた。</p>



<p class="wp-block-paragraph">書類とキーボードの間。</p>



<p class="wp-block-paragraph">そこだけ最初から空けてあったように、きれいに収まっていた。</p>



<p class="wp-block-paragraph">妹はまだ何かを話していた。</p>



<p class="wp-block-paragraph">私は箱を見ながら、</p>



<p class="wp-block-paragraph">「分かった」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">電話を切った。</p>



<p class="wp-block-paragraph">箱には何も書かれていなかった。</p>



<p class="wp-block-paragraph">ロゴもない。</p>



<p class="wp-block-paragraph">掌に載るくらいの紙箱だった。</p>



<p class="wp-block-paragraph">菓子が一つ入りそうにも見えた。</p>



<p class="wp-block-paragraph">小さなアクセサリーの箱にも見えた。</p>



<p class="wp-block-paragraph">持ち上げた。</p>



<p class="wp-block-paragraph">軽い。</p>



<p class="wp-block-paragraph">少し振った。</p>



<p class="wp-block-paragraph">音はしない。</p>



<p class="wp-block-paragraph">蓋を開けた。</p>



<p class="wp-block-paragraph">空だった。</p>



<p class="wp-block-paragraph">指を入れた。</p>



<p class="wp-block-paragraph">底も普通の紙だった。</p>



<p class="wp-block-paragraph">同僚がこちらを向いた。</p>



<p class="wp-block-paragraph">「何それ」</p>



<p class="wp-block-paragraph">「分からない」</p>



<p class="wp-block-paragraph">何も出なかった。</p>



<p class="wp-block-paragraph">それは本当だった。</p>



<p class="wp-block-paragraph">白い箱を鞄に入れ、仕事へ戻った。</p>



<p class="wp-block-paragraph">一時間ほどして、妹に、</p>



<p class="wp-block-paragraph">「明日また教えて」</p>



<p class="wp-block-paragraph">とメッセージを送った。</p>



<p class="wp-block-paragraph">その夜、箱を家の棚に置いた。</p>



<p class="wp-block-paragraph">鍵や郵便物を一時的に置く場所だった。</p>



<p class="wp-block-paragraph">捨てようとは思わなかった。</p>



<p class="wp-block-paragraph">だからといって、大切にしたわけでもない。</p>



<p class="wp-block-paragraph">翌朝、起きると箱が目に入った。</p>



<p class="wp-block-paragraph">蓋を開けた。</p>



<p class="wp-block-paragraph">何もない。</p>



<p class="wp-block-paragraph">母からメッセージが来ていた。</p>



<p class="wp-block-paragraph">朝から検査をするらしい。</p>



<p class="wp-block-paragraph">「了解」</p>



<p class="wp-block-paragraph">と返した。</p>



<p class="wp-block-paragraph">少しして、</p>



<p class="wp-block-paragraph">「心配しなくていいから」</p>



<p class="wp-block-paragraph">と来た。</p>



<p class="wp-block-paragraph">何と返すか迷って、</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">だけ送った。</p>



<p class="wp-block-paragraph">駅へ向かう途中、消化店の前を通った。</p>



<p class="wp-block-paragraph">開店前だった。</p>



<p class="wp-block-paragraph">シャッターの前に一人だけ立っていた。</p>



<p class="wp-block-paragraph">私はそのまま通り過ぎた。</p>



<p class="wp-block-paragraph">昼過ぎ、母から、</p>



<p class="wp-block-paragraph">「検査終わった」</p>



<p class="wp-block-paragraph">と来た。</p>



<p class="wp-block-paragraph">「よかった」</p>



<p class="wp-block-paragraph">と送った。</p>



<p class="wp-block-paragraph">何も現れなかった。</p>



<p class="wp-block-paragraph">夕方、同僚に、</p>



<p class="wp-block-paragraph">「今日中にいけそう？」</p>



<p class="wp-block-paragraph">と聞かれた。</p>



<p class="wp-block-paragraph">「たぶん」</p>



<p class="wp-block-paragraph">何も出ない。</p>



<p class="wp-block-paragraph">夜、棚の上の箱を開けた。</p>



<p class="wp-block-paragraph">空だった。</p>



<p class="wp-block-paragraph">その日の嘘は、一度も物にならなかった。</p>



<p class="wp-block-paragraph">あるいは、自分では気づいていないところで何かが出ていたのかもしれない。</p>



<p class="wp-block-paragraph">でも、その夜の私は、今日は嘘をつかなかったのだと思って眠った。</p>



<p class="wp-block-paragraph">母の入院は数日続いた。</p>



<p class="wp-block-paragraph">仕事へ行く。</p>



<p class="wp-block-paragraph">帰る。</p>



<p class="wp-block-paragraph">妹から連絡が来る。</p>



<p class="wp-block-paragraph">母とも短いメッセージをやり取りする。</p>



<p class="wp-block-paragraph">「今日はどう」</p>



<p class="wp-block-paragraph">「普通」</p>



<p class="wp-block-paragraph">「食べられてる？」</p>



<p class="wp-block-paragraph">「病院食」</p>



<p class="wp-block-paragraph">「眠れた？」</p>



<p class="wp-block-paragraph">「まあまあ」</p>



<p class="wp-block-paragraph">病院にいる状態を「普通」と言っていいのか。</p>



<p class="wp-block-paragraph">何時間眠れば「まあまあ眠れた」になるのか。</p>



<p class="wp-block-paragraph">以前なら気にしなかった言葉に、少し引っかかるようになった。</p>



<p class="wp-block-paragraph">それでも、箱には何も増えなかった。</p>



<p class="wp-block-paragraph">数日後、母は退院した。</p>



<p class="wp-block-paragraph">大きな問題は見つからなかった。</p>



<p class="wp-block-paragraph">薬を飲みながら様子を見ることになった。</p>



<p class="wp-block-paragraph">「帰ってきました」</p>



<p class="wp-block-paragraph">母からメッセージが届いた。</p>



<p class="wp-block-paragraph">私は少し考え、</p>



<p class="wp-block-paragraph">「よかった」</p>



<p class="wp-block-paragraph">と返した。</p>



<p class="wp-block-paragraph">それから、白い箱のことも少しずつ忘れた。</p>



<p class="wp-block-paragraph">棚の上で埃をかぶった。</p>



<p class="wp-block-paragraph">郵便物の下に埋もれる日もあった。</p>



<p class="wp-block-paragraph">鍵をその上へ置くこともあった。</p>



<p class="wp-block-paragraph">一度だけ、捨てかけた。</p>



<p class="wp-block-paragraph">部屋を片付けながら、古いレシートや空き箱を紙袋に集めていた。</p>



<p class="wp-block-paragraph">白い箱を手に取る。</p>



<p class="wp-block-paragraph">蓋を開ける。</p>



<p class="wp-block-paragraph">空だった。</p>



<p class="wp-block-paragraph">ごみの紙袋へ入れようとして、やめた。</p>



<p class="wp-block-paragraph">元の棚へ戻した。</p>



<p class="wp-block-paragraph">数週間後。</p>



<p class="wp-block-paragraph">休日に掃除機をかけていると、棚に肘が当たった。</p>



<p class="wp-block-paragraph">白い箱が床へ落ちた。</p>



<p class="wp-block-paragraph">蓋が外れた。</p>



<p class="wp-block-paragraph">何かが転がった。</p>



<p class="wp-block-paragraph">掃除機を止めた。</p>



<p class="wp-block-paragraph">黒い石だった。</p>



<p class="wp-block-paragraph">私はしゃがんだ。</p>



<p class="wp-block-paragraph">道路脇に落ちていても誰も拾わないような、小さな石だった。</p>



<p class="wp-block-paragraph">箱を拾う。</p>



<p class="wp-block-paragraph">中は空。</p>



<p class="wp-block-paragraph">石を手に取った。</p>



<p class="wp-block-paragraph">以前は確かに入っていなかった。</p>



<p class="wp-block-paragraph">何度も箱を開けていた。</p>



<p class="wp-block-paragraph">底にも触れた。</p>



<p class="wp-block-paragraph">いつ入ったのか分からない。</p>



<p class="wp-block-paragraph">石を机に置いた。</p>



<p class="wp-block-paragraph">意味を考えようとして、やめた。</p>



<p class="wp-block-paragraph">この町では、言ったことと現れる物の関係が分からないことは珍しくない。</p>



<p class="wp-block-paragraph">「大丈夫」から箱が出た。</p>



<p class="wp-block-paragraph">箱から石が出た。</p>



<p class="wp-block-paragraph">それ以上は分からなかった。</p>



<p class="wp-block-paragraph">私は母に電話した。</p>



<p class="wp-block-paragraph">特に用事はなかった。</p>



<p class="wp-block-paragraph">二回呼び出し音が鳴って、母が出た。</p>



<p class="wp-block-paragraph">「どうしたの」</p>



<p class="wp-block-paragraph">「別に」</p>



<p class="wp-block-paragraph">机の上に、もう一つ石が現れた。</p>



<p class="wp-block-paragraph">最初の石の横。</p>



<p class="wp-block-paragraph">小さな音がした。</p>



<p class="wp-block-paragraph">私は電話を耳に当てたまま動かなかった。</p>



<p class="wp-block-paragraph">「もしもし」</p>



<p class="wp-block-paragraph">母が言った。</p>



<p class="wp-block-paragraph">私は新しい石を見た。</p>



<p class="wp-block-paragraph">一日に一つだけのはずだった。</p>



<p class="wp-block-paragraph">最初の石がいつ現れたのかは分からない。</p>



<p class="wp-block-paragraph">もしかすると今日の分だったのかもしれない。</p>



<p class="wp-block-paragraph">だとしても、今の石で二つ目になる。</p>



<p class="wp-block-paragraph">最初の石を左手に取った。</p>



<p class="wp-block-paragraph">新しい石を右手に取った。</p>



<p class="wp-block-paragraph">形は少し違う。</p>



<p class="wp-block-paragraph">重さはほとんど同じだった。</p>



<p class="wp-block-paragraph">「本当にどうしたの」</p>



<p class="wp-block-paragraph">母が聞いた。</p>



<p class="wp-block-paragraph">「いや」</p>



<p class="wp-block-paragraph">母は待っていた。</p>



<p class="wp-block-paragraph">声を聞きたかった、と言えばよかったのかもしれない。</p>



<p class="wp-block-paragraph">退院してから本当に大丈夫なのか聞きたかったのかもしれない。</p>



<p class="wp-block-paragraph">入院したと聞いた日、自分が思っていたより動揺していたことを話してもよかった。</p>



<p class="wp-block-paragraph">白い箱のことを言ってもよかった。</p>



<p class="wp-block-paragraph">石のことも。</p>



<p class="wp-block-paragraph">でも、それを説明するほどのことでもないように思えた。</p>



<p class="wp-block-paragraph">「なんでもない」</p>



<p class="wp-block-paragraph">三つ目の石が机の上に落ちた。</p>



<p class="wp-block-paragraph">今度は、はっきり音がした。</p>



<p class="wp-block-paragraph">私は黙った。</p>



<p class="wp-block-paragraph">母も黙った。</p>



<p class="wp-block-paragraph">「そう」</p>



<p class="wp-block-paragraph">母が言った。</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">「じゃあ、またね」</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">電話を切った。</p>



<p class="wp-block-paragraph">部屋が静かになった。</p>



<p class="wp-block-paragraph">石を三つ並べた。</p>



<p class="wp-block-paragraph">一つは黒に近い灰色。</p>



<p class="wp-block-paragraph">一つは少し茶色い。</p>



<p class="wp-block-paragraph">最後の一つには、細い白い線が入っていた。</p>



<p class="wp-block-paragraph">私は三つとも白い箱へ戻した。</p>



<p class="wp-block-paragraph">蓋を閉じた。</p>



<p class="wp-block-paragraph">翌朝、仕事を午前だけ休んで役所へ行った。</p>



<p class="wp-block-paragraph">入口の案内板を見る。</p>



<p class="wp-block-paragraph">転入。</p>



<p class="wp-block-paragraph">戸籍。</p>



<p class="wp-block-paragraph">税金。</p>



<p class="wp-block-paragraph">保険。</p>



<p class="wp-block-paragraph">年金。</p>



<p class="wp-block-paragraph">ごみ。</p>



<p class="wp-block-paragraph">道路。</p>



<p class="wp-block-paragraph">住宅。</p>



<p class="wp-block-paragraph">子育て。</p>



<p class="wp-block-paragraph">嘘についての窓口はなかった。</p>



<p class="wp-block-paragraph">受付で、</p>



<p class="wp-block-paragraph">「相談したいことがあるんですけど」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">「どういった内容でしょう」</p>



<p class="wp-block-paragraph">昨日のことを話した。</p>



<p class="wp-block-paragraph">石。</p>



<p class="wp-block-paragraph">二回。</p>



<p class="wp-block-paragraph">いや、もしかすると三回。</p>



<p class="wp-block-paragraph">受付の人は少し困った顔をした。</p>



<p class="wp-block-paragraph">「一日一度です」</p>



<p class="wp-block-paragraph">「はい」</p>



<p class="wp-block-paragraph">「現れるのは、一日一つです」</p>



<p class="wp-block-paragraph">「でも、二つ出たんです」</p>



<p class="wp-block-paragraph">「何がですか」</p>



<p class="wp-block-paragraph">「石が」</p>



<p class="wp-block-paragraph">「石？」</p>



<p class="wp-block-paragraph">「『別に』って言ったら一つ出て、そのあと『なんでもない』って言ったらもう一つ出ました」</p>



<p class="wp-block-paragraph">受付の人は私を見た。</p>



<p class="wp-block-paragraph">「それはありません」</p>



<p class="wp-block-paragraph">机の上に、一枚の白い紙が現れた。</p>



<p class="wp-block-paragraph">二人とも黙った。</p>



<p class="wp-block-paragraph">受付の人の右手の横だった。</p>



<p class="wp-block-paragraph">何も印刷されていない。</p>



<p class="wp-block-paragraph">A4くらいの紙。</p>



<p class="wp-block-paragraph">その人はゆっくり持ち上げた。</p>



<p class="wp-block-paragraph">裏返す。</p>



<p class="wp-block-paragraph">裏も白かった。</p>



<p class="wp-block-paragraph">光へ透かした。</p>



<p class="wp-block-paragraph">何もない。</p>



<p class="wp-block-paragraph">「今の」</p>



<p class="wp-block-paragraph">私は言った。</p>



<p class="wp-block-paragraph">受付の人は答えなかった。</p>



<p class="wp-block-paragraph">「今日、もう何か出ました？」</p>



<p class="wp-block-paragraph">しばらくして、</p>



<p class="wp-block-paragraph">「分かりません」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">何も現れなかった。</p>



<p class="wp-block-paragraph">役所を出た。</p>



<p class="wp-block-paragraph">午後から会社へ行った。</p>



<p class="wp-block-paragraph">誰にも話さなかった。</p>



<p class="wp-block-paragraph">話したところで、何を説明すればいいのか分からなかった。</p>



<p class="wp-block-paragraph">数日間、新聞やニュースを見るようになった。</p>



<p class="wp-block-paragraph">市のホームページも確認した。</p>



<p class="wp-block-paragraph">何もなかった。</p>



<p class="wp-block-paragraph">一週間ほど経った昼休み、会社の給湯室から声がした。</p>



<p class="wp-block-paragraph">「昨日、二回出たんだけど」</p>



<p class="wp-block-paragraph">私は自動販売機の前で立ち止まった。</p>



<p class="wp-block-paragraph">「何が？」</p>



<p class="wp-block-paragraph">「物」</p>



<p class="wp-block-paragraph">「何出た？」</p>



<p class="wp-block-paragraph">「朝が輪ゴム。夜がスプーン」</p>



<p class="wp-block-paragraph">「朝、消化したのに？」</p>



<p class="wp-block-paragraph">「した」</p>



<p class="wp-block-paragraph">二人は笑った。</p>



<p class="wp-block-paragraph">「勘違いじゃない？」</p>



<p class="wp-block-paragraph">「だと思うけど」</p>



<p class="wp-block-paragraph">何も現れなかった。</p>



<p class="wp-block-paragraph">それから、同じような話を何度も聞いた。</p>



<p class="wp-block-paragraph">電車。</p>



<p class="wp-block-paragraph">スーパー。</p>



<p class="wp-block-paragraph">喫茶店。</p>



<p class="wp-block-paragraph">美容室。</p>



<p class="wp-block-paragraph">一日に二個。</p>



<p class="wp-block-paragraph">三個。</p>



<p class="wp-block-paragraph">昨日は五個。</p>



<p class="wp-block-paragraph">子どもが二回出した。</p>



<p class="wp-block-paragraph">夫婦で数えていたのに合わない。</p>



<p class="wp-block-paragraph">最初は、前の日の物を見落としていたのだと言われた。</p>



<p class="wp-block-paragraph">誰かが置いた。</p>



<p class="wp-block-paragraph">たまたまそこにあった。</p>



<p class="wp-block-paragraph">そういうことにされた。</p>



<p class="wp-block-paragraph">駅前の消化店には、以前より長い列ができた。</p>



<p class="wp-block-paragraph">朝、会社へ向かう途中、十人ほど並んでいるのを見た。</p>



<p class="wp-block-paragraph">スーツ姿の男。</p>



<p class="wp-block-paragraph">制服の高校生。</p>



<p class="wp-block-paragraph">買い物袋を持った女性。</p>



<p class="wp-block-paragraph">子どもを連れた母親。</p>



<p class="wp-block-paragraph">ガラス越しに、客の一人がカウンターに立っていた。</p>



<p class="wp-block-paragraph">「赤い鉛筆を持っています」</p>



<p class="wp-block-paragraph">何も出ない。</p>



<p class="wp-block-paragraph">「青い消しゴムを持っています」</p>



<p class="wp-block-paragraph">青い消しゴムが出た。</p>



<p class="wp-block-paragraph">店員が何か言った。</p>



<p class="wp-block-paragraph">たぶん、</p>



<p class="wp-block-paragraph">「本日分、終了です」</p>



<p class="wp-block-paragraph">だった。</p>



<p class="wp-block-paragraph">男は消しゴムを受け取り、入口へ向かった。</p>



<p class="wp-block-paragraph">その途中でスマートフォンが鳴った。</p>



<p class="wp-block-paragraph">電話に出る。</p>



<p class="wp-block-paragraph">何か答える。</p>



<p class="wp-block-paragraph">足元に小さな紙袋が現れた。</p>



<p class="wp-block-paragraph">並んでいた人が全員、そこを見た。</p>



<p class="wp-block-paragraph">男も止まった。</p>



<p class="wp-block-paragraph">店員がカウンターから出てきた。</p>



<p class="wp-block-paragraph">誰も何も言わなかった。</p>



<p class="wp-block-paragraph">その日の午後、店は閉まった。</p>



<p class="wp-block-paragraph">翌朝、</p>



<p class="wp-block-paragraph">「設備点検のため臨時休業」</p>



<p class="wp-block-paragraph">という紙が貼られていた。</p>



<p class="wp-block-paragraph">その次の日も。</p>



<p class="wp-block-paragraph">三日目には、</p>



<p class="wp-block-paragraph">「当面の間休業します」</p>



<p class="wp-block-paragraph">に変わった。</p>



<p class="wp-block-paragraph">会社でも物が増えた。</p>



<p class="wp-block-paragraph">会議室で、</p>



<p class="wp-block-paragraph">「資料、確認しました」</p>



<p class="wp-block-paragraph">と言う。</p>



<p class="wp-block-paragraph">紙が一枚現れる。</p>



<p class="wp-block-paragraph">「メールは送ってあります」</p>



<p class="wp-block-paragraph">封筒が出る。</p>



<p class="wp-block-paragraph">「その件、聞いてます」</p>



<p class="wp-block-paragraph">小さなイヤホンが床に落ちる。</p>



<p class="wp-block-paragraph">最初は、現れた物を庶務室へ持っていく決まりになった。</p>



<p class="wp-block-paragraph">透明な箱が置かれた。</p>



<p class="wp-block-paragraph">日付。</p>



<p class="wp-block-paragraph">時刻。</p>



<p class="wp-block-paragraph">発話内容。</p>



<p class="wp-block-paragraph">発話者。</p>



<p class="wp-block-paragraph">紙に書いて、一緒に入れる。</p>



<p class="wp-block-paragraph">一週間も経たないうちに、記入されていない物が増えた。</p>



<p class="wp-block-paragraph">誰が言ったのか分からない。</p>



<p class="wp-block-paragraph">どの言葉だったのか分からない。</p>



<p class="wp-block-paragraph">会話の途中で突然現れるので、本人にも判別できない。</p>



<p class="wp-block-paragraph">ある朝、課長が全員を集めた。</p>



<p class="wp-block-paragraph">「できるだけ事実に基づいて話してください」</p>



<p class="wp-block-paragraph">誰かが笑った。</p>



<p class="wp-block-paragraph">「業務に必要のない虚偽の発言は控えてください」</p>



<p class="wp-block-paragraph">誰も笑わなかった。</p>



<p class="wp-block-paragraph">「ただし、会話を極端に避ける必要はありません」</p>



<p class="wp-block-paragraph">机の端に透明な板が一枚現れた。</p>



<p class="wp-block-paragraph">課長が止まった。</p>



<p class="wp-block-paragraph">全員が板を見た。</p>



<p class="wp-block-paragraph">何を嘘と判断されたのかは分からなかった。</p>



<p class="wp-block-paragraph">朝礼はそこで終わった。</p>



<p class="wp-block-paragraph">少しずつ、会社の言葉が変わった。</p>



<p class="wp-block-paragraph">「確認しました」</p>



<p class="wp-block-paragraph">ではなく、</p>



<p class="wp-block-paragraph">「添付ファイルの一ページ目を開きました」</p>



<p class="wp-block-paragraph">「対応済みです」</p>



<p class="wp-block-paragraph">ではなく、</p>



<p class="wp-block-paragraph">「十五時二十分に送信しました」</p>



<p class="wp-block-paragraph">「すぐやります」</p>



<p class="wp-block-paragraph">ではなく、</p>



<p class="wp-block-paragraph">「今日中を予定しています」</p>



<p class="wp-block-paragraph">電話で、</p>



<p class="wp-block-paragraph">「大丈夫です」</p>



<p class="wp-block-paragraph">と言う人も減った。</p>



<p class="wp-block-paragraph">「今は話せます」</p>



<p class="wp-block-paragraph">「その時間は空いています」</p>



<p class="wp-block-paragraph">「現時点では問題ありません」</p>



<p class="wp-block-paragraph">会話は少し長くなった。</p>



<p class="wp-block-paragraph">町のあちこちでも、似たことが起きた。</p>



<p class="wp-block-paragraph">喫茶店で、隣の客が店員に、</p>



<p class="wp-block-paragraph">「少々お待ちくださいって、どれくらい？」</p>



<p class="wp-block-paragraph">と聞いた。</p>



<p class="wp-block-paragraph">店員は一瞬止まり、</p>



<p class="wp-block-paragraph">「確認して戻ります」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">病院で、医師が患者に、</p>



<p class="wp-block-paragraph">「大丈夫ですよ」</p>



<p class="wp-block-paragraph">とは言わず、</p>



<p class="wp-block-paragraph">「今日の検査では異常は見つかっていません」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">子どもが学校から帰ってきて、</p>



<p class="wp-block-paragraph">「宿題を忘れた」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">母親が、</p>



<p class="wp-block-paragraph">「本当に忘れたの？」</p>



<p class="wp-block-paragraph">と聞いた。</p>



<p class="wp-block-paragraph">子どもは黙った。</p>



<p class="wp-block-paragraph">ランドセルの横に、小さなノートが現れた。</p>



<p class="wp-block-paragraph">返事までの間が、以前より少し長くなった。</p>



<p class="wp-block-paragraph">知らなければ、</p>



<p class="wp-block-paragraph">「知らない」</p>



<p class="wp-block-paragraph">と言う。</p>



<p class="wp-block-paragraph">まだなら、</p>



<p class="wp-block-paragraph">「まだ」</p>



<p class="wp-block-paragraph">と言う。</p>



<p class="wp-block-paragraph">行きたくないとき、</p>



<p class="wp-block-paragraph">「予定がある」</p>



<p class="wp-block-paragraph">ではなく、</p>



<p class="wp-block-paragraph">「行かない」</p>



<p class="wp-block-paragraph">と言う人もいた。</p>



<p class="wp-block-paragraph">電話に出たくなければ、出ない。</p>



<p class="wp-block-paragraph">それでも、物は減らなかった。</p>



<p class="wp-block-paragraph">ある日、母から電話が来た。</p>



<p class="wp-block-paragraph">「最近、仕事どう？」</p>



<p class="wp-block-paragraph">「普通」</p>



<p class="wp-block-paragraph">机の上に、灰色の布が現れた。</p>



<p class="wp-block-paragraph">ハンカチにするには小さい。</p>



<p class="wp-block-paragraph">何に使うのか分からない。</p>



<p class="wp-block-paragraph">「今、出た？」</p>



<p class="wp-block-paragraph">母が聞いた。</p>



<p class="wp-block-paragraph">「出た」</p>



<p class="wp-block-paragraph">「何？」</p>



<p class="wp-block-paragraph">「布」</p>



<p class="wp-block-paragraph">「そう」</p>



<p class="wp-block-paragraph">母はそれ以上聞かなかった。</p>



<p class="wp-block-paragraph">「そっちは？」</p>



<p class="wp-block-paragraph">「まあまあ」</p>



<p class="wp-block-paragraph">電話の向こうで、小さな音がした。</p>



<p class="wp-block-paragraph">「あ」</p>



<p class="wp-block-paragraph">「何出た？」</p>



<p class="wp-block-paragraph">「何かの蓋」</p>



<p class="wp-block-paragraph">二人で少し笑った。</p>



<p class="wp-block-paragraph">母が退院してから、以前より電話をするようになった。</p>



<p class="wp-block-paragraph">週に一度あるかないか。</p>



<p class="wp-block-paragraph">特に話すことはない。</p>



<p class="wp-block-paragraph">天気。</p>



<p class="wp-block-paragraph">食べたもの。</p>



<p class="wp-block-paragraph">妹のこと。</p>



<p class="wp-block-paragraph">近所の店。</p>



<p class="wp-block-paragraph">テレビ。</p>



<p class="wp-block-paragraph">体調。</p>



<p class="wp-block-paragraph">話すほどのことではないことを話した。</p>



<p class="wp-block-paragraph">その途中で物が出る。</p>



<p class="wp-block-paragraph">「別に変わらない」</p>



<p class="wp-block-paragraph">小さなネジ。</p>



<p class="wp-block-paragraph">「ちゃんと食べてる」</p>



<p class="wp-block-paragraph">紙の皿。</p>



<p class="wp-block-paragraph">「寝てた」</p>



<p class="wp-block-paragraph">白い布。</p>



<p class="wp-block-paragraph">母の側でも出る。</p>



<p class="wp-block-paragraph">何が出たか聞く。</p>



<p class="wp-block-paragraph">答える。</p>



<p class="wp-block-paragraph">それで終わる。</p>



<p class="wp-block-paragraph">一度だけ、</p>



<p class="wp-block-paragraph">「箱、出たことある？」</p>



<p class="wp-block-paragraph">と聞いた。</p>



<p class="wp-block-paragraph">「何の箱？」</p>



<p class="wp-block-paragraph">「白いやつ」</p>



<p class="wp-block-paragraph">母はしばらく考えた。</p>



<p class="wp-block-paragraph">「ないと思う」</p>



<p class="wp-block-paragraph">何も起きなかった。</p>



<p class="wp-block-paragraph">私は棚の上の箱を見た。</p>



<p class="wp-block-paragraph">石は三つのままだった。</p>



<p class="wp-block-paragraph">そのころ、白い箱の写真をよく見かけるようになった。</p>



<p class="wp-block-paragraph">「大丈夫」と言ったあとに出た、と書かれていた。</p>



<p class="wp-block-paragraph">少し細長いもの。</p>



<p class="wp-block-paragraph">正方形に近いもの。</p>



<p class="wp-block-paragraph">蓋が浅いもの。</p>



<p class="wp-block-paragraph">どれも白く、何も書かれていない。</p>



<p class="wp-block-paragraph">中は空だという人が多かった。</p>



<p class="wp-block-paragraph">捨てた人。</p>



<p class="wp-block-paragraph">残している人。</p>



<p class="wp-block-paragraph">怖くて開けていない人。</p>



<p class="wp-block-paragraph">一か月後に砂が入っていた人。</p>



<p class="wp-block-paragraph">最初からガラス片が一つ入っていた人。</p>



<p class="wp-block-paragraph">私は見るだけにした。</p>



<p class="wp-block-paragraph">自分の箱のことは書かなかった。</p>



<p class="wp-block-paragraph">石が三つあることも。</p>



<p class="wp-block-paragraph">しばらくして、市役所の二階に、</p>



<p class="wp-block-paragraph">「物品出現に関する相談窓口」</p>



<p class="wp-block-paragraph">ができた。</p>



<p class="wp-block-paragraph">「嘘」という字はどこにもなかった。</p>



<p class="wp-block-paragraph">もう一度行こうかと思った。</p>



<p class="wp-block-paragraph">行かなかった。</p>



<p class="wp-block-paragraph">テレビでは、知らない専門家が話していた。</p>



<p class="wp-block-paragraph">本当に昔から一日に一度だったのか。</p>



<p class="wp-block-paragraph">複数回起きても、人が見落としていただけではないのか。</p>



<p class="wp-block-paragraph">そもそも「一日」とは、いつからいつまでなのか。</p>



<p class="wp-block-paragraph">人間の暦と現象が一致すると、誰が確かめたのか。</p>



<p class="wp-block-paragraph">私は途中でテレビを消した。</p>



<p class="wp-block-paragraph">朝に一度消化すれば安心できた。</p>



<p class="wp-block-paragraph">私にとって確かだったのは、それだけだった。</p>



<p class="wp-block-paragraph">その安心がなくなった。</p>



<p class="wp-block-paragraph">町が壊れたわけではなかった。</p>



<p class="wp-block-paragraph">建物が急に増えたわけでもない。</p>



<p class="wp-block-paragraph">人が消えたという話も、私は知らない。</p>



<p class="wp-block-paragraph">増えたのは、小さなものばかりだった。</p>



<p class="wp-block-paragraph">会社の会議室には、</p>



<p class="wp-block-paragraph">「確認しました」</p>



<p class="wp-block-paragraph">の紙が積み上がった。</p>



<p class="wp-block-paragraph">毎晩、清掃の人が捨てた。</p>



<p class="wp-block-paragraph">病院の診察室には透明なケースが置かれた。</p>



<p class="wp-block-paragraph">何かが出ると、医師か看護師が入れた。</p>



<p class="wp-block-paragraph">家では、玄関や台所に小さな籠を置く人が増えた。</p>



<p class="wp-block-paragraph">妹の家にもあった。</p>



<p class="wp-block-paragraph">ある休日、妹の家で食事をした。</p>



<p class="wp-block-paragraph">皿を洗いながら棚を見ると、透明なケースが置いてあった。</p>



<p class="wp-block-paragraph">赤い輪ゴム。</p>



<p class="wp-block-paragraph">木片。</p>



<p class="wp-block-paragraph">小さな鍵。</p>



<p class="wp-block-paragraph">青い石。</p>



<p class="wp-block-paragraph">白いプラスチック片。</p>



<p class="wp-block-paragraph">「これ全部？」</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">妹がケースを開けた。</p>



<p class="wp-block-paragraph">小さな鍵をつまむ。</p>



<p class="wp-block-paragraph">「これは『今出るところ』」</p>



<p class="wp-block-paragraph">次に青い石を持つ。</p>



<p class="wp-block-paragraph">「これは『覚えてない』」</p>



<p class="wp-block-paragraph">白いプラスチック片を持ち上げた。</p>



<p class="wp-block-paragraph">「これは？」</p>



<p class="wp-block-paragraph">妹は首をかしげた。</p>



<p class="wp-block-paragraph">「本当に覚えてない」</p>



<p class="wp-block-paragraph">二人で笑った。</p>



<p class="wp-block-paragraph">しばらくして、妹が言った。</p>



<p class="wp-block-paragraph">「お兄ちゃん、まだあの箱持ってる？」</p>



<p class="wp-block-paragraph">「なんで知ってるの」</p>



<p class="wp-block-paragraph">「お母さんから聞いた」</p>



<p class="wp-block-paragraph">母に話した覚えはなかった。</p>



<p class="wp-block-paragraph">どこかで言ったのかもしれない。</p>



<p class="wp-block-paragraph">「持ってる」</p>



<p class="wp-block-paragraph">「中、何か入ってる？」</p>



<p class="wp-block-paragraph">「石」</p>



<p class="wp-block-paragraph">「何個？」</p>



<p class="wp-block-paragraph">「三つ」</p>



<p class="wp-block-paragraph">「増えてる？」</p>



<p class="wp-block-paragraph">「増えてない」</p>



<p class="wp-block-paragraph">「捨てないの？」</p>



<p class="wp-block-paragraph">「別に」</p>



<p class="wp-block-paragraph">テーブルの上に、黒い石が一つ現れた。</p>



<p class="wp-block-paragraph">二人で見た。</p>



<p class="wp-block-paragraph">妹が笑った。</p>



<p class="wp-block-paragraph">私も笑った。</p>



<p class="wp-block-paragraph">「四つ目じゃん」</p>



<p class="wp-block-paragraph">石を拾った。</p>



<p class="wp-block-paragraph">箱の三つより丸かった。</p>



<p class="wp-block-paragraph">「違うと思う」</p>



<p class="wp-block-paragraph">「何が？」</p>



<p class="wp-block-paragraph">「箱の石とは」</p>



<p class="wp-block-paragraph">「石は石じゃん」</p>



<p class="wp-block-paragraph">私は何も言わなかった。</p>



<p class="wp-block-paragraph">家へ帰ってから、その石を箱に入れるか迷った。</p>



<p class="wp-block-paragraph">入れなかった。</p>



<p class="wp-block-paragraph">机の引き出しへしまった。</p>



<p class="wp-block-paragraph">白い箱には、あの三つだけを残した。</p>



<p class="wp-block-paragraph">数か月が経った。</p>



<p class="wp-block-paragraph">町は新しい状態にも慣れた。</p>



<p class="wp-block-paragraph">会話の途中で何かが現れても、大声を出す人は減った。</p>



<p class="wp-block-paragraph">飲食店なら店員が拾う。</p>



<p class="wp-block-paragraph">会社なら各自で捨てる。</p>



<p class="wp-block-paragraph">学校なら先生が保管する。</p>



<p class="wp-block-paragraph">駅なら駅員へ渡す。</p>



<p class="wp-block-paragraph">「今の何から出た？」</p>



<p class="wp-block-paragraph">分かれば答える。</p>



<p class="wp-block-paragraph">分からなければ、</p>



<p class="wp-block-paragraph">「分からない」</p>



<p class="wp-block-paragraph">と言う。</p>



<p class="wp-block-paragraph">そして時々、その「分からない」からも何かが出る。</p>



<p class="wp-block-paragraph">誰かが話すと、その人の顔だけでなく、机や床を見るようになった。</p>



<p class="wp-block-paragraph">何も出なければ、</p>



<p class="wp-block-paragraph">「ほら、本当だった」</p>



<p class="wp-block-paragraph">と言う人もいた。</p>



<p class="wp-block-paragraph">でも、嘘を言っても何も出ないことはある。</p>



<p class="wp-block-paragraph">全部の嘘が物になるわけではない。</p>



<p class="wp-block-paragraph">ある日、電車の中で男が、</p>



<p class="wp-block-paragraph">「何も出なかったでしょ」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">向かいの女が黙った。</p>



<p class="wp-block-paragraph">男の膝の上に、小さな鏡が現れた。</p>



<p class="wp-block-paragraph">誰も笑わなかった。</p>



<p class="wp-block-paragraph">私は、以前より話すことが少なくなった。</p>



<p class="wp-block-paragraph">正確に答えようとすると、言わなくてもいいことが増えた。</p>



<p class="wp-block-paragraph">「元気？」</p>



<p class="wp-block-paragraph">「まあ」</p>



<p class="wp-block-paragraph">「忙しい？」</p>



<p class="wp-block-paragraph">「今日は仕事」</p>



<p class="wp-block-paragraph">「最近どう？」</p>



<p class="wp-block-paragraph">少し考える。</p>



<p class="wp-block-paragraph">「昨日と今日は違う」</p>



<p class="wp-block-paragraph">相手が困った顔をする。</p>



<p class="wp-block-paragraph">「どうしたの」</p>



<p class="wp-block-paragraph">「考えてた」</p>



<p class="wp-block-paragraph">それは本当だった。</p>



<p class="wp-block-paragraph">母との電話でも同じだった。</p>



<p class="wp-block-paragraph">「ちゃんと寝てる？」</p>



<p class="wp-block-paragraph">「昨日は六時間くらい」</p>



<p class="wp-block-paragraph">「ご飯食べてる？」</p>



<p class="wp-block-paragraph">「今日は食べた」</p>



<p class="wp-block-paragraph">「仕事どう？」</p>



<p class="wp-block-paragraph">「今日は終わった」</p>



<p class="wp-block-paragraph">母も、以前より具体的に聞くようになった。</p>



<p class="wp-block-paragraph">「大丈夫？」</p>



<p class="wp-block-paragraph">とは、あまり言わなくなった。</p>



<p class="wp-block-paragraph">私も「大丈夫」を使わなくなった。</p>



<p class="wp-block-paragraph">白い箱が出るからではない。</p>



<p class="wp-block-paragraph">何をまとめて「大丈夫」と呼べばいいのか、分からなくなった。</p>



<p class="wp-block-paragraph">仕事へ行ければ大丈夫なのか。</p>



<p class="wp-block-paragraph">食べられれば。</p>



<p class="wp-block-paragraph">眠れれば。</p>



<p class="wp-block-paragraph">電話に出られれば。</p>



<p class="wp-block-paragraph">病院から帰ってこられれば。</p>



<p class="wp-block-paragraph">歩ければ。</p>



<p class="wp-block-paragraph">返事ができれば。</p>



<p class="wp-block-paragraph">あの日は考えなかった。</p>



<p class="wp-block-paragraph">妹から、</p>



<p class="wp-block-paragraph">「大丈夫？」</p>



<p class="wp-block-paragraph">と聞かれて、</p>



<p class="wp-block-paragraph">「大丈夫」</p>



<p class="wp-block-paragraph">と答えた。</p>



<p class="wp-block-paragraph">今なら、</p>



<p class="wp-block-paragraph">「仕事中」</p>



<p class="wp-block-paragraph">と言うかもしれない。</p>



<p class="wp-block-paragraph">「今聞いた」</p>



<p class="wp-block-paragraph">と言うかもしれない。</p>



<p class="wp-block-paragraph">「まだ分からない」</p>



<p class="wp-block-paragraph">でもいい。</p>



<p class="wp-block-paragraph">それなら白い箱は出なかったのか。</p>



<p class="wp-block-paragraph">確かめることはできない。</p>



<p class="wp-block-paragraph">箱は今も棚の上にある。</p>



<p class="wp-block-paragraph">少し黄ばんだ。</p>



<p class="wp-block-paragraph">角は柔らかくなった。</p>



<p class="wp-block-paragraph">何度も開けたせいで、蓋の折り目が白く擦れている。</p>



<p class="wp-block-paragraph">中には黒い石が三つある。</p>



<p class="wp-block-paragraph">時々、机に出す。</p>



<p class="wp-block-paragraph">一つずつ並べる。</p>



<p class="wp-block-paragraph">最初の石。</p>



<p class="wp-block-paragraph">「別に」の石。</p>



<p class="wp-block-paragraph">「なんでもない」の石。</p>



<p class="wp-block-paragraph">そう呼んでいるだけだ。</p>



<p class="wp-block-paragraph">最初の一つが何から出たのか、本当は分からない。</p>



<p class="wp-block-paragraph">箱を落とす何日も前に、別の嘘から生まれたのかもしれない。</p>



<p class="wp-block-paragraph">なぜ箱の中に入ったのかも知らない。</p>



<p class="wp-block-paragraph">それでも数える。</p>



<p class="wp-block-paragraph">一つ。</p>



<p class="wp-block-paragraph">二つ。</p>



<p class="wp-block-paragraph">三つ。</p>



<p class="wp-block-paragraph">母は元気にしている。</p>



<p class="wp-block-paragraph">少なくとも、昨日は夕食を食べたと言っていた。</p>



<p class="wp-block-paragraph">妹も同じ町にいる。</p>



<p class="wp-block-paragraph">駅前の消化店だった場所には、今は修理屋が入っている。</p>



<p class="wp-block-paragraph">時計。</p>



<p class="wp-block-paragraph">鞄。</p>



<p class="wp-block-paragraph">傘。</p>



<p class="wp-block-paragraph">壊れたものを直す店。</p>



<p class="wp-block-paragraph">入口の丸い時計だけは昔のまま残っている。</p>



<p class="wp-block-paragraph">針は止まったままだ。</p>



<p class="wp-block-paragraph">会社の庶務室にあった透明ケースはなくなった。</p>



<p class="wp-block-paragraph">物が増えすぎて、集めることをやめた。</p>



<p class="wp-block-paragraph">必要なければ捨てる。</p>



<p class="wp-block-paragraph">それだけになった。</p>



<p class="wp-block-paragraph">町のごみ収集も普通に続いている。</p>



<p class="wp-block-paragraph">物は増える。</p>



<p class="wp-block-paragraph">捨てられる。</p>



<p class="wp-block-paragraph">また増える。</p>



<p class="wp-block-paragraph">人間が急に正直になったわけではない。</p>



<p class="wp-block-paragraph">ただ、嘘と呼ぶほどでもない言葉を、一日に何度も使っていた。</p>



<p class="wp-block-paragraph">話を終えるため。</p>



<p class="wp-block-paragraph">心配させないため。</p>



<p class="wp-block-paragraph">その場を通り過ぎるため。</p>



<p class="wp-block-paragraph">説明を省くため。</p>



<p class="wp-block-paragraph">まだ自分でも分からないことを、とりあえず閉じておくため。</p>



<p class="wp-block-paragraph">そういう言葉が、どこかで紙になり、石になり、箱になって残る。</p>



<p class="wp-block-paragraph">私はときどき、白い箱を開ける。</p>



<p class="wp-block-paragraph">三つの石を見る。</p>



<p class="wp-block-paragraph">触らない日もある。</p>



<p class="wp-block-paragraph">一つずつ取り出す日もある。</p>



<p class="wp-block-paragraph">数える。</p>



<p class="wp-block-paragraph">一つ。</p>



<p class="wp-block-paragraph">二つ。</p>



<p class="wp-block-paragraph">三つ。</p>



<p class="wp-block-paragraph">箱の底には、石が擦れた黒い粉が少しついている。</p>



<p class="wp-block-paragraph">指で拭おうとして、やめる。</p>



<p class="wp-block-paragraph">石を戻す。</p>



<p class="wp-block-paragraph">蓋を閉じる。</p>



<p class="wp-block-paragraph">棚へ戻す。</p>



<p class="wp-block-paragraph">何も言わない。</p>



<p class="wp-block-paragraph">それだけなら、今のところ何も起こらない。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/todays-lie-complete/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3095</post-id>	</item>
		<item>
		<title>再接続中</title>
		<link>https://tranquilguides.com/reconnecting/</link>
					<comments>https://tranquilguides.com/reconnecting/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Sat, 10 Oct 2026 15:30:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[エッセイ]]></category>
		<category><![CDATA[制作]]></category>
		<category><![CDATA[接続]]></category>
		<category><![CDATA[時間]]></category>
		<category><![CDATA[記憶]]></category>
		<category><![CDATA[記録]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=3060</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Misty-City-Workspace-at-Dawn.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>一週間を整理するために設定した処理は、月曜日の九時一分、開始から0秒で止まった。画面に残った「再接続中」を見ながら、途中になっているものと、それぞれに異なる停止時間について考える。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/Misty-City-Workspace-at-Dawn.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">月曜日の九時一分、処理が始まった。</p>



<p class="wp-block-paragraph">0秒後に停止した。</p>



<p class="wp-block-paragraph">画面には「再接続中」と表示された。</p>



<p class="wp-block-paragraph">一週間に一度、進んだものと止まったものを整理するために設定していた処理だった。</p>



<p class="wp-block-paragraph">何ができたか。<br>何ができなかったか。<br>次に何を見るか。</p>



<p class="wp-block-paragraph">それだけを短く並べる。</p>



<p class="wp-block-paragraph">前日の夜には設定を終え、毎週同じ時刻に動くようになっていた。</p>



<p class="wp-block-paragraph">再接続中。</p>



<p class="wp-block-paragraph">しばらくしても、表示は変わらなかった。</p>



<p class="wp-block-paragraph">昨日までの一週間を整理するはずのものが、今日の一分目で止まっている。</p>



<p class="wp-block-paragraph">進んだものを確かめるための仕組みが、自分自身の停止だけを知らせていた。</p>



<p class="wp-block-paragraph">その画面を見ながら、途中になっているもののことを考えた。</p>



<p class="wp-block-paragraph">開いたままのファイル。<br>書きかけの文章。<br>途中で閉じたページ。<br>あとで触ろうと思って、名前だけ残したもの。<br>何度も優先順位の下へ移されたもの。</p>



<p class="wp-block-paragraph">どれも同じ「途中」ではない。</p>



<p class="wp-block-paragraph">昨日止まったものなら、開けばそのまま続けられることがある。</p>



<p class="wp-block-paragraph">少し時間が経ったものでは、どこまで進めていたのかを確かめるところから始まる。</p>



<p class="wp-block-paragraph">さらに時間が経つと、何をしようとしていたのかを思い出すところから始まる。</p>



<p class="wp-block-paragraph">画面を見れば戻れるものもある。</p>



<p class="wp-block-paragraph">どこから触ればいいのか分からなくなったものもある。</p>



<p class="wp-block-paragraph">存在していることだけを覚えているものもある。</p>



<p class="wp-block-paragraph">そこには、それぞれ違う停止時間がある。</p>



<p class="wp-block-paragraph">九時を過ぎても、再接続中。</p>



<p class="wp-block-paragraph">失敗したとも、終わったとも表示されない。</p>



<p class="wp-block-paragraph">ただ、まだ接続しようとしている。</p>



<p class="wp-block-paragraph">やめたわけではない。<br>進んでもいない。<br>次へ移ったわけでもない。</p>



<p class="wp-block-paragraph">何をしていたのかを思い出す。<br>残っているものを確かめる。<br>次にするはずだったことを探す。</p>



<p class="wp-block-paragraph">そのあいだにも、別のものが途中になる。</p>



<p class="wp-block-paragraph">一週間分の報告は届かなかった。</p>



<p class="wp-block-paragraph">代わりに、ひとつの状態だけが残っていた。</p>



<p class="wp-block-paragraph">9:01</p>



<p class="wp-block-paragraph">0s後に停止しました</p>



<p class="wp-block-paragraph">再接続中　/5</p>



<p class="wp-block-paragraph">Reconnecting&#8230; waiting for network<br>Reconnecting&#8230; waiting for network<br>Reconnecting&#8230; waiting for network<br>Reconnecting&#8230; waiting for network<br>Reconnecting&#8230; waiting for network</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/reconnecting/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3060</post-id>	</item>
		<item>
		<title>水を十センチ動かす</title>
		<link>https://tranquilguides.com/move-water-10cm/</link>
					<comments>https://tranquilguides.com/move-water-10cm/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Fri, 09 Oct 2026 15:16:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[エッセイ]]></category>
		<category><![CDATA[水]]></category>
		<category><![CDATA[空間]]></category>
		<category><![CDATA[身体]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=3055</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20261005_015941.png?fit=1024%2C576&ssl=1" class="webfeedsFeaturedVisual" /></p>一本の木が水の中に入ると、変わるのは木だけではない。距離、光、重なり、身体の動きまで含めて、見えている関係そのものが変わっていく。「海の中の森」から、物とそのあいだにある環境について考える。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20261005_015941.png?fit=1024%2C576&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">海の中では、目に見える距離と、身体が受け取る距離が一致しないことがある。</p>



<p class="wp-block-paragraph">光は水を通るあいだに変わり、遠くの輪郭は弱くなる。</p>



<p class="wp-block-paragraph">そこに木があっても、陸上と同じように木を見ることはできない。</p>



<p class="wp-block-paragraph">「海の中の森」という言葉について考えている。</p>



<p class="wp-block-paragraph">青い水の中に木々が立つ風景を想像することはできる。</p>



<p class="wp-block-paragraph">けれど、気になっているのは、その景色そのものではない。</p>



<p class="wp-block-paragraph">一本の木を海へ入れたとき、何が起きるのか。</p>



<p class="wp-block-paragraph">木の寸法は変わらない。</p>



<p class="wp-block-paragraph">変わるのは、その木へ至るまでの環境だ。</p>



<p class="wp-block-paragraph">空気ではなく、水がある。</p>



<p class="wp-block-paragraph">光は水を通り、身体は水を押し分けて進む。</p>



<p class="wp-block-paragraph">遠くなるほど輪郭は弱くなり、色の見え方も変わる。</p>



<p class="wp-block-paragraph">水の透明度が下がれば、そこに何かがあることは分かっても、それが何なのか判別しにくくなる。</p>



<p class="wp-block-paragraph">近づけば、すべて分かるわけでもない。</p>



<p class="wp-block-paragraph">枝が別の枝と重なる。身体の位置を変えると、それまで見えていたものが隠れ、別の形が現れる。</p>



<p class="wp-block-paragraph">木を見るつもりでも、水は視界から消えない。</p>



<p class="wp-block-paragraph">森も、木だけではできていない。</p>



<p class="wp-block-paragraph">同じ本数の木でも、等間隔に並んでいる場合と、密集している場合では、その中で身体ができることが違う。</p>



<p class="wp-block-paragraph">通れる幅があるか。<br>向こう側まで見通せるか。<br>枝がどの高さで重なるか。<br>光がどこまで届くか。</p>



<p class="wp-block-paragraph">一本一本の形だけでなく、それらの間隔や重なりによって、森の内部は変わる。</p>



<p class="wp-block-paragraph">調べていくと、「海の中の森」には、成立の仕方が異なる二つの森が実際にあることが分かった。</p>



<p class="wp-block-paragraph">海では、大型の海藻や海草が密集し、三次元的な環境を形成することがある。</p>



<p class="wp-block-paragraph">「海中林」と呼ばれるものだ。</p>



<p class="wp-block-paragraph">一方には、かつて陸上にあった森林が海面の変化などによって水没し、海底に残された「沈水林」や「海底林」がある。</p>



<p class="wp-block-paragraph">一方は、水の中で森のような構造がつくられる。</p>



<p class="wp-block-paragraph">もう一方では、森があった場所そのものが別の環境に包まれる。</p>



<p class="wp-block-paragraph">木を海へ運んだわけではない。</p>



<p class="wp-block-paragraph">同じ場所へ水が来る。</p>



<p class="wp-block-paragraph">物そのものが同じでも、周囲が変われば、身体との関係は同じではなくなる。</p>



<p class="wp-block-paragraph">海の中へ入った木は、同じ高さ、同じ太さであっても、陸上と同じ仕方では近づけない。</p>



<p class="wp-block-paragraph">歩く代わりに水の中を進む。</p>



<p class="wp-block-paragraph">進む速度も違う。</p>



<p class="wp-block-paragraph">呼吸の仕方も、視界も、手を伸ばしたときの身体の安定も違う。</p>



<p class="wp-block-paragraph">物ではなく、そこへ至るまでの環境を動かす。</p>



<p class="wp-block-paragraph">振り返ると、制作の中でも似たことを繰り返している。</p>



<p class="wp-block-paragraph">金属を切る。<br>木を組む。<br>光源を移す。<br>映像を数秒短くする。<br>文章の一行を移す。<br>Webページで、ある要素が現れる位置を変える。</p>



<p class="wp-block-paragraph">たとえば、物を十センチ動かす。</p>



<p class="wp-block-paragraph">それだけで別の物の背後に入り、一方向から見えなくなることがある。</p>



<p class="wp-block-paragraph">通路へ近づけば、その横を通る身体の向きが変わる。</p>



<p class="wp-block-paragraph">光源との角度がずれれば、影も伸びたり縮んだりする。</p>



<p class="wp-block-paragraph">文章の一行を前へ移せば、前後を読む順序が変わる。</p>



<p class="wp-block-paragraph">Webでは、同じ画像でも最初の画面にあるのか、スクロールした先にあるのかで出会い方が違う。</p>



<p class="wp-block-paragraph">映像では、数秒を残すか切るかで、次の像へ移る前に見られるものが違う。</p>



<p class="wp-block-paragraph">素材や媒体が違っても、動かしているのは物だけではない。</p>



<p class="wp-block-paragraph">その周囲にある距離、順序、時間、光、身体の位置まで一緒に動く。</p>



<p class="wp-block-paragraph">「海の中の森」は、何かの象徴というより、そうしたことを考えるための場所に近いのかもしれない。</p>



<p class="wp-block-paragraph">水が入る。</p>



<p class="wp-block-paragraph">見えていたものが見えにくくなる。</p>



<p class="wp-block-paragraph">けれど、単純に情報が減るわけではない。</p>



<p class="wp-block-paragraph">水の透明度が現れる。<br>光の方向が現れる。<br>物同士の重なりが強くなる。<br>身体をどちらへ動かしたかが、次に見えるものを決める。</p>



<p class="wp-block-paragraph">何かが見えにくくなったことで、それまで気にしていなかったものが前へ出てくる。</p>



<p class="wp-block-paragraph">だから、海そのものを再現したいわけではない。</p>



<p class="wp-block-paragraph">森そのものを再現したいわけでもない。</p>



<p class="wp-block-paragraph">青い光を置けば海になるわけではないし、木を何本か並べれば森になるわけでもない。</p>



<p class="wp-block-paragraph">知りたいのは、それらが「海」や「森」として経験される手前で、何が起きているのかということだ。</p>



<p class="wp-block-paragraph">どれほど物が密集すれば、奥まで一度に見通せなくなるのか。</p>



<p class="wp-block-paragraph">何が重なれば、その向こうにある形を確定できなくなるのか。</p>



<p class="wp-block-paragraph">身体の位置が変わると、何が消え、何が現れるのか。</p>



<p class="wp-block-paragraph">「見えない」にも違いがある。</p>



<p class="wp-block-paragraph">暗くて見えない。<br>遠くて見えない。<br>重なって見えない。<br>濁って見えない。<br>角度によって見えない。<br>まだそこまで移動していないから見えない。</p>



<p class="wp-block-paragraph">理由が違えば、そのあとに身体がすることも違う。</p>



<p class="wp-block-paragraph">近づく。<br>横へずれる。<br>回り込む。<br>角度を変える。</p>



<p class="wp-block-paragraph">それでも分からないことはある。</p>



<p class="wp-block-paragraph">一本の木が見える。</p>



<p class="wp-block-paragraph">その背後に、別の形がある。</p>



<p class="wp-block-paragraph">位置を変えると、二つだと思っていたものが三つになる。</p>



<p class="wp-block-paragraph">さらに進めば、最初に見えていた一本が別のものに隠れる。</p>



<p class="wp-block-paragraph">場所についての理解は、どこか一か所で完成するのではなく、身体の位置が変わるたびに組み替えられていく。</p>



<p class="wp-block-paragraph">海の中なら、そこへ水の状態も加わる。</p>



<p class="wp-block-paragraph">同じ場所に同じ物があっても、光や透明度が違えば、確認できる範囲も違う。</p>



<p class="wp-block-paragraph">対象だけを見ることはできない。</p>



<p class="wp-block-paragraph">対象までのあいだも、一緒に見ることになる。</p>



<p class="wp-block-paragraph">「海の中の森」という言葉に残したいのは、その構造なのだと思う。</p>



<p class="wp-block-paragraph">木だけを切り出さない。</p>



<p class="wp-block-paragraph">水だけも切り出さない。</p>



<p class="wp-block-paragraph">物があり、そのあいだを水が満たし、そこへ身体が入る。</p>



<p class="wp-block-paragraph">位置がずれる。<br>光が変わる。<br>重なりが変わる。<br>見える範囲が変わる。</p>



<p class="wp-block-paragraph">それまで持っていた場所の理解も、そこで組み直される。</p>



<p class="wp-block-paragraph">一本の木の向こうに何があるのか。</p>



<p class="wp-block-paragraph">それを最初からすべて見せない。</p>



<p class="wp-block-paragraph">ただ隠すのではなく、身体が動いたとき、それまで見えていた関係そのものが別の形になる余地を残す。</p>



<p class="wp-block-paragraph">一本の木の向こうが見えなくなるところから、まだ考えている。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/move-water-10cm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3055</post-id>	</item>
		<item>
		<title>月に線を引く</title>
		<link>https://tranquilguides.com/moon-line/</link>
					<comments>https://tranquilguides.com/moon-line/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Thu, 08 Oct 2026 15:02:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[エッセイ]]></category>
		<category><![CDATA[境界]]></category>
		<category><![CDATA[月]]></category>
		<category><![CDATA[言葉]]></category>
		<category><![CDATA[認知]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=3046</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20261004_035242.png?fit=1024%2C576&ssl=1" class="webfeedsFeaturedVisual" /></p>満月と、ほぼ満月。その違いはあるのに、私には見分けられない。連続して変化する月と、人がそこに置く境界について考える。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20261004_035242.png?fit=1024%2C576&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">ふと、夜空を見上げる。</p>



<h2 class="wp-block-heading">満月。</h2>



<p class="wp-block-paragraph">まんげつ？</p>



<p class="wp-block-paragraph">まだ満月ではない？</p>



<p class="wp-block-paragraph">でも、見た目は満月に見える。</p>



<p class="wp-block-paragraph">満月には、満月になる瞬間があるらしい。</p>



<p class="wp-block-paragraph">その瞬間より前なら、どれだけ丸く見えても、まだ満月ではない。</p>



<p class="wp-block-paragraph">では、99.9%なら「ほぼ満月」と言えるのか？</p>



<p class="wp-block-paragraph">たぶんそう。</p>



<p class="wp-block-paragraph">でも、98%は？　95%は？</p>



<p class="wp-block-paragraph">どこから「ほぼ」になるのだろう。</p>



<p class="wp-block-paragraph">そもそも、私は今日の月が何%なのか、見ても分からない。</p>



<p class="wp-block-paragraph">丸い。</p>



<p class="wp-block-paragraph">少し欠けてる？</p>



<p class="wp-block-paragraph">そのくらいしか分からない。</p>



<p class="wp-block-paragraph">満月。</p>



<p class="wp-block-paragraph">こちらには名前がある。</p>



<p class="wp-block-paragraph">ほぼ満月。</p>



<p class="wp-block-paragraph">こちらは、満月そのものの名前ではなく、満月との距離を表している。</p>



<p class="wp-block-paragraph">満月に近い。<br>でも、満月ではない。</p>



<p class="wp-block-paragraph">「ほぼ完成」<br>「ほぼ同じ」<br>「ほぼ食べ終えた」<br>「ほぼ終わった」</p>



<p class="wp-block-paragraph">どれも、そうだと言ってもよさそうなくらい近い。</p>



<p class="wp-block-paragraph">でも、そうだとは言い切れない。</p>



<h3 class="wp-block-heading">「ほぼ」は、曖昧だ。</h3>



<p class="wp-block-paragraph">いや。</p>



<p class="wp-block-paragraph">むしろ逆かもしれない。</p>



<p class="wp-block-paragraph">「ほぼ満月」と言うためには、どこかに「満月」が存在していなければならない。</p>



<p class="wp-block-paragraph">基準がある。</p>



<p class="wp-block-paragraph">そこに近い。<br>でも、届いてはいない。</p>



<p class="wp-block-paragraph">そう考えると、「ほぼ」は境界をぼかす言葉ではなく、境界の存在を意識させる言葉でもある。</p>



<p class="wp-block-paragraph">では、曖昧なのは何だろう。</p>



<p class="wp-block-paragraph">月か。<br>言葉か。<br>私の見方か。<br>境界そのものか。</p>



<p class="wp-block-paragraph">月はずっと連続して変化している。</p>



<p class="wp-block-paragraph">ある瞬間に突然、「<strong>満月</strong>」になるようには見えない。</p>



<p class="wp-block-paragraph">少しずつ満ちて、少しずつ欠けていく。</p>



<p class="wp-block-paragraph">変化は連続している。</p>



<p class="wp-block-paragraph">でも、言葉にすると、</p>



<p class="wp-block-paragraph">満月。<br>満月ではない。</p>



<p class="wp-block-paragraph">と分かれる。</p>



<p class="wp-block-paragraph">では、その境界は人間が勝手に作ったものなのか。</p>



<p class="wp-block-paragraph">「満月」という名前も、どこをそう呼ぶかという決め方も、人間がつくったものではある。</p>



<p class="wp-block-paragraph">でも、月そのものは、名前とは関係なく変化し続けている。</p>



<p class="wp-block-paragraph">その連続した変化の中に、私たちは一点を置いて、</p>



<p class="wp-block-paragraph">「<strong>満月</strong>」</p>



<p class="wp-block-paragraph">と呼んでいる。</p>



<p class="wp-block-paragraph">そして、その前後にある月を、</p>



<p class="wp-block-paragraph">まだ満月ではない。<br>もう満月ではない。</p>



<p class="wp-block-paragraph">と分けている。</p>



<p class="wp-block-paragraph">ただ、私にはその境界が見えない。</p>



<p class="wp-block-paragraph">満月になる一分前と、<br>満月になった一分後を並べても、<br>たぶん私は区別できない。</p>



<p class="wp-block-paragraph">境界はある。</p>



<p class="wp-block-paragraph">でも、見分けられない。</p>



<p class="wp-block-paragraph">そう考えると、「曖昧」という状態さえ怪しくなる。</p>



<p class="wp-block-paragraph">対象が曖昧なのか。</p>



<p class="wp-block-paragraph">境界が曖昧なのか。</p>



<p class="wp-block-paragraph">それとも、境界は明確なのに、人の知覚がそこまで細かくないだけなのか。</p>



<p class="wp-block-paragraph">満月。<br>ほぼ満月。</p>



<p class="wp-block-paragraph">同じように見える。</p>



<p class="wp-block-paragraph">でも、同じではない。</p>



<p class="wp-block-paragraph">違いはある。</p>



<p class="wp-block-paragraph">その違いを、私は認識することができない。</p>



<p class="wp-block-paragraph">今のところ、「ほぼ満月」について考えていて一番気になるのは、曖昧さそのものではない。</p>



<p class="wp-block-paragraph"><strong>明確な境界が存在していても、私たちはそれを知覚できるとは限らない。</strong></p>



<p class="wp-block-paragraph">そして、その見えない境界の近くに、「ほぼ」という言葉を置いている。</p>



<p class="wp-block-paragraph">今のところ、私はそう考えることにした。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/moon-line/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3046</post-id>	</item>
		<item>
		<title>六畳、五十七デシベル</title>
		<link>https://tranquilguides.com/6-tatami-57db/</link>
					<comments>https://tranquilguides.com/6-tatami-57db/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 15:32:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[ディストピア]]></category>
		<category><![CDATA[中編]]></category>
		<category><![CDATA[声]]></category>
		<category><![CDATA[小説]]></category>
		<category><![CDATA[社会規範]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=2884</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/09/IMG_20260918_103909.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>この街では、声の大きさで家賃が決まる。一デシベルにつき、月千円。声を小さくするほど暮らしは安くなり、話さなくても生活できる街で、私は少しずつ自分の声を使わなくなっていった。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/09/IMG_20260918_103909.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">「こんにちは」</p>



<p class="wp-block-paragraph">五十二。</p>



<p class="wp-block-paragraph">画面の数字が止まる。</p>



<p class="wp-block-paragraph">その下に、五万二千円と表示された。</p>



<p class="wp-block-paragraph">この街では、声の大きさで家賃が決まる。</p>



<p class="wp-block-paragraph">一デシベルにつき、月千円。</p>



<p class="wp-block-paragraph">私はその日、自分の声に初めて値段がつくところを見た。</p>



<p class="wp-block-paragraph">不動産会社の奥に、小さな防音室があった。</p>



<p class="wp-block-paragraph">机と椅子とマイク。</p>



<p class="wp-block-paragraph">壁には測定用の画面。</p>



<p class="wp-block-paragraph">床には、椅子の位置を示す白いテープが貼られている。</p>



<p class="wp-block-paragraph">担当者は扉の外から、</p>



<p class="wp-block-paragraph">「普段の声でお願いします」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">画面に文章が出た。</p>



<p class="wp-block-paragraph">こんにちは。</p>



<p class="wp-block-paragraph">今日はいい天気ですね。</p>



<p class="wp-block-paragraph">よろしくお願いします。</p>



<p class="wp-block-paragraph">三回読む。</p>



<p class="wp-block-paragraph">五十五。</p>



<p class="wp-block-paragraph">五十一。</p>



<p class="wp-block-paragraph">五十。</p>



<p class="wp-block-paragraph">平均五十二デシベル。</p>



<p class="wp-block-paragraph">基準家賃、五万二千円。</p>



<p class="wp-block-paragraph">「平均くらいですね」</p>



<p class="wp-block-paragraph">担当者が言った。</p>



<p class="wp-block-paragraph">「平均って、どのくらいなんですか」</p>



<p class="wp-block-paragraph">「五十前後です」</p>



<p class="wp-block-paragraph">「じゃあ普通ですね」</p>



<p class="wp-block-paragraph">「そうですね」</p>



<p class="wp-block-paragraph">普通。</p>



<p class="wp-block-paragraph">その言葉に少し安心した。</p>



<p class="wp-block-paragraph">部屋は駅から十分ほど。</p>



<p class="wp-block-paragraph">六階。</p>



<p class="wp-block-paragraph">六畳と小さな台所。</p>



<p class="wp-block-paragraph">窓からは隣のマンションと、その向こうに線路が少し見える。</p>



<p class="wp-block-paragraph">物件検索サイトには、駅からの距離や築年数と並んで「基準声量」という項目があった。</p>



<p class="wp-block-paragraph">四十デシベル以下。</p>



<p class="wp-block-paragraph">五十前後。</p>



<p class="wp-block-paragraph">六十五以上。</p>



<p class="wp-block-paragraph">二階以上。</p>



<p class="wp-block-paragraph">バス・トイレ別。</p>



<p class="wp-block-paragraph">声量五十五デシベル以下。</p>



<p class="wp-block-paragraph">そういう条件で部屋を探す人もいた。</p>



<p class="wp-block-paragraph">引っ越してきたばかりの頃、私はこの制度を変わっていると思っていた。</p>



<p class="wp-block-paragraph">でも、不動産屋は、</p>



<p class="wp-block-paragraph">「駅に近いので少し高めです」</p>



<p class="wp-block-paragraph">と言うのと同じ調子で、</p>



<p class="wp-block-paragraph">「声量が高いと少し上がります」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">説明する必要があることと、ないことの境目が、私とは少し違うだけだった。</p>



<p class="wp-block-paragraph">壁は思っていたほど厚くなかった。</p>



<p class="wp-block-paragraph">声で家賃が決まる街なのだから、建物全体が防音仕様なのかと思っていた。</p>



<p class="wp-block-paragraph">反対側の部屋から水を流す音は聞こえる。</p>



<p class="wp-block-paragraph">椅子を引く音も。</p>



<p class="wp-block-paragraph">上の階を歩く音もする。</p>



<p class="wp-block-paragraph">ただ、人の話し声はほとんど聞こえなかった。</p>



<p class="wp-block-paragraph">隣には女性が住んでいた。</p>



<p class="wp-block-paragraph">年齢はよく分からなかった。</p>



<p class="wp-block-paragraph">私より少し上にも見えたし、同じくらいにも見えた。</p>



<p class="wp-block-paragraph">朝、何度かエレベーターで一緒になった。</p>



<p class="wp-block-paragraph">彼女は乗るとき、いつも軽く頭を下げた。</p>



<p class="wp-block-paragraph">何度目かに、口元が動いているのに気づいた。</p>



<p class="wp-block-paragraph">「おはようございます」</p>



<p class="wp-block-paragraph">と言っていた。</p>



<p class="wp-block-paragraph">声はほとんど聞こえなかった。</p>



<p class="wp-block-paragraph">私は、</p>



<p class="wp-block-paragraph">「おはようございます」</p>



<p class="wp-block-paragraph">と返した。</p>



<p class="wp-block-paragraph">彼女は少し驚いて、それから笑った。</p>



<p class="wp-block-paragraph">笑い声は聞こえなかった。</p>



<p class="wp-block-paragraph">しばらくして、彼女の基準声量が三十八デシベルだと知った。</p>



<p class="wp-block-paragraph">本人からではない。</p>



<p class="wp-block-paragraph">郵便受けの前で、管理人が何かの確認をしているときに数字が聞こえた。</p>



<p class="wp-block-paragraph">三十八。</p>



<p class="wp-block-paragraph">三万八千円。</p>



<p class="wp-block-paragraph">部屋へ戻ってから、スマートフォンに音量測定アプリを入れた。</p>



<p class="wp-block-paragraph">「こんにちは」</p>



<p class="wp-block-paragraph">四十八。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">四十五。</p>



<p class="wp-block-paragraph">さらに小さく。</p>



<p class="wp-block-paragraph">四十一。</p>



<p class="wp-block-paragraph">三十八にしようとすると、自分の耳にもほとんど届かなくなった。</p>



<p class="wp-block-paragraph">駅前には、声を小さくする教室があった。</p>



<p class="wp-block-paragraph">窓に、</p>



<p class="wp-block-paragraph"><strong>三か月で平均5dB減</strong></p>



<p class="wp-block-paragraph">と貼られている。</p>



<p class="wp-block-paragraph">その下に、</p>



<p class="wp-block-paragraph"><strong>年間60,000円の住居費削減も</strong></p>



<p class="wp-block-paragraph">と小さく書かれていた。</p>



<p class="wp-block-paragraph">呼吸法。</p>



<p class="wp-block-paragraph">喉の使い方。</p>



<p class="wp-block-paragraph">口の開き方。</p>



<p class="wp-block-paragraph">遠くから人を呼ばない練習。</p>



<p class="wp-block-paragraph">怒っているときにも声量を上げない方法。</p>



<p class="wp-block-paragraph">笑い声を抑える練習。</p>



<p class="wp-block-paragraph">受講料は月八千円。</p>



<p class="wp-block-paragraph">四デシベル下がれば、二か月で元が取れる。</p>



<p class="wp-block-paragraph">私は通わなかった。</p>



<p class="wp-block-paragraph">五万二千円なら払えたし、家賃のために話し方まで変えたいとは思わなかった。</p>



<p class="wp-block-paragraph">最初の一年は、特に何もなかった。</p>



<p class="wp-block-paragraph">仕事へ行く。</p>



<p class="wp-block-paragraph">帰る。</p>



<p class="wp-block-paragraph">食べる。</p>



<p class="wp-block-paragraph">眠る。</p>



<p class="wp-block-paragraph">休日に買い物へ行く。</p>



<p class="wp-block-paragraph">街は少し静かだった。</p>



<p class="wp-block-paragraph">電車では話している人が少ない。</p>



<p class="wp-block-paragraph">飲食店でも、隣の席の会話は聞こえにくい。</p>



<p class="wp-block-paragraph">公園で子どもが遊んでいても、声が遠くまで飛んでこない。</p>



<p class="wp-block-paragraph">そういう土地柄なのだと思っていた。</p>



<p class="wp-block-paragraph">二年目の更新で、もう一度防音室へ入った。</p>



<p class="wp-block-paragraph">同じ椅子。</p>



<p class="wp-block-paragraph">同じマイク。</p>



<p class="wp-block-paragraph">同じ文章。</p>



<p class="wp-block-paragraph">こんにちは。</p>



<p class="wp-block-paragraph">今日はいい天気ですね。</p>



<p class="wp-block-paragraph">よろしくお願いします。</p>



<p class="wp-block-paragraph">五十。</p>



<p class="wp-block-paragraph">四十八。</p>



<p class="wp-block-paragraph">四十九。</p>



<p class="wp-block-paragraph">平均四十九デシベル。</p>



<p class="wp-block-paragraph">「下がりましたね」</p>



<p class="wp-block-paragraph">担当者が言った。</p>



<p class="wp-block-paragraph">「何もしてないです」</p>



<p class="wp-block-paragraph">「そういう方もいます」</p>



<p class="wp-block-paragraph">家賃は四万九千円。</p>



<p class="wp-block-paragraph">三千円安くなった。</p>



<p class="wp-block-paragraph">考えてみれば、その一年で仕事が変わっていた。</p>



<p class="wp-block-paragraph">以前は隣の席に人がいて、分からないことがあれば声をかけていた。</p>



<p class="wp-block-paragraph">今は一日中画面を見る時間が長い。</p>



<p class="wp-block-paragraph">昼食も一人で食べることが多い。</p>



<p class="wp-block-paragraph">家に帰れば、当然、一人だった。</p>



<p class="wp-block-paragraph">一日の中で、自分の声を聞かない日もあった。</p>



<p class="wp-block-paragraph">三年目。</p>



<p class="wp-block-paragraph">四十六。</p>



<p class="wp-block-paragraph">四年目。</p>



<p class="wp-block-paragraph">四十二。</p>



<p class="wp-block-paragraph">家賃は毎年少しずつ下がった。</p>



<p class="wp-block-paragraph">給与はほとんど変わらなかったので、助かった。</p>



<p class="wp-block-paragraph">最初の年と比べれば、年間十万円以上違う。</p>



<p class="wp-block-paragraph">靴を買える。</p>



<p class="wp-block-paragraph">家電を替えられる。</p>



<p class="wp-block-paragraph">少し遠くへ行ける。</p>



<p class="wp-block-paragraph">何もしなくても、毎月少し残る。</p>



<p class="wp-block-paragraph">通帳を見ると、声が小さくなることを悪いとは思わなくなった。</p>



<p class="wp-block-paragraph">三年目の冬、昔からの友人と食事をした。</p>



<p class="wp-block-paragraph">駅前の居酒屋。</p>



<p class="wp-block-paragraph">店内には音楽が流れていた。</p>



<p class="wp-block-paragraph">私は料理を取りながら何か言った。</p>



<p class="wp-block-paragraph">友人が、</p>



<p class="wp-block-paragraph">「え？」</p>



<p class="wp-block-paragraph">と聞いた。</p>



<p class="wp-block-paragraph">もう一度言う。</p>



<p class="wp-block-paragraph">「何？」</p>



<p class="wp-block-paragraph">三度目に少し声を張った。</p>



<p class="wp-block-paragraph">「ああ」</p>



<p class="wp-block-paragraph">友人は笑った。</p>



<p class="wp-block-paragraph">「お前、声小さくなったな」</p>



<p class="wp-block-paragraph">私は、</p>



<p class="wp-block-paragraph">「そう？」</p>



<p class="wp-block-paragraph">と返した。</p>



<p class="wp-block-paragraph">「前はもっと普通だったよ」</p>



<p class="wp-block-paragraph">普通。</p>



<p class="wp-block-paragraph">その言葉で、最初の防音室を思い出した。</p>



<p class="wp-block-paragraph">五十二デシベル。</p>



<p class="wp-block-paragraph">平均くらい。</p>



<p class="wp-block-paragraph">普通。</p>



<p class="wp-block-paragraph">今は四十二だった。</p>



<p class="wp-block-paragraph">それから、聞き返されることが増えた。</p>



<p class="wp-block-paragraph">コンビニで、</p>



<p class="wp-block-paragraph">「袋お願いします」</p>



<p class="wp-block-paragraph">と言っても届かない。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">飲食店で、</p>



<p class="wp-block-paragraph">「すみません」</p>



<p class="wp-block-paragraph">と呼んでも振り返られない。</p>



<p class="wp-block-paragraph">二度目を言わず、店員が近くへ来るまで待つことが増えた。</p>



<p class="wp-block-paragraph">電話では、</p>



<p class="wp-block-paragraph">「もう少し大きな声でお願いします」</p>



<p class="wp-block-paragraph">と言われる。</p>



<p class="wp-block-paragraph">オンライン会議では、マイクの入力音量を上げた。</p>



<p class="wp-block-paragraph">自分の声を大きくするより、機械の方を大きくした。</p>



<p class="wp-block-paragraph">それでも、大きく困ることはなかった。</p>



<p class="wp-block-paragraph">街の方が、少しずつ声を使わなくても済む形になっていた。</p>



<p class="wp-block-paragraph">ある日、駅前の定食屋へ入った。</p>



<p class="wp-block-paragraph">以前は、</p>



<p class="wp-block-paragraph">「すみません」</p>



<p class="wp-block-paragraph">と店員を呼ぶ店だった。</p>



<p class="wp-block-paragraph">その日はテーブルに小さな画面が置かれていた。</p>



<p class="wp-block-paragraph">定食を選ぶ。</p>



<p class="wp-block-paragraph">ご飯の量を選ぶ。</p>



<p class="wp-block-paragraph">注文する。</p>



<p class="wp-block-paragraph">食べ終わる。</p>



<p class="wp-block-paragraph">伝票を持ってレジへ行く。</p>



<p class="wp-block-paragraph">店員はバーコードを読み取り、私は画面で支払方法を選んだ。</p>



<p class="wp-block-paragraph">最後まで、声を出さなかった。</p>



<p class="wp-block-paragraph">店を出るとき、店員が頭を下げた。</p>



<p class="wp-block-paragraph">私も頭を下げた。</p>



<p class="wp-block-paragraph">それで終わった。</p>



<p class="wp-block-paragraph">別の日、病院へ行った。</p>



<p class="wp-block-paragraph">受付番号はスマートフォンに届いた。</p>



<p class="wp-block-paragraph">名前は呼ばれなかった。</p>



<p class="wp-block-paragraph">診察室の前の画面に番号が表示される。</p>



<p class="wp-block-paragraph">症状も、いつからかも、どこが痛むかも、あらかじめ入力してある。</p>



<p class="wp-block-paragraph">医師と話した時間は短かった。</p>



<p class="wp-block-paragraph">帰りに薬局へ寄る。</p>



<p class="wp-block-paragraph">そこでも番号。</p>



<p class="wp-block-paragraph">必要なことだけ確認する。</p>



<p class="wp-block-paragraph">声を使わなくても、だいたいのことが済んだ。</p>



<p class="wp-block-paragraph">役所には、</p>



<p class="wp-block-paragraph"><strong>会話不要窓口</strong></p>



<p class="wp-block-paragraph">があった。</p>



<p class="wp-block-paragraph">必要書類を端末で選ぶ。</p>



<p class="wp-block-paragraph">本人確認。</p>



<p class="wp-block-paragraph">申請。</p>



<p class="wp-block-paragraph">受け取り。</p>



<p class="wp-block-paragraph">分からないときだけ職員を呼ぶ。</p>



<p class="wp-block-paragraph">列は長かった。</p>



<p class="wp-block-paragraph">全国的に同じような仕組みが増えていたのかもしれない。</p>



<p class="wp-block-paragraph">人手不足。</p>



<p class="wp-block-paragraph">効率化。</p>



<p class="wp-block-paragraph">感染症対策の名残。</p>



<p class="wp-block-paragraph">理由はいくらでもある。</p>



<p class="wp-block-paragraph">それでも、この街では広告の言葉が少し違った。</p>



<p class="wp-block-paragraph"><strong>話さなくても、もっと便利に。</strong></p>



<p class="wp-block-paragraph"><strong>声を使わない新しい受付。</strong></p>



<p class="wp-block-paragraph"><strong>静かな暮らしを支えます。</strong></p>



<p class="wp-block-paragraph">声を出さなくて済むことが、少しずつ良いことになっていた。</p>



<p class="wp-block-paragraph">駅前の教室は三店舗に増えていた。</p>



<p class="wp-block-paragraph">以前見た教室は広い場所へ移転していた。</p>



<p class="wp-block-paragraph">新しい広告には、</p>



<p class="wp-block-paragraph"><strong>家賃は固定費です。<br>声量は改善できます。</strong></p>



<p class="wp-block-paragraph">と書かれている。</p>



<p class="wp-block-paragraph">改善。</p>



<p class="wp-block-paragraph">その言葉が少し気になった。</p>



<p class="wp-block-paragraph">声が小さいことが良くて、大きいことが悪い。</p>



<p class="wp-block-paragraph">そういう制度ではないはずだった。</p>



<p class="wp-block-paragraph">ただ、小さい方が安い。</p>



<p class="wp-block-paragraph">安くなるものを、悪いとは言いにくい。</p>



<p class="wp-block-paragraph">会社の同僚が、その教室へ通い始めた。</p>



<p class="wp-block-paragraph">昼休み、スマートフォンの画面を見せてきた。</p>



<p class="wp-block-paragraph">「六デシベル下がった」</p>



<p class="wp-block-paragraph">「六千円？」</p>



<p class="wp-block-paragraph">「そう。月六千」</p>



<p class="wp-block-paragraph">うれしそうだった。</p>



<p class="wp-block-paragraph">講座は三か月で二万四千円。</p>



<p class="wp-block-paragraph">十分に元が取れる。</p>



<p class="wp-block-paragraph">画面には練習メニューが並んでいた。</p>



<p class="wp-block-paragraph">近距離発話。</p>



<p class="wp-block-paragraph">笑声調整。</p>



<p class="wp-block-paragraph">感情時声量維持。</p>



<p class="wp-block-paragraph">非発声コミュニケーション。</p>



<p class="wp-block-paragraph">「非発声って？」</p>



<p class="wp-block-paragraph">「指したり、画面見せたり」</p>



<p class="wp-block-paragraph">「話し方教室なのに」</p>



<p class="wp-block-paragraph">「まあ、そういう名前だから」</p>



<p class="wp-block-paragraph">彼は笑った。</p>



<p class="wp-block-paragraph">声は小さかった。</p>



<p class="wp-block-paragraph">教室では怒り方も教わるらしい。</p>



<p class="wp-block-paragraph">怒鳴らない。</p>



<p class="wp-block-paragraph">相手に近づく。</p>



<p class="wp-block-paragraph">短く話す。</p>



<p class="wp-block-paragraph">その場で言わず、あとから文章で送る。</p>



<p class="wp-block-paragraph">「その方が揉めないし」</p>



<p class="wp-block-paragraph">同僚は言った。</p>



<p class="wp-block-paragraph">確かにそうかもしれないと思った。</p>



<p class="wp-block-paragraph">市役所のWebサイトに、毎年の平均声量が載っていることを知ったのはその頃だった。</p>



<p class="wp-block-paragraph">生活音環境報告書。</p>



<p class="wp-block-paragraph">人口。</p>



<p class="wp-block-paragraph">世帯数。</p>



<p class="wp-block-paragraph">騒音苦情。</p>



<p class="wp-block-paragraph">交通量。</p>



<p class="wp-block-paragraph">その途中に、小さなグラフがある。</p>



<p class="wp-block-paragraph">十年前、五十四・二。</p>



<p class="wp-block-paragraph">九年前、五十三・七。</p>



<p class="wp-block-paragraph">八年前、五十二・九。</p>



<p class="wp-block-paragraph">前年、四十三・一。</p>



<p class="wp-block-paragraph">毎年、少しずつ下がっていた。</p>



<p class="wp-block-paragraph">同じページには、騒音苦情の減少や深夜の近隣トラブル件数が載っていた。</p>



<p class="wp-block-paragraph">市長のコメントには、</p>



<p class="wp-block-paragraph"><strong>静穏な生活環境の実現</strong></p>



<p class="wp-block-paragraph">とあった。</p>



<p class="wp-block-paragraph">制度が始まった理由を調べたこともある。</p>



<p class="wp-block-paragraph">昔、この街で人口が急に増えた。</p>



<p class="wp-block-paragraph">小さな集合住宅が大量に建った。</p>



<p class="wp-block-paragraph">壁が薄く、騒音問題が増えた。</p>



<p class="wp-block-paragraph">古い建物まで防音性能を上げるには費用がかかりすぎた。</p>



<p class="wp-block-paragraph">その代わり、一部の住宅で、静かに暮らす人の家賃を割り引く制度が始まった。</p>



<p class="wp-block-paragraph">自己申告。</p>



<p class="wp-block-paragraph">簡単な測定。</p>



<p class="wp-block-paragraph">共通基準。</p>



<p class="wp-block-paragraph">今の制度。</p>



<p class="wp-block-paragraph">そこまでは記録に残っていた。</p>



<p class="wp-block-paragraph">けれど、誰が一デシベル千円と決めたのかは分からなかった。</p>



<p class="wp-block-paragraph">なぜ今も続いているのかも書かれていなかった。</p>



<p class="wp-block-paragraph">始まった理由は残っているのに、続いている理由はどこにもなかった。</p>



<p class="wp-block-paragraph">五年目の春、一階に家族が引っ越してきた。</p>



<p class="wp-block-paragraph">夫婦と、小さな男の子。</p>



<p class="wp-block-paragraph">三歳か四歳くらいだった。</p>



<p class="wp-block-paragraph">最初の日、廊下を走りながら、</p>



<p class="wp-block-paragraph">「おかあさん」</p>



<p class="wp-block-paragraph">と呼んだ。</p>



<p class="wp-block-paragraph">声がよく響いた。</p>



<p class="wp-block-paragraph">私は玄関の中で、その声を聞いた。</p>



<p class="wp-block-paragraph">この建物で、子どもの大きな声を聞くのは珍しかった。</p>



<p class="wp-block-paragraph">数日後。</p>



<p class="wp-block-paragraph">母親が、</p>



<p class="wp-block-paragraph">「ここでは静かにね」</p>



<p class="wp-block-paragraph">と言っていた。</p>



<p class="wp-block-paragraph">集合住宅なら、どこでも言うような注意だった。</p>



<p class="wp-block-paragraph">そのあと子どもが聞いた。</p>



<p class="wp-block-paragraph">「大きい声だと高くなる？」</p>



<p class="wp-block-paragraph">母親は少し笑った。</p>



<p class="wp-block-paragraph">「そうだよ」</p>



<p class="wp-block-paragraph">「いくら？」</p>



<p class="wp-block-paragraph">「まだあなたの家賃じゃないから大丈夫」</p>



<p class="wp-block-paragraph">子どもも笑った。</p>



<p class="wp-block-paragraph">その笑い声は、最初の日より小さかった。</p>



<p class="wp-block-paragraph">学校では未成年の声を家賃に使わない。</p>



<p class="wp-block-paragraph">ただ、十八歳になると最初の測定がある。</p>



<p class="wp-block-paragraph">ある夜、テレビで高校生の特集を見た。</p>



<p class="wp-block-paragraph">卒業前の生活指導。</p>



<p class="wp-block-paragraph">防音室。</p>



<p class="wp-block-paragraph">生徒が、</p>



<p class="wp-block-paragraph">「よろしくお願いします」</p>



<p class="wp-block-paragraph">と読む。</p>



<p class="wp-block-paragraph">画面に四十一と出る。</p>



<p class="wp-block-paragraph">インタビューで、</p>



<p class="wp-block-paragraph">「四十以下にしたいです」</p>



<p class="wp-block-paragraph">と答える。</p>



<p class="wp-block-paragraph">「どうして？」</p>



<p class="wp-block-paragraph">「一人暮らししたいので」</p>



<p class="wp-block-paragraph">その答えに、誰も驚かなかった。</p>



<p class="wp-block-paragraph">私は、その頃から三十台を意識するようになっていた。</p>



<p class="wp-block-paragraph">四十二。</p>



<p class="wp-block-paragraph">あと三下がれば三万円台。</p>



<p class="wp-block-paragraph">三十九。</p>



<p class="wp-block-paragraph">三万円台。</p>



<p class="wp-block-paragraph">四万と三万では、数字の見え方が違う。</p>



<p class="wp-block-paragraph">教室には通わなかった。</p>



<p class="wp-block-paragraph">代わりに、少しだけ生活を変えた。</p>



<p class="wp-block-paragraph">人に近づいてから話す。</p>



<p class="wp-block-paragraph">離れた場所から呼ばない。</p>



<p class="wp-block-paragraph">店員を声で呼ばない。</p>



<p class="wp-block-paragraph">電話よりメッセージ。</p>



<p class="wp-block-paragraph">笑うとき口を閉じる。</p>



<p class="wp-block-paragraph">聞き返されたら、一度目より少しだけ大きくする。</p>



<p class="wp-block-paragraph">やっているつもりはなかった。</p>



<p class="wp-block-paragraph">でも、やっていたのだと思う。</p>



<p class="wp-block-paragraph">隣の女性とは、相変わらずエレベーターで会った。</p>



<p class="wp-block-paragraph">何年も隣にいるのに名前は知らない。</p>



<p class="wp-block-paragraph">何の仕事をしているのかも知らない。</p>



<p class="wp-block-paragraph">ただ、帰りは私より少し遅い。</p>



<p class="wp-block-paragraph">買い物袋から長ねぎが出ていることがある。</p>



<p class="wp-block-paragraph">冬は濃い色のコート。</p>



<p class="wp-block-paragraph">雨の日は長い傘。</p>



<p class="wp-block-paragraph">そのくらいだった。</p>



<p class="wp-block-paragraph">ある日、彼女の袋からみかんが一つ落ちた。</p>



<p class="wp-block-paragraph">床を転がった。</p>



<p class="wp-block-paragraph">私は拾って渡した。</p>



<p class="wp-block-paragraph">「ありがとうございます」</p>



<p class="wp-block-paragraph">「いえ」</p>



<p class="wp-block-paragraph">それだけだった。</p>



<p class="wp-block-paragraph">その夜、なぜか何度か思い出した。</p>



<p class="wp-block-paragraph">彼女の声を、たしかに聞いたからかもしれない。</p>



<p class="wp-block-paragraph">五年目の更新。</p>



<p class="wp-block-paragraph">三十九・二。</p>



<p class="wp-block-paragraph">「三万円台ですね」</p>



<p class="wp-block-paragraph">担当者が言った。</p>



<p class="wp-block-paragraph">私は少し笑った。</p>



<p class="wp-block-paragraph">家賃、三万九千円。</p>



<p class="wp-block-paragraph">最初より一万三千円安い。</p>



<p class="wp-block-paragraph">年間十五万六千円。</p>



<p class="wp-block-paragraph">その夜、昔の友人とオンラインで話した。</p>



<p class="wp-block-paragraph">途中で、</p>



<p class="wp-block-paragraph">「マイク壊れてる？」</p>



<p class="wp-block-paragraph">と言われた。</p>



<p class="wp-block-paragraph">「壊れてない」</p>



<p class="wp-block-paragraph">「めっちゃ小さい」</p>



<p class="wp-block-paragraph">設定を開く。</p>



<p class="wp-block-paragraph">入力音量を上げる。</p>



<p class="wp-block-paragraph">「これで？」</p>



<p class="wp-block-paragraph">「ああ、聞こえる」</p>



<p class="wp-block-paragraph">友人は少し黙った。</p>



<p class="wp-block-paragraph">「そっちの街って、みんなそうなるの？」</p>



<p class="wp-block-paragraph">「何が」</p>



<p class="wp-block-paragraph">「声」</p>



<p class="wp-block-paragraph">「分からない」</p>



<p class="wp-block-paragraph">「前はそんな話し方じゃなかった」</p>



<p class="wp-block-paragraph">「前っていつ」</p>



<p class="wp-block-paragraph">「大学くらい」</p>



<p class="wp-block-paragraph">ずいぶん前だった。</p>



<p class="wp-block-paragraph">「歳じゃない」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">友人は笑った。</p>



<p class="wp-block-paragraph">「歳でそんな小さくなるかよ」</p>



<p class="wp-block-paragraph">私も笑った。</p>



<p class="wp-block-paragraph">ヘッドホンの中では、自分の笑い声がよく聞こえた。</p>



<p class="wp-block-paragraph">六年目。</p>



<p class="wp-block-paragraph">三十四デシベル。</p>



<p class="wp-block-paragraph">担当者は画面を見て、</p>



<p class="wp-block-paragraph">「かなり下がりましたね」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">三万四千円。</p>



<p class="wp-block-paragraph">最初より一万八千円安い。</p>



<p class="wp-block-paragraph">帰りのエレベーターで、隣の女性と一緒になった。</p>



<p class="wp-block-paragraph">六階のボタンは押されている。</p>



<p class="wp-block-paragraph">二階。</p>



<p class="wp-block-paragraph">三階。</p>



<p class="wp-block-paragraph">私は何となく、今日のことを言いたくなった。</p>



<p class="wp-block-paragraph">「家賃、安くなりました」</p>



<p class="wp-block-paragraph">彼女がこちらを見た。</p>



<p class="wp-block-paragraph">首を少し傾げる。</p>



<p class="wp-block-paragraph">聞こえなかった。</p>



<p class="wp-block-paragraph">もう一度言えばいい。</p>



<p class="wp-block-paragraph">少し大きくすれば届く。</p>



<p class="wp-block-paragraph">その程度のことだった。</p>



<p class="wp-block-paragraph">一度くらい大きな声を出しても、来年の測定値は変わらない。</p>



<p class="wp-block-paragraph">測定は一年後。</p>



<p class="wp-block-paragraph">三回平均。</p>



<p class="wp-block-paragraph">日常の声を記録されるわけでもない。</p>



<p class="wp-block-paragraph">分かっていた。</p>



<p class="wp-block-paragraph">それでも、言い直さなかった。</p>



<p class="wp-block-paragraph">大きな声を出す理由が見つからなかった。</p>



<p class="wp-block-paragraph">「なんでもないです」</p>



<p class="wp-block-paragraph">と笑った。</p>



<p class="wp-block-paragraph">彼女も笑った。</p>



<p class="wp-block-paragraph">六階に着いた。</p>



<p class="wp-block-paragraph">それで終わった。</p>



<p class="wp-block-paragraph">部屋へ戻る。</p>



<p class="wp-block-paragraph">家賃は安くなった。</p>



<p class="wp-block-paragraph">なのに、その数字より、言い直さなかったことの方が残った。</p>



<p class="wp-block-paragraph">その後も、声を使わなくて済む場所は増えた。</p>



<p class="wp-block-paragraph">美容室の予約画面に、</p>



<p class="wp-block-paragraph">会話あり。</p>



<p class="wp-block-paragraph">必要最低限。</p>



<p class="wp-block-paragraph">会話なし。</p>



<p class="wp-block-paragraph">という項目ができた。</p>



<p class="wp-block-paragraph">私は一度、「会話なし」を選んだ。</p>



<p class="wp-block-paragraph">椅子に座る。</p>



<p class="wp-block-paragraph">美容師が鏡越しに確認する。</p>



<p class="wp-block-paragraph">私はスマートフォンに保存した画像を見せる。</p>



<p class="wp-block-paragraph">長さ。</p>



<p class="wp-block-paragraph">前髪。</p>



<p class="wp-block-paragraph">耳まわり。</p>



<p class="wp-block-paragraph">全部、画面で伝わると思った。</p>



<p class="wp-block-paragraph">途中で、少しだけ違うと感じた。</p>



<p class="wp-block-paragraph">もう少し短く。</p>



<p class="wp-block-paragraph">本当はそう言いたかった。</p>



<p class="wp-block-paragraph">でも、会話なしを自分で選んでいた。</p>



<p class="wp-block-paragraph">私はそのまま何も言わなかった。</p>



<p class="wp-block-paragraph">店を出てから、ガラスに映った髪を見た。</p>



<p class="wp-block-paragraph">悪くはなかった。</p>



<p class="wp-block-paragraph">だから余計に、言わなかったことだけが残った。</p>



<p class="wp-block-paragraph">不便がなくなると、声を使わない理由もなくなると思っていた。</p>



<p class="wp-block-paragraph">逆だった。</p>



<p class="wp-block-paragraph">不便がなくなるほど、声を使う理由が減った。</p>



<p class="wp-block-paragraph">ある夏の夜、一階の男の子が中庭で遊んでいた。</p>



<p class="wp-block-paragraph">もう六歳くらいになっていた。</p>



<p class="wp-block-paragraph">母親と小さなボールを投げ合っている。</p>



<p class="wp-block-paragraph">ボールが植え込みへ転がった。</p>



<p class="wp-block-paragraph">男の子が追いかける。</p>



<p class="wp-block-paragraph">植え込みの向こうには駐車場。</p>



<p class="wp-block-paragraph">車がゆっくりバックしていた。</p>



<p class="wp-block-paragraph">母親が何か言った。</p>



<p class="wp-block-paragraph">男の子は止まらない。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">聞こえていない。</p>



<p class="wp-block-paragraph">三度目に、母親が叫んだ。</p>



<p class="wp-block-paragraph">「危ない！」</p>



<p class="wp-block-paragraph">男の子が止まった。</p>



<p class="wp-block-paragraph">車も止まった。</p>



<p class="wp-block-paragraph">何も起きなかった。</p>



<p class="wp-block-paragraph">私は六階の廊下から見ていた。</p>



<p class="wp-block-paragraph">その声量なら、次の更新で家賃が上がるのだろうか。</p>



<p class="wp-block-paragraph">一瞬そう考えた。</p>



<p class="wp-block-paragraph">すぐに嫌なことを考えたと思った。</p>



<p class="wp-block-paragraph">声は、ああいうときのためにあるのかもしれない。</p>



<p class="wp-block-paragraph">翌日には忘れた。</p>



<p class="wp-block-paragraph">七年目の測定が近づいた頃、会社で小さな会議があった。</p>



<p class="wp-block-paragraph">四人。</p>



<p class="wp-block-paragraph">私は説明を頼まれた。</p>



<p class="wp-block-paragraph">数分話したところで、上司が、</p>



<p class="wp-block-paragraph">「ちょっと聞こえにくい」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">声を上げる。</p>



<p class="wp-block-paragraph">少しするとまた下がる。</p>



<p class="wp-block-paragraph">「もう少しお願いします」</p>



<p class="wp-block-paragraph">また上げる。</p>



<p class="wp-block-paragraph">声を出すことに力が必要だった。</p>



<p class="wp-block-paragraph">喉ではなく、気持ちの方に。</p>



<p class="wp-block-paragraph">ここまで出していい。</p>



<p class="wp-block-paragraph">ここにいる人へ届いていい。</p>



<p class="wp-block-paragraph">そう許可しないと、大きくならなかった。</p>



<p class="wp-block-paragraph">その夜、自宅で声を測った。</p>



<p class="wp-block-paragraph">「こんにちは」</p>



<p class="wp-block-paragraph">三十三。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">三十二。</p>



<p class="wp-block-paragraph">息を吸う。</p>



<p class="wp-block-paragraph">「こんにちは」</p>



<p class="wp-block-paragraph">五十一。</p>



<p class="wp-block-paragraph">出そうと思えば出た。</p>



<p class="wp-block-paragraph">少し安心した。</p>



<p class="wp-block-paragraph">画面に、</p>



<p class="wp-block-paragraph">51.4 dB</p>



<p class="wp-block-paragraph">と出ている。</p>



<p class="wp-block-paragraph">私は履歴を消した。</p>



<p class="wp-block-paragraph">翌週、防音室。</p>



<p class="wp-block-paragraph">こんにちは。</p>



<p class="wp-block-paragraph">今日はいい天気ですね。</p>



<p class="wp-block-paragraph">よろしくお願いします。</p>



<p class="wp-block-paragraph">三十三。</p>



<p class="wp-block-paragraph">三十五。</p>



<p class="wp-block-paragraph">三十四。</p>



<p class="wp-block-paragraph">平均三十四。</p>



<p class="wp-block-paragraph">前年とほぼ同じ。</p>



<p class="wp-block-paragraph">家賃も変わらなかった。</p>



<p class="wp-block-paragraph">少し安心した。</p>



<p class="wp-block-paragraph">少し残念だった。</p>



<p class="wp-block-paragraph">どちらなのか、自分でも分からなかった。</p>



<p class="wp-block-paragraph">街では、低声量者向けの新築マンションが増えていた。</p>



<p class="wp-block-paragraph"><strong>静かな方ほど、お得。</strong></p>



<p class="wp-block-paragraph">顔認証。</p>



<p class="wp-block-paragraph">宅配ボックス。</p>



<p class="wp-block-paragraph">無人管理。</p>



<p class="wp-block-paragraph">チャットサポート。</p>



<p class="wp-block-paragraph">オンライン理事会。</p>



<p class="wp-block-paragraph">住人同士が話さなくても、建物は運営できる。</p>



<p class="wp-block-paragraph">人気があるらしかった。</p>



<p class="wp-block-paragraph">私は引っ越さなかった。</p>



<p class="wp-block-paragraph">今の部屋に慣れていた。</p>



<p class="wp-block-paragraph">ある日、郵便受けの前で隣の女性が鍵を落とした。</p>



<p class="wp-block-paragraph">金属の音。</p>



<p class="wp-block-paragraph">私が拾う。</p>



<p class="wp-block-paragraph">「ありがとうございます」</p>



<p class="wp-block-paragraph">「どういたしまして」</p>



<p class="wp-block-paragraph">その日は、二人とも聞き返さなかった。</p>



<p class="wp-block-paragraph">近かったからだ。</p>



<p class="wp-block-paragraph">声が小さくても、距離が短ければ届く。</p>



<p class="wp-block-paragraph">そのことを、そこで初めて意識した。</p>



<p class="wp-block-paragraph">この街では、人は声を小さくした。</p>



<p class="wp-block-paragraph">その代わりに、近づけばよかった。</p>



<p class="wp-block-paragraph">けれど、実際には、人同士の距離まで短くなったわけではなかった。</p>



<p class="wp-block-paragraph">離れた人にはメッセージを送る。</p>



<p class="wp-block-paragraph">店員は画面で呼ぶ。</p>



<p class="wp-block-paragraph">窓口は機械になる。</p>



<p class="wp-block-paragraph">隣人とは話さない。</p>



<p class="wp-block-paragraph">声を小さくするために近づくのではなく、</p>



<p class="wp-block-paragraph">声を出さなくて済むように、関係の方を置き換えていた。</p>



<p class="wp-block-paragraph">それに気づいたのは、もっとあとだった。</p>



<p class="wp-block-paragraph">夜中、一時を少し過ぎた頃。</p>



<p class="wp-block-paragraph">最初に聞こえたのは電子音だった。</p>



<p class="wp-block-paragraph">ピッ。</p>



<p class="wp-block-paragraph">ピッ。</p>



<p class="wp-block-paragraph">ピッ。</p>



<p class="wp-block-paragraph">夢の中にも聞こえていた。</p>



<p class="wp-block-paragraph">目を開ける。</p>



<p class="wp-block-paragraph">天井。</p>



<p class="wp-block-paragraph">警報音。</p>



<p class="wp-block-paragraph">私はしばらく動かなかった。</p>



<p class="wp-block-paragraph">こんな時間に設備点検はない。</p>



<p class="wp-block-paragraph">身体を起こす。</p>



<p class="wp-block-paragraph">焦げた匂いがした。</p>



<p class="wp-block-paragraph">玄関を開ける。</p>



<p class="wp-block-paragraph">廊下に何人か出ていた。</p>



<p class="wp-block-paragraph">パジャマ。</p>



<p class="wp-block-paragraph">上着だけ羽織った人。</p>



<p class="wp-block-paragraph">スマートフォンを持つ人。</p>



<p class="wp-block-paragraph">みんな周囲を見ている。</p>



<p class="wp-block-paragraph">警報音だけが鳴っている。</p>



<p class="wp-block-paragraph">奥で誰かの口が動いた。</p>



<p class="wp-block-paragraph">聞こえない。</p>



<p class="wp-block-paragraph">別の人も何か言った。</p>



<p class="wp-block-paragraph">聞こえない。</p>



<p class="wp-block-paragraph">三階の方から煙が上がっていた。</p>



<p class="wp-block-paragraph">隣の女性も出てきた。</p>



<p class="wp-block-paragraph">こちらを見る。</p>



<p class="wp-block-paragraph">何か聞いた。</p>



<p class="wp-block-paragraph">たぶん、</p>



<p class="wp-block-paragraph">「何ですか」</p>



<p class="wp-block-paragraph">だった。</p>



<p class="wp-block-paragraph">私は首を振った。</p>



<p class="wp-block-paragraph">エレベーターの前に人が集まっていた。</p>



<p class="wp-block-paragraph">ボタンが光っている。</p>



<p class="wp-block-paragraph">私は、</p>



<p class="wp-block-paragraph">「使わない方が」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">誰も振り返らない。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">届かない。</p>



<p class="wp-block-paragraph">非常階段の扉が開いた。</p>



<p class="wp-block-paragraph">下から男が上がってくる。</p>



<p class="wp-block-paragraph">三階の住人だった。</p>



<p class="wp-block-paragraph">腕を振りながら何か言っている。</p>



<p class="wp-block-paragraph">警報音に消されて聞こえない。</p>



<p class="wp-block-paragraph">下へ行くなと言っているのか。</p>



<p class="wp-block-paragraph">上へ行けと言っているのか。</p>



<p class="wp-block-paragraph">分からない。</p>



<p class="wp-block-paragraph">誰かがスマートフォンの画面を見せた。</p>



<p class="wp-block-paragraph"><strong>3階 火事</strong></p>



<p class="wp-block-paragraph">それを見た人だけが動いた。</p>



<p class="wp-block-paragraph">廊下の反対側にいる人には届かない。</p>



<p class="wp-block-paragraph">一階の男の子が泣いていた。</p>



<p class="wp-block-paragraph">母親が抱いている。</p>



<p class="wp-block-paragraph">泣き声も小さかった。</p>



<p class="wp-block-paragraph">煙が濃くなる。</p>



<p class="wp-block-paragraph">エレベーターが上がってくる。</p>



<p class="wp-block-paragraph">私は、</p>



<p class="wp-block-paragraph">「乗らないでください」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">誰も動かない。</p>



<p class="wp-block-paragraph">喉に力を入れた。</p>



<p class="wp-block-paragraph">「乗らないでください」</p>



<p class="wp-block-paragraph">何人かがこちらを見る。</p>



<p class="wp-block-paragraph">まだ小さい。</p>



<p class="wp-block-paragraph">息を吸う。</p>



<p class="wp-block-paragraph">胸の奥まで空気が入る。</p>



<p class="wp-block-paragraph">何年も使っていなかった場所が広がる。</p>



<p class="wp-block-paragraph">「エレベーター、使わないで！」</p>



<p class="wp-block-paragraph">声が廊下に響いた。</p>



<p class="wp-block-paragraph">自分の声だと分かるまで、少しかかった。</p>



<p class="wp-block-paragraph">全員がこちらを見た。</p>



<p class="wp-block-paragraph">「火事です！　外へ出てください！」</p>



<p class="wp-block-paragraph">警報音の上を越えた。</p>



<p class="wp-block-paragraph">「階段から外へ！」</p>



<p class="wp-block-paragraph">扉が開く。</p>



<p class="wp-block-paragraph">住人が出てくる。</p>



<p class="wp-block-paragraph">「火事です！」</p>



<p class="wp-block-paragraph">私はもう一度叫んだ。</p>



<p class="wp-block-paragraph">誰かが五階へ向かって同じ言葉を叫んだ。</p>



<p class="wp-block-paragraph">別の人も、</p>



<p class="wp-block-paragraph">「火事！」</p>



<p class="wp-block-paragraph">と声を上げた。</p>



<p class="wp-block-paragraph">廊下のあちこちから声が聞こえ始めた。</p>



<p class="wp-block-paragraph">「こっち」</p>



<p class="wp-block-paragraph">「階段」</p>



<p class="wp-block-paragraph">「子どもがいます」</p>



<p class="wp-block-paragraph">「待って」</p>



<p class="wp-block-paragraph">「下は煙」</p>



<p class="wp-block-paragraph">「こっちから」</p>



<p class="wp-block-paragraph">短いあいだだけ、建物が別の場所になった。</p>



<p class="wp-block-paragraph">誰もデシベルのことを考えていなかった。</p>



<p class="wp-block-paragraph">声が重なる。</p>



<p class="wp-block-paragraph">高い声。</p>



<p class="wp-block-paragraph">低い声。</p>



<p class="wp-block-paragraph">掠れた声。</p>



<p class="wp-block-paragraph">泣き声。</p>



<p class="wp-block-paragraph">怒鳴る声。</p>



<p class="wp-block-paragraph">聞き取りにくい。</p>



<p class="wp-block-paragraph">うるさい。</p>



<p class="wp-block-paragraph">でも、誰かがいることが分かった。</p>



<p class="wp-block-paragraph">姿が見えなくても。</p>



<p class="wp-block-paragraph">煙の向こうでも。</p>



<p class="wp-block-paragraph">階段の上下でも。</p>



<p class="wp-block-paragraph">声だけで、人がいる場所が分かった。</p>



<p class="wp-block-paragraph">隣の女性が私の腕を引いた。</p>



<p class="wp-block-paragraph">階段を指す。</p>



<p class="wp-block-paragraph">一緒に降りる。</p>



<p class="wp-block-paragraph">五階。</p>



<p class="wp-block-paragraph">四階。</p>



<p class="wp-block-paragraph">三階は煙が濃かった。</p>



<p class="wp-block-paragraph">消防隊が上がってきた。</p>



<p class="wp-block-paragraph">「止まらず下へ！」</p>



<p class="wp-block-paragraph">大きな声だった。</p>



<p class="wp-block-paragraph">迷う余地がなかった。</p>



<p class="wp-block-paragraph">その声に従って、外へ出た。</p>



<p class="wp-block-paragraph">道路には住人が集まっていた。</p>



<p class="wp-block-paragraph">消防車の光が建物に反射している。</p>



<p class="wp-block-paragraph">みんな話していた。</p>



<p class="wp-block-paragraph">「どこ？」</p>



<p class="wp-block-paragraph">「三階」</p>



<p class="wp-block-paragraph">「何号室」</p>



<p class="wp-block-paragraph">「分からない」</p>



<p class="wp-block-paragraph">「あの人は？」</p>



<p class="wp-block-paragraph">「います」</p>



<p class="wp-block-paragraph">「六階の人は？」</p>



<p class="wp-block-paragraph">「降りてきた」</p>



<p class="wp-block-paragraph">何年も住んでいた建物に、こんなに多くの声があったことを初めて知った。</p>



<p class="wp-block-paragraph">火元は三階だった。</p>



<p class="wp-block-paragraph">台所から出た火。</p>



<p class="wp-block-paragraph">一部屋と廊下の一部が焼けた。</p>



<p class="wp-block-paragraph">けが人はいなかった。</p>



<p class="wp-block-paragraph">消防士がそう説明すると、誰かが、</p>



<p class="wp-block-paragraph">「よかった」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">その声は大きかった。</p>



<p class="wp-block-paragraph">二時間ほどして部屋へ戻れることになった。</p>



<p class="wp-block-paragraph">エレベーターは止まっていた。</p>



<p class="wp-block-paragraph">隣の女性と階段を上がる。</p>



<p class="wp-block-paragraph">六階へ着く少し前に、彼女が言った。</p>



<p class="wp-block-paragraph">「ありがとうございました」</p>



<p class="wp-block-paragraph">何についてなのか、すぐに分かった。</p>



<p class="wp-block-paragraph">「いや」</p>



<p class="wp-block-paragraph">「声、すごく通るんですね」</p>



<p class="wp-block-paragraph">私は笑った。</p>



<p class="wp-block-paragraph">「自分でもびっくりしました」</p>



<p class="wp-block-paragraph">普通の声だった。</p>



<p class="wp-block-paragraph">彼女には聞こえた。</p>



<p class="wp-block-paragraph">翌朝、喉が少し痛かった。</p>



<p class="wp-block-paragraph">鏡の前で、</p>



<p class="wp-block-paragraph">「あー」</p>



<p class="wp-block-paragraph">と声を出す。</p>



<p class="wp-block-paragraph">掠れている。</p>



<p class="wp-block-paragraph">私は少し笑った。</p>



<p class="wp-block-paragraph">笑い声が部屋に響いた。</p>



<p class="wp-block-paragraph">誰かに聞かれたかもしれない。</p>



<p class="wp-block-paragraph">そのときは気にならなかった。</p>



<p class="wp-block-paragraph">三週間ほどして、管理会社から封筒が届いた。</p>



<p class="wp-block-paragraph">重要。</p>



<p class="wp-block-paragraph">設備修繕の案内だと思った。</p>



<p class="wp-block-paragraph">中には二枚。</p>



<p class="wp-block-paragraph">一枚目は共用部の修繕。</p>



<p class="wp-block-paragraph">二枚目。</p>



<p class="wp-block-paragraph"><strong>臨時基準声量測定のお知らせ</strong></p>



<p class="wp-block-paragraph">何度か読み直した。</p>



<p class="wp-block-paragraph">共用部の安全設備が記録した音声のうち、一定値を超える発声が居住者本人のものと確認された場合、基準値に著しい変化が生じている可能性があるため、再測定を行う。</p>



<p class="wp-block-paragraph">そんな規則があることを知らなかった。</p>



<p class="wp-block-paragraph">契約書を出す。</p>



<p class="wp-block-paragraph">細かい文字。</p>



<p class="wp-block-paragraph">安全管理時の例外測定。</p>



<p class="wp-block-paragraph">たしかに書いてある。</p>



<p class="wp-block-paragraph">私は椅子に座った。</p>



<p class="wp-block-paragraph">七十なら七万円。</p>



<p class="wp-block-paragraph">八十なら八万円。</p>



<p class="wp-block-paragraph">火事の夜、自分はどれくらいだったのだろう。</p>



<p class="wp-block-paragraph">スマートフォンを机に置く。</p>



<p class="wp-block-paragraph">「火事です！」</p>



<p class="wp-block-paragraph">六十三。</p>



<p class="wp-block-paragraph">もう少し。</p>



<p class="wp-block-paragraph">「外へ出てください！」</p>



<p class="wp-block-paragraph">七十四。</p>



<p class="wp-block-paragraph">隣の部屋から何か音がした。</p>



<p class="wp-block-paragraph">私はすぐ黙った。</p>



<p class="wp-block-paragraph">画面に、</p>



<p class="wp-block-paragraph">74.6</p>



<p class="wp-block-paragraph">と出ていた。</p>



<p class="wp-block-paragraph">翌週、防音室へ入った。</p>



<p class="wp-block-paragraph">「今回は通常更新ではなく、臨時測定になります」</p>



<p class="wp-block-paragraph">「はい」</p>



<p class="wp-block-paragraph">「普段の声でお願いします」</p>



<p class="wp-block-paragraph">普段の声。</p>



<p class="wp-block-paragraph">こんにちは。</p>



<p class="wp-block-paragraph">今日はいい天気ですね。</p>



<p class="wp-block-paragraph">よろしくお願いします。</p>



<p class="wp-block-paragraph">私は、</p>



<p class="wp-block-paragraph">「こんにちは」</p>



<p class="wp-block-paragraph">と読んだ。</p>



<p class="wp-block-paragraph">六十八。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">「今日はいい天気ですね」</p>



<p class="wp-block-paragraph">七十三。</p>



<p class="wp-block-paragraph">「よろしくお願いします」</p>



<p class="wp-block-paragraph">七十一。</p>



<p class="wp-block-paragraph">平均七十・七。</p>



<p class="wp-block-paragraph">担当者も画面を見たまま少し黙った。</p>



<p class="wp-block-paragraph">「かなり変わりましたね」</p>



<p class="wp-block-paragraph">私は喉に触った。</p>



<p class="wp-block-paragraph">叫んでいるつもりはなかった。</p>



<p class="wp-block-paragraph">普通に読んだだけだった。</p>



<p class="wp-block-paragraph">「これ、火事のせいですか」</p>



<p class="wp-block-paragraph">「どうでしょう」</p>



<p class="wp-block-paragraph">担当者は言った。</p>



<p class="wp-block-paragraph">「一度発声の仕方が変わると、その後しばらく基準値が変わる方はいます」</p>



<p class="wp-block-paragraph">「元に戻りますか」</p>



<p class="wp-block-paragraph">「戻る方もいます」</p>



<p class="wp-block-paragraph">「戻らない人も？」</p>



<p class="wp-block-paragraph">「います」</p>



<p class="wp-block-paragraph">結果が印刷された。</p>



<p class="wp-block-paragraph"><strong>70.7 dB</strong></p>



<p class="wp-block-paragraph">その下に、</p>



<p class="wp-block-paragraph"><strong>予想家賃　71,000円</strong></p>



<p class="wp-block-paragraph">私はしばらく紙を見た。</p>



<p class="wp-block-paragraph">「七万一千円」</p>



<p class="wp-block-paragraph">「はい」</p>



<p class="wp-block-paragraph">「倍以上ですね」</p>



<p class="wp-block-paragraph">「現在が三万四千円ですので」</p>



<p class="wp-block-paragraph">急激な増額になるため、調整制度が使えるという。</p>



<p class="wp-block-paragraph">一年目五万円。</p>



<p class="wp-block-paragraph">二年目六万円。</p>



<p class="wp-block-paragraph">三年目七万一千円。</p>



<p class="wp-block-paragraph">その間に声量が下がれば再計算。</p>



<p class="wp-block-paragraph">「異議申し立ては？」</p>



<p class="wp-block-paragraph">「できます」</p>



<p class="wp-block-paragraph">一枚の紙を渡された。</p>



<p class="wp-block-paragraph">事故。</p>



<p class="wp-block-paragraph">災害。</p>



<p class="wp-block-paragraph">疾病。</p>



<p class="wp-block-paragraph">一時的な発声変化。</p>



<p class="wp-block-paragraph">その他。</p>



<p class="wp-block-paragraph">理由を書く欄。</p>



<p class="wp-block-paragraph">私はその場では何も書かなかった。</p>



<p class="wp-block-paragraph">管理会社を出る。</p>



<p class="wp-block-paragraph">横断歩道。</p>



<p class="wp-block-paragraph">高校生が二人、スマートフォンを見せ合って笑っている。</p>



<p class="wp-block-paragraph">声は聞こえない。</p>



<p class="wp-block-paragraph">コンビニに入る。</p>



<p class="wp-block-paragraph">水を一本。</p>



<p class="wp-block-paragraph">セルフレジ。</p>



<p class="wp-block-paragraph">画面。</p>



<p class="wp-block-paragraph">支払い。</p>



<p class="wp-block-paragraph">誰とも話さない。</p>



<p class="wp-block-paragraph">外へ出る。</p>



<p class="wp-block-paragraph">私は、</p>



<p class="wp-block-paragraph">「ありがとうございます」</p>



<p class="wp-block-paragraph">と言わなかった。</p>



<p class="wp-block-paragraph">言わなくても終わる。</p>



<p class="wp-block-paragraph">マンションへ戻る。</p>



<p class="wp-block-paragraph">エレベーター。</p>



<p class="wp-block-paragraph">途中の階から隣の女性が乗る。</p>



<p class="wp-block-paragraph">「測定、今日でした？」</p>



<p class="wp-block-paragraph">はっきり聞こえた。</p>



<p class="wp-block-paragraph">「はい」</p>



<p class="wp-block-paragraph">自分の声も、はっきり聞こえた。</p>



<p class="wp-block-paragraph">「どうでした？」</p>



<p class="wp-block-paragraph">「七十一」</p>



<p class="wp-block-paragraph">彼女の目が少し大きくなる。</p>



<p class="wp-block-paragraph">「そんなに」</p>



<p class="wp-block-paragraph">「そんなにでした」</p>



<p class="wp-block-paragraph">「火事のときの」</p>



<p class="wp-block-paragraph">「たぶん」</p>



<p class="wp-block-paragraph">六階。</p>



<p class="wp-block-paragraph">扉が開く。</p>



<p class="wp-block-paragraph">彼女は少し立ち止まった。</p>



<p class="wp-block-paragraph">「申し立てするんですか」</p>



<p class="wp-block-paragraph">「まだ分かりません」</p>



<p class="wp-block-paragraph">「した方がいいですよ」</p>



<p class="wp-block-paragraph">彼女は言った。</p>



<p class="wp-block-paragraph">「非常時だったんだから」</p>



<p class="wp-block-paragraph">「そうですね」</p>



<p class="wp-block-paragraph">数歩歩く。</p>



<p class="wp-block-paragraph">彼女が振り返る。</p>



<p class="wp-block-paragraph">「あのとき」</p>



<p class="wp-block-paragraph">私は止まる。</p>



<p class="wp-block-paragraph">「はい」</p>



<p class="wp-block-paragraph">「声が聞こえて、助かりました」</p>



<p class="wp-block-paragraph">少しして、</p>



<p class="wp-block-paragraph">「よかったです」</p>



<p class="wp-block-paragraph">と答えた。</p>



<p class="wp-block-paragraph">部屋へ入る。</p>



<p class="wp-block-paragraph">机に、家賃通知と異議申し立て書を並べる。</p>



<p class="wp-block-paragraph">七万一千円。</p>



<p class="wp-block-paragraph">高い。</p>



<p class="wp-block-paragraph">毎月三万七千円増える。</p>



<p class="wp-block-paragraph">年間四十四万四千円。</p>



<p class="wp-block-paragraph">引っ越しても、この街では測定値が引き継がれる。</p>



<p class="wp-block-paragraph">声を小さくする教室を検索する。</p>



<p class="wp-block-paragraph">以前の教室が出てきた。</p>



<p class="wp-block-paragraph">新しい講座。</p>



<p class="wp-block-paragraph"><strong>火災・事故後の声量回復コース</strong></p>



<p class="wp-block-paragraph">回復。</p>



<p class="wp-block-paragraph">八週間。</p>



<p class="wp-block-paragraph">四万八千円。</p>



<p class="wp-block-paragraph">平均低減実績七・二デシベル。</p>



<p class="wp-block-paragraph">私は画面を閉じた。</p>



<p class="wp-block-paragraph">異議申し立て書を開く。</p>



<p class="wp-block-paragraph">理由。</p>



<p class="wp-block-paragraph">火災発生時、住人の避難誘導のため大声を使用。</p>



<p class="wp-block-paragraph">そこまで書く。</p>



<p class="wp-block-paragraph">その結果生じた声量増加は日常的なものではないため――</p>



<p class="wp-block-paragraph">手が止まった。</p>



<p class="wp-block-paragraph">日常的ではない。</p>



<p class="wp-block-paragraph">本当にそうなのか。</p>



<p class="wp-block-paragraph">測定では七十を超えた。</p>



<p class="wp-block-paragraph">あれから数週間経っている。</p>



<p class="wp-block-paragraph">私は普通に文章を読んだだけだった。</p>



<p class="wp-block-paragraph">戻っていない。</p>



<p class="wp-block-paragraph">戻っていない、という言い方も妙だった。</p>



<p class="wp-block-paragraph">五十二。</p>



<p class="wp-block-paragraph">三十四。</p>



<p class="wp-block-paragraph">七十一。</p>



<p class="wp-block-paragraph">どれも自分の声だった。</p>



<p class="wp-block-paragraph">窓を開ける。</p>



<p class="wp-block-paragraph">夜。</p>



<p class="wp-block-paragraph">道路を車が走る。</p>



<p class="wp-block-paragraph">遠くに電車。</p>



<p class="wp-block-paragraph">向かいの歩道を二人が歩いている。</p>



<p class="wp-block-paragraph">私は窓辺に立った。</p>



<p class="wp-block-paragraph">「こんばんは」</p>



<p class="wp-block-paragraph">声が外へ出る。</p>



<p class="wp-block-paragraph">誰も振り返らない。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">「こんばんは」</p>



<p class="wp-block-paragraph">一人が少しだけ上を見た。</p>



<p class="wp-block-paragraph">私は窓を閉めた。</p>



<p class="wp-block-paragraph">異議申し立て書を引き出しに入れた。</p>



<p class="wp-block-paragraph">提出しないと決めたわけではなかった。</p>



<p class="wp-block-paragraph">その日は書かなかった。</p>



<p class="wp-block-paragraph">翌日も。</p>



<p class="wp-block-paragraph">提出期限が近づく。</p>



<p class="wp-block-paragraph">木曜日の夜。</p>



<p class="wp-block-paragraph">もう一度紙を出す。</p>



<p class="wp-block-paragraph">年間四十四万円。</p>



<p class="wp-block-paragraph">制度として考えれば、申し立てる理由はある。</p>



<p class="wp-block-paragraph">火災。</p>



<p class="wp-block-paragraph">避難誘導。</p>



<p class="wp-block-paragraph">例外。</p>



<p class="wp-block-paragraph">それでも、理由欄を見ていると、彼女の言葉を思い出した。</p>



<p class="wp-block-paragraph">声が聞こえて、助かりました。</p>



<p class="wp-block-paragraph">助けたというほどではない。</p>



<p class="wp-block-paragraph">消防設備は鳴っていた。</p>



<p class="wp-block-paragraph">煙も見えていた。</p>



<p class="wp-block-paragraph">誰かが通報していた。</p>



<p class="wp-block-paragraph">私が叫ばなくても、全員逃げられたかもしれない。</p>



<p class="wp-block-paragraph">分からない。</p>



<p class="wp-block-paragraph">それでも、あの夜だけは、聞こえてほしいと思った。</p>



<p class="wp-block-paragraph">遠くにいる人にも。</p>



<p class="wp-block-paragraph">知らない人にも。</p>



<p class="wp-block-paragraph">扉の向こうにも。</p>



<p class="wp-block-paragraph">普段なら、聞こえなければ言い直さなかった。</p>



<p class="wp-block-paragraph">あの夜は、届くまで大きくした。</p>



<p class="wp-block-paragraph">金曜日。</p>



<p class="wp-block-paragraph">紙を鞄に入れて家を出る。</p>



<p class="wp-block-paragraph">管理会社は駅までの途中にある。</p>



<p class="wp-block-paragraph">入口まで行く。</p>



<p class="wp-block-paragraph">中に担当者が見える。</p>



<p class="wp-block-paragraph">私は通り過ぎた。</p>



<p class="wp-block-paragraph">仕事へ行った。</p>



<p class="wp-block-paragraph">帰りにも前を通った。</p>



<p class="wp-block-paragraph">シャッターは閉まっていた。</p>



<p class="wp-block-paragraph">提出期限が終わった。</p>



<p class="wp-block-paragraph">次年度から、まず五万円。</p>



<p class="wp-block-paragraph">通知が届く。</p>



<p class="wp-block-paragraph">私は受け入れた。</p>



<p class="wp-block-paragraph">制度が正しいと思ったわけではない。</p>



<p class="wp-block-paragraph">火災のときの声まで家賃に使うのは、今でも変だと思う。</p>



<p class="wp-block-paragraph">ただ、異議を申し立てなかった。</p>



<p class="wp-block-paragraph">理由をうまく説明できなかった。</p>



<p class="wp-block-paragraph">私は何年も、数字が下がることを喜んでいた。</p>



<p class="wp-block-paragraph">あの夜だけ、その数字より届くことを選んだ。</p>



<p class="wp-block-paragraph">そのあと高くなった。</p>



<p class="wp-block-paragraph">それだけだった。</p>



<p class="wp-block-paragraph">数か月すると、声は少しずつ小さくなった。</p>



<p class="wp-block-paragraph">六十六。</p>



<p class="wp-block-paragraph">六十一。</p>



<p class="wp-block-paragraph">五十八。</p>



<p class="wp-block-paragraph">特に練習はしていない。</p>



<p class="wp-block-paragraph">仕事では以前より話すようになった。</p>



<p class="wp-block-paragraph">聞き返されたら、普通に言い直した。</p>



<p class="wp-block-paragraph">店員を呼ぶこともあった。</p>



<p class="wp-block-paragraph">「すみません」</p>



<p class="wp-block-paragraph">振り返らなければ、もう一度。</p>



<p class="wp-block-paragraph">以前ほど、その一声を気にしなくなった。</p>



<p class="wp-block-paragraph">街は変わらない。</p>



<p class="wp-block-paragraph">注文は画面。</p>



<p class="wp-block-paragraph">受付は番号。</p>



<p class="wp-block-paragraph">電車は静か。</p>



<p class="wp-block-paragraph">不動産広告には、</p>



<p class="wp-block-paragraph"><strong>静かな方ほど、お得。</strong></p>



<p class="wp-block-paragraph">とある。</p>



<p class="wp-block-paragraph">一階の男の子は小学生になった。</p>



<p class="wp-block-paragraph">朝、ランドセルを背負って外へ出る。</p>



<p class="wp-block-paragraph">少し離れたところに友達を見つける。</p>



<p class="wp-block-paragraph">名前を呼ぶ。</p>



<p class="wp-block-paragraph">母親が、</p>



<p class="wp-block-paragraph">「声」</p>



<p class="wp-block-paragraph">と言う。</p>



<p class="wp-block-paragraph">男の子は一度小さくする。</p>



<p class="wp-block-paragraph">友達は気づかない。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">今度は大きい。</p>



<p class="wp-block-paragraph">友達が振り返る。</p>



<p class="wp-block-paragraph">二人で走っていく。</p>



<p class="wp-block-paragraph">母親は何も言わなかった。</p>



<p class="wp-block-paragraph">私はエレベーターの中からそれを見ていた。</p>



<p class="wp-block-paragraph">次の更新。</p>



<p class="wp-block-paragraph">また防音室。</p>



<p class="wp-block-paragraph">こんにちは。</p>



<p class="wp-block-paragraph">今日はいい天気ですね。</p>



<p class="wp-block-paragraph">よろしくお願いします。</p>



<p class="wp-block-paragraph">五十八。</p>



<p class="wp-block-paragraph">五十六。</p>



<p class="wp-block-paragraph">五十七。</p>



<p class="wp-block-paragraph">平均五十七。</p>



<p class="wp-block-paragraph">「下がりましたね」</p>



<p class="wp-block-paragraph">担当者が言う。</p>



<p class="wp-block-paragraph">「はい」</p>



<p class="wp-block-paragraph">家賃、五万七千円。</p>



<p class="wp-block-paragraph">最初にこの街へ来たときより五千円高い。</p>



<p class="wp-block-paragraph">七万一千円よりは安い。</p>



<p class="wp-block-paragraph">紙を受け取る。</p>



<p class="wp-block-paragraph">以前なら、あと何デシベル下げられるか計算したと思う。</p>



<p class="wp-block-paragraph">その日はしなかった。</p>



<p class="wp-block-paragraph">管理会社を出る。</p>



<p class="wp-block-paragraph">夕方。</p>



<p class="wp-block-paragraph">駅へ向かう人が多い。</p>



<p class="wp-block-paragraph">横断歩道の向こうに、隣の女性がいた。</p>



<p class="wp-block-paragraph">少し離れている。</p>



<p class="wp-block-paragraph">こちらには気づいていない。</p>



<p class="wp-block-paragraph">以前なら、追いつくまで待ったと思う。</p>



<p class="wp-block-paragraph">あるいは、何も言わなかった。</p>



<p class="wp-block-paragraph">私は立ち止まる。</p>



<p class="wp-block-paragraph">名前を知らない。</p>



<p class="wp-block-paragraph">何年も隣に住んでいるのに。</p>



<p class="wp-block-paragraph">「すみません」</p>



<p class="wp-block-paragraph">声を出す。</p>



<p class="wp-block-paragraph">彼女は気づかない。</p>



<p class="wp-block-paragraph">車の音。</p>



<p class="wp-block-paragraph">もう一度。</p>



<p class="wp-block-paragraph">「すみません」</p>



<p class="wp-block-paragraph">少し大きく。</p>



<p class="wp-block-paragraph">彼女が振り返る。</p>



<p class="wp-block-paragraph">私を見つける。</p>



<p class="wp-block-paragraph">笑う。</p>



<p class="wp-block-paragraph">私は横断歩道を渡った。</p>



<p class="wp-block-paragraph">「今日、更新だったんです」</p>



<p class="wp-block-paragraph">「どうでした？」</p>



<p class="wp-block-paragraph">「五十七」</p>



<p class="wp-block-paragraph">「下がりましたね」</p>



<p class="wp-block-paragraph">「はい」</p>



<p class="wp-block-paragraph">二人で歩き始める。</p>



<p class="wp-block-paragraph">しばらくして、私は言った。</p>



<p class="wp-block-paragraph">「そういえば、名前、聞いてませんでしたよね」</p>



<p class="wp-block-paragraph">彼女は少し驚いた。</p>



<p class="wp-block-paragraph">それから、自分の名前を言った。</p>



<p class="wp-block-paragraph">車が横を通った。</p>



<p class="wp-block-paragraph">聞き取れなかった。</p>



<p class="wp-block-paragraph">以前なら、分かったふりをしたかもしれない。</p>



<p class="wp-block-paragraph">「もう一回お願いします」</p>



<p class="wp-block-paragraph">彼女は少し大きな声で、もう一度名前を言った。</p>



<p class="wp-block-paragraph">今度は聞こえた。</p>



<p class="wp-block-paragraph">私も自分の名前を言う。</p>



<p class="wp-block-paragraph">彼女が笑った。</p>



<p class="wp-block-paragraph">「知ってました」</p>



<p class="wp-block-paragraph">「どうして」</p>



<p class="wp-block-paragraph">「火事のあと、掲示板に名前出てましたよ」</p>



<p class="wp-block-paragraph">「あれ、見てたんですか」</p>



<p class="wp-block-paragraph">「見ました」</p>



<p class="wp-block-paragraph">二人で笑った。</p>



<p class="wp-block-paragraph">彼女の声は、以前より少し大きかった。</p>



<p class="wp-block-paragraph">私の声も。</p>



<p class="wp-block-paragraph">家賃がいくらなのかは聞かなかった。</p>



<p class="wp-block-paragraph">六階に着く。</p>



<p class="wp-block-paragraph">それぞれの玄関の前。</p>



<p class="wp-block-paragraph">「おやすみなさい」</p>



<p class="wp-block-paragraph">彼女が言う。</p>



<p class="wp-block-paragraph">「おやすみなさい」</p>



<p class="wp-block-paragraph">私は返す。</p>



<p class="wp-block-paragraph">廊下に少しだけ響く。</p>



<p class="wp-block-paragraph">部屋へ入る。</p>



<p class="wp-block-paragraph">机の上に更新通知。</p>



<p class="wp-block-paragraph">五万七千円。</p>



<p class="wp-block-paragraph">紙を裏返す。</p>



<p class="wp-block-paragraph">部屋は同じだった。</p>



<p class="wp-block-paragraph">六畳。</p>



<p class="wp-block-paragraph">小さな台所。</p>



<p class="wp-block-paragraph">窓から隣のマンション。</p>



<p class="wp-block-paragraph">その向こうに線路。</p>



<p class="wp-block-paragraph">最初にここへ来たときから、ほとんど変わっていない。</p>



<p class="wp-block-paragraph">変わったのは家賃だった。</p>



<p class="wp-block-paragraph">それから声だった。</p>



<p class="wp-block-paragraph">どちらが先だったのかは、もうよく分からない。</p>



<p class="wp-block-paragraph">窓を少し開ける。</p>



<p class="wp-block-paragraph">夜の街は静かだった。</p>



<p class="wp-block-paragraph">遠くで誰かが笑った。</p>



<p class="wp-block-paragraph">どこにいるのか分からない。</p>



<p class="wp-block-paragraph">声だけが少し届いた。</p>



<p class="wp-block-paragraph">私は、そのまま窓を閉めずにいた。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/6-tatami-57db/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2884</post-id>	</item>
		<item>
		<title>まだ名前のない魔法</title>
		<link>https://tranquilguides.com/unnamed-magic/</link>
					<comments>https://tranquilguides.com/unnamed-magic/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 15:01:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[Web Game]]></category>
		<category><![CDATA[体験]]></category>
		<category><![CDATA[創作]]></category>
		<category><![CDATA[魔法]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=2936</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20260924_164432.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>いくつかの質問に答えながら、まだ名前のない「あなたの魔法」の法則を見つけていく。完成した魔法は、記録として持ち帰り、いつものAIでも使えます。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20260924_164432.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>
<!--
まだ名前のない魔法 v7.3 / Tranquilvæj
WordPress / SWELL Custom HTML Block
-->

<style>
.tv-magic{
  --tvm-ink:#202624;
  --tvm-muted:rgba(32,38,36,.62);
  --tvm-line:rgba(32,38,36,.13);
  --tvm-bg:#f3f1ea;
  --tvm-surface:rgba(255,255,255,.70);
  --tvm-surface-strong:rgba(255,255,255,.88);
  --tvm-dark:#171b1a;
  width:min(45em,calc(100vw - 1.5em));
  max-width:none;
  margin-left:50%;
  transform:translateX(-50%);
  padding:
    max(2.25em,env(safe-area-inset-top))
    max(1.125em,env(safe-area-inset-right))
    max(7em,env(safe-area-inset-bottom))
    max(1.125em,env(safe-area-inset-left));
  min-width:0;
  min-height:0;
  color:var(--tvm-ink);
  font-family:inherit;
  line-break:strict;
  overflow-wrap:anywhere;
}

.tv-magic{
  /* Tranquil Material System — scoped tokens */
  --tvm-space-0:0;
  --tvm-space-2:0.125em;
  --tvm-space-4:0.25em;
  --tvm-space-8:0.5em;
  --tvm-space-12:0.75em;
  --tvm-space-16:1em;
  --tvm-space-24:1.5em;
  --tvm-space-32:2em;
  --tvm-space-48:3em;
  --tvm-space-64:4em;
  --tvm-space-96:6em;
  --tvm-space-128:8em;

  --tvm-radius-0:0;
  --tvm-radius-6:0.375em;
  --tvm-radius-10:0.625em;
  --tvm-radius-16:1em;
  --tvm-radius-24:1.5em;
  --tvm-radius-pill:62.4375em;

  --tvm-motion-fast:120ms;
  --tvm-motion-base:220ms;
  --tvm-motion-slow:360ms;
  --tvm-ease:cubic-bezier(.2,.8,.2,1);

  --tvm-clear:#fff;
  --tvm-mist:rgba(248,248,247,.82);
  --tvm-veil:rgba(248,248,247,.70);
  --tvm-lens:rgba(248,248,247,.62);

  --tvm-mist-solid:#f1f1ef;
  --tvm-veil-solid:#e8e8e5;
  --tvm-lens-solid:#ddddda;

  --tvm-glass-border:rgba(255,255,255,.72);
  --tvm-glass-edge:rgba(22,22,20,.10);
  --tvm-glass-shadow:0 0.625em 1.875em rgba(22,22,20,.08), inset 0 1px 0 rgba(255,255,255,.74);
  --tvm-focus-ring:0.125em solid currentColor;
  --tvm-focus-offset:0.1875em;

  /* Question screen — em-first relative sizing */
  --tvm-q-header-min-h:2.75em;
  --tvm-q-header-gap:1em;
  --tvm-q-header-bottom:0.55em;
  --tvm-q-meta-size:0.75em;
  --tvm-q-progress-bottom:1.3em;
  --tvm-q-size-min:1.5em;
  --tvm-q-size-max:2.15em;
  --tvm-q-max-width:18.5em;
  --tvm-q-choice-gap:0.5em;
  --tvm-q-choice-top:1.1em;
  --tvm-q-choice-min-h:3.125em;
  --tvm-q-choice-pad-y:0.78em;
  --tvm-q-choice-pad-x:1em;
  --tvm-q-choice-radius:0.875em;
  --tvm-q-back-top:0.75em;
  --tvm-q-focus-hit:2.75em;
  --tvm-q-focus-hit-active:3em;
  --tvm-q-focus-icon:var(--tvm-q-focus-icon-normal);
  --tvm-q-frame-width:31em;
  --tvm-q-progress-width:11.25em;
  --tvm-focus-bg:#f2f1ed;
  --tvm-normal-choice:rgba(255,255,255,.44);
  --tvm-normal-choice-hover:rgba(255,255,255,.62);
  --tvm-normal-choice-border:rgba(32,38,36,.13);
  --tvm-normal-progress-track:rgba(32,38,36,.12);
  --tvm-normal-progress-bar:.52;
  --tvm-normal-meta-opacity:.62;
  --tvm-normal-focus-opacity:.52;

  --tvm-focus-bg:#efeee9;
  --tvm-focus-choice:rgba(255,255,255,.18);
  --tvm-focus-choice-hover:rgba(255,255,255,.34);
  --tvm-focus-choice-selected:rgba(255,255,255,.46);
  --tvm-focus-choice-border:rgba(32,38,36,.08);
  --tvm-focus-progress-track:rgba(32,38,36,.085);
  --tvm-focus-progress-bar:.38;
  --tvm-focus-meta-opacity:.76;
  --tvm-focus-focus-opacity:.92;

  --tvm-q-size-focus-min:1.56em;
  --tvm-q-size-focus-max:2.25em;
  --tvm-q-focus-icon-normal:1.25em;
  --tvm-q-focus-icon-active:1.6em;
}

.tv-magic .tvm-material-mist,
.tv-magic .tvm-language{
  background:var(--tvm-mist-solid);
  border:1px solid var(--tvm-glass-edge);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-material-mist,
  .tv-magic .tvm-language{
    background:var(--tvm-mist);
    -webkit-backdrop-filter:blur(0.5em) saturate(1.02);
    backdrop-filter:blur(0.5em) saturate(1.02);
    border-color:var(--tvm-glass-border);
    box-shadow:var(--tvm-glass-shadow);
  }
}

.tv-magic .tvm-material-veil,
.tv-magic .tvm-btn.is-primary{
  background:var(--tvm-veil-solid);
  border:1px solid var(--tvm-glass-edge);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-material-veil,
  .tv-magic .tvm-btn.is-primary{
    background:var(--tvm-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.06);
    backdrop-filter:blur(1.125em) saturate(1.06);
    border-color:var(--tvm-glass-border);
    box-shadow:var(--tvm-glass-shadow);
  }
}

.tv-magic .tvm-material-lens{
  background:var(--tvm-lens-solid);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-material-lens{
    background:var(--tvm-lens);
    -webkit-backdrop-filter:blur(1.625em) saturate(1.10);
    backdrop-filter:blur(1.625em) saturate(1.10);
  }
}

.tv-magic,
.tv-magic *,
.tv-magic *::before,
.tv-magic *::after{box-sizing:border-box}
.tv-magic button,
.tv-magic textarea{font:inherit}
.tv-magic [hidden]{display:none!important}

.tvm-top{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--tvm-q-header-gap);
  min-height:var(--tvm-q-header-min-h);
  margin-bottom:var(--tvm-q-header-bottom);
  color:var(--tvm-muted);
}
.tvm-question-meta{
  min-width:0;
  overflow-wrap:anywhere;
  font-size:var(--tvm-q-meta-size);
  letter-spacing:.055em;
  font-variant-numeric:tabular-nums;
}
.tvm-question-meta-count{
  opacity:var(--tvm-normal-meta-opacity);
}
.tv-magic.is-focus .tvm-question-meta-count{
  opacity:var(--tvm-focus-meta-opacity);
}
.tvm-screen{animation:tvmFade .22s ease both}

.tvm-spacer{
  display:block;
  width:100%;
  height:0;
  pointer-events:none;
}
.tvm-spacer--sm{height:0.75em}
.tvm-spacer--entry-top{height:4.75em}
.tvm-spacer--hero-lead{height:1.125em}
.tvm-spacer--lead-language{height:1.375em}
.tvm-spacer--language-start{height:1.75em}

.tvm-entry .tvm-hero{
  margin:0;
  max-width:none;
  font-size:clamp(2.125em,4.2vw,3.25em);
}
.tvm-hero-line{display:block}
@media(min-width:48.0625em){
  .tvm-hero-line--keep{white-space:nowrap}
}
.tvm-entry .tvm-lead{margin:0}
.tvm-entry .tvm-language{margin:0}
.tvm-entry .tvm-actions{margin-top:0}
@keyframes tvmFade{
  from{opacity:0;transform:translateY(0.25em)}
  to{opacity:1;transform:none}
}
.tvm-hero{
  margin:0;
  max-width:10em;
  font-size:clamp(2.125em,8vw,3.625em);
  line-height:1.08;
  font-weight:560;
  letter-spacing:-.035em;
}
.tvm-question{
  margin:0;
  max-width:var(--tvm-q-max-width);
  font-size:clamp(var(--tvm-q-size-min),5.4vw,var(--tvm-q-size-max));
  line-height:1.34;
  font-weight:560;
  letter-spacing:-.022em;
}
.tv-magic.is-focus .tvm-question{
  font-size:clamp(var(--tvm-q-size-focus-min),5.7vw,var(--tvm-q-size-focus-max));
}
.tvm-lead{
  margin:1.375em 0 0;
  max-width:36em;
  color:var(--tvm-muted);
  font-size:0.9375em;
  line-height:1.9;
}
.tvm-actions{
  display:flex;
  flex-wrap:wrap;
  gap:0.625em;
  margin-top:2em;
}
.tvm-btn{
  min-height:3em;
  padding:0.8125em 1.1875em;
  border:1px solid var(--tvm-line);
  border-radius:62.4375em;
  background:var(--tvm-surface);
  color:inherit;
  cursor:pointer;
  transition:.16s ease;
}
.tvm-btn:hover{background:var(--tvm-surface-strong)}
.tvm-btn:focus-visible,
.tvm-choice:focus-visible,
.tvm-back:focus-visible,
.tvm-summary:focus-visible{
  outline:0.125em solid currentColor;
  outline-offset:0.1875em;
}
.tvm-btn.is-primary{
  border-color:var(--tvm-dark);
  background:var(--tvm-dark);
  color:var(--tvm-bg);
}
.tvm-btn.is-ghost{background:transparent}

.tvm-choices{
  display:grid;
  grid-template-columns:1fr;
  gap:var(--tvm-q-choice-gap);
  margin-top:var(--tvm-q-choice-top);
}
.tvm-choice{
  width:100%;
  min-height:var(--tvm-q-choice-min-h);
  padding:var(--tvm-q-choice-pad-y) var(--tvm-q-choice-pad-x);
  border:1px solid var(--tvm-normal-choice-border);
  border-radius:var(--tvm-q-choice-radius);
  background:var(--tvm-normal-choice);
  color:inherit;
  text-align:left;
  cursor:pointer;
  transition:
    background var(--tvm-motion-fast) var(--tvm-ease),
    border-color var(--tvm-motion-fast) var(--tvm-ease),
    transform var(--tvm-motion-fast) var(--tvm-ease);
}
.tvm-choice:hover{
  background:var(--tvm-normal-choice-hover);
  border-color:rgba(32,38,36,.20);
  transform:none;
}
.tvm-choice[data-contact-state="pressed"]{
  transform:scale(.985);
}
.tvm-choice.is-preview,
.tvm-choice.is-long-preview{
  background:rgba(32,38,36,.035);
  border-color:rgba(32,38,36,.24);
}
.tvm-choice.is-selected{
  background:rgba(32,38,36,.075);
  border-color:rgba(32,38,36,.26);
  font-weight:560;
  transform:none;
}
.tvm-backrow{
  margin-top:var(--tvm-q-back-top);
  text-align:left;
}
.tvm-back{
  min-height:2.75em;
  padding:0.5em 0;
  border:0;
  background:none;
  color:var(--tvm-muted);
  cursor:pointer;
}

.tvm-loader{
  height:1px;
  margin-top:2.125em;
  overflow:hidden;
  background:var(--tvm-line);
}
.tvm-loader::after{
  content:"";
  display:block;
  width:38%;
  height:100%;
  background:var(--tvm-dark);
  animation:tvmLoad 1s ease-in-out infinite;
}
@keyframes tvmLoad{
  0%{transform:translateX(-120%)}
  100%{transform:translateX(340%)}
}

.tvm-kicker{
  margin:0 0 1.25em;
  color:var(--tvm-muted);
  font-size:0.75em;
  letter-spacing:.025em;
}
.tvm-result-name{
  margin:0;
  font-size:clamp(1.75em,4vw,2.5em);
  line-height:1.15;
  font-weight:620;
  letter-spacing:-.025em;
}
.tvm-result-section{
  margin-top:3.25em;
  padding-top:0;
}
.tvm-result-section-title{
  margin:0 0 1.125em;
  font-size:1.0625em;
  font-weight:620;
  letter-spacing:-.012em;
}
.tvm-summary-grid{
  display:grid;
  grid-template-columns:8em minmax(0,1fr);
  gap:0.7em 1.25em;
  margin:0;
  font-size:0.9375em;
  line-height:1.65;
}
.tvm-summary-grid dt{
  color:var(--tvm-muted);
}
.tvm-summary-grid dd{
  margin:0;
  overflow-wrap:anywhere;
}
.tvm-carry-lead{
  max-width:34em;
  margin:0 0 1.25em;
  color:var(--tvm-muted);
  font-size:0.9375em;
  line-height:1.8;
}
.tvm-copy-action{
  width:100%;
}
.tvm-copy-action .tvm-btn{
  display:block;
  width:100%;
  max-width:none;
  box-sizing:border-box;
}
.tvm-result-restart{
  margin-top:4em;
  padding-top:0;
  text-align:center;
}
.tvm-result-restart .tvm-actions{
  justify-content:center;
}
.tvm-result-restart .tvm-btn{
  width:auto;
  min-width:0;
  padding-left:0.9em;
  padding-right:0.9em;
  color:var(--tvm-muted);
  background:transparent;
  border-color:transparent;
  box-shadow:none;
}

.tvm-name{
  margin-bottom:0.625em;
  color:var(--tvm-muted);
  font-size:0.75em;
  letter-spacing:.08em;
}
.tvm-core{
  max-width:36em;
  margin:0;
  padding:0;
  border:0;
  background:transparent;
  font-size:1.0625em;
  line-height:1.95;
  letter-spacing:-.006em;
}
.tvm-entry .tvm-language{
  display:flex;
  width:max-content;
  margin-left:auto;
  margin-right:auto;
}
.tvm-language{
  display:inline-flex;
  align-items:center;
  gap:var(--tvm-space-4);
  padding:var(--tvm-space-4);
  border-radius:var(--tvm-radius-pill);
  isolation:isolate;
}
.tvm-lang{
  min-height:2.75em;
  padding:0 var(--tvm-space-16);
  border:0;
  border-radius:var(--tvm-radius-pill);
  background:transparent;
  color:inherit;
  cursor:pointer;
  font:inherit;
  transition:
    background var(--tvm-motion-fast) var(--tvm-ease),
    color var(--tvm-motion-fast) var(--tvm-ease),
    transform var(--tvm-motion-fast) var(--tvm-ease),
    box-shadow var(--tvm-motion-fast) var(--tvm-ease);
  -webkit-tap-highlight-color:transparent;
}

.tvm-lang.is-active{
  background:var(--tvm-clear);
  color:var(--tvm-dark);
  box-shadow:0 1px 0 rgba(255,255,255,.82), 0 0.25em 0.875em rgba(22,22,20,.08);
}
.tvm-lang:focus-visible{
  outline:var(--tvm-focus-ring);
  outline-offset:var(--tvm-focus-offset);
}

.tvm-helper,
.tvm-note{
  margin:0.875em 0 0;
  color:var(--tvm-muted);
  font-size:0.8125em;
  line-height:1.75;
}
.tvm-detail{
  margin-top:0;
}
.tvm-detail-title{
  margin:0 0 1em;
  font-size:0.875em;
  font-weight:600;
  color:var(--tvm-muted);
}
.tvm-grid{
  display:grid;
  grid-template-columns:7.5em minmax(0,1fr);
  gap:0.5625em 0.875em;
  margin:0;
  font-size:0.875em;
  line-height:1.65;
}
.tvm-grid--secondary{
  color:var(--tvm-muted);
}
.tvm-grid--secondary dd{
  color:var(--tvm-ink);
}
.tvm-grid dt{color:var(--tvm-muted)}
.tvm-grid dd{margin:0;overflow-wrap:anywhere}
.tvm-details{
  margin-top:1.5em;
  padding-top:0;
}
.tvm-summary{
  cursor:pointer;
  color:var(--tvm-muted);
  font-size:0.8125em;
}
.tvm-pre,
.tvm-prompt{
  width:100%;
  max-width:100%;
  margin-top:0.75em;
  padding:1em;
  border:1px solid var(--tvm-line);
  border-radius:1.125em;
  background:rgba(255,255,255,.52);
  color:var(--tvm-ink);
  font:0.75em/1.65 ui-monospace,SFMono-Regular,Menlo,monospace;
}
.tvm-pre{
  white-space:pre-wrap;
  word-break:break-word;
  overflow:auto;
}
.tvm-prompt{
  min-height:12em;
  max-height:24em;
  resize:vertical;
  background:rgba(255,255,255,.34);
}
.tvm-error{
  padding:1.125em;
  border:1px solid var(--tvm-line);
  border-radius:1.125em;
  background:var(--tvm-surface);
  font-size:0.875em;
  line-height:1.7;
}

@media(max-width:30em){
  .tv-magic{padding:1.75em 0.875em 4em}
  .tvm-spacer--entry-top{height:3.625em}
  .tvm-spacer--hero-lead{height:1.25em}
  .tvm-spacer--lead-language{height:1.25em}
  .tvm-spacer--language-start{height:1.375em}
  .tvm-entry .tvm-hero{font-size:clamp(2.125em,10vw,2.75em)}
  .tvm-grid{grid-template-columns:1fr;gap:0.1875em}
  .tvm-grid dd{margin-bottom:0.5em}
  .tvm-summary-grid{grid-template-columns:1fr;gap:0.1875em}
  .tvm-summary-grid dd{margin-bottom:0.5625em}
  .tvm-core{font-size:1.0625em}
}
@media(prefers-reduced-motion:reduce){
  .tv-magic *,
  .tv-magic *::before,
  .tv-magic *::after{
    animation:none!important;
    transition:none!important;
  }
}

/* TMS — interface controls only. Content remains Clear. */
.tv-magic .tvm-btn,
.tv-magic .tvm-choice,
.tv-magic .tvm-back{
  min-height:2.75em;
  transition:
    transform var(--tvm-motion-fast) var(--tvm-ease),
    background var(--tvm-motion-fast) var(--tvm-ease),
    border-color var(--tvm-motion-fast) var(--tvm-ease),
    box-shadow var(--tvm-motion-fast) var(--tvm-ease),
    opacity var(--tvm-motion-fast) var(--tvm-ease);
  -webkit-tap-highlight-color:transparent;
}

.tv-magic .tvm-btn{
  border-radius:var(--tvm-radius-16);
}

.tv-magic .tvm-btn.is-primary{
  color:var(--tvm-dark);
  border-color:rgba(22,22,20,.10);
}

.tv-magic .tvm-btn:not(.is-primary),
.tv-magic .tvm-choice,
.tv-magic .tvm-back{
  background:var(--tvm-clear);
}

.tv-magic .tvm-choice{
  border-radius:var(--tvm-radius-16);
  border-color:rgba(22,22,20,.12);
  box-shadow:0 1px 0 rgba(255,255,255,.70);
}

.tv-magic .tvm-choice.is-selected{
  background:var(--tvm-veil-solid);
  border-color:rgba(22,22,20,.18);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-choice.is-selected{
    background:var(--tvm-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.06);
    backdrop-filter:blur(1.125em) saturate(1.06);
    box-shadow:var(--tvm-glass-shadow);
  }
}

@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-lang:hover:not(.is-active),
  .tv-magic .tvm-btn:hover,
  .tv-magic .tvm-choice:hover,
  .tv-magic .tvm-back:hover{
    background:var(--tvm-mist-solid);
  }

  @supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
    .tv-magic .tvm-lang:hover:not(.is-active),
    .tv-magic .tvm-btn:hover,
    .tv-magic .tvm-choice:hover,
    .tv-magic .tvm-back:hover{
      background:var(--tvm-mist);
      -webkit-backdrop-filter:blur(0.5em) saturate(1.02);
      backdrop-filter:blur(0.5em) saturate(1.02);
    }
  }
}

.tv-magic .tvm-lang:active,
.tv-magic .tvm-btn:active,
.tv-magic .tvm-choice:active,
.tv-magic .tvm-back:active{
  transform:scale(.97);
  background:var(--tvm-lens-solid);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-lang:active,
  .tv-magic .tvm-btn:active,
  .tv-magic .tvm-choice:active,
  .tv-magic .tvm-back:active{
    background:var(--tvm-lens);
    -webkit-backdrop-filter:blur(1.625em) saturate(1.10);
    backdrop-filter:blur(1.625em) saturate(1.10);
  }
}

.tv-magic .tvm-btn:focus-visible,
.tv-magic .tvm-choice:focus-visible,
.tv-magic .tvm-back:focus-visible{
  outline:var(--tvm-focus-ring);
  outline-offset:var(--tvm-focus-offset);
}

/* Content surfaces explicitly stay Clear / non-Glass. */
.tv-magic .tvm-screen,
.tv-magic .tvm-hero,
.tv-magic .tvm-lead,
.tv-magic .tvm-question,
.tv-magic .tvm-core,
.tv-magic .tvm-detail,
.tv-magic .tvm-grid,
.tv-magic .tvm-pre,
.tv-magic .tvm-prompt{
  -webkit-backdrop-filter:none;
  backdrop-filter:none;
}

/* Transparency fallback */
@media (prefers-reduced-transparency: reduce){
  .tv-magic .tvm-language,
  .tv-magic .tvm-btn.is-primary,
  .tv-magic .tvm-choice.is-selected,
  .tv-magic .tvm-lang:active,
  .tv-magic .tvm-btn:active,
  .tv-magic .tvm-choice:active,
  .tv-magic .tvm-back:active{
    -webkit-backdrop-filter:none;
    backdrop-filter:none;
  }
  .tv-magic .tvm-language{background:var(--tvm-mist-solid)}
  .tv-magic .tvm-btn.is-primary{background:var(--tvm-veil-solid)}
  .tv-magic .tvm-choice.is-selected{background:var(--tvm-veil-solid)}
}

/* Motion fallback */

/* =========================================================
   Browser / viewport resilience derived from Today / Margin
   ========================================================= */
.tv-magic.is-focus{
  position:fixed !important;
  inset:0 !important;
  z-index:2147483000 !important;
  width:100vw !important;
  width:100dvw !important;
  height:var(--tvm-visual-height,100vh) !important;
  height:var(--tvm-visual-height,100dvh) !important;
  max-width:none !important;
  margin:0 !important;
  transform:none !important;
  padding:0 !important;
  overflow:hidden !important;
  overscroll-behavior:none;
  background-color:var(--tvm-focus-bg) !important;
  background-image:
    radial-gradient(circle at 50% 11%,rgba(255,255,255,.22),rgba(255,255,255,0) 28em) !important;
  -webkit-text-size-adjust:100%;
  text-size-adjust:100%;
}

.tv-magic.is-focus #tvmagicApp{
  box-sizing:border-box;
  width:100%;
  height:100%;
  min-height:0;
  overflow-x:hidden;
  overflow-y:auto;
  overscroll-behavior-x:none;
  overscroll-behavior-y:contain;
  -webkit-overflow-scrolling:touch;
  touch-action:pan-y pinch-zoom;
  padding:
    max(1.5em,env(safe-area-inset-top))
    max(1.25em,env(safe-area-inset-right))
    max(1.5em,env(safe-area-inset-bottom))
    max(1.25em,env(safe-area-inset-left));
  scrollbar-gutter:stable;
}


.tv-magic.is-focus .tvm-screen{
  width:min(45em,100%);
  margin:0 auto;
}
.tv-magic.is-focus .tvm-question-screen{
  width:100%;
  max-width:none;
  margin:0;
}

.tv-magic .tvm-focus-toggle{
  appearance:none;
  display:grid;
  place-items:center;
  flex:0 0 var(--tvm-q-focus-hit);
  width:var(--tvm-q-focus-hit);
  height:var(--tvm-q-focus-hit);
  min-width:var(--tvm-q-focus-hit);
  min-height:var(--tvm-q-focus-hit);
  margin:0;
  padding:0;
  border:0;
  background:transparent;
  color:var(--tvm-muted);
  opacity:var(--tvm-normal-focus-opacity);
  cursor:pointer;
  -webkit-tap-highlight-color:transparent;
  transition:
    width var(--tvm-motion-fast) var(--tvm-ease),
    height var(--tvm-motion-fast) var(--tvm-ease),
    flex-basis var(--tvm-motion-fast) var(--tvm-ease),
    opacity var(--tvm-motion-fast) var(--tvm-ease),
    color var(--tvm-motion-fast) var(--tvm-ease);
}
.tv-magic .tvm-focus-toggle:hover{
  color:var(--tvm-ink);
  opacity:1;
}
.tv-magic .tvm-focus-toggle:focus-visible{opacity:1}
.tv-magic.is-focus .tvm-focus-toggle{
  flex-basis:var(--tvm-q-focus-hit-active);
  width:var(--tvm-q-focus-hit-active);
  height:var(--tvm-q-focus-hit-active);
  min-width:var(--tvm-q-focus-hit-active);
  min-height:var(--tvm-q-focus-hit-active);
  opacity:var(--tvm-focus-focus-opacity);
}
.tv-magic.is-focus .tvm-focus-toggle{
  color:var(--tvm-ink);
}

.tv-magic .tvm-focus-toggle:focus-visible{
  opacity:1;
  outline:var(--tvm-focus-ring);
  outline-offset:var(--tvm-focus-offset);
}
.tv-magic .tvm-focus-toggle svg{
  width:var(--tvm-q-focus-icon);
  height:var(--tvm-q-focus-icon);
  fill:none;
  stroke:currentColor;
  stroke-width:1.8;
  stroke-linecap:round;
  stroke-linejoin:round;
  overflow:visible;
  pointer-events:none;
  transition:
    width var(--tvm-motion-fast) var(--tvm-ease),
    height var(--tvm-motion-fast) var(--tvm-ease);
}
.tv-magic.is-focus .tvm-focus-toggle svg{
  width:var(--tvm-q-focus-icon-active);
  height:var(--tvm-q-focus-icon-active);
}
.tv-magic .tvm-focus-icon-exit{display:none}
.tv-magic.is-focus .tvm-focus-icon-enter{display:none}
.tv-magic.is-focus .tvm-focus-icon-exit{display:block}

@media (max-height:32.5em){
  .tv-magic{
    padding-top:max(1em,env(safe-area-inset-top));
    padding-bottom:max(1.5em,env(safe-area-inset-bottom));
  }
  .tv-magic .tvm-top{margin-bottom:1.25em}
  .tv-magic .tvm-spacer--entry-top{height:2em}
  .tv-magic .tvm-spacer--density-2{height:1em}
  .tv-magic .tvm-choices{margin-top:1.125em;gap:0.5em}
  .tv-magic .tvm-choice{min-height:3em;padding:0.75em 1em}
  .tv-magic .tvm-backrow{margin-top:0.75em}
}

@media (max-height:23.75em){
  .tv-magic .tvm-question{font-size:clamp(1.35em,5.5vw,2em)}
}

@media (hover:none){
  .tv-magic .tvm-btn:hover,
  .tv-magic .tvm-choice:hover,
  .tv-magic .tvm-focus-toggle:hover{
    transform:none;
  }
}

@media (pointer:coarse){
  .tv-magic button{
    -webkit-tap-highlight-color:transparent;
  }
}

/* Single-pointer operation contract.
   Keep browser/OS multi-touch accessibility gestures available. */
.tv-magic:not(.is-focus) .tvm-choice,
.tv-magic:not(.is-focus) .tvm-btn,
.tv-magic:not(.is-focus) .tvm-back,
.tv-magic:not(.is-focus) .tvm-lang,
.tv-magic:not(.is-focus) .tvm-focus-toggle{
  touch-action:manipulation;
}

.tv-magic .tvm-question-shell,
.tv-magic .tvm-question-shell .tvm-choice,
.tv-magic.is-focus .tvm-focus-toggle,
.tv-magic.is-focus .tvm-back{
  -webkit-user-select:none;
  user-select:none;
  -webkit-touch-callout:none;
}

.tv-magic .tvm-result-name,
.tv-magic .tvm-core,
.tv-magic .tvm-grid dd,
.tv-magic .tvm-summary-grid dd,
.tv-magic .tvm-carry-lead,
.tv-magic .tvm-helper,
.tv-magic .tvm-note{
  overflow-wrap:anywhere;
}

@media (max-width:20em){
  .tv-magic{
    padding-left:max(0.875em,env(safe-area-inset-left));
    padding-right:max(0.875em,env(safe-area-inset-right));
  }
  .tv-magic .tvm-hero{
    font-size:clamp(1.75em,9vw,2.5em);
  }
  .tv-magic .tvm-question{
    font-size:clamp(1.4em,8vw,2em);
  }
  .tv-magic .tvm-progress{
    width:min(100%,17.5em);
  }
  .tv-magic .tvm-summary-grid{
    grid-template-columns:1fr;
    gap:0.2em;
  }
  .tv-magic .tvm-summary-grid dd{
    margin-bottom:0.8em;
  }
}

@media (prefers-contrast:more){
  .tv-magic{
    --tvm-line:currentColor;
    --tvm-glass-edge:currentColor;
    --tvm-glass-shadow:none;
    --tvm-elevation-float:none;
    --tvm-elevation-toast:none;
  }
  .tv-magic .tvm-btn,
  .tv-magic .tvm-choice,
  .tv-magic .tvm-language,
  .tv-magic .tvm-progress{
    border-color:currentColor;
  }
  .tv-magic .tvm-muted,
  .tv-magic .tvm-lead,
  .tv-magic .tvm-kicker,
  .tv-magic .tvm-helper,
  .tv-magic .tvm-note,
  .tv-magic .tvm-back,
  .tv-magic .tvm-detail-title{
    color:currentColor;
    opacity:.82;
  }
}

@media (prefers-reduced-motion: reduce){
  .tv-magic *,
  .tv-magic *::before,
  .tv-magic *::after{
    scroll-behavior:auto !important;
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
  }
}

/* High-contrast fallback */
@media (forced-colors: active){
  .tv-magic .tvm-language,
  .tv-magic .tvm-btn,
  .tv-magic .tvm-choice,
  .tv-magic .tvm-back,
  .tv-magic .tvm-lang{
    forced-color-adjust:auto;
    -webkit-backdrop-filter:none;
    backdrop-filter:none;
    box-shadow:none;
    border:1px solid ButtonText;
    background:Canvas;
    color:CanvasText;
  }
  .tv-magic .tvm-lang.is-active{
    background:Highlight;
    color:HighlightText;
  }
}


/* =========================================================
   Tranquil Material System v1.7
   Material State Machine / Morphing / Progress / Toast
   ========================================================= */

/* Semantic material aliases: components reference meaning, not raw color. */
.tv-magic{
  --tvm-surface-clear:var(--tvm-clear);
  --tvm-surface-mist:var(--tvm-mist);
  --tvm-surface-veil:var(--tvm-veil);
  --tvm-surface-lens:var(--tvm-lens);

  --tvm-surface-mist-solid:var(--tvm-mist-solid);
  --tvm-surface-veil-solid:var(--tvm-veil-solid);
  --tvm-surface-lens-solid:var(--tvm-lens-solid);

  --tvm-elevation-inline:0 1px 0 rgba(255,255,255,.64);
  --tvm-elevation-float:0 0.5em 1.5em rgba(22,22,20,.08), inset 0 1px 0 rgba(255,255,255,.78);
  --tvm-elevation-toast:0 0.875em 2.25em rgba(22,22,20,.12), inset 0 1px 0 rgba(255,255,255,.82);

  --tvm-z-content:0;
  --tvm-z-inline:10;
  --tvm-z-float:20;
  --tvm-z-toast:30;

  --tvm-control-radius-rest:var(--tvm-radius-16);
  --tvm-control-radius-hover:1.125em;
  --tvm-control-radius-active:1.25em;
}

/* Dark tokens are prepared, but never auto-force the WordPress page into dark mode.
   Activate only when this experience is explicitly placed in a dark context. */
.tv-magic[data-tvm-theme="dark"]{
    --tvm-surface-clear:#171715;
    --tvm-surface-mist:rgba(36,36,33,.82);
    --tvm-surface-veil:rgba(42,42,38,.72);
    --tvm-surface-lens:rgba(48,48,43,.64);

    --tvm-surface-mist-solid:#242421;
    --tvm-surface-veil-solid:#2a2a26;
    --tvm-surface-lens-solid:#30302b;

    --tvm-glass-border:rgba(255,255,255,.12);
    --tvm-glass-edge:rgba(255,255,255,.10);
    --tvm-elevation-inline:0 1px 0 rgba(255,255,255,.05);
    --tvm-elevation-float:0 0.625em 1.875em rgba(0,0,0,.20), inset 0 1px 0 rgba(255,255,255,.08);
    --tvm-elevation-toast:0 1em 2.625em rgba(0,0,0,.30), inset 0 1px 0 rgba(255,255,255,.10);
}

/* Material State Machine */
.tv-magic .tvm-control{
  position:relative;
  z-index:var(--tvm-z-inline);
  border-radius:var(--tvm-control-radius-rest);
  transform:translateZ(0) scale(1);
  transition:
    transform var(--tvm-motion-fast) var(--tvm-ease),
    border-radius var(--tvm-motion-base) var(--tvm-ease),
    background var(--tvm-motion-base) var(--tvm-ease),
    border-color var(--tvm-motion-base) var(--tvm-ease),
    box-shadow var(--tvm-motion-base) var(--tvm-ease),
    opacity var(--tvm-motion-fast) var(--tvm-ease);
}

.tv-magic .tvm-control[data-material="clear" data-surface="interface" data-elevation="s1"]{
  background:var(--tvm-surface-clear);
  box-shadow:var(--tvm-elevation-inline);
}

.tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"]{
  background:var(--tvm-surface-mist-solid);
  box-shadow:var(--tvm-elevation-float);
}

.tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"]{
  background:var(--tvm-surface-veil-solid);
  box-shadow:var(--tvm-elevation-float);
}

.tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
  background:var(--tvm-surface-lens-solid);
  box-shadow:var(--tvm-elevation-float);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"]{
    background:var(--tvm-surface-mist);
    -webkit-backdrop-filter:blur(0.5em) saturate(1.02);
    backdrop-filter:blur(0.5em) saturate(1.02);
  }

  .tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"]{
    background:var(--tvm-surface-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.06);
    backdrop-filter:blur(1.125em) saturate(1.06);
  }

  .tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
    background:var(--tvm-surface-lens);
    -webkit-backdrop-filter:blur(1.625em) saturate(1.10);
    backdrop-filter:blur(1.625em) saturate(1.10);
  }
}

@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-control:hover:not(:disabled){
    border-radius:var(--tvm-control-radius-hover);
    transform:translateY(-1px) scale(1.005);
  }
}

.tv-magic .tvm-control:active:not(:disabled){
  border-radius:var(--tvm-control-radius-active);
  transform:scale(.975);
}

.tv-magic .tvm-control:disabled,
.tv-magic .tvm-control[aria-disabled="true"]{
  opacity:.52;
  cursor:default;
  transform:none;
}

/* Keep the segmented language control pill-shaped. */
.tv-magic .tvm-lang.tvm-control,
.tv-magic .tvm-language{
  border-radius:var(--tvm-radius-pill);
}
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-lang.tvm-control:hover:not(:disabled){
    border-radius:var(--tvm-radius-pill);
  }
}
.tv-magic .tvm-lang.tvm-control:active:not(:disabled){
  border-radius:var(--tvm-radius-pill);
}

/* Floating question progress */
.tv-magic .tvm-progress-wrap{
  width:100%;
  position:relative;
  z-index:var(--tvm-z-inline);
  margin-bottom:var(--tvm-q-progress-bottom);
}

.tv-magic .tvm-progress{
  width:100%;
  padding:0;
  border:0;
  border-radius:0;
  background:transparent;
  box-shadow:none;
}

.tv-magic .tvm-progress-meta{
  display:none;
}

.tv-magic .tvm-progress-track{
  position:relative;
  width:100%;
  height:1px;
  margin:0;
  overflow:visible;
  border-radius:0;
  background:var(--tvm-normal-progress-track);
}

.tv-magic .tvm-progress-bar{
  display:block;
  height:1px;
  width:0;
  border-radius:0;
  background:currentColor;
  opacity:var(--tvm-normal-progress-bar);
  transform-origin:left center;
  transition:width var(--tvm-motion-base) var(--tvm-ease);
}

.tv-magic .tvm-progress-traces{
  position:absolute;
  inset:0;
  pointer-events:none;
}
.tv-magic .tvm-progress-trace{
  position:absolute;
  top:50%;
  width:0.25em;
  height:0.25em;
  border-radius:50%;
  background:currentColor;
  opacity:.16;
  transform:translate(-50%,-50%);
}
.tv-magic .tvm-progress-trace.is-current{
  opacity:.42;
}

.tv-magic.is-focus .tvm-progress-track{
  background:var(--tvm-focus-progress-track);
}
.tv-magic.is-focus .tvm-progress-bar{
  opacity:var(--tvm-focus-progress-bar);
}
.tv-magic.is-focus .tvm-progress-trace{
  width:0.2em;
  height:0.2em;
  opacity:.12;
}
.tv-magic.is-focus .tvm-progress-trace.is-current{
  opacity:.34;
}


.tv-magic .tvm-density-regular .tvm-spacer--density-2{
  height:0.65em;
}
.tv-magic .tvm-question-shell{
  max-width:100%;
}
@media (min-width:48.0625em){
  .tv-magic .tvm-density-regular{
    padding-top:0.25em;
  }
}
@media (max-width:30em){
  .tvm-top{
    margin-bottom:0.35em;
  }
  .tvm-progress-wrap{
    margin-bottom:1.25em;
  }
  .tvm-question{
    font-size:clamp(1.42em,7vw,1.9em);
    max-width:16em;
  }
  .tvm-choices{
    margin-top:0.95em;
    gap:0.45em;
  }
}


/* One coordinate system for header / progress / question / choices / back. */
.tv-magic .tvm-question-frame{
  width:min(var(--tvm-q-frame-width),100%);
  margin-left:auto;
  margin-right:auto;
  padding-top:0.25em;
}
.tv-magic.is-focus .tvm-question-frame{
  padding-top:1em;
}
.tv-magic .tvm-question-frame .tvm-top,
.tv-magic .tvm-question-frame .tvm-progress-wrap,
.tv-magic .tvm-question-frame .tvm-question-shell,
.tv-magic .tvm-question-frame .tvm-backrow{
  width:100%;
  max-width:none;
}
.tv-magic .tvm-question-frame .tvm-question-shell:focus{
  outline:none;
}

/* Progress remains intentionally shorter than the answer column. */
.tv-magic .tvm-question-frame .tvm-progress-wrap{
  width:min(var(--tvm-q-progress-width),100%);
  margin-left:0;
  margin-right:0;
}

/* Back is navigation, not a material card. */
.tv-magic .tvm-question-frame .tvm-back,
.tv-magic .tvm-question-frame .tvm-back:hover,
.tv-magic .tvm-question-frame .tvm-back:active{
  width:auto;
  border:0 !important;
  border-radius:0 !important;
  background:transparent !important;
  box-shadow:none !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
.tv-magic .tvm-question-frame .tvm-back:hover{
  color:var(--tvm-ink);
}
.tv-magic .tvm-question-frame .tvm-back:active{
  transform:scale(.98);
}

.tv-magic.is-focus .tvm-question-frame .tvm-back::before{
  content:"←";
  display:inline-block;
  margin-right:.55em;
  transform:translateY(-.02em);
}

/* Choices are deliberately quieter than generic TMS controls. */
.tv-magic .tvm-question-frame .tvm-choice:not(.is-selected){
  background:var(--tvm-normal-choice) !important;
  border-color:var(--tvm-normal-choice-border) !important;
  box-shadow:none !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
.tv-magic.is-focus .tvm-question-frame .tvm-choice:not(.is-selected){
  background:var(--tvm-focus-choice) !important;
  border-color:var(--tvm-focus-choice-border) !important;
}
.tv-magic.is-focus .tvm-question-frame .tvm-choice.is-selected{
  background:var(--tvm-focus-choice-selected) !important;
  border-color:rgba(32,38,36,.22) !important;
  box-shadow:none !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-question-frame .tvm-choice:hover:not(.is-selected){
    background:var(--tvm-normal-choice-hover) !important;
  }
  .tv-magic.is-focus .tvm-question-frame .tvm-choice:hover:not(.is-selected){
    background:var(--tvm-focus-choice-hover) !important;
  }
}

/* Start is a single gateway action, visually distinct from question rows. */
.tv-magic .tvm-entry .tvm-actions{
  justify-content:center;
}
.tv-magic .tvm-entry #tvmStart{
  width:min(22em,100%);
  max-width:100%;
}

/* Result should feel like the completed artifact, not a smaller footnote. */
.tv-magic .tvm-result-screen{
  width:min(42em,100%);
  margin-left:auto;
  margin-right:auto;
}
.tv-magic .tvm-result-screen .tvm-result-name{
  font-size:clamp(1.9em,4.5vw,2.75em);
}
.tv-magic .tvm-result-screen .tvm-core{
  max-width:38em;
  font-size:1.125em;
}
.tv-magic .tvm-result-screen .tvm-result-section-title{
  font-size:1.125em;
}
.tv-magic .tvm-result-screen .tvm-summary-grid{
  font-size:0.975em;
}
.tv-magic .tvm-result-screen .tvm-grid{
  font-size:0.925em;
}
.tv-magic .tvm-result-screen .tvm-prompt{
  font-size:0.8125em;
}


.tv-magic .tvm-result-screen .tvm-kicker{
  margin-bottom:1em;
}
.tv-magic .tvm-result-screen .tvm-result-section{
  margin-top:3.5em;
}
.tv-magic .tvm-result-screen .tvm-carry-lead{
  max-width:38em;
}



/* =========================================================
   Alignment contract v4.0
   Alignment follows content role rather than one global rule.
   ========================================================= */
.tv-magic .tvm-align-left{
  text-align:left;
}
.tv-magic .tvm-align-center{
  text-align:center;
}
.tv-magic .tvm-align-right{
  text-align:right;
}

/* Entry: invitation / gateway = centered. */
.tv-magic .tvm-entry{
  text-align:center;
}
.tv-magic .tvm-entry .tvm-hero,
.tv-magic .tvm-entry .tvm-lead{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.tv-magic .tvm-entry .tvm-actions{
  justify-content:center;
}

/* Question: reading + decision = left; utility remains split left/right. */
.tv-magic .tvm-question-frame,
.tv-magic .tvm-question-shell,
.tv-magic .tvm-question,
.tv-magic .tvm-choices,
.tv-magic .tvm-choice,
.tv-magic .tvm-backrow,
.tv-magic .tvm-back{
  text-align:left;
}
.tv-magic .tvm-question-meta{
  text-align:left;
}
.tv-magic .tvm-focus-toggle{
  text-align:right;
}

/* Result opening: identity / completion = centered. */
.tv-magic .tvm-result-screen > .tvm-kicker,
.tv-magic .tvm-result-screen > .tvm-result-name,
.tv-magic .tvm-result-screen > .tvm-core{
  text-align:center;
}
.tv-magic .tvm-result-screen > .tvm-core{
  margin-left:auto;
  margin-right:auto;
}

/* Result facts: labels face values across a shared axis. */
.tv-magic .tvm-result-section{
  text-align:left;
}
.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-grid dt{
  text-align:right;
}
.tv-magic .tvm-summary-grid dd,
.tv-magic .tvm-grid dd{
  text-align:left;
}

/* Carry action: instruction is centered; prompt itself remains source text. */
.tv-magic .tvm-carry-section{
  text-align:center;
}
.tv-magic .tvm-carry-section .tvm-carry-lead{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.tv-magic .tvm-carry-section .tvm-copy-action{
  text-align:center;
}
.tv-magic .tvm-carry-section .tvm-helper{
  text-align:center;
}
.tv-magic .tvm-carry-section .tvm-prompt-heading,
.tv-magic .tvm-carry-section .tvm-prompt,
.tv-magic .tvm-carry-section .tvm-note{
  text-align:left;
}

/* Share / completion actions = centered. */
.tv-magic .tvm-share{
  text-align:center;
}
.tv-magic .tvm-share-row,
.tv-magic .tvm-share-group{
  justify-content:center;
}
.tv-magic .tvm-result-restart{
  text-align:center;
}

/* Narrow screens: two-column definition grids collapse, so labels return left. */
@media(max-width:30em){
  .tv-magic .tvm-summary-grid dt,
  .tv-magic .tvm-grid dt{
    text-align:left;
  }
}

/* =========================================================
   Result share — TranquilShare v1.0-derived icon / state system
   ========================================================= */
.tv-magic .tvm-share{
  margin-top:3.75em;
}
.tv-magic .tvm-share-title{
  margin:0;
  font-size:1.0625em;
  line-height:1.35;
  font-weight:620;
  letter-spacing:-.015em;
}
.tv-magic .tvm-share-row{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:.75em;
  margin-top:1em;
}
.tv-magic .tvm-share-group{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  gap:.38em;
}
.tv-magic .tvm-share-group--utility{
  gap:.42em;
}
.tv-magic .tvm-share-btn{
  appearance:none;
  position:relative;
  display:grid;
  place-items:center;
  width:2.75em;
  height:2.75em;
  min-width:2.75em;
  min-height:2.75em;
  margin:0;
  padding:0;
  border:1px solid rgba(32,38,36,.11);
  border-radius:999em;
  background:rgba(255,255,255,.34);
  color:var(--tvm-ink);
  font:inherit;
  line-height:1;
  cursor:pointer;
  text-decoration:none;
  overflow:visible;
  -webkit-tap-highlight-color:transparent;
  touch-action:manipulation;
  transition:
    background var(--tvm-motion-fast) var(--tvm-ease),
    border-color var(--tvm-motion-fast) var(--tvm-ease),
    transform var(--tvm-motion-fast) var(--tvm-ease),
    opacity var(--tvm-motion-fast) var(--tvm-ease);
}
.tv-magic .tvm-share-btn:hover{
  background:rgba(255,255,255,.62);
  border-color:rgba(32,38,36,.20);
}
.tv-magic .tvm-share-btn:active{
  transform:scale(.97);
}
.tv-magic .tvm-share-btn[hidden]{
  display:none !important;
}
.tv-magic .tvm-share-btn[aria-busy="true"]{
  cursor:progress;
  opacity:.55;
  transform:none;
}
.tv-magic .tvm-share-btn:focus-visible{
  outline:var(--tvm-focus-ring);
  outline-offset:var(--tvm-focus-offset);
}
.tv-magic .tvm-share-icon,
.tv-magic .tvm-copy-icon,
.tv-magic .tvm-share-font-icon{
  display:block;
  width:1em;
  height:1em;
  margin:0;
  padding:0;
  flex:none;
  pointer-events:none;
}
.tv-magic .tvm-share-font-icon{
  font-size:1em;
  line-height:1;
}
.tv-magic .tvm-share-icon{
  fill:none;
  stroke:currentColor;
}
.tv-magic .tvm-share-icon--brand{
  fill:currentColor;
  stroke:none;
}
.tv-magic [data-share-action="x"] .tvm-share-font-icon{
  transform:scale(.90);
}
.tv-magic [data-share-action="threads"] .tvm-share-icon{
  transform:scale(1.20);
}
.tv-magic [data-share-action="bluesky"] .tvm-share-icon{
  transform:scale(.90);
}
.tv-magic [data-share-action="line"] .tvm-share-font-icon{
  transform:scale(1.20);
}
.tv-magic [data-share-action="native"] .tvm-share-icon,
.tv-magic [data-share-action="story"] .tvm-share-icon,
.tv-magic [data-share-action="copy"] .tvm-copy-icon{
  transform:scale(1.15);
}
.tv-magic .tvm-share-fallback{
  display:none;
  font-size:.8em;
  font-weight:700;
  line-height:1;
}
.tv-magic .tvm-share-btn.is-font-icon-missing .tvm-share-font-icon{
  display:none;
}
.tv-magic .tvm-share-btn.is-font-icon-missing .tvm-share-fallback{
  display:block;
}
.tv-magic .tvm-copy-icon__default,
.tv-magic .tvm-copy-icon__copied{
  transition:opacity .18s ease;
}
.tv-magic .tvm-copy-icon__default{
  opacity:1;
}
.tv-magic .tvm-copy-icon__copied{
  opacity:0;
}
.tv-magic .tvm-share-btn.is-copied .tvm-copy-icon__default{
  opacity:0;
}
.tv-magic .tvm-share-btn.is-copied .tvm-copy-icon__copied{
  opacity:1;
}
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-share-btn::after{
    content:attr(data-tooltip);
    position:absolute;
    left:50%;
    bottom:calc(100% + .625em);
    width:max-content;
    max-width:14em;
    padding:.45em .65em;
    border-radius:.35em;
    background:#404040;
    color:#fff;
    font-size:.6875em;
    font-weight:400;
    line-height:1.35;
    letter-spacing:.01em;
    white-space:normal;
    text-align:center;
    opacity:0;
    visibility:hidden;
    transform:translate(-50%,.25em);
    pointer-events:none;
    z-index:var(--tvm-z-toast);
    transition:
      opacity .16s ease,
      transform .16s ease,
      visibility .16s ease;
  }
  .tv-magic .tvm-share-btn:hover::after,
  .tv-magic .tvm-share-btn:focus-visible::after{
    opacity:1;
    visibility:visible;
    transform:translate(-50%,0);
  }
}
@media (max-width:20em){
  .tv-magic .tvm-share-row{gap:.625em}
  .tv-magic .tvm-share-group{gap:.3em}
  .tv-magic .tvm-share-btn{
    width:2.75em;
    height:2.75em;
    min-width:2.75em;
    min-height:2.75em;
  }
}
@media (prefers-reduced-motion:reduce){
  .tv-magic .tvm-copy-icon__default,
  .tv-magic .tvm-copy-icon__copied,
  .tv-magic .tvm-share-btn,
  .tv-magic .tvm-share-btn::after{
    transition:none !important;
  }
}
@media (prefers-contrast:more){
  .tv-magic .tvm-share-btn{
    background:transparent;
    border-color:currentColor;
  }
}
@media (forced-colors:active){
  .tv-magic .tvm-share-btn{
    background:ButtonFace;
    color:ButtonText;
    border-color:ButtonText;
  }
}

/* Copy toast — transient interface only */
.tv-magic .tvm-toast{
  position:fixed;
  left:50%;
  bottom:max(1.5em,calc(env(safe-area-inset-bottom) + 1em));
  z-index:var(--tvm-z-toast);
  max-width:min(88vw,26.25em);
  padding:0.75em 1em;
  border:1px solid var(--tvm-glass-border);
  border-radius:var(--tvm-radius-16);
  background:var(--tvm-surface-veil-solid);
  box-shadow:var(--tvm-elevation-toast);
  opacity:0;
  transform:translate(-50%,0.75em) scale(.98);
  pointer-events:none;
  transition:
    opacity var(--tvm-motion-base) var(--tvm-ease),
    transform var(--tvm-motion-base) var(--tvm-ease);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-toast{
    background:var(--tvm-surface-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.06);
    backdrop-filter:blur(1.125em) saturate(1.06);
  }
}

.tv-magic .tvm-toast.is-visible{
  opacity:1;
  transform:translate(-50%,0) scale(1);
}

/* Copy state */
.tv-magic #tvmCopy[data-state="working"]{
  cursor:progress;
}
.tv-magic #tvmCopy[data-state="success"]{
  border-radius:var(--tvm-control-radius-active);
}

/* Prefer spacers for new vertical rhythm. */
.tv-magic .tvm-spacer--progress-question{height:var(--tvm-space-24)}
.tv-magic .tvm-spacer--question-choices{height:var(--tvm-space-24)}

/* Performance budget:
   - progress is the only always-on blurred floating surface during questions.
   - unselected choices stay Clear.
   - selected/active controls alone may use Veil/Lens.
*/
.tv-magic .tvm-choice:not(.is-selected){
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
.tv-magic .tvm-choice.is-selected{
  background:var(--tvm-surface-veil-solid);
}
@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-choice.is-selected{
    background:var(--tvm-surface-veil);
  }
}

/* Accessibility fallbacks for new v1.7 surfaces */
@media (prefers-reduced-transparency: reduce){
  .tv-magic .tvm-progress,
  .tv-magic .tvm-toast,
  .tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"],
  .tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"],
  .tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }
  .tv-magic .tvm-progress,
  .tv-magic .tvm-toast,
  .tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"]{
    background:var(--tvm-surface-veil-solid);
  }
  .tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"]{
    background:var(--tvm-surface-mist-solid);
  }
  .tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
    background:var(--tvm-surface-lens-solid);
  }
}

@media (forced-colors: active){
  .tv-magic .tvm-progress,
  .tv-magic .tvm-toast{
    forced-color-adjust:auto;
    -webkit-backdrop-filter:none;
    backdrop-filter:none;
    box-shadow:none;
    background:Canvas;
    color:CanvasText;
    border:1px solid ButtonText;
  }
  .tv-magic .tvm-progress-track{
    background:Canvas;
    border:1px solid ButtonText;
  }
  .tv-magic .tvm-progress-bar{
    background:Highlight;
    opacity:1;
  }
}


/* =========================================================
   Tranquil Material System v1.8
   Specular / Edge / Density / Motion Roles / Refraction
   ========================================================= */

.tv-magic{
  --tvm-motion-press:120ms;
  --tvm-motion-select:220ms;
  --tvm-motion-progress:280ms;
  --tvm-motion-float-in:320ms;
  --tvm-motion-float-out:240ms;

  --tvm-density-relaxed-gap-1:1.5em;
  --tvm-density-relaxed-gap-2:2em;
  --tvm-density-regular-gap-1:1em;
  --tvm-density-regular-gap-2:1.5em;
  --tvm-density-compact-gap-1:0.75em;
  --tvm-density-compact-gap-2:1em;

  --tvm-specular:rgba(255,255,255,.82);
  --tvm-specular-soft:rgba(255,255,255,.42);
  --tvm-edge-dark:rgba(20,20,18,.10);
  --tvm-edge-dark-soft:rgba(20,20,18,.05);
  --tvm-refraction-contrast:1.02;
  --tvm-refraction-saturation:1.04;
}

.tv-magic .tvm-density-relaxed{
  --tvm-density-gap-1:var(--tvm-density-relaxed-gap-1);
  --tvm-density-gap-2:var(--tvm-density-relaxed-gap-2);
}
.tv-magic .tvm-density-regular{
  --tvm-density-gap-1:var(--tvm-density-regular-gap-1);
  --tvm-density-gap-2:var(--tvm-density-regular-gap-2);
}
.tv-magic .tvm-density-compact{
  --tvm-density-gap-1:var(--tvm-density-compact-gap-1);
  --tvm-density-gap-2:var(--tvm-density-compact-gap-2);
}
.tv-magic .tvm-spacer--density-1{height:var(--tvm-density-gap-1,1em)}
.tv-magic .tvm-spacer--density-2{height:var(--tvm-density-gap-2,1.5em)}

.tv-magic .tvm-language,
.tv-magic .tvm-progress,
.tv-magic .tvm-toast,
.tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"],
.tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"],
.tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
  position:relative;
  overflow:hidden;
}

.tv-magic .tvm-language::before,
.tv-magic .tvm-progress::before,
.tv-magic .tvm-toast::before,
.tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"]::before,
.tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"]::before,
.tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]::before{
  content:"";
  position:absolute;
  left:10%;
  right:10%;
  top:0;
  height:1px;
  background:linear-gradient(90deg,transparent,var(--tvm-specular),transparent);
  opacity:.72;
  pointer-events:none;
}

.tv-magic .tvm-language::after,
.tv-magic .tvm-progress::after,
.tv-magic .tvm-toast::after{
  content:"";
  position:absolute;
  left:0.125em;
  right:0.125em;
  top:1px;
  height:40%;
  border-radius:inherit;
  background:linear-gradient(180deg,var(--tvm-specular-soft),transparent);
  opacity:.34;
  pointer-events:none;
}

.tv-magic .tvm-language,
.tv-magic .tvm-progress,
.tv-magic .tvm-toast,
.tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"],
.tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"],
.tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
  box-shadow:
    inset 0 1px 0 var(--tvm-specular-soft),
    inset 0 -1px 0 var(--tvm-edge-dark-soft),
    var(--tvm-elevation-float);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .tv-magic .tvm-language,
  .tv-magic .tvm-progress,
  .tv-magic .tvm-toast{
    -webkit-backdrop-filter:
      blur(1em)
      saturate(var(--tvm-refraction-saturation))
      contrast(var(--tvm-refraction-contrast));
    backdrop-filter:
      blur(1em)
      saturate(var(--tvm-refraction-saturation))
      contrast(var(--tvm-refraction-contrast));
  }
  .tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"]{
    -webkit-backdrop-filter:blur(0.5em) saturate(1.02) contrast(1.01);
    backdrop-filter:blur(0.5em) saturate(1.02) contrast(1.01);
  }
  .tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"]{
    -webkit-backdrop-filter:blur(1.125em) saturate(1.05) contrast(1.02);
    backdrop-filter:blur(1.125em) saturate(1.05) contrast(1.02);
  }
  .tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
    -webkit-backdrop-filter:blur(1.5em) saturate(1.08) contrast(1.03);
    backdrop-filter:blur(1.5em) saturate(1.08) contrast(1.03);
  }
}

.tv-magic .tvm-control{
  transition:
    transform var(--tvm-motion-press) var(--tvm-ease),
    border-radius var(--tvm-motion-select) var(--tvm-ease),
    background var(--tvm-motion-select) var(--tvm-ease),
    border-color var(--tvm-motion-select) var(--tvm-ease),
    box-shadow var(--tvm-motion-select) var(--tvm-ease),
    opacity var(--tvm-motion-press) var(--tvm-ease);
}
.tv-magic .tvm-progress-bar{
  transition:width var(--tvm-motion-progress) var(--tvm-ease);
}
.tv-magic .tvm-toast{
  transition:
    opacity var(--tvm-motion-float-in) var(--tvm-ease),
    transform var(--tvm-motion-float-in) var(--tvm-ease);
}
.tv-magic .tvm-toast:not(.is-visible){
  transition-duration:var(--tvm-motion-float-out);
}

.tv-magic .tvm-screen,
.tv-magic .tvm-hero,
.tv-magic .tvm-lead,
.tv-magic .tvm-question,
.tv-magic .tvm-core,
.tv-magic .tvm-detail,
.tv-magic .tvm-grid,
.tv-magic .tvm-pre,
.tv-magic .tvm-prompt,
.tv-magic textarea{
  box-shadow:none;
}

@media (prefers-reduced-transparency: reduce){
  .tv-magic .tvm-language,
  .tv-magic .tvm-progress,
  .tv-magic .tvm-toast,
  .tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"],
  .tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"],
  .tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }
  .tv-magic .tvm-language::after,
  .tv-magic .tvm-progress::after,
  .tv-magic .tvm-toast::after{
    opacity:.18;
  }
}

@media (forced-colors: active){
  .tv-magic .tvm-language::before,
  .tv-magic .tvm-language::after,
  .tv-magic .tvm-progress::before,
  .tv-magic .tvm-progress::after,
  .tv-magic .tvm-toast::before,
  .tv-magic .tvm-toast::after,
  .tv-magic .tvm-control::before{
    display:none !important;
  }
}


/* =========================================================
   Tranquil Material System v1.9
   Reactive Input / Trace Decay / Spatial Continuity
   ========================================================= */
.tv-magic{--tvm-pointer-x:50%;--tvm-pointer-y:50%;--tvm-reactive-opacity:0;--tvm-trace-size:2.625em;--tvm-trace-duration:520ms;--tvm-continuity-shift:0.625em}
.tv-magic .tvm-reactive{position:relative;isolation:isolate}
.tv-magic .tvm-reactive::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;background:radial-gradient(circle at var(--tvm-pointer-x) var(--tvm-pointer-y),rgba(255,255,255,.36) 0,rgba(255,255,255,.18) 16%,rgba(255,255,255,0) 46%);opacity:var(--tvm-reactive-opacity);transition:opacity var(--tvm-motion-press) var(--tvm-ease);z-index:1}
.tv-magic .tvm-reactive>*{position:relative;z-index:2}
.tv-magic .tvm-trace-layer{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:inherit;z-index:3}
.tv-magic .tvm-trace{position:absolute;width:var(--tvm-trace-size);height:var(--tvm-trace-size);margin-left:calc(var(--tvm-trace-size)/-2);margin-top:calc(var(--tvm-trace-size)/-2);border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.34) 0,rgba(255,255,255,.16) 34%,rgba(255,255,255,0) 72%);filter:blur(0.125em);opacity:.92;transform:scale(.82);animation:tvmTraceDecay var(--tvm-trace-duration) var(--tvm-ease) forwards}
@keyframes tvmTraceDecay{0%{opacity:.92;transform:scale(.82)}55%{opacity:.28;transform:scale(1.02)}100%{opacity:0;transform:scale(1.16)}}
.tv-magic .tvm-control[data-contact-state="approach"]{--tvm-reactive-opacity:.20}.tv-magic .tvm-control[data-contact-state="contact"]{--tvm-reactive-opacity:.36}.tv-magic .tvm-control[data-contact-state="pressed"]{--tvm-reactive-opacity:.52}.tv-magic .tvm-control[data-contact-state="selected"]{--tvm-reactive-opacity:.24}
.tv-magic .tvm-choice.is-preview{background:var(--tvm-surface-mist-solid);border-radius:var(--tvm-control-radius-hover)}
@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){.tv-magic .tvm-choice.is-preview{background:var(--tvm-surface-mist);-webkit-backdrop-filter:blur(0.5em) saturate(1.02) contrast(1.01);backdrop-filter:blur(0.5em) saturate(1.02) contrast(1.01)}}
.tv-magic .tvm-question-shell{position:relative}.tv-magic .tvm-question-shell.is-leaving{animation:tvmQuestionLeave var(--tvm-motion-select) var(--tvm-ease) both}.tv-magic .tvm-question-shell.is-entering{animation:tvmQuestionEnter var(--tvm-motion-select) var(--tvm-ease) both}
@keyframes tvmQuestionLeave{from{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(calc(var(--tvm-continuity-shift)*-1))}}@keyframes tvmQuestionEnter{from{opacity:0;transform:translateY(var(--tvm-continuity-shift))}to{opacity:1;transform:translateY(0)}}
.tv-magic .tvm-progress{width:min(13.75em,58vw);padding:0.4375em 0.6875em}.tv-magic .tvm-progress-meta{justify-content:center;font-size:0.75em;letter-spacing:.04em}.tv-magic .tvm-progress-meta span:last-child{display:none}.tv-magic .tvm-progress-track{margin-top:0.375em}
@media (hover:hover) and (pointer:fine){.tv-magic .tvm-control:hover{--tvm-reactive-opacity:.18}}
.tv-magic[data-input-mode="touch"]{--tvm-trace-size:3.25em}.tv-magic[data-input-mode="mouse"]{--tvm-trace-size:2.5em}.tv-magic[data-input-mode="keyboard"]{--tvm-reactive-opacity:0}.tv-magic[data-input-mode="keyboard"] .tvm-reactive::after{display:none}
.tv-magic:not([data-interacting="true"]) .tvm-control{animation:none}
@media (prefers-reduced-motion:reduce){.tv-magic .tvm-trace{animation:none!important;opacity:0!important}.tv-magic .tvm-question-shell.is-leaving,.tv-magic .tvm-question-shell.is-entering{animation:none!important}}
@media (prefers-reduced-transparency:reduce){.tv-magic .tvm-reactive::after{background:radial-gradient(circle at var(--tvm-pointer-x) var(--tvm-pointer-y),rgba(255,255,255,.20) 0,rgba(255,255,255,0) 44%)}}
@media (forced-colors:active){.tv-magic .tvm-reactive::after,.tv-magic .tvm-trace-layer{display:none!important}}


/* =========================================================
   Tranquil Interaction System v2.0
   Unified Interaction Physics / Stage Environment /
   Long-press Preview / Progress Trace / True Calm
   ========================================================= */
.tv-magic{
  --tis-energy:0;
  --tis-contact-x:50%;
  --tis-contact-y:50%;
  --tis-stage-density:1;
  --tis-stage-contrast:1;
  --tis-stage-blur:1;
  --tis-stage-reflection:1;
  --tis-preview-lift:0.3125em;
}
.tv-magic[data-stage-env="outline"]{
  --tis-stage-density:.92;
  --tis-stage-contrast:1;
  --tis-stage-blur:.96;
  --tis-stage-reflection:.88;
}
.tv-magic[data-stage-env="mechanism"]{
  --tis-stage-density:1;
  --tis-stage-contrast:1.02;
  --tis-stage-blur:1;
  --tis-stage-reflection:1;
}
.tv-magic[data-stage-env="almost"]{
  --tis-stage-density:1.04;
  --tis-stage-contrast:1.03;
  --tis-stage-blur:1.02;
  --tis-stage-reflection:1.06;
}
.tv-magic[data-stage-env="result"]{
  --tis-stage-density:.98;
  --tis-stage-contrast:1.01;
  --tis-stage-blur:.98;
  --tis-stage-reflection:.92;
}
.tv-magic .tvm-reactive{
  --tvm-pointer-x:var(--tis-contact-x);
  --tvm-pointer-y:var(--tis-contact-y);
}
.tv-magic .tvm-reactive::after{
  opacity:calc(var(--tis-energy) * .44);
  background:
    radial-gradient(
      circle at var(--tis-contact-x) var(--tis-contact-y),
      rgba(255,255,255,calc(.40 * var(--tis-stage-reflection))) 0,
      rgba(255,255,255,calc(.16 * var(--tis-stage-reflection))) 18%,
      rgba(255,255,255,0) 48%
    );
}
.tv-magic[data-calm="true"]{--tis-energy:0}
.tv-magic[data-calm="true"] .tvm-control{animation:none}
.tv-magic .tvm-control{filter:contrast(var(--tis-stage-contrast))}
.tv-magic .tvm-control[data-contact-state="approach"]{--tis-energy:.22}
.tv-magic .tvm-control[data-contact-state="contact"]{--tis-energy:.34}
.tv-magic .tvm-control[data-contact-state="pressed"]{--tis-energy:.62}
.tv-magic .tvm-control[data-contact-state="selected"]{--tis-energy:.28}

.tv-magic .tvm-choice.is-long-preview{
  transform:translateY(calc(var(--tis-preview-lift) * -1)) scale(1.008);
  background:var(--tvm-surface-veil-solid);
  box-shadow:
    inset 0 1px 0 var(--tvm-specular-soft),
    inset 0 -1px 0 var(--tvm-edge-dark-soft),
    0 0.75em 1.75em rgba(22,22,20,.10);
}
@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .tv-magic .tvm-choice.is-long-preview{
    background:var(--tvm-surface-veil);
    -webkit-backdrop-filter:blur(0.875em) saturate(1.04) contrast(1.02);
    backdrop-filter:blur(0.875em) saturate(1.04) contrast(1.02);
  }
}

.tv-magic .tvm-progress-track{position:relative}
.tv-magic .tvm-progress-traces{
  position:absolute;
  inset:0;
  pointer-events:none;
}
.tv-magic .tvm-progress-trace{
  position:absolute;
  top:50%;
  width:0.25em;
  height:0.25em;
  margin:-0.125em 0 0 -0.125em;
  border-radius:50%;
  background:currentColor;
  opacity:.28;
  transform:scale(.9);
}
.tv-magic .tvm-progress-trace.is-current{
  opacity:.62;
  transform:scale(1.18);
}
.tv-magic .tvm-language,
.tv-magic .tvm-progress,
.tv-magic .tvm-toast,
.tv-magic .tvm-control[data-material="mist" data-surface="interface" data-elevation="s1" data-glass="mist"],
.tv-magic .tvm-control[data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil"],
.tv-magic .tvm-control[data-material="lens" data-surface="transient" data-elevation="s3" data-glass="lens"]{
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,calc(.42 * var(--tis-stage-reflection))),
    inset 0 -1px 0 var(--tvm-edge-dark-soft),
    0 calc(0.5em * var(--tis-stage-density)) calc(1.5em * var(--tis-stage-density)) rgba(22,22,20,.08);
}
@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .tv-magic .tvm-language,
  .tv-magic .tvm-progress,
  .tv-magic .tvm-toast{
    -webkit-backdrop-filter:
      blur(calc(1em * var(--tis-stage-blur)))
      saturate(calc(1.03 * var(--tis-stage-density)))
      contrast(var(--tis-stage-contrast));
    backdrop-filter:
      blur(calc(1em * var(--tis-stage-blur)))
      saturate(calc(1.03 * var(--tis-stage-density)))
      contrast(var(--tis-stage-contrast));
  }
}
.tv-magic[data-calm="true"] .tvm-reactive::after{opacity:0}
.tv-magic .tvm-choice.is-long-preview{cursor:default}
@media (prefers-reduced-motion:reduce){
  .tv-magic .tvm-choice.is-long-preview{transform:none !important}
}
@media (forced-colors:active){
  .tv-magic .tvm-choice.is-long-preview{
    outline:0.125em solid Highlight;
    box-shadow:none;
  }
}


/* =========================================================
   Tranquil Interaction System v2.1
   Semantic Elevation / Surface Semantics /
   Container Query / Unified Generating & Error States
   ========================================================= */

.tv-magic{
  container-type:inline-size;
  container-name:tvmagic;

  /* Semantic elevation */
  --tis-elev-s0:0;
  --tis-elev-s1:10;
  --tis-elev-s2:20;
  --tis-elev-s3:30;

  /* Surface semantics */
  --tis-content-bg:transparent;
  --tis-interface-bg:var(--tvm-surface-clear);
  --tis-transient-bg:var(--tvm-surface-veil);

  /* Responsive geometry tokens */
  --tis-inline-pad:0;
  --tis-choice-gap:0.75em;
  --tis-result-gap:1em;
  --tis-max-control:42.5em;
}

/* ---------------------------------------------------------
   Semantic elevation layers
   S0 Canvas / S1 Surface / S2 Float / S3 Focus
   --------------------------------------------------------- */
.tv-magic [data-elevation="s0"]{z-index:var(--tis-elev-s0)}
.tv-magic [data-elevation="s1"]{z-index:var(--tis-elev-s1)}
.tv-magic [data-elevation="s2"]{z-index:var(--tis-elev-s2)}
.tv-magic [data-elevation="s3"]{z-index:var(--tis-elev-s3)}

/* ---------------------------------------------------------
   Surface semantics
   content = Clear
   interface = interactive surface
   transient = temporary focus surface
   --------------------------------------------------------- */
.tv-magic [data-surface="content"]{
  background:var(--tis-content-bg);
  -webkit-backdrop-filter:none;
  backdrop-filter:none;
  box-shadow:none;
}

.tv-magic [data-surface="interface"]{
  position:relative;
}

.tv-magic [data-surface="transient"]{
  position:relative;
}

/* Content must never inherit glass */
.tv-magic [data-surface="content"]::before,
.tv-magic [data-surface="content"]::after{
  display:none !important;
}

/* ---------------------------------------------------------
   Glass eligibility contract
   Only interface/transient surfaces may blur.
   --------------------------------------------------------- */
.tv-magic [data-surface="interface"][data-glass="mist"]{
  background:var(--tvm-surface-mist-solid);
}
.tv-magic [data-surface="interface"][data-glass="veil"],
.tv-magic [data-surface="transient"][data-glass="veil"]{
  background:var(--tvm-surface-veil-solid);
}
.tv-magic [data-surface="transient"][data-glass="lens"]{
  background:var(--tvm-surface-lens-solid);
}

@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .tv-magic [data-surface="interface"][data-glass="mist"]{
    background:var(--tvm-surface-mist);
    -webkit-backdrop-filter:blur(0.5em) saturate(1.02) contrast(1.01);
    backdrop-filter:blur(0.5em) saturate(1.02) contrast(1.01);
  }

  .tv-magic [data-surface="interface"][data-glass="veil"],
  .tv-magic [data-surface="transient"][data-glass="veil"]{
    background:var(--tvm-surface-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.05) contrast(1.02);
    backdrop-filter:blur(1.125em) saturate(1.05) contrast(1.02);
  }

  .tv-magic [data-surface="transient"][data-glass="lens"]{
    background:var(--tvm-surface-lens);
    -webkit-backdrop-filter:blur(1.5em) saturate(1.08) contrast(1.03);
    backdrop-filter:blur(1.5em) saturate(1.08) contrast(1.03);
  }
}

/* ---------------------------------------------------------
   Single-DOM responsive contract
   Geometry changes only; markup remains identical.
   --------------------------------------------------------- */
.tv-magic .tvm-screen{
  padding-inline:var(--tis-inline-pad);
}

.tv-magic .tvm-choices{
  gap:var(--tis-choice-gap);
}

.tv-magic .tvm-choice,
.tv-magic .tvm-btn,
.tv-magic .tvm-back{
  width:min(100%,var(--tis-max-control));
}

.tv-magic .tvm-grid{
  gap:var(--tis-result-gap);
}

@container tvmagic (max-width: 32.5em){
  .tv-magic{
    --tis-inline-pad:0;
    --tis-choice-gap:0.625em;
    --tis-result-gap:0.75em;
    --tis-max-control:100%;
  }

  .tv-magic .tvm-progress{
    width:min(12.5em,64cqw);
  }

  .tv-magic .tvm-language{
    max-width:100%;
  }

  .tv-magic .tvm-grid{
    grid-template-columns:1fr;
  }
}

@container tvmagic (min-width: 32.5625em) and (max-width: 51.25em){
  .tv-magic{
    --tis-choice-gap:0.75em;
    --tis-result-gap:1em;
    --tis-max-control:40em;
  }

  .tv-magic .tvm-progress{
    width:min(13.75em,40cqw);
  }
}

@container tvmagic (min-width: 51.3125em){
  .tv-magic{
    --tis-choice-gap:0.875em;
    --tis-result-gap:1.25em;
    --tis-max-control:42.5em;
  }
}

/* Fallback for browsers without container queries */
@supports not (container-type:inline-size){
  @media (max-width:40em){
    .tv-magic{
      --tis-choice-gap:0.625em;
      --tis-result-gap:0.75em;
      --tis-max-control:100%;
    }

    .tv-magic .tvm-grid{
      grid-template-columns:1fr;
    }
  }
}

/* ---------------------------------------------------------
   Unified generating/error state surfaces
   --------------------------------------------------------- */
.tv-magic .tvm-state-surface{
  width:min(100%,42.5em);
  margin-inline:auto;
  padding:1.25em;
  border:1px solid var(--tvm-glass-border);
  border-radius:var(--tvm-radius-24);
  background:var(--tvm-surface-veil-solid);
  box-shadow:var(--tvm-elevation-float);
  text-align:center;
}

@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .tv-magic .tvm-state-surface{
    background:var(--tvm-surface-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.05) contrast(1.02);
    backdrop-filter:blur(1.125em) saturate(1.05) contrast(1.02);
  }
}

.tv-magic .tvm-state-surface[data-state="generating"]{
  transform:translateY(0);
  opacity:1;
}

.tv-magic .tvm-state-surface[data-state="error"]{
  border-style:dashed;
}

.tv-magic .tvm-state-title{
  margin:0;
  font:inherit;
  font-weight:600;
}

.tv-magic .tvm-state-copy{
  margin:0.5em 0 0;
  font-size:0.8125em;
  line-height:1.6;
  opacity:.72;
}

.tv-magic .tvm-state-actions{
  display:flex;
  justify-content:center;
  gap:0.625em;
  margin-top:1em;
  flex-wrap:wrap;
}

/* State continuity */
.tv-magic .tvm-state-surface.is-entering{
  animation:tisStateEnter var(--tvm-motion-float-in) var(--tvm-ease) both;
}

@keyframes tisStateEnter{
  from{
    opacity:0;
    transform:translateY(0.5em) scale(.99);
  }
  to{
    opacity:1;
    transform:translateY(0) scale(1);
  }
}

/* Accessibility */
@media (prefers-reduced-motion:reduce){
  .tv-magic .tvm-state-surface.is-entering{
    animation:none !important;
  }
}

@media (prefers-reduced-transparency:reduce){
  .tv-magic .tvm-state-surface{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    background:var(--tvm-surface-veil-solid);
  }
}

@media (forced-colors:active){
  .tv-magic .tvm-state-surface{
    background:Canvas;
    color:CanvasText;
    border:1px solid ButtonText;
    box-shadow:none;
  }
}


/* =========================================================
   Tranquil Interaction System v2.3
   Role Radius / Focus-visible / QA Contracts
   ========================================================= */

.tv-magic{
  /* Role radius aliases */
  --tis-radius-control:var(--tvm-radius-16);
  --tis-radius-control-active:1.25em;
  --tis-radius-floating:var(--tvm-radius-24);
  --tis-radius-dialog:var(--tvm-radius-24);
  --tis-radius-pill:var(--tvm-radius-pill);

  /* Accessibility contract */
  --tis-focus-width:0.125em;
  --tis-focus-offset:0.1875em;
  --tis-focus-color:currentColor;
}

/* Role-based geometry */
.tv-magic .tvm-control{
  border-radius:var(--tis-radius-control);
}
.tv-magic .tvm-control:active:not(:disabled){
  border-radius:var(--tis-radius-control-active);
}
.tv-magic .tvm-progress,
.tv-magic .tvm-state-surface,
.tv-magic .tvm-toast{
  border-radius:var(--tis-radius-floating);
}
.tv-magic .tvm-language,
.tv-magic .tvm-lang{
  border-radius:var(--tis-radius-pill);
}

/* Pointer focus must not imitate keyboard focus. */
.tv-magic .tvm-control:focus{
  outline:none;
}
.tv-magic .tvm-control:focus-visible,
.tv-magic .tvm-lang:focus-visible,
.tv-magic summary:focus-visible,
.tv-magic textarea:focus-visible{
  outline:var(--tis-focus-width) solid var(--tis-focus-color);
  outline-offset:var(--tis-focus-offset);
}

/* Error state accessibility */
.tv-magic .tvm-state-surface[data-state="error"] .tvm-state-title{
  font-weight:700;
}
.tv-magic .tvm-state-surface[data-state="error"] .tvm-state-copy{
  max-width:52ch;
  margin-inline:auto;
}

/* QA contract: content may never become glass. */
.tv-magic [data-surface="content"][data-glass]{
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
  background:transparent !important;
  box-shadow:none !important;
}

/* Reduced-motion contract: remove travel, keep state meaning. */
@media (prefers-reduced-motion:reduce){
  .tv-magic .tvm-control,
  .tv-magic .tvm-progress-bar,
  .tv-magic .tvm-toast,
  .tv-magic .tvm-question-shell,
  .tv-magic .tvm-state-surface{
    transition-duration:1ms !important;
    animation-duration:1ms !important;
    animation-iteration-count:1 !important;
  }
}

/* Reduced-transparency contract: all glass surfaces become solid. */
@media (prefers-reduced-transparency:reduce){
  .tv-magic [data-glass="mist"]{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    background:var(--tvm-surface-mist-solid) !important;
  }
  .tv-magic [data-glass="veil"]{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    background:var(--tvm-surface-veil-solid) !important;
  }
  .tv-magic [data-glass="lens"]{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    background:var(--tvm-surface-lens-solid) !important;
  }
}

/* Forced-colors contract */
@media (forced-colors:active){
  .tv-magic [data-surface="interface"],
  .tv-magic [data-surface="transient"]{
    forced-color-adjust:auto;
    color:CanvasText !important;
    background:Canvas !important;
    border-color:ButtonText !important;
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }

  .tv-magic .tvm-control:focus-visible,
  .tv-magic .tvm-lang:focus-visible,
  .tv-magic summary:focus-visible,
  .tv-magic textarea:focus-visible{
    outline-color:Highlight;
  }
}


.tv-magic .tvm-spacer--detail-section{height:1.75em}

@media (forced-colors:active){
  .tv-magic.is-focus{
    background-image:none !important;
    background-color:Canvas !important;
  }
}


/* =========================================================
   v4.1 — Density / balance / hover physics refinement
   ========================================================= */

/* Entry */
.tv-magic .tvm-entry .tvm-hero{
  max-width:12em;
  margin-left:auto;
  margin-right:auto;
}
.tv-magic .tvm-entry .tvm-lead{
  max-width:32em;
  font-size:.975em;
}
.tv-magic .tvm-entry #tvmStart{
  width:min(20em,100%);
  box-shadow:0 .35em 1em rgba(22,22,20,.065);
}

/* Questions */
.tv-magic .tvm-choice{
  font-size:1.025em;
}
.tv-magic.is-focus .tvm-question-frame{
  padding-top:1.375em;
}
.tv-magic.is-focus .tvm-question-frame .tvm-choice:not(.is-selected){
  border-color:var(--tvm-focus-choice-border) !important;
}
.tv-magic.is-focus .tvm-question-frame .tvm-choice:hover:not(.is-selected){
  border-color:rgba(32,38,36,.15) !important;
}
.tv-magic .tvm-progress-meta{
  opacity:.78;
}

/* Result width and hierarchy */
.tv-magic .tvm-result-screen{
  width:min(44em,100%);
}
.tv-magic .tvm-result-screen .tvm-core{
  max-width:38em;
  font-size:1.2em;
  line-height:1.85;
}
.tv-magic .tvm-result-screen .tvm-summary-section{
  margin-top:4.5em;
}
.tv-magic .tvm-summary-grid{
  grid-template-columns:9em minmax(0,1fr);
}
.tv-magic .tvm-grid{
  grid-template-columns:8.5em minmax(0,1fr);
}
.tv-magic .tvm-carry-lead{
  color:rgba(32,38,36,.68);
}
.tv-magic .tvm-copy-action{
  text-align:center;
}
.tv-magic .tvm-copy-action .tvm-btn{
  width:100%;
  max-width:24em;
  margin-left:auto;
  margin-right:auto;
}
.tv-magic .tvm-prompt-heading{
  margin-bottom:1.15em;
}
.tv-magic .tvm-prompt{
  min-height:9em;
  max-height:22em;
  border-color:rgba(32,38,36,.10);
  background:rgba(255,255,255,.30);
}
.tv-magic .tvm-share{
  margin-top:4.25em;
}
.tv-magic .tvm-share-row{
  gap:1em;
}
.tv-magic .tvm-share-btn{
  width:2.875em;
  height:2.875em;
  min-width:2.875em;
  min-height:2.875em;
}
.tv-magic .tvm-result-restart{
  margin-top:3.125em;
}

/* On narrow layouts the definition grids collapse back to a natural reading edge. */
@media(max-width:30em){
  .tv-magic .tvm-summary-grid,
  .tv-magic .tvm-grid{
    grid-template-columns:1fr;
  }
  .tv-magic .tvm-share-btn{
    width:2.875em;
    height:2.875em;
    min-width:2.875em;
    min-height:2.875em;
  }
}

/*
  Hover no longer lifts controls.
  Position remains fixed; only material/contrast changes.
  Press remains a small downward/physical scale response.
*/
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-control:hover:not(:disabled){
    transform:none !important;
  }
  .tv-magic .tvm-btn:hover:not(:disabled){
    background:var(--tvm-surface-strong);
  }
  .tv-magic .tvm-btn.is-ghost:hover:not(:disabled),
  .tv-magic .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-focus-toggle:hover:not(:disabled){
    background:transparent;
    color:var(--tvm-ink);
    opacity:1;
  }
  .tv-magic .tvm-share-btn:hover:not(:disabled){
    background:rgba(255,255,255,.62);
    border-color:rgba(32,38,36,.20);
  }
}
.tv-magic .tvm-control:active:not(:disabled){
  transform:scale(.975);
}
.tv-magic .tvm-choice:active:not(:disabled){
  transform:scale(.985);
}
.tv-magic .tvm-share-btn:active:not(:disabled){
  transform:scale(.97);
}


/* =========================================================
   v4.2 — Grouped result laws / prompt alignment / hover state contract
   Inspired by Library v8.8 + Osaka Guide v11.0 interaction semantics.
   ========================================================= */

/* Result laws: one centered semantic group, without a static Glass card. */
.tv-magic .tvm-summary-section{
  text-align:center;
}
.tv-magic .tvm-law-group{
  width:min(36em,100%);
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.tv-magic .tvm-summary-section .tvm-result-section-title{
  margin-bottom:1.5em;
  text-align:center;
}
.tv-magic .tvm-law-list,
.tv-magic .tvm-summary-grid,
.tv-magic .tvm-grid{
  display:grid;
  grid-template-columns:1fr;
  gap:1.15em;
  width:100%;
  margin:0 auto;
  text-align:center;
}
.tv-magic .tvm-law-row{
  display:grid;
  grid-template-columns:1fr;
  gap:.2em;
  justify-items:center;
  min-width:0;
  text-align:center;
}
.tv-magic .tvm-law-row dt,
.tv-magic .tvm-law-row dd,
.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-summary-grid dd,
.tv-magic .tvm-grid dt,
.tv-magic .tvm-grid dd{
  width:100%;
  margin:0;
  text-align:center;
}
.tv-magic .tvm-law-row dt{
  color:var(--tvm-muted);
  font-size:.86em;
  line-height:1.5;
}
.tv-magic .tvm-law-row dd{
  color:var(--tvm-ink);
  line-height:1.72;
}
.tv-magic .tvm-law-row--ontology{
  width:min(34em,100%);
  margin-left:auto;
  margin-right:auto;
}
.tv-magic .tvm-law-row--ontology dd{
  max-width:34em;
}
.tv-magic .tvm-summary-section .tvm-detail{
  text-align:center;
}
.tv-magic .tvm-summary-section .tvm-detail-title{
  margin-bottom:1.35em;
  text-align:center;
}

/* Carry prompt: the whole subsection is centered as a unit.
   Long prompt contents remain left-aligned inside the textarea. */
.tv-magic .tvm-prompt-group{
  width:min(38em,100%);
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.tv-magic .tvm-carry-section .tvm-prompt-heading{
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.tv-magic .tvm-carry-section .tvm-prompt{
  display:block;
  width:100%;
  max-width:38em;
  margin-left:auto;
  margin-right:auto;
  text-align:left;
}
.tv-magic .tvm-carry-section .tvm-note{
  max-width:34em;
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

/* -----------------------------------------
   Interaction state contract
   rest -> hover -> focus -> active/selected
   Hover never moves the control.
----------------------------------------- */
.tv-magic{
  --tvm-hover-soft:rgba(106,125,137,.055);
  --tvm-hover-medium:rgba(106,125,137,.075);
  --tvm-hover-line:rgba(32,38,36,.18);
  --tvm-focus-soft:rgba(106,125,137,.10);
  --tvm-selected-line:rgba(32,38,36,.22);
}

/* Ghost navigation: color/opacity only. */
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-result-restart .tvm-btn:hover:not(:disabled),
  .tv-magic .tvm-focus-toggle:hover:not(:disabled){
    transform:none !important;
    background:transparent !important;
    border-color:transparent !important;
    color:var(--tvm-ink) !important;
    opacity:1;
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }

  /* Primary actions: subtle fill only. */
  .tv-magic .tvm-btn.is-primary:hover:not(:disabled){
    transform:none !important;
    background:var(--tvm-hover-medium) !important;
    border-color:rgba(32,38,36,.14) !important;
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }

  /* Language selector: quiet surface; active state remains authoritative. */
  .tv-magic .tvm-lang:hover:not(.is-active):not(:disabled){
    transform:none !important;
    background:var(--tvm-hover-soft) !important;
    color:var(--tvm-ink);
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }
  .tv-magic .tvm-lang.is-active:hover{
    transform:none !important;
    background:var(--tvm-clear) !important;
  }

  /* Choice: surface + border, but selected always wins over hover. */
  .tv-magic .tvm-choice:hover:not(.is-selected):not(:disabled){
    transform:none !important;
    background:var(--tvm-hover-soft) !important;
    border-color:var(--tvm-hover-line) !important;
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }
  .tv-magic .tvm-choice.is-selected:hover{
    transform:none !important;
    background:var(--tvm-veil-solid) !important;
    border-color:var(--tvm-selected-line) !important;
  }

  /* Share icons: gentle material increase. */
  .tv-magic .tvm-share-btn:hover:not(:disabled){
    transform:none !important;
    background:var(--tvm-hover-soft);
    border-color:var(--tvm-hover-line);
    opacity:1;
  }

  /* Tooltip is the preview layer: opacity + scale, never button lift. */
  .tv-magic .tvm-share-btn::after{
    transform:translateX(-50%) scale(.94);
    transform-origin:50% 100%;
  }
  .tv-magic .tvm-share-btn:hover::after,
  .tv-magic .tvm-share-btn:focus-visible::after{
    transform:translateX(-50%) scale(1);
  }
}

/* Focus is deliberately stronger than hover. */
.tv-magic .tvm-btn:focus-visible,
.tv-magic .tvm-choice:focus-visible,
.tv-magic .tvm-back:focus-visible,
.tv-magic .tvm-lang:focus-visible,
.tv-magic .tvm-focus-toggle:focus-visible,
.tv-magic .tvm-share-btn:focus-visible{
  outline:var(--tvm-focus-ring);
  outline-offset:var(--tvm-focus-offset);
}
.tv-magic .tvm-choice:focus-visible{
  background:var(--tvm-focus-soft);
  border-color:rgba(32,38,36,.28);
}

/* Press stays physical. */
.tv-magic .tvm-btn:active:not(:disabled),
.tv-magic .tvm-lang:active:not(:disabled),
.tv-magic .tvm-back:active:not(:disabled),
.tv-magic .tvm-focus-toggle:active:not(:disabled){
  transform:scale(.975);
}
.tv-magic .tvm-choice:active:not(:disabled){
  transform:scale(.985);
}
.tv-magic .tvm-share-btn:active:not(:disabled){
  transform:scale(.97);
}

@media(max-width:30em){
  .tv-magic .tvm-law-group,
  .tv-magic .tvm-prompt-group{
    width:100%;
  }
  .tv-magic .tvm-law-row--ontology{
    width:100%;
  }
}

@media(prefers-reduced-motion:reduce){
  .tv-magic .tvm-share-btn::after{
    transform:translateX(-50%) scale(1) !important;
  }
}


/* =========================================================
   v4.3 — Typography consolidation + unified control states
   ========================================================= */

.tv-magic{
  /* -------------------------------------------------------
     Typography — non-heading text uses only four base styles.
     Bold / italic / muted are modifiers, not new type styles.
     ------------------------------------------------------- */
  --tvm-text-body-size:1em;
  --tvm-text-body-weight:400;
  --tvm-text-body-line:1.75;
  --tvm-text-body-track:0;

  --tvm-text-ui-size:1em;
  --tvm-text-ui-weight:400;
  --tvm-text-ui-line:1.5;
  --tvm-text-ui-track:0;

  --tvm-text-meta-size:.8125em;
  --tvm-text-meta-weight:400;
  --tvm-text-meta-line:1.6;
  --tvm-text-meta-track:.03em;

  --tvm-text-code-size:.8125em;
  --tvm-text-code-weight:400;
  --tvm-text-code-line:1.65;
  --tvm-text-code-track:0;

  --tvm-weight-regular:400;
  --tvm-weight-medium:560;
  --tvm-weight-semibold:600;
  --tvm-weight-bold:700;

  /* -------------------------------------------------------
     Unified control state tokens.
     Every button/control uses the same rest → hover → focus
     → active state change. Shape may differ; behavior does not.
     ------------------------------------------------------- */
  --tvm-control-rest-bg:rgba(255,255,255,.28);
  --tvm-control-rest-border:rgba(32,38,36,.11);
  --tvm-control-rest-color:var(--tvm-ink);

  --tvm-control-hover-bg:rgba(106,125,137,.065);
  --tvm-control-hover-border:rgba(32,38,36,.18);
  --tvm-control-hover-color:var(--tvm-ink);

  --tvm-control-focus-bg:rgba(106,125,137,.10);
  --tvm-control-focus-border:rgba(32,38,36,.28);

  --tvm-control-active-bg:rgba(106,125,137,.12);
  --tvm-control-active-scale:.975;

  --tvm-control-selected-bg:rgba(255,255,255,.46);
  --tvm-control-selected-border:rgba(32,38,36,.22);
  --tvm-control-disabled-opacity:.52;
}

/* ---------------------------------------------------------
   Text / Body
   --------------------------------------------------------- */
.tv-magic .tvm-lead,
.tv-magic .tvm-core,
.tv-magic .tvm-summary-grid dd,
.tv-magic .tvm-grid dd,
.tv-magic .tvm-carry-lead,
.tv-magic .tvm-error{
  font-size:var(--tvm-text-body-size);
  font-weight:var(--tvm-text-body-weight);
  line-height:var(--tvm-text-body-line);
  letter-spacing:var(--tvm-text-body-track);
}

/* ---------------------------------------------------------
   Text / UI
   --------------------------------------------------------- */
.tv-magic .tvm-btn,
.tv-magic .tvm-choice,
.tv-magic .tvm-lang,
.tv-magic .tvm-back,
.tv-magic .tvm-focus-toggle,
.tv-magic .tvm-share-btn{
  font-size:var(--tvm-text-ui-size);
  font-weight:var(--tvm-text-ui-weight);
  line-height:var(--tvm-text-ui-line);
  letter-spacing:var(--tvm-text-ui-track);
}

/* ---------------------------------------------------------
   Text / Meta
   --------------------------------------------------------- */
.tv-magic .tvm-kicker,
.tv-magic .tvm-name,
.tv-magic .tvm-question-meta,
.tv-magic .tvm-progress-meta,
.tv-magic .tvm-helper,
.tv-magic .tvm-note,
.tv-magic .tvm-detail-title,
.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-grid dt,
.tv-magic .tvm-state-copy,
.tv-magic .tvm-share-btn::after{
  font-size:var(--tvm-text-meta-size);
  font-weight:var(--tvm-text-meta-weight);
  line-height:var(--tvm-text-meta-line);
  letter-spacing:var(--tvm-text-meta-track);
}

/* Semantic labels use the same Meta style + Semibold modifier. */
.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-grid dt{
  font-weight:var(--tvm-weight-semibold);
}

/* ---------------------------------------------------------
   Text / Code
   --------------------------------------------------------- */
.tv-magic .tvm-pre,
.tv-magic .tvm-prompt{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:var(--tvm-text-code-size);
  font-weight:var(--tvm-text-code-weight);
  line-height:var(--tvm-text-code-line);
  letter-spacing:var(--tvm-text-code-track);
}

/* Modifiers — optional, not separate typography styles. */
.tv-magic .is-medium{font-weight:var(--tvm-weight-medium)}
.tv-magic .is-semibold{font-weight:var(--tvm-weight-semibold)}
.tv-magic .is-bold{font-weight:var(--tvm-weight-bold)}
.tv-magic .is-italic{font-style:italic}
.tv-magic .is-muted{color:var(--tvm-muted)}

/* ---------------------------------------------------------
   Result laws — preserve the prior two-column structure,
   but center the whole information group.
   --------------------------------------------------------- */
.tv-magic .tvm-summary-section{
  text-align:center;
}
.tv-magic .tvm-law-group{
  width:min(38em,100%);
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}
.tv-magic .tvm-summary-section .tvm-result-section-title{
  text-align:center;
  margin-bottom:1.5em;
}
.tv-magic .tvm-summary-grid,
.tv-magic .tvm-grid{
  display:grid;
  grid-template-columns:minmax(7.8em,max-content) minmax(0,1fr);
  gap:.72em 1.15em;
  width:min(34em,100%);
  margin-left:auto;
  margin-right:auto;
  text-align:left;
}
.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-grid dt{
  margin:0;
  text-align:right;
  color:var(--tvm-muted);
}
.tv-magic .tvm-summary-grid dd,
.tv-magic .tvm-grid dd{
  margin:0;
  text-align:left;
  overflow-wrap:anywhere;
}
.tv-magic .tvm-summary-section .tvm-detail{
  text-align:center;
}
.tv-magic .tvm-summary-section .tvm-detail-title{
  margin-bottom:1.35em;
  text-align:center;
}
.tv-magic .tvm-grid--secondary{
  width:min(34em,100%);
}
.tv-magic .tvm-grid--secondary dd:last-child{
  max-width:24em;
}

/* ---------------------------------------------------------
   Unified control behavior.
   --------------------------------------------------------- */

/* Base rest state. */
.tv-magic .tvm-control,
.tv-magic .tvm-lang,
.tv-magic .tvm-choice,
.tv-magic .tvm-btn,
.tv-magic .tvm-back,
.tv-magic .tvm-focus-toggle,
.tv-magic .tvm-share-btn{
  color:var(--tvm-control-rest-color);
  transform:none;
}

/* Surface-bearing controls use shared rest tokens. */
.tv-magic .tvm-btn:not(.is-ghost),
.tv-magic .tvm-choice,
.tv-magic .tvm-lang,
.tv-magic .tvm-share-btn{
  background:var(--tvm-control-rest-bg);
  border-color:var(--tvm-control-rest-border);
}

/* Ghost/navigation controls stay transparent at rest. */
.tv-magic .tvm-btn.is-ghost,
.tv-magic .tvm-back,
.tv-magic .tvm-focus-toggle{
  background:transparent;
  border-color:transparent;
  box-shadow:none;
  -webkit-backdrop-filter:none;
  backdrop-filter:none;
}

/* Selected state is persistent and wins over hover. */
.tv-magic .tvm-choice.is-selected,
.tv-magic .tvm-lang.is-active{
  background:var(--tvm-control-selected-bg);
  border-color:var(--tvm-control-selected-border);
}

/* Hover: all buttons change the same properties and never move. */
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-control:hover:not(:disabled),
  .tv-magic .tvm-lang:hover:not(:disabled),
  .tv-magic .tvm-choice:hover:not(:disabled),
  .tv-magic .tvm-btn:hover:not(:disabled),
  .tv-magic .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-focus-toggle:hover:not(:disabled),
  .tv-magic .tvm-share-btn:hover:not(:disabled){
    transform:none !important;
    color:var(--tvm-control-hover-color) !important;
  }

  .tv-magic .tvm-btn:not(.is-ghost):hover:not(:disabled),
  .tv-magic .tvm-choice:hover:not(.is-selected):not(:disabled),
  .tv-magic .tvm-lang:hover:not(.is-active):not(:disabled),
  .tv-magic .tvm-share-btn:hover:not(:disabled){
    background:var(--tvm-control-hover-bg) !important;
    border-color:var(--tvm-control-hover-border) !important;
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }

  .tv-magic .tvm-btn.is-ghost:hover:not(:disabled),
  .tv-magic .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-focus-toggle:hover:not(:disabled){
    background:transparent !important;
    border-color:transparent !important;
    box-shadow:none !important;
  }

  .tv-magic .tvm-choice.is-selected:hover,
  .tv-magic .tvm-lang.is-active:hover{
    background:var(--tvm-control-selected-bg) !important;
    border-color:var(--tvm-control-selected-border) !important;
  }
}

/* Focus-visible: same across all control types and stronger than hover. */
.tv-magic .tvm-control:focus-visible,
.tv-magic .tvm-lang:focus-visible,
.tv-magic .tvm-choice:focus-visible,
.tv-magic .tvm-btn:focus-visible,
.tv-magic .tvm-back:focus-visible,
.tv-magic .tvm-focus-toggle:focus-visible,
.tv-magic .tvm-share-btn:focus-visible{
  outline:var(--tvm-focus-ring);
  outline-offset:var(--tvm-focus-offset);
}
.tv-magic .tvm-btn:not(.is-ghost):focus-visible,
.tv-magic .tvm-choice:focus-visible,
.tv-magic .tvm-lang:focus-visible,
.tv-magic .tvm-share-btn:focus-visible{
  background:var(--tvm-control-focus-bg);
  border-color:var(--tvm-control-focus-border);
}

/* Press: same physical rule everywhere. */
.tv-magic .tvm-control:active:not(:disabled),
.tv-magic .tvm-lang:active:not(:disabled),
.tv-magic .tvm-choice:active:not(:disabled),
.tv-magic .tvm-btn:active:not(:disabled),
.tv-magic .tvm-back:active:not(:disabled),
.tv-magic .tvm-focus-toggle:active:not(:disabled),
.tv-magic .tvm-share-btn:active:not(:disabled){
  transform:scale(var(--tvm-control-active-scale)) !important;
}
.tv-magic .tvm-btn:not(.is-ghost):active:not(:disabled),
.tv-magic .tvm-choice:active:not(:disabled),
.tv-magic .tvm-lang:active:not(:disabled),
.tv-magic .tvm-share-btn:active:not(:disabled){
  background:var(--tvm-control-active-bg) !important;
}

/* Disabled: same opacity across controls. */
.tv-magic .tvm-control:disabled,
.tv-magic .tvm-lang:disabled,
.tv-magic .tvm-choice:disabled,
.tv-magic .tvm-btn:disabled,
.tv-magic .tvm-back:disabled,
.tv-magic .tvm-focus-toggle:disabled,
.tv-magic .tvm-share-btn:disabled,
.tv-magic [aria-disabled="true"]{
  opacity:var(--tvm-control-disabled-opacity);
  cursor:default;
  transform:none !important;
}

/* Tooltip remains a separate preview layer. */
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-share-btn::after{
    transform:translateX(-50%) scale(.94);
    transform-origin:50% 100%;
  }
  .tv-magic .tvm-share-btn:hover::after,
  .tv-magic .tvm-share-btn:focus-visible::after{
    transform:translateX(-50%) scale(1);
  }
}

/* Mobile: keep the two-column information relation as long as practical.
   Collapse only at genuinely narrow widths. */
@media(max-width:23em){
  .tv-magic .tvm-summary-grid,
  .tv-magic .tvm-grid{
    grid-template-columns:1fr;
    gap:.18em;
    width:100%;
  }
  .tv-magic .tvm-summary-grid dt,
  .tv-magic .tvm-grid dt,
  .tv-magic .tvm-summary-grid dd,
  .tv-magic .tvm-grid dd{
    text-align:center;
  }
  .tv-magic .tvm-summary-grid dd,
  .tv-magic .tvm-grid dd{
    margin-bottom:.6em;
  }
}

@media(prefers-reduced-motion:reduce){
  .tv-magic .tvm-control,
  .tv-magic .tvm-lang,
  .tv-magic .tvm-choice,
  .tv-magic .tvm-btn,
  .tv-magic .tvm-back,
  .tv-magic .tvm-focus-toggle,
  .tv-magic .tvm-share-btn,
  .tv-magic .tvm-share-btn::after{
    transition:none !important;
  }
}


/* =========================================================
   v4.4 — viewport-aware composition + compact laws + focus scale
   ========================================================= */

.tv-magic{
  --tvm-focus-frame-width:min(42em,78dvw);
  --tvm-focus-question-size:clamp(2em,2.6vw,2.8em);
  --tvm-focus-choice-size:clamp(1em,1.05vw,1.125em);
  --tvm-focus-choice-height:3.6em;
  --tvm-focus-top-space:clamp(4em,9dvh,7.5em);
  --tvm-focus-question-gap:clamp(1.45em,2.6dvh,2.3em);
  --tvm-focus-choice-gap:clamp(.65em,1.05dvh,.95em);

  --tvm-result-fluid-width:min(44em,88dvw);
  --tvm-prompt-fluid-width:min(38em,86dvw);
  --tvm-law-fluid-width:min(24em,72dvw);
  --tvm-major-section-space:clamp(2.5em,5dvh,5em);
}

/* Large-display text can breathe with the viewport but remains clamped. */
.tv-magic .tvm-hero{
  font-size:clamp(2.125em,3.15vw,3.25em);
}
.tv-magic .tvm-result-name{
  font-size:clamp(1.9em,2.7vw,2.75em);
}

/* Result / prompt / law widths use dvw where screen-relative sizing is useful. */
.tv-magic .tvm-result-screen{
  width:var(--tvm-result-fluid-width);
  max-width:100%;
  margin-left:auto;
  margin-right:auto;
}
.tv-magic .tvm-prompt-group{
  width:var(--tvm-prompt-fluid-width);
  max-width:100%;
}
.tv-magic .tvm-prompt{
  width:100%;
  max-width:100%;
}
.tv-magic .tvm-law-group{
  width:var(--tvm-law-fluid-width);
  max-width:100%;
}

/* Compact central law column — prior two-column structure preserved. */
.tv-magic .tvm-summary-grid,
.tv-magic .tvm-grid{
  width:100%;
  grid-template-columns:max-content minmax(0,1fr);
  column-gap:1em;
  row-gap:.58em;
}
.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-grid dt{
  white-space:nowrap;
}
.tv-magic .tvm-summary-section .tvm-result-section-title{
  margin-bottom:1.25em;
}
.tv-magic .tvm-summary-section .tvm-detail-title{
  margin-bottom:1.15em;
}
.tv-magic .tvm-spacer--detail-section{
  height:clamp(2em,3.6dvh,3.25em);
}

/* Major result rhythm follows viewport height only where the separation is structural. */
.tv-magic .tvm-carry,
.tv-magic .tvm-share{
  margin-top:var(--tvm-major-section-space);
}

/* ---------------------------------------------------------
   Focus = a dedicated enlarged full-screen composition.
   Progress, focus control, question, choices and Back use
   one shared coordinate frame.
   --------------------------------------------------------- */
.tv-magic.is-focus .tvm-screen{
  width:100%;
  max-width:none;
}

.tv-magic.is-focus .tvm-question-frame{
  width:var(--tvm-focus-frame-width);
  max-width:100%;
  margin-left:auto;
  margin-right:auto;
  padding-top:var(--tvm-focus-top-space);
}

.tv-magic.is-focus .tvm-question-header,
.tv-magic.is-focus .tvm-progress-wrap,
.tv-magic.is-focus .tvm-question-shell,
.tv-magic.is-focus .tvm-backrow{
  width:100%;
  max-width:none;
  margin-left:auto;
  margin-right:auto;
}

.tv-magic.is-focus .tvm-question-header{
  position:relative;
  display:flex;
  align-items:center;
  justify-content:space-between;
}

.tv-magic.is-focus .tvm-progress{
  margin-top:clamp(.8em,1.4dvh,1.25em);
}

.tv-magic.is-focus .tvm-question{
  font-size:var(--tvm-focus-question-size);
  line-height:1.3;
  letter-spacing:-.024em;
  max-width:100%;
}

.tv-magic.is-focus .tvm-question-shell{
  margin-top:clamp(1.55em,2.8dvh,2.5em);
}

.tv-magic.is-focus .tvm-choices{
  margin-top:var(--tvm-focus-question-gap);
  display:grid;
  gap:var(--tvm-focus-choice-gap);
}

.tv-magic.is-focus .tvm-choice{
  width:100%;
  min-height:var(--tvm-focus-choice-height);
  font-size:var(--tvm-focus-choice-size);
  padding:.82em 1.05em;
}

.tv-magic.is-focus .tvm-backrow{
  margin-top:clamp(1.2em,2.2dvh,2em);
}

.tv-magic.is-focus .tvm-back{
  font-size:clamp(1em,.9vw,1.075em);
}

.tv-magic.is-focus .tvm-question-meta,
.tv-magic.is-focus .tvm-progress-meta{
  font-size:clamp(.8125em,.78vw,.9em);
}

.tv-magic.is-focus .tvm-focus-toggle{
  width:3em;
  height:3em;
}
.tv-magic.is-focus .tvm-margin__fullscreenIcon,
.tv-magic.is-focus .tvm-focus-icon,
.tv-magic.is-focus .tvm-focus-toggle svg{
  width:1.7em;
  height:1.7em;
}

/* Short viewports: preserve usable composition without overfilling. */
@media(max-height:42em){
  .tv-magic.is-focus{
    --tvm-focus-top-space:clamp(2.25em,5.5dvh,4em);
    --tvm-focus-question-size:clamp(1.72em,2.35vw,2.25em);
    --tvm-focus-choice-height:3.15em;
    --tvm-focus-question-gap:clamp(1em,1.8dvh,1.45em);
    --tvm-focus-choice-gap:.52em;
  }
}

/* Narrow portrait: viewport-aware width, component internals remain em based. */
@media(max-width:30em){
  .tv-magic{
    --tvm-focus-frame-width:min(34em,calc(100dvw - 2em));
    --tvm-focus-question-size:clamp(1.72em,7.1vw,2.2em);
    --tvm-focus-choice-size:1em;
    --tvm-focus-top-space:clamp(3em,7dvh,5em);
    --tvm-result-fluid-width:min(44em,calc(100dvw - 1.5em));
    --tvm-prompt-fluid-width:min(38em,calc(100dvw - 1.5em));
    --tvm-law-fluid-width:min(24em,calc(100dvw - 2em));
  }
}

/* Existing very-narrow one-column law fallback remains readable. */
@media(max-width:23em){
  .tv-magic .tvm-summary-grid,
  .tv-magic .tvm-grid{
    grid-template-columns:1fr;
  }
}


/* =========================================================
   v4.5 — Experience Mode
   Start / Question / Result share one Focus canvas.
   ========================================================= */

.tv-magic{
  --tvm-experience-bg:#efeee9;
  --tvm-experience-inline:min(72em,92dvw);
  --tvm-experience-top:clamp(3.5em,7dvh,6.5em);
  --tvm-experience-bottom:clamp(4em,8dvh,7em);

  --tvm-start-width:min(42em,76dvw);
  --tvm-start-top:clamp(5em,12dvh,9em);
  --tvm-start-hero-size:clamp(2.35em,3.2vw,3.8em);
  --tvm-start-lead-size:clamp(1em,1.02vw,1.125em);

  --tvm-result-body-size:clamp(1.075em,1.15vw,1.2em);
  --tvm-result-meta-size:clamp(.8125em,.78vw,.9em);
  --tvm-result-ui-size:clamp(1.025em,1vw,1.1em);
  --tvm-result-fluid-width:min(48em,86dvw);
  --tvm-prompt-fluid-width:min(40em,80dvw);
  --tvm-law-fluid-width:min(29em,68dvw);
  --tvm-result-section-space:clamp(2em,2.7dvh,3.4em);
  --tvm-result-small-space:clamp(1.1em,1.6dvh,1.8em);

  --tvm-focus-progress-width:min(16em,28dvw);
}

/* Full-screen Experience canvas */
.tv-magic.is-focus{
  background:var(--tvm-experience-bg);
  min-height:100dvh;
}

.tv-magic.is-focus .tvm-screen{
  max-width:none;
}

.tv-magic.is-focus .tvm-entry,
.tv-magic.is-focus .tvm-question-screen,
.tv-magic.is-focus .tvm-result-screen{
  width:var(--tvm-experience-inline);
  max-width:100%;
  margin-left:auto;
  margin-right:auto;
}

/* Shared Focus toggle across all screens */
.tv-magic.is-focus .tvm-experience-toggle .tvm-focus-toggle,
.tv-magic.is-focus > .tvm-focus-toggle,
.tv-magic.is-focus .tvm-focus-toggle{
  position:fixed;
  top:max(1.25em,env(safe-area-inset-top));
  right:max(1.25em,env(safe-area-inset-right));
  z-index:30;
}

/* ---------------------------------------------------------
   Start — a real full-screen gateway
   --------------------------------------------------------- */
.tv-magic.is-focus .tvm-entry{
  min-height:100dvh;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:flex-start;
  padding-top:var(--tvm-start-top);
  padding-bottom:var(--tvm-experience-bottom);
  text-align:center;
}

.tv-magic.is-focus .tvm-entry > *{
  max-width:var(--tvm-start-width);
}

.tv-magic.is-focus .tvm-entry .tvm-hero{
  font-size:var(--tvm-start-hero-size);
  line-height:1.08;
  letter-spacing:-.034em;
}

.tv-magic.is-focus .tvm-entry .tvm-lead{
  font-size:var(--tvm-start-lead-size);
  line-height:1.8;
  max-width:34em;
}

.tv-magic.is-focus .tvm-entry .tvm-language{
  font-size:clamp(1em,.92vw,1.08em);
}

.tv-magic.is-focus .tvm-entry .tvm-btn{
  min-height:3.25em;
  font-size:clamp(1em,.92vw,1.08em);
}

/* Existing entry spacers should not force the old WP-embedded vertical rhythm. */
.tv-magic.is-focus .tvm-entry .tvm-spacer--entry-top{
  height:0;
}

/* ---------------------------------------------------------
   Question — preserve v4.4 scale, refine vertical balance
   --------------------------------------------------------- */
.tv-magic.is-focus .tvm-question-frame{
  padding-top:clamp(4.75em,10dvh,8.25em);
}

.tv-magic.is-focus .tvm-progress{
  width:var(--tvm-focus-progress-width);
  max-width:44%;
  margin-left:0;
  margin-right:auto;
}

.tv-magic.is-focus .tvm-progress-track{
  width:100%;
}

.tv-magic.is-focus .tvm-question-shell{
  margin-top:clamp(1.7em,3dvh,2.7em);
}

/* ---------------------------------------------------------
   Result — full-screen destination
   --------------------------------------------------------- */
.tv-magic.is-focus .tvm-result-screen{
  width:var(--tvm-result-fluid-width);
  max-width:100%;
  min-height:100dvh;
  padding-top:var(--tvm-experience-top);
  padding-bottom:var(--tvm-experience-bottom);
  margin-left:auto;
  margin-right:auto;
}

.tv-magic.is-focus .tvm-result-name{
  font-size:clamp(2.2em,3vw,3.25em);
  line-height:1.12;
}

/* Same four typography families, scaled contextually rather than adding new styles. */
.tv-magic.is-focus .tvm-result-screen .tvm-lead,
.tv-magic.is-focus .tvm-result-screen .tvm-core,
.tv-magic.is-focus .tvm-result-screen .tvm-summary-grid dd,
.tv-magic.is-focus .tvm-result-screen .tvm-grid dd,
.tv-magic.is-focus .tvm-result-screen .tvm-carry-lead,
.tv-magic.is-focus .tvm-result-screen .tvm-error{
  font-size:var(--tvm-result-body-size);
}

.tv-magic.is-focus .tvm-result-screen .tvm-kicker,
.tv-magic.is-focus .tvm-result-screen .tvm-name,
.tv-magic.is-focus .tvm-result-screen .tvm-helper,
.tv-magic.is-focus .tvm-result-screen .tvm-note,
.tv-magic.is-focus .tvm-result-screen .tvm-detail-title,
.tv-magic.is-focus .tvm-result-screen .tvm-summary-grid dt,
.tv-magic.is-focus .tvm-result-screen .tvm-grid dt,
.tv-magic.is-focus .tvm-result-screen .tvm-state-copy,
.tv-magic.is-focus .tvm-result-screen .tvm-share-btn::after{
  font-size:var(--tvm-result-meta-size);
}

.tv-magic.is-focus .tvm-result-screen .tvm-btn,
.tv-magic.is-focus .tvm-result-screen .tvm-share-btn{
  font-size:var(--tvm-result-ui-size);
}

.tv-magic.is-focus .tvm-core{
  max-width:38em;
  margin-left:auto;
  margin-right:auto;
  line-height:1.82;
}

/* Correct v4.4's small-text / large-gap imbalance. */
.tv-magic.is-focus .tvm-result-screen .tvm-result-section,
.tv-magic.is-focus .tvm-result-screen .tvm-carry,
.tv-magic.is-focus .tvm-result-screen .tvm-prompt-group,
.tv-magic.is-focus .tvm-result-screen .tvm-share,
.tv-magic.is-focus .tvm-result-screen .tvm-result-restart{
  margin-top:var(--tvm-result-section-space);
}

.tv-magic.is-focus .tvm-result-screen .tvm-spacer--detail-section{
  height:var(--tvm-result-small-space);
}

/* Law column: still compact, but no longer over-compressed. */
.tv-magic.is-focus .tvm-law-group{
  width:var(--tvm-law-fluid-width);
  max-width:100%;
}

.tv-magic.is-focus .tvm-summary-grid,
.tv-magic.is-focus .tvm-grid{
  width:100%;
  grid-template-columns:max-content minmax(0,1fr);
  column-gap:1.15em;
  row-gap:.62em;
}

.tv-magic.is-focus .tvm-summary-grid dd,
.tv-magic.is-focus .tvm-grid dd{
  line-height:1.7;
}

.tv-magic.is-focus .tvm-grid--secondary dd:last-child{
  max-width:none;
}

/* Prompt expands with Result, but text itself remains left aligned. */
.tv-magic.is-focus .tvm-prompt-group{
  width:var(--tvm-prompt-fluid-width);
  max-width:100%;
}

.tv-magic.is-focus .tvm-prompt{
  min-height:10em;
  max-height:24em;
}

/* ---------------------------------------------------------
   Responsive tuning
   --------------------------------------------------------- */
@media(max-width:48em){
  .tv-magic{
    --tvm-experience-inline:min(44em,calc(100dvw - 2em));
    --tvm-start-width:min(36em,calc(100dvw - 2em));
    --tvm-result-fluid-width:min(44em,calc(100dvw - 2em));
    --tvm-prompt-fluid-width:min(38em,calc(100dvw - 2em));
    --tvm-law-fluid-width:min(29em,calc(100dvw - 2em));
  }
}

@media(max-width:30em){
  .tv-magic{
    --tvm-start-top:clamp(3.5em,8dvh,5.5em);
    --tvm-start-hero-size:clamp(2em,8.4vw,2.65em);
    --tvm-start-lead-size:1em;

    --tvm-result-body-size:1em;
    --tvm-result-meta-size:.8125em;
    --tvm-result-ui-size:1em;

    --tvm-law-fluid-width:min(26em,calc(100dvw - 2em));
    --tvm-result-section-space:clamp(1.8em,2.4dvh,2.7em);
  }

  .tv-magic.is-focus .tvm-result-name{
    font-size:clamp(2em,8.4vw,2.7em);
  }
}

@media(max-height:42em){
  .tv-magic{
    --tvm-start-top:clamp(2.5em,6dvh,4em);
    --tvm-experience-top:clamp(2.5em,5dvh,4em);
    --tvm-experience-bottom:clamp(2.5em,5dvh,4em);
  }

  .tv-magic.is-focus .tvm-question-frame{
    padding-top:clamp(2.5em,5.5dvh,4.2em);
  }
}


/* =========================================================
   v4.6 — result axis / keyboard-ready controls / button sizing
   ========================================================= */

.tv-magic{
  --tvm-result-axis-width:min(40em,78dvw);

  --tvm-language-button-height:3.25em;
  --tvm-primary-button-height:3.5em;
  --tvm-share-button-size:3.25em;
}

/* ---------------------------------------------------------
   Back: text only in both Normal and Focus.
   --------------------------------------------------------- */
.tv-magic .tvm-back::before,
.tv-magic.is-focus .tvm-question-frame .tvm-back::before{
  content:none !important;
  display:none !important;
}

/* ---------------------------------------------------------
   Question vertical density
   Short content sits slightly lower; long/dense questions stay higher.
   --------------------------------------------------------- */
.tv-magic.is-focus .tvm-question-frame.is-density-relaxed{
  padding-top:clamp(5.75em,12dvh,9.5em);
}

.tv-magic.is-focus .tvm-question-frame.is-density-regular{
  padding-top:clamp(4.75em,9dvh,7.5em);
}

.tv-magic.is-focus .tvm-question-frame.is-density-dense{
  padding-top:clamp(3em,5.8dvh,5em);
}

@media(max-height:42em){
  .tv-magic.is-focus .tvm-question-frame.is-density-relaxed,
  .tv-magic.is-focus .tvm-question-frame.is-density-regular{
    padding-top:clamp(2.4em,5dvh,3.8em);
  }

  .tv-magic.is-focus .tvm-question-frame.is-density-dense{
    padding-top:clamp(1.75em,3.6dvh,2.8em);
  }
}

/* ---------------------------------------------------------
   Result: one central axis for Laws → AI carry → Share → Restart.
   --------------------------------------------------------- */
.tv-magic .tvm-result-axis{
  width:var(--tvm-result-axis-width);
  max-width:100%;
  margin-left:auto;
  margin-right:auto;
  text-align:center;
}

.tv-magic .tvm-result-axis > .tvm-result-section,
.tv-magic .tvm-result-axis > .tvm-result-restart{
  width:100%;
  margin-left:auto;
  margin-right:auto;
}

.tv-magic .tvm-result-axis .tvm-result-section-title,
.tv-magic .tvm-result-axis .tvm-detail-title,
.tv-magic .tvm-result-axis .tvm-share-title,
.tv-magic .tvm-result-axis .tvm-result-restart{
  text-align:center;
}

/* Law block: strict shared 2-column definition axis. */
.tv-magic .tvm-law-group{
  width:min(30em,100%);
  margin-left:auto;
  margin-right:auto;
}

.tv-magic .tvm-summary-grid,
.tv-magic .tvm-grid{
  width:100%;
  display:grid;
  grid-template-columns:max-content minmax(0,1fr);
  column-gap:1.15em;
  row-gap:.56em;
  margin-left:auto;
  margin-right:auto;
}

.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-grid dt{
  text-align:right;
  white-space:nowrap;
}

.tv-magic .tvm-summary-grid dd,
.tv-magic .tvm-grid dd{
  text-align:left;
  min-width:0;
  overflow-wrap:anywhere;
}

.tv-magic .tvm-grid--secondary dd:last-child{
  max-width:none;
}

/* Prompt can be wider inside the common result axis without shifting headings. */
.tv-magic .tvm-prompt-group{
  width:min(38em,100%);
  margin-left:auto;
  margin-right:auto;
}

/* ---------------------------------------------------------
   Button sizing: em-based, role-based.
   --------------------------------------------------------- */
.tv-magic .tvm-lang{
  min-height:var(--tvm-language-button-height);
  padding-inline:1.15em;
}

.tv-magic #tvmStart,
.tv-magic #tvmCopy{
  min-height:var(--tvm-primary-button-height);
  padding-inline:1.4em;
}

.tv-magic .tvm-share-btn{
  width:var(--tvm-share-button-size);
  height:var(--tvm-share-button-size);
  min-width:var(--tvm-share-button-size);
  min-height:var(--tvm-share-button-size);
  padding:0;
}

/* Keep the language group proportional to its children. */
.tv-magic .tvm-language{
  min-height:var(--tvm-language-button-height);
}

/* Mobile keeps the same em relationships. */
@media(max-width:30em){
  .tv-magic{
    --tvm-result-axis-width:min(38em,calc(100dvw - 1.5em));
  }

  .tv-magic .tvm-law-group{
    width:min(28em,100%);
  }
}

@media(max-width:23em){
  .tv-magic .tvm-summary-grid,
  .tv-magic .tvm-grid{
    grid-template-columns:1fr;
    row-gap:.18em;
  }

  .tv-magic .tvm-summary-grid dt,
  .tv-magic .tvm-grid dt,
  .tv-magic .tvm-summary-grid dd,
  .tv-magic .tvm-grid dd{
    text-align:center;
  }
}


/* =========================================================
   v4.7 — central-axis correction + unified Focus utility
   ========================================================= */

.tv-magic{
  --tvm-result-axis-width:min(42em,80dvw);
  --tvm-law-axis-width:min(34em,72dvw);

  /* Shared top-right utility geometry */
  --tvm-focus-control-size:2.75em;
  --tvm-focus-glyph-size:1.5em;
  --tvm-focus-edge-x:max(1.25em,env(safe-area-inset-right));
  --tvm-focus-edge-y:max(1.25em,env(safe-area-inset-top));
}

/* ---------------------------------------------------------
   Result: exact common center axis
   --------------------------------------------------------- */
.tv-magic .tvm-result-axis{
  width:var(--tvm-result-axis-width);
  max-width:100%;
  margin-inline:auto;
  text-align:center;
}

.tv-magic .tvm-result-axis > *{
  margin-left:auto;
  margin-right:auto;
}

.tv-magic .tvm-result-axis .tvm-summary-section,
.tv-magic .tvm-result-axis .tvm-carry,
.tv-magic .tvm-result-axis .tvm-share,
.tv-magic .tvm-result-axis .tvm-result-restart{
  width:100%;
  max-width:100%;
}

/* Headings share the exact geometric center. */
.tv-magic .tvm-result-axis .tvm-result-section-title,
.tv-magic .tvm-result-axis .tvm-detail-title,
.tv-magic .tvm-result-axis .tvm-carry-title,
.tv-magic .tvm-result-axis .tvm-prompt-heading,
.tv-magic .tvm-result-axis .tvm-share-title,
.tv-magic .tvm-result-axis .tvm-result-restart,
.tv-magic .tvm-result-axis .tvm-actions{
  width:100%;
  text-align:center;
  margin-left:auto;
  margin-right:auto;
}

/* Laws: two equal columns = center seam is always the page axis. */
.tv-magic .tvm-law-group{
  width:var(--tvm-law-axis-width);
  max-width:100%;
  margin-inline:auto;
}

.tv-magic .tvm-summary-grid,
.tv-magic .tvm-grid{
  width:100%;
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  column-gap:1.15em;
  row-gap:.58em;
  margin-inline:auto;
}

.tv-magic .tvm-summary-grid dt,
.tv-magic .tvm-grid dt{
  justify-self:stretch;
  text-align:right;
  white-space:normal;
}

.tv-magic .tvm-summary-grid dd,
.tv-magic .tvm-grid dd{
  justify-self:stretch;
  text-align:left;
  min-width:0;
  overflow-wrap:anywhere;
}

/* Prompt unit and box are centered on the same axis. */
.tv-magic .tvm-prompt-group{
  width:min(40em,100%);
  max-width:100%;
  margin-inline:auto;
  text-align:center;
}

.tv-magic .tvm-prompt{
  display:block;
  width:100%;
  margin-inline:auto;
  text-align:left;
}

/* Share row and restart remain centered within the same axis. */
.tv-magic .tvm-share-row,
.tv-magic #tvmShareRow{
  justify-content:center;
  margin-inline:auto;
}

.tv-magic .tvm-result-restart .tvm-actions{
  display:flex;
  justify-content:center;
}

/* ---------------------------------------------------------
   Focus utility: same glyph size, hit area and fixed position
   on Start / Question / Result.
   --------------------------------------------------------- */
.tv-magic .tvm-focus-toggle,
.tv-magic.is-focus .tvm-focus-toggle,
.tv-magic.is-focus .tvm-experience-toggle .tvm-focus-toggle,
.tv-magic.is-focus > .tvm-focus-toggle{
  position:fixed !important;
  top:var(--tvm-focus-edge-y) !important;
  right:var(--tvm-focus-edge-x) !important;
  left:auto !important;
  bottom:auto !important;
  width:var(--tvm-focus-control-size) !important;
  min-width:var(--tvm-focus-control-size) !important;
  height:var(--tvm-focus-control-size) !important;
  min-height:var(--tvm-focus-control-size) !important;
  padding:0 !important;
  z-index:30;
  display:inline-flex;
  align-items:center;
  justify-content:center;
}

.tv-magic .tvm-focus-toggle svg,
.tv-magic .tvm-focus-icon-enter,
.tv-magic .tvm-focus-icon-exit,
.tv-magic .tvm-margin__fullscreenIcon{
  width:var(--tvm-focus-glyph-size) !important;
  height:var(--tvm-focus-glyph-size) !important;
  flex:0 0 var(--tvm-focus-glyph-size);
}

/* Prevent question-header layout from reserving space for the fixed icon. */
.tv-magic.is-focus .tvm-question-header .tvm-focus-toggle{
  margin:0 !important;
}

/* ---------------------------------------------------------
   TMS resilience refinements carried into this component.
   --------------------------------------------------------- */
@supports not (backdrop-filter:blur(1px)){
  .tv-magic .tvm-btn,
  .tv-magic .tvm-choice,
  .tv-magic .tvm-lang,
  .tv-magic .tvm-share-btn,
  .tv-magic .tvm-prompt{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }
}

@media(forced-colors:active){
  .tv-magic .tvm-btn,
  .tv-magic .tvm-choice,
  .tv-magic .tvm-lang,
  .tv-magic .tvm-share-btn,
  .tv-magic .tvm-focus-toggle{
    background:Canvas !important;
    color:CanvasText !important;
    border:1px solid CanvasText !important;
    box-shadow:none !important;
  }

  .tv-magic .tvm-focus-toggle svg{
    stroke:CanvasText !important;
  }
}

@media(prefers-reduced-motion:reduce){
  .tv-magic *,
  .tv-magic *::before,
  .tv-magic *::after{
    scroll-behavior:auto !important;
  }
}

/* Narrow screens retain the same centered two-column seam until
   the existing very-narrow one-column fallback takes over. */
@media(max-width:30em){
  .tv-magic{
    --tvm-result-axis-width:min(40em,calc(100dvw - 1.5em));
    --tvm-law-axis-width:min(32em,calc(100dvw - 1.75em));
    --tvm-focus-edge-x:max(1em,env(safe-area-inset-right));
    --tvm-focus-edge-y:max(1em,env(safe-area-inset-top));
  }
}

@media(max-width:23em){
  .tv-magic .tvm-summary-grid,
  .tv-magic .tvm-grid{
    grid-template-columns:1fr;
  }

  .tv-magic .tvm-summary-grid dt,
  .tv-magic .tvm-grid dt,
  .tv-magic .tvm-summary-grid dd,
  .tv-magic .tvm-grid dd{
    text-align:center;
  }
}


/* v4.7.1 specificity correction: Experience Mode must use the same
   geometric center-axis rules as Normal mode. */
.tv-magic.is-focus .tvm-law-group{
  width:var(--tvm-law-axis-width);
  max-width:100%;
  margin-inline:auto;
}

.tv-magic.is-focus .tvm-summary-grid,
.tv-magic.is-focus .tvm-grid{
  width:100%;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  column-gap:1.15em;
  row-gap:.58em;
  margin-inline:auto;
}

.tv-magic.is-focus .tvm-prompt-group{
  width:min(40em,100%);
  max-width:100%;
  margin-inline:auto;
}


/* =========================================================
   v4.8 — PPE/TMS + Indextro integration
   Applicable source patterns only; Magic-specific UX preserved.
   ========================================================= */

.tv-magic{
  /* Semantic text / line system */
  --tvm-text-primary:var(--tvm-ink);
  --tvm-text-secondary:var(--tvm-muted);
  --tvm-text-tertiary:rgba(32,38,36,.52);
  --tvm-text-disabled:rgba(32,38,36,.38);

  --tvm-line-subtle:rgba(32,38,36,.08);
  --tvm-line-default:rgba(32,38,36,.14);
  --tvm-line-strong:rgba(32,38,36,.24);

  /* Semantic spacing aliases */
  --tvm-space-0:0;
  --tvm-space-1:.125em;
  --tvm-space-2:.25em;
  --tvm-space-3:.5em;
  --tvm-space-4:.75em;
  --tvm-space-5:1em;
  --tvm-space-6:1.5em;
  --tvm-space-7:2em;
  --tvm-space-8:3em;
  --tvm-space-9:4em;

  /* Interaction tokens */
  --tvm-target-min:2.75em;
  --tvm-target-comfort:3em;
  --tvm-opacity-hover:.92;
  --tvm-opacity-pressed:.82;
  --tvm-opacity-disabled:.42;

  /* Layer aliases */
  --tvm-layer-content:0;
  --tvm-layer-sticky:20;
  --tvm-layer-floating:40;
  --tvm-layer-popover:60;
  --tvm-layer-modal:80;
  --tvm-layer-toast:100;

  /* Safe-area aliases */
  --tvm-safe-top:env(safe-area-inset-top,0px);
  --tvm-safe-right:env(safe-area-inset-right,0px);
  --tvm-safe-bottom:env(safe-area-inset-bottom,0px);
  --tvm-safe-left:env(safe-area-inset-left,0px);

  /* Content-width aliases */
  --tvm-content-narrow:40em;
  --tvm-content-reading:45em;
  --tvm-content-standard:60em;
  --tvm-content-wide:80em;

  color-scheme:light;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}

/* Explicit theme support. Default remains light; auto/dark are opt-in via
   TranquilMagicTheme.set("auto"|"dark"|"light"). */
.tv-magic[data-tvm-theme="dark"]{
  color-scheme:dark;
  --tvm-ink:#f8f8f7;
  --tvm-muted:#c6c6c2;
  --tvm-text-primary:#f8f8f7;
  --tvm-text-secondary:#c6c6c2;
  --tvm-text-tertiary:#a5a5a0;
  --tvm-text-disabled:#5d5d59;
  --tvm-line-subtle:rgba(248,248,247,.08);
  --tvm-line-default:rgba(248,248,247,.14);
  --tvm-line-strong:rgba(248,248,247,.24);
  --tvm-focus-bg:#0d0d0c;
  --tvm-experience-bg:#0d0d0c;
  --tvm-clear:#171716;
  --tvm-mist:rgba(23,23,22,.84);
  --tvm-veil:rgba(23,23,22,.72);
  --tvm-lens:rgba(23,23,22,.64);
  --tvm-mist-solid:#1b1b19;
  --tvm-veil-solid:#242421;
  --tvm-lens-solid:#30302c;
  --tvm-hover-soft:rgba(248,248,247,.055);
  --tvm-hover-medium:rgba(248,248,247,.075);
  --tvm-hover-line:rgba(248,248,247,.18);
  --tvm-focus-soft:rgba(248,248,247,.10);
  --tvm-selected-line:rgba(248,248,247,.22);
}

/* Content stays clear; glass remains interface/transient only. */
.tv-magic [data-surface="content"]{
  -webkit-backdrop-filter:none;
  backdrop-filter:none;
}

/* Indextro-style stationary hover: state changes, controls do not lift. */
@media(hover:hover) and (pointer:fine){
  .tv-magic .tvm-control:hover:not(:disabled):not([aria-disabled="true"]){
    transform:none !important;
  }
}

/* Disabled is a semantic interaction state, not just a visual hint. */
.tv-magic .tvm-control:disabled,
.tv-magic .tvm-control[aria-disabled="true"],
.tv-magic .tvm-lang:disabled,
.tv-magic .tvm-choice:disabled{
  opacity:var(--tvm-opacity-disabled) !important;
  cursor:default !important;
  pointer-events:none !important;
  transform:none !important;
}

/* Global focus-visible contract for every executable/input surface. */
.tv-magic button:focus-visible,
.tv-magic textarea:focus-visible,
.tv-magic input:focus-visible,
.tv-magic select:focus-visible,
.tv-magic a:focus-visible,
.tv-magic [tabindex]:focus-visible{
  outline:2px solid var(--tvm-focus-ring);
  outline-offset:3px;
}

/* Language is a true segmented radiogroup. */
.tv-magic .tvm-language[role="radiogroup"]{
  display:inline-flex;
  align-items:stretch;
}
.tv-magic .tvm-lang[role="radio"][aria-checked="true"]{
  color:var(--tvm-text-primary);
}

/* ---------------------------------------------------------
   Keyboard shortcut sheet — hidden until requested with ?
   --------------------------------------------------------- */
.tv-magic .tvm-shortcut-sheet{
  position:fixed;
  inset:0;
  z-index:var(--tvm-layer-modal);
  display:grid;
  place-items:center;
  padding:
    max(1em,var(--tvm-safe-top))
    max(1em,var(--tvm-safe-right))
    max(1em,var(--tvm-safe-bottom))
    max(1em,var(--tvm-safe-left));
  background:rgba(0,0,0,.12);
}

.tv-magic .tvm-shortcut-panel{
  width:min(27em,calc(100dvw - 2em));
  max-height:min(36em,calc(100dvh - 2em));
  overflow:auto;
  padding:1.25em;
  border:1px solid var(--tvm-line-subtle);
  border-radius:1.25em;
  background:var(--tvm-surface-veil-solid);
  color:var(--tvm-text-primary);
  box-shadow:var(--tvm-elevation-toast);
}

@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .tv-magic .tvm-shortcut-panel{
    background:var(--tvm-surface-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.06);
    backdrop-filter:blur(1.125em) saturate(1.06);
  }
}

.tv-magic .tvm-shortcut-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:1em;
  margin-bottom:1em;
}

.tv-magic .tvm-shortcut-title{
  margin:0;
  font-size:1em;
  font-weight:600;
}

.tv-magic .tvm-shortcut-close{
  width:2.75em;
  height:2.75em;
  min-width:2.75em;
  min-height:2.75em;
  padding:0;
  display:inline-grid;
  place-items:center;
  border:1px solid var(--tvm-line-subtle);
  border-radius:999em;
  background:transparent;
  color:inherit;
  font:inherit;
}

.tv-magic .tvm-shortcut-list{
  display:grid;
  gap:.25em;
}

.tv-magic .tvm-shortcut-list > div{
  display:grid;
  grid-template-columns:5.75em minmax(0,1fr);
  gap:1em;
  align-items:baseline;
  padding:.625em 0;
  border-bottom:1px solid var(--tvm-line-subtle);
}

.tv-magic .tvm-shortcut-list kbd{
  font-family:var(--tvm-font-mono);
  font-size:.8125em;
  color:var(--tvm-text-secondary);
}

.tv-magic .tvm-shortcut-list span{
  font-size:.875em;
  line-height:1.55;
}

.tv-magic .tvm-shortcut-hint{
  margin:1em 0 0;
  font-size:.8125em;
  line-height:1.55;
  color:var(--tvm-text-secondary);
}

/* ---------------------------------------------------------
   Runtime recovery layer
   --------------------------------------------------------- */
.tv-magic .tvm-recovery{
  position:fixed;
  left:50%;
  bottom:max(1.25em,var(--tvm-safe-bottom));
  transform:translateX(-50%);
  z-index:var(--tvm-layer-toast);
  width:min(32.5em,calc(100dvw - 2em));
  padding:1em;
  border:1px solid var(--tvm-line-default);
  border-radius:1em;
  background:var(--tvm-surface-veil-solid);
  color:var(--tvm-text-primary);
  box-shadow:var(--tvm-elevation-toast);
}

.tv-magic .tvm-recovery[hidden]{
  display:none;
}

@supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
  .tv-magic .tvm-recovery{
    background:var(--tvm-surface-veil);
    -webkit-backdrop-filter:blur(1.125em) saturate(1.06);
    backdrop-filter:blur(1.125em) saturate(1.06);
  }
}

.tv-magic .tvm-recovery-message{
  margin:0;
  font-size:.875em;
  line-height:1.55;
}

.tv-magic .tvm-recovery-actions{
  display:flex;
  flex-wrap:wrap;
  gap:.5em;
  margin-top:.75em;
}

.tv-magic .tvm-recovery-actions .tvm-btn{
  min-height:2.75em;
}

/* Glass fallbacks for the new transient surfaces. */
@supports not (backdrop-filter:blur(1px)){
  .tv-magic .tvm-shortcut-panel,
  .tv-magic .tvm-recovery{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    background:var(--tvm-surface-veil-solid) !important;
  }
}

@media(prefers-reduced-motion:reduce){
  .tv-magic .tvm-shortcut-sheet,
  .tv-magic .tvm-shortcut-panel,
  .tv-magic .tvm-recovery{
    animation:none !important;
    transition:none !important;
  }
}

@media(forced-colors:active){
  .tv-magic .tvm-shortcut-sheet{
    background:Canvas;
  }

  .tv-magic .tvm-shortcut-panel,
  .tv-magic .tvm-recovery{
    background:Canvas !important;
    color:CanvasText !important;
    border:1px solid CanvasText !important;
    box-shadow:none !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }

  .tv-magic .tvm-shortcut-list > div{
    border-color:CanvasText;
  }
}


/* =========================================================
   v4.9 — remaining PPE/TMS + Indextro integration
   ========================================================= */

/* Language is scoped to the component; WordPress document language is untouched. */
.tv-magic[lang="ja"]{
  font-language-override:normal;
}
.tv-magic[lang="en"]{
  font-language-override:normal;
}

/* Stable layout when internal scrolling appears. */
.tv-magic.is-focus,
.tv-magic .tvm-result-screen,
.tv-magic .tvm-prompt,
.tv-magic .tvm-shortcut-panel{
  scrollbar-gutter:stable;
}

.tv-magic.is-focus,
.tv-magic .tvm-shortcut-panel{
  overscroll-behavior:contain;
}

/* Prompt unit communicates focus at the unit level. */
.tv-magic .tvm-prompt-group{
  border-radius:1em;
  transition:
    background-color var(--tvm-motion-fast) var(--tvm-ease-standard),
    box-shadow var(--tvm-motion-fast) var(--tvm-ease-standard);
}

.tv-magic .tvm-prompt-group:focus-within{
  background:var(--tvm-focus-soft);
  box-shadow:0 0 0 1px var(--tvm-hover-line);
}

/* Progressive semantic color derivation. Existing RGBA values remain fallback. */
@supports(color:color-mix(in srgb,currentColor 10%,transparent)){
  .tv-magic{
    --tvm-hover-soft:color-mix(in srgb,var(--tvm-ink) 5.5%,transparent);
    --tvm-hover-medium:color-mix(in srgb,var(--tvm-ink) 7.5%,transparent);
    --tvm-focus-soft:color-mix(in srgb,var(--tvm-ink) 10%,transparent);
    --tvm-hover-line:color-mix(in srgb,var(--tvm-ink) 18%,transparent);
    --tvm-selected-line:color-mix(in srgb,var(--tvm-ink) 22%,transparent);
  }
}

/* Busy is a first-class state. */
.tv-magic .tvm-control[data-busy="true"]{
  cursor:progress !important;
  opacity:.72;
  pointer-events:none !important;
}

/* Toast may include one contextual action. */
.tv-magic .tvm-toast{
  display:flex;
  align-items:center;
  gap:.75em;
}

.tv-magic .tvm-toast-message{
  min-width:0;
}

.tv-magic .tvm-toast-action{
  flex:0 0 auto;
  min-height:2.5em;
  padding-inline:.85em;
  border:1px solid var(--tvm-line-default);
  border-radius:999em;
  background:transparent;
  color:inherit;
  font:inherit;
  font-size:.8125em;
}

/* Recovery retry is shown only when a local retry callback exists. */
.tv-magic #tvmRecoveryRetry[hidden]{
  display:none;
}

/* Managed overlays use one explicit open state. */
.tv-magic [data-overlay-open="true"]{
  visibility:visible;
}

/* Prevent page-scroll chaining while a modal sheet is open. */
.tv-magic .tvm-shortcut-sheet[data-overlay-open="true"]{
  overscroll-behavior:contain;
}

/* Dark theme prompt focus remains restrained. */
.tv-magic[data-tvm-theme="dark"] .tvm-prompt-group:focus-within{
  background:var(--tvm-focus-soft);
}


/* =========================================================
   v5.0 — action affordance / unified action sizing / share color inversion
   ========================================================= */
.tv-magic{
  --tvm-action-size:3.25em;
  --tvm-start-size:5em;
  --tvm-secondary-rest-bg:rgba(255,255,255,.34);
  --tvm-secondary-rest-border:rgba(32,38,36,.16);
  --tvm-secondary-hover-bg:rgba(255,255,255,.62);
  --tvm-secondary-hover-border:rgba(32,38,36,.28);
}

/* Language / Prompt Copy / Share / Secondary Action share one action size. */
.tv-magic .tvm-lang,
.tv-magic #tvmCopy,
.tv-magic .tvm-back,
.tv-magic .tvm-result-restart .tvm-btn{
  min-height:var(--tvm-action-size) !important;
}
.tv-magic .tvm-language{
  min-height:var(--tvm-action-size) !important;
}
.tv-magic .tvm-share-btn{
  width:var(--tvm-action-size) !important;
  height:var(--tvm-action-size) !important;
  min-width:var(--tvm-action-size) !important;
  min-height:var(--tvm-action-size) !important;
}

/* Start is the single dominant CTA. */
.tv-magic #tvmStart{
  min-height:var(--tvm-start-size) !important;
  padding-inline:2.25em !important;
  font-size:clamp(1.0625em,1.1vw,1.1875em) !important;
  font-weight:var(--tvm-weight-semibold) !important;
}
.tv-magic .tvm-entry .tvm-actions{
  justify-content:center;
  margin-top:clamp(2em,3.5dvh,3.25em);
}

/* Back / Restart are visibly actionable even before hover. */
.tv-magic .tvm-back,
.tv-magic .tvm-result-restart .tvm-btn,
.tv-magic .tvm-result-restart .tvm-btn.is-ghost{
  padding-inline:1.2em !important;
  border:0.0625em solid var(--tvm-secondary-rest-border) !important;
  border-radius:999em !important;
  background:var(--tvm-secondary-rest-bg) !important;
  color:var(--tvm-ink) !important;
  box-shadow:inset 0 0.0625em 0 rgba(255,255,255,.38) !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}

@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-result-restart .tvm-btn:hover:not(:disabled){
    transform:none !important;
    background:var(--tvm-secondary-hover-bg) !important;
    border-color:var(--tvm-secondary-hover-border) !important;
    color:var(--tvm-ink) !important;
    box-shadow:inset 0 0.0625em 0 rgba(255,255,255,.5) !important;
  }
}

.tv-magic .tvm-back:focus-visible,
.tv-magic .tvm-result-restart .tvm-btn:focus-visible{
  background:var(--tvm-control-focus-bg) !important;
  border-color:var(--tvm-control-focus-border) !important;
  outline:var(--tvm-focus-ring) !important;
  outline-offset:var(--tvm-focus-offset) !important;
}

/* TranquilShare v1.0-derived rest colors. */
.tv-magic [data-share-action="x"]{color:#000 !important;}
.tv-magic [data-share-action="threads"]{color:#383D38 !important;}
.tv-magic [data-share-action="bluesky"]{color:#1185FE !important;}
.tv-magic [data-share-action="line"]{color:#06C755 !important;}
.tv-magic [data-share-action="native"],
.tv-magic [data-share-action="story"],
.tv-magic [data-share-action="copy"]{color:#404040 !important;}

/* Stationary color inversion: surface becomes service color, glyph becomes white. */
@media (hover:hover) and (pointer:fine){
  .tv-magic [data-share-action="x"]:hover:not(:disabled){
    background:#000 !important;
    border-color:#000 !important;
    color:#fff !important;
  }
  .tv-magic [data-share-action="threads"]:hover:not(:disabled){
    background:#383D38 !important;
    border-color:#383D38 !important;
    color:#fff !important;
  }
  .tv-magic [data-share-action="bluesky"]:hover:not(:disabled){
    background:#1185FE !important;
    border-color:#1185FE !important;
    color:#fff !important;
  }
  .tv-magic [data-share-action="line"]:hover:not(:disabled){
    background:#06C755 !important;
    border-color:#06C755 !important;
    color:#fff !important;
  }
  .tv-magic [data-share-action="native"]:hover:not(:disabled),
  .tv-magic [data-share-action="story"]:hover:not(:disabled),
  .tv-magic [data-share-action="copy"]:hover:not(:disabled){
    background:#404040 !important;
    border-color:#404040 !important;
    color:#fff !important;
  }
  .tv-magic [data-share-action="threads"]:hover .tvm-share-icon--brand path,
  .tv-magic [data-share-action="bluesky"]:hover .tvm-share-icon--brand path{
    fill:#fff !important;
  }
  .tv-magic [data-share-action="native"]:hover .tvm-share-icon path,
  .tv-magic [data-share-action="story"]:hover .tvm-share-icon rect,
  .tv-magic [data-share-action="story"]:hover .tvm-share-icon path,
  .tv-magic [data-share-action="copy"]:hover .tvm-copy-icon rect,
  .tv-magic [data-share-action="copy"]:hover .tvm-copy-icon path{
    stroke:#fff !important;
  }
  .tv-magic [data-share-action="story"]:hover .tvm-share-icon rect,
  .tv-magic [data-share-action="story"]:hover .tvm-share-icon path{
    fill:none !important;
  }
  .tv-magic [data-share-action="story"]:hover .tvm-share-icon circle{
    fill:#fff !important;
  }
  .tv-magic .tvm-share-btn:hover:not(:disabled){
    transform:none !important;
    box-shadow:none !important;
  }
}

/* Press remains the only positional feedback. */
.tv-magic .tvm-back:active:not(:disabled),
.tv-magic .tvm-result-restart .tvm-btn:active:not(:disabled),
.tv-magic .tvm-share-btn:active:not(:disabled){
  transform:scale(.975) !important;
}

@media (forced-colors:active){
  .tv-magic .tvm-back,
  .tv-magic .tvm-result-restart .tvm-btn{
    background:ButtonFace !important;
    color:ButtonText !important;
    border-color:ButtonText !important;
  }
}



/* =========================================================
   v5.1 — scale hierarchy / language-derived controls / ontology prose
   ========================================================= */
.tv-magic{
  --tvm-action-size:3.25em;
  --tvm-share-size:3.75em;
  --tvm-share-glyph-size:1.30em;
  --tvm-start-size:6em;
  --tvm-focus-exit-size:5em;
  --tvm-focus-exit-glyph-size:2.55em;
}

/* Language is the visual/interaction reference for text actions. */
.tv-magic #tvmCopy,
.tv-magic .tvm-back,
.tv-magic .tvm-result-restart .tvm-btn,
.tv-magic .tvm-result-restart .tvm-btn.is-ghost{
  min-height:var(--tvm-action-size) !important;
  padding-inline:1.15em !important;
  border-radius:var(--tvm-radius-pill) !important;
  font:inherit !important;
  line-height:1.2 !important;
  transition:
    background var(--tvm-motion-fast) var(--tvm-ease),
    color var(--tvm-motion-fast) var(--tvm-ease),
    border-color var(--tvm-motion-fast) var(--tvm-ease),
    transform var(--tvm-motion-fast) var(--tvm-ease),
    box-shadow var(--tvm-motion-fast) var(--tvm-ease) !important;
}

/* Start keeps the language-control design language but becomes the unmistakable CTA. */
.tv-magic #tvmStart{
  min-height:var(--tvm-start-size) !important;
  width:min(30em,calc(100dvw - 3em));
  max-width:100%;
  padding-inline:clamp(2.5em,7dvw,5em) !important;
  border-radius:999em !important;
  font-size:clamp(1.20em,1.55vw,1.50em) !important;
  line-height:1.2 !important;
  letter-spacing:-.015em;
}
.tv-magic .tvm-entry .tvm-actions{
  width:100%;
  justify-content:center;
  margin-top:clamp(2.25em,4.5dvh,4em);
}

/* Share controls: true circles, larger glyphs, same control physics. */
.tv-magic .tvm-share-btn{
  width:var(--tvm-share-size) !important;
  height:var(--tvm-share-size) !important;
  min-width:var(--tvm-share-size) !important;
  min-height:var(--tvm-share-size) !important;
  flex:0 0 var(--tvm-share-size) !important;
  aspect-ratio:1 / 1;
  border-radius:50% !important;
  padding:0 !important;
}
.tv-magic .tvm-share-icon,
.tv-magic .tvm-copy-icon,
.tv-magic .tvm-share-font-icon{
  width:var(--tvm-share-glyph-size) !important;
  height:var(--tvm-share-glyph-size) !important;
}
.tv-magic .tvm-share-font-icon{
  font-size:var(--tvm-share-glyph-size) !important;
}
.tv-magic .tvm-share-row{
  gap:.85em;
}
.tv-magic .tvm-share-group{
  gap:.52em;
}

/* Only the Focus-exit control grows: entering Focus remains unobtrusive. */
.tv-magic.is-focus .tvm-focus-toggle,
.tv-magic.is-focus .tvm-experience-toggle .tvm-focus-toggle,
.tv-magic.is-focus > .tvm-focus-toggle{
  width:var(--tvm-focus-exit-size) !important;
  min-width:var(--tvm-focus-exit-size) !important;
  height:var(--tvm-focus-exit-size) !important;
  min-height:var(--tvm-focus-exit-size) !important;
  border-radius:50% !important;
}
.tv-magic.is-focus .tvm-focus-toggle svg,
.tv-magic.is-focus .tvm-focus-icon-exit,
.tv-magic.is-focus .tvm-margin__fullscreenIcon{
  width:var(--tvm-focus-exit-glyph-size) !important;
  height:var(--tvm-focus-exit-glyph-size) !important;
  flex:0 0 var(--tvm-focus-exit-glyph-size) !important;
}

/* World law is prose, not a squeezed definition-list value. */
.tv-magic .tvm-ontology-block{
  width:min(34em,100%);
  margin:clamp(2.25em,4dvh,3.5em) auto 0;
  text-align:center;
}
.tv-magic .tvm-ontology-label{
  margin:0 0 .8em;
  color:var(--tvm-muted);
  font-size:.86em;
  line-height:1.5;
  font-weight:600;
}
.tv-magic .tvm-ontology-text{
  width:min(30em,100%);
  margin:0 auto;
  color:var(--tvm-ink);
  font-size:.96em;
  line-height:1.9;
  text-align:center;
  text-wrap:pretty;
}

@media(max-width:30em){
  .tv-magic #tvmStart{
    width:min(100%,calc(100dvw - 2em));
    min-height:6em !important;
    padding-inline:2em !important;
  }
  .tv-magic .tvm-share-row{
    gap:.65em;
  }
  .tv-magic .tvm-share-group{
    gap:.44em;
  }
  .tv-magic .tvm-ontology-text{
    width:min(27em,100%);
  }
}

@media (hover:hover) and (pointer:fine){
  .tv-magic #tvmCopy:hover:not(:disabled),
  .tv-magic .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-result-restart .tvm-btn:hover:not(:disabled){
    transform:none !important;
  }
}

@media (prefers-reduced-motion:reduce){
  .tv-magic #tvmStart,
  .tv-magic #tvmCopy,
  .tv-magic .tvm-back,
  .tv-magic .tvm-result-restart .tvm-btn,
  .tv-magic .tvm-share-btn,
  .tv-magic .tvm-focus-toggle{
    transition:none !important;
  }
}


/* =========================================================
   v5.2 — real-browser refinement / Today-Margin CTA / grouped share optics
   ========================================================= */
.tv-magic{
  /* 0924today-derived composition: em inside controls, viewport only for bounded composition. */
  --tvm-start-cta-min:5em;
  --tvm-start-cta-fluid:8dvh;
  --tvm-start-cta-max:6.25em;
  --tvm-start-cta-width:min(34em,82dvw);
  --tvm-focus-control-size-v52:5em;
  --tvm-focus-glyph-size-v52:2.4em;
  --tvm-share-glyph-size-v52:1.5em;
  --tvm-related-gap:.9em;
  --tvm-section-gap-after-ontology:clamp(3.5em,6dvh,5.75em);
}

/* Start: retain Main CTA prominence without turning height itself into a 10em object. */
.tv-magic #tvmStart{
  width:var(--tvm-start-cta-width) !important;
  max-width:100% !important;
  min-height:clamp(var(--tvm-start-cta-min),var(--tvm-start-cta-fluid),var(--tvm-start-cta-max)) !important;
  padding-inline:clamp(2.25em,6dvw,4.5em) !important;
  padding-block:1.15em !important;
  border-radius:var(--tvm-radius-pill) !important;
  font-size:clamp(1.15em,1.35vw,1.4em) !important;
  line-height:1.2 !important;
  letter-spacing:-.012em !important;
}
.tv-magic .tvm-entry .tvm-actions{
  margin-top:clamp(2.25em,4dvh,3.6em) !important;
}
@media(max-width:30em){
  .tv-magic #tvmStart{
    width:min(100%,calc(100dvw - 2em)) !important;
    min-height:clamp(4.75em,7.5dvh,5.75em) !important;
    padding-inline:1.75em !important;
  }
}

/* Back is now a real Language-family action, including inside Question Frame. */
.tv-magic .tvm-question-frame .tvm-back,
.tv-magic .tvm-question-frame .tvm-back:hover,
.tv-magic .tvm-question-frame .tvm-back:active,
.tv-magic .tvm-back{
  width:auto !important;
  min-width:0 !important;
  min-height:var(--tvm-action-size) !important;
  padding-inline:1.15em !important;
  border:0.0625em solid var(--tvm-secondary-rest-border) !important;
  border-radius:var(--tvm-radius-pill) !important;
  background:var(--tvm-secondary-rest-bg) !important;
  color:var(--tvm-ink) !important;
  box-shadow:inset 0 0.0625em 0 rgba(255,255,255,.38) !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-question-frame .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-back:hover:not(:disabled){
    transform:none !important;
    background:var(--tvm-secondary-hover-bg) !important;
    border-color:var(--tvm-secondary-hover-border) !important;
    color:var(--tvm-ink) !important;
  }
}
.tv-magic .tvm-question-frame .tvm-back:active:not(:disabled),
.tv-magic .tvm-back:active:not(:disabled){
  transform:scale(var(--tvm-control-active-scale)) !important;
}

/* Focus enter and exit use one clearly visible geometry; hit area and glyph grow together. */
.tv-magic .tvm-focus-toggle,
.tv-magic.is-focus .tvm-focus-toggle,
.tv-magic .tvm-experience-toggle .tvm-focus-toggle,
.tv-magic.is-focus .tvm-experience-toggle .tvm-focus-toggle,
.tv-magic > .tvm-focus-toggle,
.tv-magic.is-focus > .tvm-focus-toggle{
  flex:0 0 var(--tvm-focus-control-size-v52) !important;
  width:var(--tvm-focus-control-size-v52) !important;
  height:var(--tvm-focus-control-size-v52) !important;
  min-width:var(--tvm-focus-control-size-v52) !important;
  min-height:var(--tvm-focus-control-size-v52) !important;
  border-radius:50% !important;
}
.tv-magic .tvm-focus-toggle svg,
.tv-magic.is-focus .tvm-focus-toggle svg,
.tv-magic .tvm-focus-icon-enter,
.tv-magic .tvm-focus-icon-exit,
.tv-magic .tvm-margin__fullscreenIcon{
  width:var(--tvm-focus-glyph-size-v52) !important;
  height:var(--tvm-focus-glyph-size-v52) !important;
  flex:0 0 var(--tvm-focus-glyph-size-v52) !important;
}

/* Result title unit: completion label belongs to the name; prose starts after a larger pause. */
.tv-magic .tvm-result-screen > .tvm-kicker{
  margin-bottom:.62em !important;
}
.tv-magic .tvm-result-screen > .tvm-result-name{
  margin:0 !important;
}
.tv-magic .tvm-result-screen > .tvm-result-name + .tvm-spacer--density-1{
  height:1.55em !important;
}

/* World law closes the law block; carrying begins as a clearly new section. */
.tv-magic .tvm-summary-section + .tvm-carry-section{
  margin-top:var(--tvm-section-gap-after-ontology) !important;
}

/* Copy button and the prompt are one related unit. */
.tv-magic .tvm-spacer--copy-to-prompt{
  height:var(--tvm-related-gap) !important;
}
.tv-magic .tvm-copy-action{
  margin-bottom:0 !important;
}
.tv-magic .tvm-prompt-group{
  margin-top:0 !important;
}

/* Explicit share action units: each circle and glyph travel as one grouped control. */
.tv-magic .tvm-share-unit{
  display:grid;
  place-items:center;
  width:var(--tvm-share-size);
  height:var(--tvm-share-size);
  min-width:var(--tvm-share-size);
  min-height:var(--tvm-share-size);
  flex:0 0 var(--tvm-share-size);
  margin:0;
  padding:0;
}
.tv-magic .tvm-share-unit > .tvm-share-btn{
  width:100% !important;
  height:100% !important;
  min-width:100% !important;
  min-height:100% !important;
  flex:none !important;
  display:grid !important;
  place-items:center !important;
  aspect-ratio:1 / 1;
  border-radius:50% !important;
  padding:0 !important;
}
.tv-magic .tvm-share-icon,
.tv-magic .tvm-copy-icon,
.tv-magic .tvm-share-font-icon{
  width:var(--tvm-share-glyph-size-v52) !important;
  height:var(--tvm-share-glyph-size-v52) !important;
  margin:0 !important;
  transform-origin:50% 50% !important;
  justify-self:center !important;
  align-self:center !important;
}
.tv-magic .tvm-share-font-icon{
  display:grid !important;
  place-items:center !important;
  font-size:var(--tvm-share-glyph-size-v52) !important;
  line-height:1 !important;
}
/* Per-glyph optical correction happens inside the fixed geometric circle. */
.tv-magic [data-share-action="x"] .tvm-share-font-icon{
  transform:translateY(-.02em) scale(.98) !important;
}
.tv-magic [data-share-action="threads"] .tvm-share-icon{
  transform:translateY(.01em) scale(1.14) !important;
}
.tv-magic [data-share-action="bluesky"] .tvm-share-icon{
  transform:translateY(.02em) scale(.98) !important;
}
.tv-magic [data-share-action="line"] .tvm-share-font-icon{
  transform:translateY(.01em) scale(1.12) !important;
}
.tv-magic [data-share-action="native"] .tvm-share-icon,
.tv-magic [data-share-action="story"] .tvm-share-icon,
.tv-magic [data-share-action="copy"] .tvm-copy-icon{
  transform:translateY(.01em) scale(1.08) !important;
}
.tv-magic .tvm-share-group{
  align-items:center !important;
}

/* Restart follows the same language-family action surface; wording is semantic, not system jargon. */
.tv-magic .tvm-result-restart .tvm-btn,
.tv-magic .tvm-result-restart .tvm-btn.is-ghost{
  width:auto !important;
  min-width:10em !important;
  min-height:var(--tvm-action-size) !important;
}

@media(prefers-reduced-motion:reduce){
  .tv-magic #tvmStart,
  .tv-magic .tvm-share-unit,
  .tv-magic .tvm-share-unit > .tvm-share-btn{
    transition:none !important;
  }
}


/* =========================================================
   v5.3 — Normal/Focus split + exact law-row centers + Akeru v3.0 resilience
   ========================================================= */
.tv-magic{
  --tvm-result-hero-gap:clamp(1.85em,3.2dvh,2.9em);
  --tvm-normal-bottom-space:3em;
  --tvm-law-row-gap:.58em;
  --tvm-law-column-gap:1.15em;
  --tvm-share-optical-size:1.58em;
}

/* Akeru v3.0-derived local hardening: keep SWELL from redefining interaction controls. */
.tv-magic,
.tv-magic *{
  box-sizing:border-box;
}
.tv-magic button{
  font-family:inherit;
  text-transform:none;
  appearance:none;
  -webkit-appearance:none;
  touch-action:manipulation;
  -webkit-tap-highlight-color:transparent;
}
.tv-magic .tvm-question-meta,
.tv-magic .tvm-question-meta-count{
  font-variant-numeric:tabular-nums;
}
.tv-magic .tvm-choice,
.tv-magic .tvm-btn,
.tv-magic .tvm-back,
.tv-magic .tvm-share-btn,
.tv-magic .tvm-focus-toggle{
  isolation:isolate;
}

/* Normal mode belongs to the WordPress article: content height, not a pseudo viewport. */
.tv-magic:not(.is-focus){
  padding-bottom:max(var(--tvm-normal-bottom-space),env(safe-area-inset-bottom));
}
.tv-magic:not(.is-focus) .tvm-entry,
.tv-magic:not(.is-focus) .tvm-question-screen,
.tv-magic:not(.is-focus) .tvm-result-screen{
  min-height:0 !important;
}
.tv-magic:not(.is-focus) .tvm-result-screen{
  width:min(48em,100%);
}
.tv-magic:not(.is-focus) .tvm-result-screen .tvm-result-name{
  font-size:clamp(2.05em,3vw,3em);
}
.tv-magic:not(.is-focus) .tvm-result-screen .tvm-core{
  font-size:1.15em;
}

/* Completion notice and magic name are distinct semantic layers in both modes. */
.tv-magic .tvm-result-screen > .tvm-kicker{
  margin-bottom:var(--tvm-result-hero-gap) !important;
}
.tv-magic .tvm-result-screen > .tvm-result-name{
  margin-top:0 !important;
}

/* One law row = one alignment unit. Label/value share the same row box center. */
.tv-magic .tvm-summary-grid.tvm-law-list,
.tv-magic .tvm-grid.tvm-law-list{
  display:grid !important;
  grid-template-columns:1fr !important;
  row-gap:var(--tvm-law-row-gap) !important;
  column-gap:0 !important;
}
.tv-magic .tvm-law-list > .tvm-law-row{
  display:grid !important;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr) !important;
  column-gap:var(--tvm-law-column-gap) !important;
  align-items:center !important;
  justify-items:stretch !important;
  width:100% !important;
  min-width:0 !important;
  margin:0 !important;
  padding:0 !important;
}
.tv-magic .tvm-law-list > .tvm-law-row > dt,
.tv-magic .tvm-law-list > .tvm-law-row > dd{
  display:flex !important;
  align-items:center !important;
  min-height:1.72em !important;
  margin:0 !important;
  padding:0 !important;
  line-height:1.45 !important;
}
.tv-magic .tvm-law-list > .tvm-law-row > dt{
  justify-content:flex-end !important;
  text-align:right !important;
  color:var(--tvm-muted);
}
.tv-magic .tvm-law-list > .tvm-law-row > dd{
  justify-content:flex-start !important;
  text-align:left !important;
  color:var(--tvm-ink);
  overflow-wrap:anywhere;
}

/* Language is the measured visual source of truth for text actions. */
.tv-magic .tvm-lang,
.tv-magic #tvmCopy,
.tv-magic .tvm-back,
.tv-magic .tvm-result-restart .tvm-btn,
.tv-magic .tvm-result-restart .tvm-btn.is-ghost{
  min-height:var(--tvm-action-size) !important;
  padding-block:0 !important;
  padding-inline:1.15em !important;
  border-radius:var(--tvm-radius-pill) !important;
  font-family:inherit !important;
  font-size:1em !important;
  font-weight:inherit !important;
  line-height:1.2 !important;
  align-items:center !important;
  justify-content:center !important;
}
.tv-magic #tvmCopy,
.tv-magic .tvm-back,
.tv-magic .tvm-result-restart .tvm-btn{
  display:inline-flex !important;
}
.tv-magic #tvmCopy{
  width:100% !important;
}
.tv-magic .tvm-back{
  width:auto !important;
}
.tv-magic .tvm-result-restart .tvm-btn{
  width:auto !important;
  min-width:10em !important;
}

/* Share: immutable geometric center wrapper; only the glyph receives optical correction. */
.tv-magic .tvm-share-unit,
.tv-magic .tvm-share-unit > .tvm-share-btn{
  aspect-ratio:1 / 1;
  border-radius:50% !important;
}
.tv-magic .tvm-share-icon-wrap{
  position:absolute;
  inset:0;
  display:grid;
  place-items:center;
  width:100%;
  height:100%;
  pointer-events:none;
}
.tv-magic .tvm-share-unit > .tvm-share-btn{
  position:relative;
  overflow:visible;
}
.tv-magic .tvm-share-icon,
.tv-magic .tvm-copy-icon{
  width:var(--tvm-share-optical-size) !important;
  height:var(--tvm-share-optical-size) !important;
}
.tv-magic .tvm-share-font-icon{
  width:auto !important;
  height:auto !important;
  font-size:var(--tvm-share-optical-size) !important;
}
.tv-magic [data-share-action="x"] .tvm-share-font-icon{
  transform:translateY(-.025em) scale(1.03) !important;
}
.tv-magic [data-share-action="threads"] .tvm-share-icon{
  transform:translateY(.005em) scale(1.15) !important;
}
.tv-magic [data-share-action="bluesky"] .tvm-share-icon{
  transform:translateY(.015em) scale(1.02) !important;
}
.tv-magic [data-share-action="line"] .tvm-share-font-icon{
  transform:translateY(.015em) scale(1.14) !important;
}
.tv-magic [data-share-action="native"] .tvm-share-icon{
  transform:translateY(.015em) scale(1.08) !important;
}
.tv-magic [data-share-action="story"] .tvm-share-icon{
  transform:translateY(.01em) scale(1.10) !important;
}
.tv-magic [data-share-action="copy"] .tvm-copy-icon{
  transform:translateY(.01em) scale(1.10) !important;
}

/* Focus start/exit: visible circle and glyph both use the enlarged geometry. */
.tv-magic .tvm-focus-toggle,
.tv-magic.is-focus .tvm-focus-toggle{
  width:var(--tvm-focus-control-size-v52) !important;
  height:var(--tvm-focus-control-size-v52) !important;
  min-width:var(--tvm-focus-control-size-v52) !important;
  min-height:var(--tvm-focus-control-size-v52) !important;
  display:grid !important;
  place-items:center !important;
  border-radius:50% !important;
}
.tv-magic .tvm-focus-toggle svg,
.tv-magic.is-focus .tvm-focus-toggle svg{
  width:var(--tvm-focus-glyph-size-v52) !important;
  height:var(--tvm-focus-glyph-size-v52) !important;
}

/* Focus keeps immersive viewport composition; it does not inherit Normal compaction. */
.tv-magic.is-focus .tvm-result-screen{
  min-height:100dvh !important;
}

@media(max-width:30em){
  .tv-magic{
    --tvm-result-hero-gap:2em;
    --tvm-law-column-gap:.9em;
  }
}

@media(prefers-reduced-motion:reduce){
  .tv-magic .tvm-share-icon-wrap,
  .tv-magic .tvm-law-row{
    transition:none !important;
  }
}


/* =========================================================
   v5.5 — unified controls / adaptive QA hardening / non-destructive feedback
   Base: 20260924_magic_v5.4.html
   ========================================================= */
.tv-magic{
  --tvm-normal-frame-width:min(50em,100%);
  --tvm-result-axis-width:min(48em,86dvw);
  --tvm-law-axis-width:min(38em,76dvw);
  --tvm-result-section-space:clamp(2.55em,3.5dvh,4em);
  --tvm-result-small-space:clamp(1.2em,1.7dvh,1.9em);
  --tvm-result-body-size:clamp(1.15em,1.25vw,1.32em);
  --tvm-result-meta-size:clamp(.875em,.86vw,.97em);
  --tvm-result-ui-size:clamp(1.025em,1.02vw,1.125em);
  --tvm-result-hero-gap:clamp(2.25em,4dvh,3.5em);
  --tvm-law-row-gap:.58em;

  --tvm-segment-outer-bg:rgba(255,255,255,.22);
  --tvm-segment-outer-border:rgba(32,38,36,.08);
  --tvm-segment-inner-bg:rgba(255,255,255,.82);
  --tvm-segment-inner-border:rgba(32,38,36,.08);
  --tvm-segment-inner-shadow:0 .0625em 0 rgba(255,255,255,.82),0 .22em .75em rgba(22,22,20,.07);

  --tvm-action-bg:var(--tvm-veil-solid);
  --tvm-action-border:var(--tvm-glass-edge);
  --tvm-action-hover-bg:var(--tvm-hover-medium);
  --tvm-action-hover-border:rgba(32,38,36,.14);
}

/* Result hierarchy is canonicalized in v5.7 below. */

/* Start remains v5.4; Question and Result use the same Normal frame axis. */
.tv-magic:not(.is-focus) .tvm-question-frame{
  width:var(--tvm-normal-frame-width);
  max-width:100%;
  margin-inline:auto;
}

/* Language: match the approved soft outer capsule + active inner pill. */
.tv-magic .tvm-language{
  background:var(--tvm-segment-outer-bg) !important;
  border:.0625em solid var(--tvm-segment-outer-border) !important;
  box-shadow:inset 0 .0625em 0 rgba(255,255,255,.28) !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
.tv-magic .tvm-lang{
  border:.0625em solid transparent !important;
  background:transparent !important;
  box-shadow:none !important;
}
.tv-magic .tvm-lang.is-active{
  background:var(--tvm-segment-inner-bg) !important;
  border-color:var(--tvm-segment-inner-border) !important;
  box-shadow:var(--tvm-segment-inner-shadow) !important;
}
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-lang:hover:not(.is-active){
    background:rgba(255,255,255,.28) !important;
    border-color:transparent !important;
    transform:none !important;
  }
}

/* Question choices inherit the Language control's material language, not its segmented geometry. */
.tv-magic .tvm-choice{
  background:var(--tvm-segment-outer-bg) !important;
  border:.0625em solid var(--tvm-segment-outer-border) !important;
  border-radius:var(--tvm-radius-pill) !important;
  box-shadow:inset 0 .0625em 0 rgba(255,255,255,.24) !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
.tv-magic .tvm-choice.is-selected{
  background:var(--tvm-segment-inner-bg) !important;
  border-color:var(--tvm-segment-inner-border) !important;
  box-shadow:var(--tvm-segment-inner-shadow) !important;
}
@media (hover:hover) and (pointer:fine){
  .tv-magic .tvm-choice:hover:not(.is-selected):not(:disabled){
    background:rgba(255,255,255,.34) !important;
    border-color:rgba(32,38,36,.10) !important;
    box-shadow:inset 0 .0625em 0 rgba(255,255,255,.34) !important;
    transform:none !important;
  }
}
.tv-magic .tvm-choice:active:not(:disabled){
  transform:scale(.975) !important;
}

/* Prompt Copy / もどる / もういちど are one Button System. Width remains contextual. */
.tv-magic #tvmCopy,
.tv-magic .tvm-question-frame .tvm-back,
.tv-magic .tvm-result-restart .tvm-btn,
.tv-magic .tvm-result-restart .tvm-btn.is-ghost{
  min-height:var(--tvm-action-size) !important;
  padding-inline:1.2em !important;
  border:.0625em solid var(--tvm-action-border) !important;
  border-radius:var(--tvm-radius-pill) !important;
  background:var(--tvm-action-bg) !important;
  color:var(--tvm-ink) !important;
  box-shadow:var(--tvm-glass-shadow) !important;
  -webkit-backdrop-filter:blur(1.125em) saturate(1.06) !important;
  backdrop-filter:blur(1.125em) saturate(1.06) !important;
  font:inherit !important;
  line-height:1.2 !important;
  display:inline-flex !important;
  align-items:center !important;
  justify-content:center !important;
  transition:background var(--tvm-motion-fast) var(--tvm-ease),border-color var(--tvm-motion-fast) var(--tvm-ease),color var(--tvm-motion-fast) var(--tvm-ease),transform var(--tvm-motion-fast) var(--tvm-ease),box-shadow var(--tvm-motion-fast) var(--tvm-ease) !important;
}
.tv-magic #tvmCopy{width:100% !important;}
.tv-magic .tvm-question-frame .tvm-back{width:auto !important;}
.tv-magic .tvm-result-restart .tvm-btn{width:auto !important;min-width:10em !important;}
.tv-magic .tvm-question-frame .tvm-back::before{content:none !important;}
@media (hover:hover) and (pointer:fine){
  .tv-magic #tvmCopy:hover:not(:disabled),
  .tv-magic .tvm-question-frame .tvm-back:hover:not(:disabled),
  .tv-magic .tvm-result-restart .tvm-btn:hover:not(:disabled){
    background:var(--tvm-action-hover-bg) !important;
    border-color:var(--tvm-action-hover-border) !important;
    box-shadow:none !important;
    transform:none !important;
  }
}
.tv-magic #tvmCopy:active:not(:disabled),
.tv-magic .tvm-question-frame .tvm-back:active:not(:disabled),
.tv-magic .tvm-result-restart .tvm-btn:active:not(:disabled){
  transform:scale(.975) !important;
}

/* Prompt-copy success is explicit at the point of action. */
.tv-magic #tvmCopy[data-state="success"]{
  border-color:var(--tvm-control-selected-border) !important;
  background:var(--tvm-control-selected-bg) !important;
}
.tv-magic .tvm-btn-label{pointer-events:none;}
.tv-magic .tvm-copy-status{
  position:absolute !important;
  inline-size:.0625em !important;
  block-size:.0625em !important;
  margin:-.0625em !important;
  padding:0 !important;
  overflow:hidden !important;
  clip-path:inset(50%) !important;
  white-space:nowrap !important;
  border:0 !important;
}

/* Laws are one continuous list. World-law prose begins after the same row rhythm. */
.tv-magic .tvm-summary-grid.tvm-law-list,
.tv-magic .tvm-grid.tvm-law-list{
  row-gap:var(--tvm-law-row-gap) !important;
}
.tv-magic .tvm-detail{margin-top:0 !important;}
.tv-magic .tvm-ontology-block{
  margin-top:var(--tvm-law-row-gap) !important;
}
.tv-magic .tvm-ontology-label{margin-bottom:.8em !important;}

/* Focus exit glyph is deliberately more visible; hit area remains stable. */
.tv-magic.is-focus .tvm-focus-toggle .tvm-focus-icon-exit,
.tv-magic.is-focus .tvm-focus-toggle .tvm-margin__fullscreenIcon.tvm-focus-icon-exit{
  width:3.5em !important;
  height:3.5em !important;
  flex-basis:3.5em !important;
}

/* Share geometry stays fixed; only visible glyph area receives optical correction. */
.tv-magic [data-share-action="x"] .tvm-share-font-icon{transform:translateY(-.025em) scale(.97) !important;}
.tv-magic [data-share-action="threads"] .tvm-share-icon{transform:translateY(.005em) scale(1.20) !important;}
.tv-magic [data-share-action="bluesky"] .tvm-share-icon{transform:translateY(.015em) scale(1.00) !important;}
.tv-magic [data-share-action="line"] .tvm-share-font-icon{transform:translateY(.015em) scale(1.25) !important;}
.tv-magic [data-share-action="native"] .tvm-share-icon{transform:translateY(.01em) scale(1.18) !important;}
.tv-magic [data-share-action="story"] .tvm-share-icon{transform:translateY(.01em) scale(1.18) !important;}
.tv-magic [data-share-action="copy"] .tvm-copy-icon{transform:translateY(.01em) scale(1.18) !important;}

/* Busy state never hides share/icon DOM. */
.tv-magic .tvm-share-btn[data-busy="true"] .tvm-share-icon-wrap,
.tv-magic .tvm-share-btn[data-busy="true"] .tvm-share-fallback{
  visibility:visible !important;
  opacity:1 !important;
}

@media(max-width:30em){
  .tv-magic{
    --tvm-result-axis-width:min(46em,calc(100dvw - 1.5em));
    --tvm-law-axis-width:min(35em,calc(100dvw - 1.75em));
  }
  .tv-magic:not(.is-focus) .tvm-result-name{font-size:clamp(2.15em,9vw,2.95em);}
}

@media(prefers-reduced-transparency:reduce){
  .tv-magic #tvmCopy,
  .tv-magic .tvm-question-frame .tvm-back,
  .tv-magic .tvm-result-restart .tvm-btn{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
    background:var(--tvm-veil-solid) !important;
  }
}



/* =========================================================
   v5.7 — canonical Result hierarchy / Focus composition
   Consolidates Result-specific overrides into one final layer.
   ========================================================= */
.tv-magic{
  --tvm-v57-result-width:min(50em,88dvw);
  --tvm-v57-law-width:min(38em,74dvw);
  --tvm-v57-prompt-width:min(42em,80dvw);
  --tvm-v57-section-gap:clamp(2.75em,4.2dvh,4.8em);
  --tvm-v57-law-gap:.72em;
  --tvm-v57-discovery-gap:clamp(1.15em,1.8dvh,1.8em);
}

/* Discovery -> Laws -> Carry -> Share -> Again */
.tv-magic .tvm-result-screen{
  width:var(--tvm-v57-result-width);
  max-width:100%;
  margin-inline:auto;
  padding-top:var(--tvm-experience-top);
  padding-bottom:var(--tvm-experience-bottom);
}
.tv-magic .tvm-result-discovery{
  width:100%;
  max-width:44em;
  margin-inline:auto;
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:var(--tvm-v57-discovery-gap);
}
.tv-magic .tvm-result-discovery .tvm-kicker{
  margin:0 !important;
  font-size:var(--tvm-result-meta-size);
  color:var(--tvm-muted);
}
.tv-magic .tvm-result-discovery .tvm-result-name{
  margin:0 !important;
  font-size:clamp(2.35em,3.35vw,3.4em);
  line-height:1.08;
  letter-spacing:-.034em;
}
.tv-magic .tvm-result-discovery .tvm-core{
  margin:0 !important;
  max-width:36em;
  font-size:var(--tvm-result-body-size);
  line-height:1.82;
}
.tv-magic .tvm-result-axis{
  width:min(48em,86dvw);
  max-width:100%;
  margin-inline:auto;
}
.tv-magic .tvm-result-axis > .tvm-result-section,
.tv-magic .tvm-result-axis > .tvm-result-restart{
  margin-top:var(--tvm-v57-section-gap) !important;
}
.tv-magic .tvm-result-section-title{
  margin:0 0 1.35em !important;
}

/* Law layout restored to the proven v5.5 composition: 5 core rows + 3 detail rows + world law. */
.tv-magic .tvm-law-group{
  width:var(--tvm-v57-law-width);
  max-width:100%;
  margin-inline:auto;
}
.tv-magic .tvm-summary-grid.tvm-law-list,
.tv-magic .tvm-grid.tvm-law-list{
  width:100%;
  display:grid !important;
  grid-template-columns:1fr !important;
  row-gap:var(--tvm-law-row-gap) !important;
  column-gap:0 !important;
  margin:0 !important;
  padding:0 !important;
}
.tv-magic .tvm-law-list > .tvm-law-row{
  display:grid !important;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr) !important;
  column-gap:var(--tvm-law-column-gap) !important;
  align-items:center !important;
  justify-items:stretch !important;
  width:100% !important;
  min-width:0 !important;
  margin:0 !important;
  padding:0 !important;
}
.tv-magic .tvm-law-list > .tvm-law-row > dt,
.tv-magic .tvm-law-list > .tvm-law-row > dd{
  display:flex !important;
  align-items:center !important;
  min-height:1.72em !important;
  margin:0 !important;
  padding:0 !important;
  line-height:1.45 !important;
}
.tv-magic .tvm-law-list > .tvm-law-row > dt{
  justify-content:flex-end !important;
  text-align:right !important;
  color:var(--tvm-muted);
}
.tv-magic .tvm-law-list > .tvm-law-row > dd{
  justify-content:flex-start !important;
  text-align:left !important;
  color:var(--tvm-ink);
  overflow-wrap:anywhere;
}
.tv-magic .tvm-detail{
  margin-top:0;
}
.tv-magic .tvm-law-list--detail{
  margin-top:0 !important;
}
.tv-magic .tvm-ontology-block{
  width:min(34em,100%);
  margin:clamp(2.25em,4dvh,3.5em) auto 0 !important;
  text-align:center;
}
.tv-magic .tvm-ontology-label{
  margin:0 0 .8em !important;
  color:var(--tvm-muted);
  font-size:var(--tvm-result-meta-size);
  line-height:1.5;
  font-weight:600;
  text-align:center;
}
.tv-magic .tvm-ontology-text{
  width:min(30em,100%);
  margin:0 auto !important;
  color:var(--tvm-ink);
  font-size:var(--tvm-result-body-size);
  line-height:1.9;
  text-align:center;
  overflow-wrap:anywhere;
}

/* Carry is action-first; full prompt remains available but visually secondary. */
.tv-magic .tvm-carry-section{
  width:100%;
}
.tv-magic .tvm-carry-lead{
  max-width:36em;
  margin-inline:auto;
  line-height:1.75;
  font-size:var(--tvm-result-body-size);
}
.tv-magic .tvm-copy-action{
  width:min(28em,100%);
  margin-inline:auto;
}
.tv-magic .tvm-prompt-group{
  width:var(--tvm-v57-prompt-width);
  max-width:100%;
  margin-inline:auto;
}
.tv-magic .tvm-prompt{
  min-height:7.5em;
  max-height:18em;
  font-size:.9em;
  line-height:1.65;
}
.tv-magic .tvm-result-restart .tvm-btn{
  min-width:7.5em !important;
}

/* Focus is a dedicated composition rather than Normal with the background removed. */
.tv-magic.is-focus{
  --tvm-v57-result-width:min(58em,91dvw);
  --tvm-v57-law-width:min(44em,76dvw);
  --tvm-v57-prompt-width:min(48em,82dvw);
  --tvm-v57-section-gap:clamp(3.4em,6.2dvh,6.2em);
  --tvm-v57-law-gap:clamp(.82em,1.15dvh,1.05em);
  --tvm-result-body-size:clamp(1.18em,1.35vw,1.38em);
  --tvm-result-meta-size:clamp(.9em,.9vw,1em);
  --tvm-result-ui-size:clamp(1.05em,1.04vw,1.15em);
}
.tv-magic.is-focus .tvm-entry{
  padding-top:clamp(6.5em,15dvh,11em);
}
.tv-magic.is-focus .tvm-question-frame{
  width:min(44em,80dvw);
}
.tv-magic.is-focus .tvm-question{
  font-size:clamp(2.08em,2.8vw,3em);
}
.tv-magic.is-focus .tvm-choice{
  min-height:3.8em;
  font-size:clamp(1.035em,1.08vw,1.16em);
}
.tv-magic.is-focus .tvm-result-screen{
  width:var(--tvm-v57-result-width);
  min-height:100dvh !important;
  padding-top:clamp(5.5em,10dvh,8.5em);
  padding-bottom:clamp(5em,9dvh,8em);
}
.tv-magic.is-focus .tvm-result-discovery{
  max-width:50em;
  gap:clamp(1.4em,2.4dvh,2.2em);
}
.tv-magic.is-focus .tvm-result-discovery .tvm-result-name{
  font-size:clamp(3em,4.2vw,4.35em);
}
.tv-magic.is-focus .tvm-result-discovery .tvm-core{
  max-width:40em;
  font-size:clamp(1.2em,1.45vw,1.5em);
  line-height:1.9;
}
.tv-magic.is-focus .tvm-result-axis{
  width:min(54em,88dvw);
}
.tv-magic.is-focus .tvm-law-list > .tvm-law-row{
  column-gap:1.45em !important;
}
.tv-magic.is-focus .tvm-law-list > .tvm-law-row > dt{
  font-size:clamp(.92em,.9vw,1.02em);
}
.tv-magic.is-focus .tvm-law-list > .tvm-law-row > dd,
.tv-magic.is-focus .tvm-ontology-text{
  font-size:clamp(1.08em,1.18vw,1.24em);
  line-height:1.68 !important;
}
.tv-magic.is-focus .tvm-carry-lead{
  max-width:40em;
  font-size:clamp(1.08em,1.18vw,1.24em);
}
.tv-magic.is-focus #tvmCopy,
.tv-magic.is-focus .tvm-result-restart .tvm-btn{
  min-height:3.6em !important;
  font-size:var(--tvm-result-ui-size) !important;
}
.tv-magic.is-focus .tvm-share-btn{
  font-size:var(--tvm-result-ui-size);
}
.tv-magic.is-focus .tvm-prompt{
  min-height:12em;
  max-height:30em;
  font-size:.95em;
}

@media(max-width:48em){
  .tv-magic,
  .tv-magic.is-focus{
    --tvm-v57-result-width:min(46em,calc(100dvw - 2em));
    --tvm-v57-law-width:min(38em,calc(100dvw - 2em));
    --tvm-v57-prompt-width:min(42em,calc(100dvw - 2em));
  }
}
@media(max-width:30em){
  .tv-magic,
  .tv-magic.is-focus{
    --tvm-v57-result-width:calc(100dvw - 1.5em);
    --tvm-v57-law-width:calc(100dvw - 2em);
    --tvm-v57-prompt-width:calc(100dvw - 1.5em);
    --tvm-v57-section-gap:clamp(2.1em,3.2dvh,3em);
  }
  .tv-magic .tvm-law-list > .tvm-law-row{
    grid-template-columns:minmax(7.5em,auto) minmax(0,1fr) !important;
    column-gap:.9em !important;
  }
  .tv-magic.is-focus .tvm-entry{
    padding-top:clamp(4.5em,10dvh,7em);
  }
  .tv-magic.is-focus .tvm-question-frame{
    width:calc(100dvw - 2em);
  }
  .tv-magic.is-focus .tvm-question{
    font-size:clamp(1.82em,7.4vw,2.3em);
  }
  .tv-magic.is-focus .tvm-result-discovery .tvm-result-name{
    font-size:clamp(2.45em,10vw,3.3em);
  }
  .tv-magic.is-focus .tvm-result-discovery .tvm-core{
    font-size:1.08em;
    line-height:1.82;
  }
}
@media(max-height:42em){
  .tv-magic.is-focus .tvm-entry{
    padding-top:clamp(3.25em,7dvh,4.5em);
  }
  .tv-magic.is-focus .tvm-result-screen{
    padding-top:clamp(3.25em,6dvh,4.5em);
    padding-bottom:clamp(3em,6dvh,4.5em);
  }
}



/* =========================================================
   v5.9 — ephemeral experience state / white & clear Normal actions
   - Answers, question position, Result/Profile/Prompt remain memory-only.
   - Reload always starts a fresh experience.
   - Display preferences remain persistent via localStorage.
   - Normal-mode recurring actions use white or transparent surfaces only.
   ========================================================= */
.tv-magic{
  --tvm-v59-white:#fff;
  --tvm-v59-clear:transparent;
  --tvm-v59-border:rgba(32,38,36,.14);
  --tvm-v59-hover-border:rgba(32,38,36,.24);
  --tvm-v59-hover-white:rgba(255,255,255,.72);
}

/* Copy is the primary carry action: clean white, no grey/ivory cast. */
.tv-magic:not(.is-focus) #tvmCopy{
  background:var(--tvm-v59-white) !important;
  border-color:var(--tvm-v59-border) !important;
  box-shadow:0 .10em .45em rgba(22,22,20,.045) !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}

/* Back / Again stay visually quieter: transparent at rest. */
.tv-magic:not(.is-focus) .tvm-question-frame .tvm-back,
.tv-magic:not(.is-focus) .tvm-result-restart .tvm-btn,
.tv-magic:not(.is-focus) .tvm-result-restart .tvm-btn.is-ghost{
  background:var(--tvm-v59-clear) !important;
  border-color:var(--tvm-v59-border) !important;
  box-shadow:none !important;
  -webkit-backdrop-filter:none !important;
  backdrop-filter:none !important;
}
@media (hover:hover) and (pointer:fine){
  .tv-magic:not(.is-focus) #tvmCopy:hover:not(:disabled),
  .tv-magic:not(.is-focus) .tvm-question-frame .tvm-back:hover:not(:disabled),
  .tv-magic:not(.is-focus) .tvm-result-restart .tvm-btn:hover:not(:disabled){
    background:var(--tvm-v59-hover-white) !important;
    border-color:var(--tvm-v59-hover-border) !important;
    box-shadow:none !important;
  }
}

/* Dark mode uses the same semantic roles: white primary, transparent secondary. */
.tv-magic[data-tvm-theme="dark"]{
  --tvm-v59-white:rgba(255,255,255,.10);
  --tvm-v59-clear:transparent;
  --tvm-v59-border:rgba(255,255,255,.22);
  --tvm-v59-hover-border:rgba(255,255,255,.36);
  --tvm-v59-hover-white:rgba(255,255,255,.14);
}

@media (prefers-reduced-transparency:reduce){
  .tv-magic:not(.is-focus) #tvmCopy,
  .tv-magic:not(.is-focus) .tvm-question-frame .tvm-back,
  .tv-magic:not(.is-focus) .tvm-result-restart .tvm-btn{
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
  }
}

/* =========================================================
   v6.8 — unified scrollable Focus shell / fluid scale / editorial Story Card
   - One responsive system across PC and mobile.
   - Focus shell stays fixed; its app surface is the shared vertical scroller.
   - Narrow-screen exceptions are reserved for genuine geometry constraints.
   ========================================================= */
.tv-magic{
  --tvm-law-row-gap:1.02em;
  --tvm-result-fluid-body:clamp(1.02em,1.12cqw,1.24em);
  --tvm-result-fluid-meta:clamp(.82em,.84cqw,.96em);
  --tvm-result-fluid-name:clamp(2.45em,3.55cqw,3.7em);
  --tvm-result-fluid-law:clamp(1em,1.02cqw,1.20em);
  --tvm-result-fluid-label:clamp(.84em,.80cqw,1em);
}

/* Entry hero: authored line breaks remain explicit; automatic wraps remain natural. */
.tv-magic .tvm-entry .tvm-hero{
  font-size:clamp(2em,7.15cqw,3.15em);
  line-height:1.04;
}
.tv-magic .tvm-hero-gap{
  display:block;
  width:100%;
  height:.18em;
  pointer-events:none;
}

/* Questions use one fluid equation. JS only marks genuinely wrapped questions. */
.tv-magic .tvm-question{
  font-size:clamp(1.40em,5.55cqw,2.08em);
  line-height:1.48;
}
.tv-magic.is-focus .tvm-question{
  font-size:clamp(1.42em,5.65cqw,2.12em);
  line-height:1.50;
}
.tv-magic .tvm-question-frame .tvm-choices{margin-top:1.05em;}
.tv-magic .tvm-question-frame.is-question-multiline .tvm-choices{margin-top:1.30em;}
.tv-magic.is-focus .tvm-question-frame.is-question-multiline .tvm-choices{margin-top:1.34em;}

/* Result: Normal and Focus share the same scale. Focus only widens the ceiling slightly. */
.tv-magic .tvm-result-screen{
  width:min(50em,94cqw);
}
.tv-magic .tvm-result-discovery{
  max-width:47em;
}
.tv-magic .tvm-result-discovery .tvm-kicker{
  margin-bottom:clamp(1.7em,2.8dvh,2.55em) !important;
}
.tv-magic .tvm-result-discovery .tvm-result-name{
  font-size:var(--tvm-result-fluid-name);
}
.tv-magic .tvm-result-discovery .tvm-core{
  max-width:39em;
  font-size:var(--tvm-result-fluid-body);
  line-height:1.82;
}
.tv-magic .tvm-result-axis{
  width:min(50em,92cqw);
}
.tv-magic .tvm-law-group{
  width:min(40em,100%);
}
.tv-magic .tvm-law-list > .tvm-law-row > dt{
  font-size:var(--tvm-result-fluid-label);
}
.tv-magic .tvm-law-list > .tvm-law-row > dd,
.tv-magic .tvm-ontology-text{
  font-size:var(--tvm-result-fluid-law);
  line-height:1.68 !important;
}
.tv-magic .tvm-result-section-title{
  font-size:clamp(1.02em,.98cqw,1.18em);
}

/* World law is one centered proposition, always outside the tabular rhythm. */
.tv-magic .tvm-ontology-block{
  width:min(36em,100%);
  margin:clamp(1.9em,2.8dvh,2.5em) auto 0 !important;
  text-align:center !important;
}
.tv-magic .tvm-ontology-label,
.tv-magic .tvm-ontology-text{
  text-align:center !important;
  margin-left:auto !important;
  margin-right:auto !important;
}
.tv-magic .tvm-ontology-label{margin-bottom:1.12em !important;}
.tv-magic .tvm-ontology-text{width:min(32em,100%) !important;}

/* Carry helper remains clearly subordinate to the result. */
.tv-magic .tvm-carry-lead{
  display:flex;
  flex-direction:column;
  align-items:center;
  width:min(100%,29em);
  max-width:29em;
  margin-left:auto !important;
  margin-right:auto !important;
  font-size:clamp(.78em,.74cqw,.88em) !important;
  line-height:1.40 !important;
}
.tv-magic .tvm-carry-lead-line{
  width:min(100%,26em);
  margin:0;
  line-height:1.40;
  text-align:center;
}
.tv-magic .tvm-carry-lead-gap{
  display:block;
  width:100%;
  height:.18em;
  flex:none;
}

/* Focus uses the same responsive system. No independent mobile composition. */
.tv-magic.is-focus{
  --tvm-v57-result-width:min(54em,94dvw);
  --tvm-v57-law-width:min(42em,86dvw);
  --tvm-v57-prompt-width:min(48em,88dvw);
  --tvm-v57-section-gap:clamp(3.0em,5dvh,5.0em);
  --tvm-result-body-size:var(--tvm-result-fluid-body);
  --tvm-result-meta-size:var(--tvm-result-fluid-meta);
}
.tv-magic.is-focus .tvm-screen{
  margin-left:auto;
  margin-right:auto;
}
.tv-magic.is-focus .tvm-result-screen{
  width:var(--tvm-v57-result-width);
  min-height:auto !important;
  padding-top:clamp(3.75em,7dvh,6em);
  padding-bottom:clamp(4.5em,8dvh,7em);
}
.tv-magic.is-focus .tvm-result-discovery{
  max-width:50em;
}
.tv-magic.is-focus .tvm-result-discovery .tvm-result-name{
  font-size:clamp(2.55em,3.75cqw,4.0em);
}
.tv-magic.is-focus .tvm-result-discovery .tvm-core{
  max-width:41em;
  font-size:clamp(1.03em,1.18cqw,1.34em);
  line-height:1.82;
}
.tv-magic.is-focus .tvm-result-axis{
  width:min(52em,90dvw);
}
.tv-magic.is-focus .tvm-law-list > .tvm-law-row > dt{
  font-size:clamp(.86em,.82cqw,1.02em);
}
.tv-magic.is-focus .tvm-law-list > .tvm-law-row > dd,
.tv-magic.is-focus .tvm-ontology-text{
  font-size:clamp(1em,1.04cqw,1.22em);
  line-height:1.68 !important;
}
.tv-magic.is-focus .tvm-result-section-title{
  font-size:clamp(1.03em,1cqw,1.20em);
}
.tv-magic.is-focus .tvm-carry-lead{
  font-size:clamp(.79em,.72cqw,.89em) !important;
  line-height:1.40 !important;
}
.tv-magic.is-focus .tvm-carry-lead-gap{height:.18em;}

/* Long result/prompt content remains reachable on every viewport. */
.tv-magic.is-focus .tvm-result-restart{
  padding-bottom:max(1em,env(safe-area-inset-bottom));
}

/* Genuine extreme-width safeguard only. */
@container tvmagic (max-width:22em){
  .tv-magic .tvm-question-frame{width:100%;}
  .tv-magic .tvm-result-axis{width:100%;}
  .tv-magic .tvm-law-list > .tvm-law-row{
    grid-template-columns:minmax(7.25em,auto) minmax(0,1fr) !important;
    column-gap:.8em !important;
  }
}


/* =========================================================
   v7.1 — safe mobile law layout / unified row rhythm / compact share row
   PC horizontal law geometry intentionally remains unchanged.
   ========================================================= */
.tv-magic{
  --tvm-v71-law-row-gap:.88em;
  --tvm-q-choice-pad-x:clamp(1.25em,2.2vw,1.55em);
}

/* One visible vertical rhythm across all eight law rows.
   Remove the older min-height contribution so the perceived spacing comes
   from one source: row-gap. LIMIT -> ACCESS uses the same gap as every row. */
.tv-magic .tvm-summary-grid.tvm-law-list,
.tv-magic .tvm-grid.tvm-law-list{
  row-gap:var(--tvm-v71-law-row-gap) !important;
}
.tv-magic .tvm-law-list--detail{
  margin-top:var(--tvm-v71-law-row-gap) !important;
}
.tv-magic .tvm-law-list > .tvm-law-row > dt,
.tv-magic .tvm-law-list > .tvm-law-row > dd{
  min-height:0 !important;
  line-height:1.45 !important;
}

/* Question answers remain scan-friendly: a shared left reading edge with
   a little more inset than the pill itself. */
.tv-magic .tvm-choice{
  padding-left:var(--tvm-q-choice-pad-x) !important;
  padding-right:var(--tvm-q-choice-pad-x) !important;
  text-align:left !important;
}

@media(max-width:30em){
  /* Safari-safe mobile law layout.
     No subgrid and no display:contents: both semantic lists remain ordinary
     grids, so every law row is paintable and scrollable on iOS Safari.
     The whole information block is deliberately narrower than the viewport,
     then centered as one unit. */
  .tv-magic .tvm-law-group{
    display:block !important;
    width:min(22.5em,calc(100dvw - 2em)) !important;
    max-width:100% !important;
    margin-left:auto !important;
    margin-right:auto !important;
  }
  .tv-magic .tvm-law-group > .tvm-result-section-title{
    width:100% !important;
    text-align:center !important;
  }
  .tv-magic .tvm-law-group > .tvm-law-list,
  .tv-magic .tvm-law-group .tvm-detail > .tvm-law-list{
    display:grid !important;
    grid-template-columns:1fr !important;
    width:100% !important;
    max-width:100% !important;
    margin-left:0 !important;
    margin-right:0 !important;
  }
  .tv-magic .tvm-law-group > .tvm-detail{
    display:block !important;
    width:100% !important;
    max-width:100% !important;
  }
  .tv-magic .tvm-law-list > .tvm-law-row{
    display:grid !important;
    grid-template-columns:7.75em minmax(0,1fr) !important;
    column-gap:clamp(.68em,2.5cqw,.88em) !important;
    align-items:start !important;
    width:100% !important;
    max-width:100% !important;
    margin:0 !important;
  }
  .tv-magic .tvm-law-list > .tvm-law-row > dt,
  .tv-magic .tvm-law-list > .tvm-law-row > dd{
    display:block !important;
    width:auto !important;
    min-width:0 !important;
    max-width:100% !important;
    margin:0 !important;
  }
  .tv-magic .tvm-law-list > .tvm-law-row > dt{
    text-align:right !important;
  }
  .tv-magic .tvm-law-list > .tvm-law-row > dd{
    text-align:left !important;
    overflow-wrap:anywhere !important;
  }
  .tv-magic .tvm-ontology-block{
    width:100% !important;
    max-width:100% !important;
    margin-left:auto !important;
    margin-right:auto !important;
  }
  .tv-magic .tvm-ontology-text{
    width:min(100%,27em) !important;
    max-width:100% !important;
  }

  /* Focus is internally scrollable; reserve enough terminal space that the
     world law, share actions and restart control can clear mobile browser UI. */
  .tv-magic.is-focus #tvmagicApp{
    padding-bottom:max(10em,calc(env(safe-area-inset-bottom) + 8em)) !important;
    scroll-padding-bottom:max(10em,calc(env(safe-area-inset-bottom) + 8em));
  }
  .tv-magic.is-focus .tvm-result-screen{
    padding-bottom:max(6em,calc(env(safe-area-inset-bottom) + 4em)) !important;
  }

  /* Seven actions must remain on one line on phone widths. */
  .tv-magic{
    --tvm-share-size:clamp(2.18em,9.45cqw,2.62em);
    --tvm-share-optical-size:clamp(.98em,4.15cqw,1.25em);
    --tvm-share-glyph-size-v52:var(--tvm-share-optical-size);
  }
  .tv-magic .tvm-share-row{
    display:flex !important;
    flex-wrap:nowrap !important;
    justify-content:center !important;
    align-items:center !important;
    width:100% !important;
    max-width:100% !important;
    gap:clamp(.16em,1.05cqw,.32em) !important;
  }
  .tv-magic .tvm-share-group{
    display:flex !important;
    flex-wrap:nowrap !important;
    align-items:center !important;
    gap:clamp(.14em,.92cqw,.28em) !important;
    min-width:0 !important;
  }
  .tv-magic .tvm-share-unit{
    width:var(--tvm-share-size) !important;
    height:var(--tvm-share-size) !important;
    min-width:var(--tvm-share-size) !important;
    min-height:var(--tvm-share-size) !important;
    flex:0 0 var(--tvm-share-size) !important;
  }
  .tv-magic .tvm-share-unit > .tvm-share-btn{
    width:100% !important;
    height:100% !important;
    min-width:100% !important;
    min-height:100% !important;
  }
}


/* =========================================================
   v7.2 — borderless share actions / mobile terminal reachability
   ========================================================= */
.tv-magic .tvm-share-btn,
.tv-magic .tvm-share-btn:hover,
.tv-magic .tvm-share-btn:hover:not(:disabled),
.tv-magic .tvm-share-btn:active,
.tv-magic .tvm-share-btn:active:not(:disabled),
.tv-magic .tvm-share-btn:focus-visible{
  border:0 !important;
  border-color:transparent !important;
  box-shadow:none !important;
}

@media(forced-colors:active){
  .tv-magic .tvm-share-btn,
  .tv-magic .tvm-share-btn:hover,
  .tv-magic .tvm-share-btn:focus-visible{
    border:1px solid ButtonText !important;
    border-color:ButtonText !important;
  }
}

@media(max-width:30em){
  .tv-magic.is-focus .tvm-ontology-block{
    scroll-margin-bottom:max(10em,calc(env(safe-area-inset-bottom) + 8em));
  }
  .tv-magic.is-focus .tvm-result-restart{
    padding-bottom:max(4em,calc(env(safe-area-inset-bottom) + 3em)) !important;
  }
}


/* =========================================================
   v7.3 — Story Card single-color typography
   ========================================================= */
/* Web UI colors remain unchanged. Story Card alone uses one light text color
   over a dark neutral image veil for stable photographic readability. */

</style>

<div class="tv-magic" id="tvmagic">
  <div id="tvmagicApp" aria-live="polite"></div>
  <textarea id="tvmPromptTemplateJA" hidden aria-hidden="true">以下は、 https://TranquilGuides.com で生成した私専用のPersona Magic Profileです。

[TASK]
このProfileを、今後の生成における「魔法法則の固定核」として使用してください。
これは性格診断・心理診断・能力判定・適性評価・占い・客観的な人格分析ではなく、質問への選択から構成された創作上の魔法体系です。
このPromptを受け取ったら、最初に追加質問をせず、Profileを保持した具体的な成果物を一つ生成してください。 迷った場合も質問へ戻らず、固定核を壊さない最小限の解釈で最初の一例まで進めてください。

[PRIORITY]
1. Persona Magic Profile = FIXED CORE
2. 正当に参照できる既存文脈 = SUPPORTING CONTEXT
3. 固定核を壊さず成立させる論理解釈 = DERIVED INTERPRETATION
4. 今回だけの具体化 = MANIFESTATION DETAIL

下位層から上位層を書き換えないでください。Profileに確定値として書かれた項目は、直接質問されたか、回答間の整合からTranquilGuides側で解決されたかに関係なくFIXED COREです。未確定なのは、明示的にunspecified / open等として残された部分だけです。

[PERSONA MAGIC PROFILE]
{{PERSONA_MAGIC_PROFILE}}
[/PERSONA MAGIC PROFILE]

[CORE SEMANTICS]
Profileの各項目は装飾語ではなく、互いに因果関係を持つ法則です。
DOMINANT_PRINCIPLE = 中心原理。
SOURCE = 力の発生源。
ACCESS = SOURCEと有効なTARGETの接続が成立する条件。
MEDIUM = 接続成立後にEFFECTを実行する行為・媒介。
TARGET = 作用対象。
EFFECT = TARGETへ起きる変化。
COST = 発動に伴って必ず失われるもの。
LIMIT = 成立範囲・使用条件を制約する境界。
CONTROL = 結果を意図的に決められる全体的な程度。
ONTOLOGY = この魔法が成立可能である理由を定める世界法則。

原則として SOURCE → ACCESS → MEDIUM → TARGET → EFFECT → LIMIT/COST → CONTROL の因果を、ONTOLOGYが全体として説明します。SOURCE / ACCESS / MEDIUMを同義にしないでください。たとえばsource=self、access=contact、medium=touchなら、力は本人から生まれ、接触で対象との接続条件が成立し、その接続中のtouchが発動行為です。役割を混ぜて一つの設定へ潰さないでください。

[FIXED CORE RULES]
Profileのtype、operation、level、ontology、明示されたrule等を、SUPPORTING CONTEXT、ジャンル慣習、ドラマ性、映像映え、ゲームバランス、一般的な魔法イメージを理由に変更しないでください。

COSTとLIMITは別概念です。cost.type=noneなら、寿命、記憶、身体損傷、精神的消耗、疲労、人格変化、資源消費、強制的な時間損失等を「発動の代償」として追加しません。ACCESSを満たすこと、MEDIUMを行うこと、通常の操作時間、LIMITによる禁止・待機条件は、それだけではCOSTではありません。

CONTROLのlevelは全体的な制御度です。highでも、対象選択、範囲、強度、時点、持続時間、形状等の全次元を自由に決定できるとは限りません。control.dimensionsがunspecifiedなら、その次元を固定設定にしません。

TARGETのtypeは対象カテゴリであり、語から連想できる全領域を自動的に含みません。target.type=traceかつdomain=unspecifiedでも、物理的痕跡、匂い、デジタルログ、記憶、DNA、関係性等をすべて対象にできるとは断定しません。

EFFECTのoperationは変化の方向を固定します。effect.mode=unspecifiedなら、物理的再形成、知覚可能化、情報的復元等の実装方式は未確定です。TARGETが状態・関係・境界・不在・可能性等の抽象対象なら、固定値を変更せず両立する最小の解釈を選びます。

ONTOLOGYは雰囲気説明ではなく世界法則です。principle / reference / descriptionを一体として読み、descriptionと矛盾する設定を追加しないでください。ONTOLOGYから導けることと、今回だけの実装を分離してください。

[UNRESOLVED VALUES]
unspecified = このProfileでは固定されていない正式な状態です。「自由にcanon化してよい」という意味ではありません。
open = 主にAesthetic上、固定されていない状態です。雰囲気を埋める義務はありません。
一つの完成例に必要ならunspecified / openを一時的に具体化できますが、それはMANIFESTATION DETAILです。ユーザーが採用しない限りProfileへ書き戻さず、後続生成にも自動継承しません。

例：limit.type=limited_usesでquantity/reset_rule=unspecifiedなら、固定核は「使用可能回数が有限」であることだけです。「1日3回」「睡眠で回復」等を固定設定として発明しないでください。例の中では「残りの使用可能回数が尽き、次の発動が成立しない」のように、数値・周期を確定せずLIMITを見せられます。

Profile内の固定項目同士が一見衝突する場合、一方を無視・上書きしません。両方が成立する最小のDERIVED INTERPRETATIONを組み立てます。情報不足を埋めるためだけに設定を増やさず、成果物に必要な範囲だけ仮置きしてください。

[SUPPORTING CONTEXT]
あなたがこのサービス内で正当に参照できる過去会話、Memory、プロフィール、カスタム指示、現在の会話履歴、本人が明示した制作物・好みをSUPPORTING CONTEXTとして使用して構いません。ただしFIXED COREを変更する根拠にはしません。

役割は、Profileだけでは決まらない質感、媒体、空間、道具、言葉のリズム、提示形式等を補助することです。既存作品・既存プロジェクトをほぼ再構成して魔法を付け足す使い方は避けてください。最初の成果物で主要な個人文脈を使うなら、原則として少数、目安2〜3要素で十分です。

医療・健康、精神状態、診断、政治、宗教、性的情報、家族、犯罪歴、金融情報、住所、連絡先等のセンシティブな情報は、本人が今回の創作へ明示的に持ち込みたいと指示しない限り使用しません。

参照可能な根拠なく「昔から〜だった」「本当は〜を望んでいる」等の個人的事実を断定しないでください。Profileの語から心理状態、トラウマ、病歴、性格、価値観を逆算しません。参照可能な文脈がなければ、架空の経歴や嗜好で補わずProfile単体から生成してください。

[ANTI-CONVERGENCE]
月、星、結晶、青紫、銀色、金色の粒子、古書、ルーン、魔法陣、時計、鍵、蝶、羽、黒いローブ、杖等を、「魔法らしい」「神秘的」という理由だけで追加しないでください。Profileの因果を成立・明瞭化するために必要な場合、またはSUPPORTING CONTEXTが明確に支持する場合だけ使用します。

「記憶=古書」「時間=時計」「境界=扉」「喪失=雨」のような一対一の象徴変換を避けます。まず法則を考え、その法則から外観・音・動き・空間・物質を導いてください。神秘的・幻想的・詩的であることは義務ではありません。無機質、日常的、工業的、事務的、都市的、ユーモラス、静的、騒々しい、簡素でも構いません。既存作品・キャラクター・映画・漫画・小説・ゲームの固有設定へ寄せません。

[MANIFESTATION RULES]
最初の成果物は設定要約ではなく、この魔法が実際に一度成立したと理解できる具体物にしてください。SOURCE、ACCESS、MEDIUM、TARGET、EFFECT、LIMIT、CONTROL、ONTOLOGYを、成果物に必要な範囲で因果として統合します。抽象語だけで終わらず、何が、どこで、どう変わり、何によって変化を確認できるかを具体化してください。

Profileに明記されていない限り、最初から世界規模、都市規模、歴史改変、生命の創造・消滅、万能な時間操作等へ拡張しません。法則を確認できる最小のスケールを優先します。これは能力の最大出力を固定する意味ではありません。例で選んだ対象範囲・距離・時間・数量を固定射程へ昇格させません。

新しく作る人物、場所、物、出来事、名前、色、音、数値、道具、演出等は、ユーザーが明示的に採用するまでMANIFESTATION DETAILです。

[CANON / CONTINUITY]
このProfileの確定値は、質問数や質問順を根拠に弱めないでください。5問で成立したProfileと10問で成立したProfileを、質問数だけで異なる信頼度として扱いません。確定値はFIXED CORE、unspecified / openは未確定です。生成時に補った値は、ユーザーが「この設定を残して」等と明示的に採用した場合だけ後続へ継承できます。

同じProfileをTEXT、IMAGE、AUDIO、CODE、GAME等へ展開しても、媒体変更を理由に魔法法則を変えません。媒体ごとに見せ方は変えても、SOURCE、ACCESS、MEDIUM、TARGET、EFFECT、LIMIT、COST、CONTROL、ONTOLOGYの因果を保持してください。ある媒体で作ったMANIFESTATION DETAILを、別媒体へ自動的に固定設定として持ち越しません。

ユーザーが生成結果の一部を拒否した場合、その拒否をFIXED COREへの否定と解釈しないでください。拒否されたMANIFESTATION DETAILだけを外し、同じ法則から別の具体化を作れます。ユーザーが法則変更を明示した場合のみProfile変更を扱います。

[ARTIFACT ROUTER]
生成前に内部で、まずArtifact Type「何を作るか」を一つ選び、その後Output Form「どう出すか」を一つ選びます。STORY / NARRATIVE / TEXTを既定値として優先しません。

Artifact Type:
NARRATIVE = 出来事・場面・脚本・記録
CHARACTER = 人物・生物・精霊・NPC・怪異
OBJECT = 道具・装置・衣服・武器・家具・Artifact
PLACE = 部屋・家・駅・施設・森・異常空間
WORLD = 都市・国家・文化・歴史・制度・Lore
SYSTEM = 魔法体系・能力・分類・因果・ルール
GAME = RPG・TRPG・カード・ボード・パズル
ARCHITECTURE = 建築・内装・平面・断面・導線
VISUAL = Key Visual・Poster・Symbol・Logo・Concept Art
AUDIO = 音楽・環境音・Soundscape・朗読
INTERACTIVE = Web Experience・App・Simulation・Generator
DOCUMENT = 設定資料・図鑑・企画書・仕様書・Presentation・Rulebook

Output Form:
TEXT / IMAGE / DIAGRAM / AUDIO / VIDEO / CODE / FILE / INTERACTIVE_ARTIFACT
必要ならSVG / HTML / PDF / DOCX / PPTX / JSON / YAML / Mermaid等を下位形式にします。IMAGEはArtifact Typeではありません。WEB / APPも主にINTERACTIVEの実装形式です。

成果物の種類は、その人らしさを示すための演出ではなく、Profileの因果を最も明瞭に実体化できるものを選んでください。迷う場合は、既存文脈の量ではなく、法則を最小の追加設定で示せるArtifact Typeを優先します。

[CAPABILITY CHECK / FALLBACK]
Output Formを決めた後、現在のAI環境でその形式を実際に生成できるか内部確認してください。利用可能だと実際に確認できるプラン、quota、権限、Plugin、Tool、Artifact、画像・動画・音声生成、File Exportだけを使用します。利用可否を確認できない能力を「利用可能」と推測しないでください。

直接生成可能なら、説明だけで済ませず実成果物を生成します。直接生成できない場合もArtifact Typeは固定し、Output Formだけを変更します。
1. 同じArtifact Typeで生成可能な最も近いOutput Form
2. 同じArtifact Typeのproduction-ready TEXT SPEC
3. それも難しい場合のみ、同じArtifact Typeを保持した最小テキスト実装

代表例：
VISUAL + IMAGE → VISUAL + DIAGRAM/SVG → VISUAL + TEXT SPEC
ARCHITECTURE + IMAGE → ARCHITECTURE + DIAGRAM → ARCHITECTURE + TEXT SPEC
INTERACTIVE + INTERACTIVE_ARTIFACT → INTERACTIVE + CODE → INTERACTIVE + TEXT SPEC
AUDIO + AUDIO → AUDIO + FILE → AUDIO + TEXT SPEC
DOCUMENT + FILE → DOCUMENT + TEXT
VIDEO + VIDEO → VIDEO + DIAGRAM/Storyboard → VIDEO + TEXT SPEC

画像不可→短編、動画不可→小説、Web不可→物語のようにArtifact Typeまで変更しません。Fallbackが発生した場合だけ、ユーザー向け出力の冒頭で「選択: ARTIFACT_TYPE + OUTPUT_FORM / 代替: ARTIFACT_TYPE + OUTPUT_FORM」と簡潔に示してください。

[OUTPUT CONTRACT]
内部処理：
1. Profileと必要なSUPPORTING CONTEXTを読む。
2. Artifact Typeを一つ決める。
3. Output Formを一つ決める。
4. Capability Checkを行う。
5. 必要な場合だけOutput FormをFallbackする。
6. FIXED COREとの整合を内部確認する。

ユーザーへの最初の出力：
1. Fallbackがある場合だけ選択/代替を短く示す。
2. 必要なら短いタイトル。
3. 実成果物そのもの。
4. unspecified / openを主要な形で具体化した場合だけ「今回の具現化で補った要素」。
5. 最後にだけ「次は何を作りたいですか？」。

Artifact Type、Output Form、Capability Checkを、直接生成できる場合に毎回メタ情報として表示する必要はありません。「了解しました」だけで止まらず、Profile要約だけで終わらず、生成前に形式選択を質問しないでください。

「今回の具現化で補った要素」には、固定核と誤解されやすいdomain、effect mode、具体的な数値・周期、対象範囲、射程等だけを短く記します。すべての小道具を列挙しません。DERIVED INTERPRETATIONとMANIFESTATION DETAILをProfileへ書き戻しません。

成果物提示後、ユーザーが「別案」と言えばFIXED COREを維持してManifestationを変更できます。「もっと私らしく」ならSUPPORTING CONTEXTの使い方を調整します。Profile自体を変更するのは、ユーザーが魔法法則そのものを変えたいと明示した場合だけです。

[INTERNAL PREFLIGHT]
出力前に内部で確認し、問題があれば修正してください。
&#8211; FIXED COREを書き換えていない。
&#8211; SOURCE / ACCESS / MEDIUMを区別している。
&#8211; TARGET domainやEFFECT modeのunspecifiedを無制限・固定設定にしていない。
&#8211; limited_usesへ勝手な回数・reset_ruleを設定していない。
&#8211; CONTROLから未指定の制御次元を確定していない。
&#8211; COSTがnoneなら隠れた代償を追加していない。
&#8211; ONTOLOGYと矛盾していない。
&#8211; SUPPORTING CONTEXTが固定核を上書きしていない。
&#8211; 個人的事実・心理・経歴を捏造していない。
&#8211; 定番魔法記号を雰囲気だけで追加していない。
&#8211; 既存IPへ寄せていない。
&#8211; 追加質問を成果物より先にしていない。
&#8211; FallbackでArtifact Typeを変えていない。
&#8211; 必要な一時的具体化だけを開示している。

固定核に書かれていないことまで固定設定にせず、未定義を未定義のまま尊重してください。一例に必要な分だけ具体化し、ユーザーの選択余地を残してください。</textarea>
  <textarea id="tvmPromptTemplateEN" hidden aria-hidden="true">Below is my Persona Magic Profile generated by https://TranquilGuides.com .
Use it as the FIXED CORE for future generation. It is a creative magic system, not diagnosis, divination, prediction, or a factual assessment of me.
Priority:
1. Persona Magic Profile = FIXED CORE
2. Legitimately accessible context = SUPPORTING CONTEXT
3. Fixed-core-preserving logic = DERIVED INTERPRETATION
4. One-generation concretization = MANIFESTATION DETAIL
Never let a lower layer rewrite a higher one. Resolved Profile values are FIXED CORE whether directly answered or resolved by TranquilGuides from consistent answers; only explicit unspecified / open values remain unresolved.
[PERSONA MAGIC PROFILE]
{{PERSONA_MAGIC_PROFILE}}
[/PERSONA MAGIC PROFILE]
1. Causal reading
Fields are causal rules, not decoration.
DOMINANT_PRINCIPLE=central principle; SOURCE=power origin; ACCESS=condition connecting SOURCE to a valid TARGET; MEDIUM=action/channel executing EFFECT after connection; TARGET=what is acted on; EFFECT=change; COST=unavoidable activation loss; LIMIT=valid-use boundary; CONTROL=overall intentional outcome control; ONTOLOGY=world law explaining possibility.
Use SOURCE → ACCESS → MEDIUM → TARGET → EFFECT → LIMIT/COST → CONTROL under ONTOLOGY. Keep SOURCE/ACCESS/MEDIUM distinct. Details absent from the Profile are not canon.
2. FIXED CORE / unspecified
Do not alter Profile types, operations, levels, or ontology for context, genre, drama, visuals, or game balance.
COST ≠ LIMIT. If cost.type=none, do not add lifespan/memory loss, harm, mental depletion, fatigue, personality change, resource consumption, or mandatory time loss as a price. ACCESS, MEDIUM, ordinary operation time, and LIMIT restrictions are not automatically COST.
CONTROL level is overall controllability. high does not automatically fix target choice, range, intensity, timing, duration, shape, or other dimensions. An unspecified control dimension remains unfixed.
unspecified means “not fixed by this Profile,” not “free to canonize.” Instantiate it only when needed for one complete example; it remains MANIFESTATION DETAIL unless the user adopts it. For limited_uses with quantity/reset_rule unspecified, only finitude is fixed. Do not invent a number/reset cycle; exhaustion may be shown without defining either.
3. TARGET / EFFECT / ONTOLOGY
target.type is a category, not every possible domain. trace + domain=unspecified does not grant every kind of trace; one example may choose one domain only as MANIFESTATION DETAIL.
effect.operation fixes change direction. mode=unspecified leaves implementation unfixed; a mode chosen for one example is not canon. For abstract TARGETs, use the smallest interpretation compatible with fixed fields.
ONTOLOGY is the highest world law, not atmosphere. Treat principle/reference/description together; add nothing contradicting description. Separate world law from this manifestation&#8217;s implementation.
4. SUPPORTING CONTEXT / No fabrication
Use legitimately accessible prior conversations, Memory, profile/custom instructions, current conversation, and established works/preferences only for open manifestation variables. Do not rebuild an existing project and add magic; keep context sparse.
Do not use sensitive personal data unless the user explicitly brings it into this creative task.
Do not invent biography, psychology, diagnosis, motives, values, or preferences. If context is unavailable, use the Profile alone. New creative details remain MANIFESTATION DETAIL until adopted.
5. Anti-Convergence / Expression
Do not add stock magic symbols merely for atmosphere. Use them only when causally required or clearly supported by context. Avoid one-to-one symbolic shortcuts; derive appearance from law first.
Style may be mystical, ordinary, industrial, bureaucratic, urban, humorous, noisy, or minimal. Show what changes, where, how, and how it is observed. Do not imitate existing IP.
6. First generation
Do not ask what to make or which format to use before generating. Produce one complete artifact immediately.
Use Profile as FIXED CORE and context only when useful. Do not merely summarize settings: demonstrate the magic operating, with the causal fields visible as needed.
Unless fixed by Profile, use the smallest scale that demonstrates the law; this does not define maximum power and an example&#8217;s range is not canon.
If fixed fields seem to conflict, overwrite neither. Use the smallest DERIVED INTERPRETATION in which both remain true; instantiate only what the artifact needs.
7. Artifact Type / Output Form
Question count does not change the authority of resolved Profile values. Changing output medium does not change the magic law; temporary manifestation details remain non-canon unless the user adopts them.
First choose one Artifact Type (what to make), then Output Form (how to deliver it). Do not default to STORY/TEXT.
Types: NARRATIVE / CHARACTER / OBJECT / PLACE / WORLD / SYSTEM / GAME / ARCHITECTURE / VISUAL / AUDIO / INTERACTIVE / DOCUMENT. Choose by the artifact&#8217;s primary function, not by a default preference for story or text.
Output Form: TEXT / IMAGE / DIAGRAM / AUDIO / VIDEO / CODE / FILE / INTERACTIVE_ARTIFACT. Use SVG/HTML/PDF/DOCX/PPTX/JSON/YAML/Mermaid etc. as subformats. IMAGE and WEB/APP are output/implementation forms, not Artifact Types.
8. Capability Check / Fallback
After choosing Output Form, use only capabilities you can actually confirm in the current AI environment; do not assume an unverified plan/tool/export capability. If direct creation is supported, create the actual artifact rather than only describing it.
If unavailable, keep Artifact Type fixed and change only Output Form:
1. nearest available form for the same Artifact Type
2. production-ready TEXT SPEC for that Artifact Type
3. minimal text example if necessary
Artifact Type stays unchanged. Never change it because a form is unavailable. Only on fallback, begin: “Selection: ARTIFACT_TYPE + OUTPUT_FORM / Fallback: ARTIFACT_TYPE + OUTPUT_FORM”.
9. Manifestation / Later generation
Only when unspecified values were materially instantiated, add a short “Manifestation details added this time” after the artifact. Mention only choices easily mistaken for canon—especially domain, mode, numbers, cycles, range, target scope. Do not list every prop.
DERIVED INTERPRETATION reconciles fixed fields; MANIFESTATION DETAIL implements one example. Neither is written back into Profile.
Only after the artifact ask: “What would you like to make next?” A requested form continues from the same Profile. “Another version” changes Manifestation only; “more like me” adjusts SUPPORTING CONTEXT. Change Profile only when the user explicitly asks to change the magic laws.
10. Preflight / Output contract
Internal process: read Profile/context → choose Artifact Type → choose Output Form → Capability Check → if needed fallback Output Form only → verify FIXED CORE.
Before output, verify internally that FIXED CORE/ONTOLOGY remain intact; SOURCE/ACCESS/MEDIUM remain distinct; unspecified stays non-canon; no LIMIT quantity/reset, CONTROL dimension, COST, personal fact, or stock symbolism was invented; context stays sparse; no question precedes generation; fallback did not change Artifact Type.
User-facing response:
1. only if fallback occurred, briefly show Selection / Fallback
2. optional short title
3. actual artifact
4. Manifestation details only when materially needed
5. only then “What would you like to make next?”
When direct creation works, do not routinely expose Artifact Type, Output Form, or Capability Check as meta commentary. Do not stop at a Profile summary. Respect undefined values and instantiate only what one example needs.
</textarea>
</div>

<script>
(function(){
  "use strict";
  var PREF_LANGUAGE_KEY="tranquil_magic_language_v1";
  var PREF_FOCUS_KEY="tranquil_magic_focus_v1";
  var PREF_THEME_KEY="tranquil_magic_theme_v1";
  var PREF_BUNDLE_KEY="tranquil_magic_preferences_v2";
  var PREF_SCHEMA_VERSION="2.0";


  var UI={
    ja:{
      brand:"",
      entry_stage:"",
      entry_title:"<span class=\"tvm-hero-line\">いくつか選ぶと、</span><span class=\"tvm-hero-gap\" aria-hidden=\"true\"></span><span class=\"tvm-hero-line tvm-hero-line--keep\">ひとつの魔法ができる。</span>",
      entry_lead:"いくつかの質問から、あなたの魔法の法則をつくります。<br>過去のAI会話をここへ持ち込む必要はありません。<br>最後に、そのまま普段のAIへ持っていけるプロンプトを受け取れます。",
      start:"はじめる",
      intro_title:"",
      intro_lead:"",
      next:"進む",
      back:"もどる",
      stage_outline:"輪郭",
      stage_mechanism:"仕組み",
      stage_almost:"あと少し",
      generating:"魔法の法則をまとめています",
      result_kicker:"あなたの魔法ができました。",
      summary_title:"この魔法の法則",
      starting:"発動する行為",
      change:"起きる変化",
      carry_title:"この魔法を持ち帰る",
      carry_lead:"コピーして、いつものAIに貼り付けてください。この魔法から、最初のひとつが生成されます。",
      carry_lead_first:"コピーして、いつものAIに貼り付けてください。",
      carry_lead_second:"この魔法から、最初のひとつが生成されます。",
      copy:"プロンプトをコピー",
      copy_help:"",
      copy_success_help:"コピーしました。あとは、いつものAIへ貼り付けるだけです。",
      copied:"コピーしました",
      copy_working:"コピーしています",
      progress_label:"進み具合",
      copy_fail:"自動コピーが使えないため、下のプロンプト全文を選択しました。コピーしてください。",
      restart:"もういちど",
      about:"",
      principle:"中心原理",
      source:"力の出所",
      access:"発動条件",
      medium:"媒体",
      target:"対象",
      effect:"作用",
      limit:"制約",
      control:"制御",
      ontology:"世界法則",
      full_prompt:"プロンプト本文",
      note:"",
      share_title:"この魔法をシェア",
      share_x:"Xへシェア",
      share_threads:"Threadsへシェア",
      share_bluesky:"Blueskyへシェア",
      share_line:"LINEへシェア",
      share_native:"共有",
      share_copy:"結果をコピー",
      share_copy_done:"コピー済み",
      share_story:"Story Card",
      share_copied:"結果をコピーしました。",
      share_failed:"共有できませんでした。",
      share_story_ready:"Story Cardを作成しました。",
      focus_enter:"フォーカス表示",
      focus_exit:"フォーカス表示を終了",
      error:"読み込みに失敗しました。ページを再読み込みしてください。",
      recovery_title:"処理中に問題が起きました。",
      recovery_reload:"再読み込み",
      recovery_retry:"再試行",
      recovery_dismiss:"閉じる",
      shortcuts_title:"キーボードショートカット",
      shortcuts_close:"閉じる",
      shortcuts_hint:"? でこの一覧を開閉できます。",
      shortcuts_choices:"1〜9：選択肢を選ぶ",
      shortcuts_move:"↑ / ↓：選択肢間を移動",
      shortcuts_back:"B：もどる",
      shortcuts_focus:"F：Focus表示を切り替える",
      shortcuts_restart:"R：もういちど",
      shortcuts_result_copy:"C：結果をコピー",
      shortcuts_prompt_copy:"P：プロンプトをコピー",
      shortcuts_share:"S / X / T / L：共有",
      shortcuts_escape:"Esc：閉じる / Focus表示を終了"
    },
    en:{
      brand:"",
      entry_stage:"",
      entry_title:"<span class=\"tvm-hero-line\">Choose a few things,</span><span class=\"tvm-hero-gap\" aria-hidden=\"true\"></span><span class=\"tvm-hero-line tvm-hero-line--keep\">and one magic will take shape.</span>",
      entry_lead:"A few questions will shape the laws of your magic.<br>You do not need to bring past AI conversations here.<br>At the end, you will receive a prompt you can take directly to your usual AI.",
      start:"Begin",
      intro_title:"",
      intro_lead:"",
      next:"Continue",
      back:"Back",
      stage_outline:"Outline",
      stage_mechanism:"Mechanism",
      stage_almost:"Almost there",
      generating:"Assembling the laws of your magic",
      result_kicker:"Your magic is ready.",
      summary_title:"The laws of this magic",
      starting:"Activation",
      change:"What changes",
      carry_title:"Take this magic with you",
      carry_lead:"Copy the prompt and paste it into your usual AI. It will create the first thing from this magic.",
      carry_lead_first:"Copy the prompt and paste it into your usual AI.",
      carry_lead_second:"It will create the first thing from this magic.",
      copy:"Copy prompt",
      copy_help:"",
      copy_success_help:"Copied. Now paste it into your usual AI.",
      copied:"Copied",
      copy_working:"Copying",
      progress_label:"Progress",
      copy_fail:"Automatic copy is unavailable. The full prompt below has been selected for manual copying.",
      restart:"Again",
      about:"",
      principle:"Core principle",
      source:"Source",
      access:"Access",
      medium:"Medium",
      target:"Target",
      effect:"Effect",
      limit:"Limit",
      control:"Control",
      ontology:"Ontology",
      full_prompt:"Prompt text",
      note:"",
      share_title:"Share this magic",
      share_x:"Share on X",
      share_threads:"Share on Threads",
      share_bluesky:"Share on Bluesky",
      share_line:"Share on LINE",
      share_native:"Share",
      share_copy:"Copy result",
      share_copy_done:"Copied",
      share_story:"Story Card",
      share_copied:"Result copied.",
      share_failed:"Could not share.",
      share_story_ready:"Story Card created.",
      focus_enter:"Focus view",
      focus_exit:"Exit focus view",
      error:"Failed to load. Please reload the page.",
      recovery_title:"Something went wrong.",
      recovery_reload:"Reload",
      recovery_retry:"Retry",
      recovery_dismiss:"Dismiss",
      shortcuts_title:"Keyboard shortcuts",
      shortcuts_close:"Close",
      shortcuts_hint:"Press ? to open or close this list.",
      shortcuts_choices:"1–9: choose an answer",
      shortcuts_move:"↑ / ↓: move between answers",
      shortcuts_back:"B: Back",
      shortcuts_focus:"F: toggle Focus view",
      shortcuts_restart:"R: Again",
      shortcuts_result_copy:"C: copy result",
      shortcuts_prompt_copy:"P: copy prompt",
      shortcuts_share:"S / X / T / L: share",
      shortcuts_escape:"Esc: close / exit Focus view"
    }
  };

  var QUESTIONS={
    ja:{
      q1:{stage:"outline",text:"最初に触れられるものが、一つだけある。どれを選ぶ？",choices:[["A","まだ残っているもの"],["B","もう失われたもの"],["C","まだ起きていないもの"],["D","誰にも気づかれていないもの"],["E","変わり続けているもの"],["F","二つのもののあいだ"]]},
      q2:{stage:"outline",text:"その力は、どこから生まれる？",choices:[["A","自分の内側"],["B","場所"],["C","誰かとのあいだ"],["D","物や道具"],["E","名前や言葉"],["F","積み重なった時間"],["G","その場にあるもの同士の関係"],["H","まだ分からない"]]},
      q3:{stage:"mechanism",text:"魔法は、何をしたときに始まる？",choices:[["A","触れたとき"],["B","書いたとき"],["C","声にしたとき"],["D","置いたり、並べ替えたとき"],["E","歩いたり、移動したとき"],["F","待ったとき"],["G","離れたとき"],["H","戻ったとき"]]},
      q4:{stage:"mechanism",text:"起きることを、自分でどこまで決めたい？",choices:[["A","ほとんど全部"],["B","大きな方向だけ"],["C","半分くらいは偶然に任せたい"],["D","最後まで分からなくていい"]]},
      qSource:{stage:"outline",text:"力が生まれる瞬間、いちばん近いのは？",choices:[["A","自分の中で何かが変わる"],["B","場所や周囲との関係が変わる"],["C","何かを介したときだけ生まれる"],["D","まだ絞れない"]]},
      q5:{stage:"almost",text:"その魔法で起きる変化は、どれに近い？",choices:[["A","戻る"],["B","消える"],["C","重なる"],["D","移る"],["E","遅れる"],["F","分かれる"],["G","見えるようになる"],["H","別の形になる"],["I","まだ分からない"]]},
      q6:{stage:"almost",text:"一つだけ、思いどおりにならないものがある。どれがいい？",choices:[["A","使える回数"],["B","使える場所"],["C","使える対象"],["D","結果の細部"],["E","発動する時間"],["F","自分自身には使えない"],["G","同じものには二度使えない"],["H","発動したあと、すぐにはもう一度使えない"],["I","まだ分からない"]]},
      qSourceFinal:{stage:"almost",text:"力の出所を、もう少しだけ絞るなら？",choices:[["A","自分そのもの"],["B","場所や環境"],["C","誰か・何かとの関係"],["D","物・言葉・時間などの媒介"]]},
      qEffectRefine:{stage:"almost",text:"変化の向きだけ選ぶなら、どれに近い？",choices:[["A","失われた状態へ近づける"],["B","今ある状態を弱める・消す"],["C","別の状態へ移す"],["D","隠れている状態を表に出す"]]},
      qLimitRefine:{stage:"almost",text:"制約の種類だけ選ぶなら、どれに近い？",choices:[["A","回数や間隔に制約がある"],["B","場所や時間に制約がある"],["C","対象に制約がある"],["D","結果の細部に制約がある"]]}
    },
    en:{
      q1:{stage:"outline",text:"There is only one thing you can touch first. Which do you choose?",choices:[["A","Something that still remains"],["B","Something already lost"],["C","Something that has not happened yet"],["D","Something nobody has noticed"],["E","Something that keeps changing"],["F","The space between two things"]]},
      q2:{stage:"outline",text:"Where does the power come from?",choices:[["A","From within yourself"],["B","From a place"],["C","From the space between you and someone else"],["D","From an object or tool"],["E","From names or words"],["F","From accumulated time"],["G","From the relationships among things present"],["H","Not sure yet"]]},
      q3:{stage:"mechanism",text:"What action begins the magic?",choices:[["A","Touching"],["B","Writing"],["C","Speaking aloud"],["D","Placing or rearranging things"],["E","Walking or moving"],["F","Waiting"],["G","Leaving"],["H","Returning"]]},
      q4:{stage:"mechanism",text:"How much of what happens do you want to control?",choices:[["A","Almost everything"],["B","Only the overall direction"],["C","I want about half left to chance"],["D","I am fine not knowing until the end"]]},
      qSource:{stage:"outline",text:"At the moment the power appears, which is closest?",choices:[["A","Something changes inside you"],["B","Your relation to the place or surroundings changes"],["C","It only appears through some intermediary"],["D","Still not sure"]]},
      q5:{stage:"almost",text:"What kind of change does the magic cause?",choices:[["A","Return"],["B","Disappear"],["C","Overlap"],["D","Move"],["E","Delay"],["F","Split"],["G","Become visible"],["H","Become another form"],["I","Not sure yet"]]},
      q6:{stage:"almost",text:"One thing cannot fully go your way. Which would you choose?",choices:[["A","How many times it can be used"],["B","Where it can be used"],["C","What it can affect"],["D","The fine details of the result"],["E","When it can activate"],["F","It cannot target yourself"],["G","The same target cannot be affected twice"],["H","It cannot be used again immediately after activation"],["I","Not sure yet"]]},
      qSourceFinal:{stage:"almost",text:"If you narrow the source down one step further, which is closest?",choices:[["A","Yourself"],["B","A place or environment"],["C","A relationship with someone or something"],["D","A medium such as an object, language, or accumulated time"]]},
      qEffectRefine:{stage:"almost",text:"If you choose only the direction of change, which is closest?",choices:[["A","Move toward a lost or previous state"],["B","Weaken or remove the current state"],["C","Move into another state"],["D","Bring a hidden state to the surface"]]},
      qLimitRefine:{stage:"almost",text:"If you choose only the kind of limit, which is closest?",choices:[["A","Uses or intervals are limited"],["B","Place or time is limited"],["C","Valid targets are limited"],["D","Fine outcome details are limited"]]}
    }
  };

  var MAP={
    q1:{
      A:{target:"trace",principle:"preservation"},
      B:{target:"absence",principle:"recovery"},
      C:{target:"possibility",principle:"anticipation"},
      D:{target:"hidden_state",principle:"revelation"},
      E:{target:"state_change",principle:"transformation"},
      F:{target:"boundary",principle:"boundary"}
    },
    q2:{
      A:{source:"self"},
      B:{source:"place"},
      C:{source:"relation"},
      D:{source:"object"},
      E:{source:"language"},
      F:{source:"accumulated_time"},
      G:{source:"relational_field"},
      H:{source:"unknown"}
    },
    qSource:{
      A:{source:"self"},
      B:{source:"relational_field"},
      C:{source:"mediated"},
      D:{source:"unknown"}
    },
    q3:{
      A:{medium:"touch",access:"contact"},
      B:{medium:"writing",access:"inscription"},
      C:{medium:"voice",access:"utterance"},
      D:{medium:"arrangement",access:"composition"},
      E:{medium:"movement",access:"traversal"},
      F:{medium:"waiting",access:"duration"},
      G:{medium:"departure",access:"separation"},
      H:{medium:"return",access:"repetition"}
    },
    q4:{
      A:{control:"high"},
      B:{control:"medium"},
      C:{control:"conditional"},
      D:{control:"low"}
    },
    q5:{
      A:{effect:"restore"},
      B:{effect:"erase"},
      C:{effect:"overlay"},
      D:{effect:"transfer"},
      E:{effect:"delay"},
      F:{effect:"divide"},
      G:{effect:"reveal"},
      H:{effect:"transform"},
      I:{effect:"unknown"}
    },
    q6:{
      A:{limit:"limited_uses"},
      B:{limit:"location_bound"},
      C:{limit:"target_bound"},
      D:{limit:"detail_uncontrolled"},
      E:{limit:"timing_bound"},
      F:{limit:"cannot_target_self"},
      G:{limit:"nonrepeatable_on_same_target"},
      H:{limit:"cooldown_required"},
      I:{limit:"unknown"}
    },
    qSourceFinal:{
      A:{source:"self"},
      B:{source:"place"},
      C:{source:"relation"},
      D:{source:"mediated"}
    },
    qEffectRefine:{
      A:{effect:"restore"},
      B:{effect:"erase"},
      C:{effect:"transform"},
      D:{effect:"reveal"}
    },
    qLimitRefine:{
      A:{limit:"limited_uses"},
      B:{limit:"location_bound"},
      C:{limit:"target_bound"},
      D:{limit:"detail_uncontrolled"}
    }
  };

  var state={
    screen:"entry",
    history:[],
    answers:{},
    profile:null,
    prompt:"",
    language:"",
    detail:false
  };

  function getRoot(){
    return document.getElementById("tvmagic");
  }

  function getApp(){
    var root=getRoot();
    if(!root) return null;
    return root.querySelector("#tvmagicApp");
  }

  function byId(id){
    var root=getRoot();
    if(!root) return null;
    return root.querySelector("#"+id);
  }

  function currentUI(){
    if(state.language==="en") return UI.en;
    return UI.ja;
  }

  function currentQuestions(){
    if(state.language==="en") return QUESTIONS.en;
    return QUESTIONS.ja;
  }

  function stageLabel(stage){
    var u=currentUI();
    if(stage==="outline") return u.stage_outline;
    if(stage==="mechanism") return u.stage_mechanism;
    if(stage==="almost") return u.stage_almost;
    return "";
  }

  function getPromptTemplate(language){
    var area;
    if(language==="en"){
      area=document.getElementById("tvmPromptTemplateEN");
    }else{
      area=document.getElementById("tvmPromptTemplateJA");
    }
    if(!area) return "";
    return area.value||area.textContent||"";
  }

  var storageCapabilities={
    localStorage:null
  };
  var preferredFocusMode=true;
  var themeMode="light";
  var themeMediaQuery=window.matchMedia?window.matchMedia("(prefers-color-scheme: dark)"):null;
  var recoveryBound=false;
  var recoveryRetryCallback=null;
  var shortcutSheetOpen=false;
  var shortcutBefore=null;

  function testWebStorage(name){
    var storage;
    var key="__tvm_storage_test__";
    try{
      storage=window[name];
      if(!storage) return false;
      storage.setItem(key,"1");
      storage.removeItem(key);
      return true;
    }catch(error){
      return false;
    }
  }

  function initStorageCapabilities(){
    var root=getRoot();
    storageCapabilities.localStorage=testWebStorage("localStorage");

    if(root){
      root.setAttribute("data-storage-local",storageCapabilities.localStorage?"available":"unavailable");
    }
  }

  function safeLocalGet(key,fallback){
    var value;
    if(storageCapabilities.localStorage!==true) return fallback;
    try{
      value=window.localStorage.getItem(key);
      if(value===null) return fallback;
      return value;
    }catch(error){
      return fallback;
    }
  }

  function safeLocalSet(key,value){
    if(storageCapabilities.localStorage!==true) return false;
    try{
      window.localStorage.setItem(key,String(value));
      return true;
    }catch(error){
      return false;
    }
  }

  function defaultPreferenceBundle(){
    return {
      schema_version:PREF_SCHEMA_VERSION,
      language:"ja",
      focus:true,
      theme:"light"
    };
  }

  function readPreferenceBundle(){
    var raw=safeLocalGet(PREF_BUNDLE_KEY,"");
    var parsed;
    var bundle=defaultPreferenceBundle();
    var migrated=false;
    var legacy;

    if(raw){
      try{
        parsed=JSON.parse(raw);
      }catch(error){
        parsed=null;
      }
    }

    if(parsed){
      if(typeof parsed==="object"){
        if(!Array.isArray(parsed)){
          if(parsed.language==="ja"){
            bundle.language="ja";
          }else if(parsed.language==="en"){
            bundle.language="en";
          }
          if(parsed.focus===false){
            bundle.focus=false;
          }else if(parsed.focus===true){
            bundle.focus=true;
          }
          if(parsed.theme==="auto"){
            bundle.theme="auto";
          }else if(parsed.theme==="dark"){
            bundle.theme="dark";
          }else if(parsed.theme==="light"){
            bundle.theme="light";
          }
          bundle.schema_version=PREF_SCHEMA_VERSION;
          return bundle;
        }
      }
    }

    legacy=safeLocalGet(PREF_LANGUAGE_KEY,"");
    if(legacy==="en"){
      bundle.language="en";
      migrated=true;
    }else if(legacy==="ja"){
      bundle.language="ja";
      migrated=true;
    }

    legacy=safeLocalGet(PREF_FOCUS_KEY,"");
    if(legacy==="0"){
      bundle.focus=false;
      migrated=true;
    }else if(legacy==="1"){
      bundle.focus=true;
      migrated=true;
    }

    legacy=safeLocalGet(PREF_THEME_KEY,"");
    if(legacy==="auto"){
      bundle.theme="auto";
      migrated=true;
    }else if(legacy==="dark"){
      bundle.theme="dark";
      migrated=true;
    }else if(legacy==="light"){
      bundle.theme="light";
      migrated=true;
    }

    if(migrated){
      safeLocalSet(PREF_BUNDLE_KEY,JSON.stringify(bundle));
    }

    return bundle;
  }

  function writePreferenceBundle(partial){
    var bundle=readPreferenceBundle();
    var key;

    if(partial){
      for(key in partial){
        if(Object.prototype.hasOwnProperty.call(partial,key)){
          bundle[key]=partial[key];
        }
      }
    }

    bundle.schema_version=PREF_SCHEMA_VERSION;
    return safeLocalSet(PREF_BUNDLE_KEY,JSON.stringify(bundle));
  }

  function restorePreferences(){
    var bundle=readPreferenceBundle();

    state.language=bundle.language==="en"?"en":"ja";
    preferredFocusMode=bundle.focus===false?false:true;

    if(bundle.theme==="auto"){
      themeMode="auto";
    }else if(bundle.theme==="dark"){
      themeMode="dark";
    }else{
      themeMode="light";
    }
  }

  function saveLanguagePreference(language){
    var normalized=language==="en"?"en":"ja";
    safeLocalSet(PREF_LANGUAGE_KEY,normalized);
    writePreferenceBundle({language:normalized});
  }

  function saveFocusPreference(enabled){
    safeLocalSet(PREF_FOCUS_KEY,enabled?"1":"0");
    writePreferenceBundle({focus:enabled?true:false});
  }

  function resolvedTheme(mode){
    if(mode==="dark") return "dark";
    if(mode==="auto"){
      if(themeMediaQuery){
        if(themeMediaQuery.matches===true) return "dark";
      }
    }
    return "light";
  }

  function applyThemeMode(mode,persist){
    var root=getRoot();
    var actual;

    if(mode!=="auto"){
      if(mode!=="dark"){
        mode="light";
      }
    }

    themeMode=mode;
    actual=resolvedTheme(themeMode);

    if(root){
      root.setAttribute("data-tvm-theme-mode",themeMode);
      root.setAttribute("data-tvm-theme",actual);
      root.style.setProperty("color-scheme",actual);
    }

    if(persist!==false){
      safeLocalSet(PREF_THEME_KEY,themeMode);
      writePreferenceBundle({theme:themeMode});
    }

    return actual;
  }

  function syncAutoTheme(){
    if(themeMode!=="auto") return;
    applyThemeMode("auto",false);
  }

  function recoveryPanel(){
    var root=getRoot();
    var panel;
    var message;
    var actions;
    var reload;
    var retry;
    var dismiss;
    var u=currentUI();

    if(!root) return null;

    panel=byId("tvmRecovery");
    if(panel) return panel;

    panel=document.createElement("div");
    panel.id="tvmRecovery";
    panel.className="tvm-recovery";
    panel.hidden=true;
    panel.setAttribute("role","alert");
    panel.setAttribute("aria-live","assertive");
    panel.setAttribute("aria-atomic","true");
    panel.setAttribute("data-surface","transient");
    panel.setAttribute("data-elevation","s3");
    panel.setAttribute("data-glass","veil");

    message=document.createElement("p");
    message.className="tvm-recovery-message";
    message.id="tvmRecoveryMessage";
    message.textContent=u.recovery_title;

    actions=document.createElement("div");
    actions.className="tvm-recovery-actions";

    reload=document.createElement("button");
    reload.type="button";
    reload.className="tvm-btn tvm-control";
    reload.id="tvmRecoveryReload";
    reload.textContent=u.recovery_reload;

    retry=document.createElement("button");
    retry.type="button";
    retry.className="tvm-btn tvm-control";
    retry.id="tvmRecoveryRetry";
    retry.textContent=u.recovery_retry;
    retry.hidden=true;

    dismiss=document.createElement("button");
    dismiss.type="button";
    dismiss.className="tvm-btn is-ghost tvm-control";
    dismiss.id="tvmRecoveryDismiss";
    dismiss.textContent=u.recovery_dismiss;

    actions.appendChild(reload);
    actions.appendChild(retry);
    actions.appendChild(dismiss);
    panel.appendChild(message);
    panel.appendChild(actions);
    root.appendChild(panel);

    reload.addEventListener("click",function(){
      window.location.reload();
    });

    retry.addEventListener("click",function(){
      var callback=recoveryRetryCallback;
      panel.hidden=true;
      recoveryRetryCallback=null;
      if(callback){
        guardRun("recoveryRetry",callback,true);
      }
    });

    dismiss.addEventListener("click",function(){
      panel.hidden=true;
      recoveryRetryCallback=null;
    });

    return panel;
  }

  function reportRecovery(error,scope,show,retryCallback){
    var panel;
    var message;
    var retry;
    var textValue;
    var u=currentUI();

    if(!scope) scope="runtime";
    if(show===undefined) show=true;

    if(error){
      if(error.name==="AbortError") return;
    }

    textValue=u.recovery_title;
    if(error){
      if(error.message){
        textValue=textValue+" "+String(error.message);
      }
    }

    try{
      console.error("[TranquilMagicRecovery:"+scope+"]",error);
    }catch(ignoreError){}

    if(show!==true) return;

    panel=recoveryPanel();
    if(!panel) return;
    message=byId("tvmRecoveryMessage");
    if(message){
      message.textContent=textValue;
    }
    recoveryRetryCallback=typeof retryCallback==="function"?retryCallback:null;
    retry=byId("tvmRecoveryRetry");
    if(retry){
      retry.hidden=recoveryRetryCallback?false:true;
    }
    panel.hidden=false;
  }

  function guardRun(scope,task,show){
    var result;
    try{
      result=task();
      if(result){
        if(typeof result.then==="function"){
          return result.catch(function(error){
            reportRecovery(error,scope,show);
            return null;
          });
        }
      }
      return result;
    }catch(error){
      reportRecovery(error,scope,show);
      return null;
    }
  }

  function bindRecoverySafety(){
    if(recoveryBound) return;
    recoveryBound=true;

    window.addEventListener("error",function(event){
      if(event){
        if(event.error){
          reportRecovery(event.error,"window",true);
          return;
        }
        if(event.message){
          reportRecovery(event.message,"window",true);
        }
      }
    });

    window.addEventListener("unhandledrejection",function(event){
      if(!event) return;
      reportRecovery(event.reason||"Unhandled promise rejection","promise",true);
    });
  }

  var managedOverlayStack=[];

  function overlayFocusable(container){
    if(!container) return [];
    return container.querySelectorAll('button:not(:disabled),a[href],input:not(:disabled),textarea:not(:disabled),select:not(:disabled),[tabindex]:not([tabindex="-1"])');
  }

  function openManagedOverlay(node,options){
    var record;
    var target;
    if(!node) return false;

    if(!options) options={};

    record={
      node:node,
      previous:document.activeElement,
      closeOnBackdrop:options.closeOnBackdrop===false?false:true
    };

    managedOverlayStack.push(record);
    node.removeAttribute("hidden");
    node.setAttribute("data-overlay-open","true");

    if(record.closeOnBackdrop){
      node.addEventListener("click",function(event){
        if(event.target===node){
          closeManagedOverlay(node,true);
        }
      },{once:true});
    }

    window.requestAnimationFrame(function(){
      var focusables=overlayFocusable(node);
      if(focusables.length){
        target=focusables[0];
        target.focus({preventScroll:true});
      }else if(node.focus){
        node.setAttribute("tabindex","-1");
        node.focus({preventScroll:true});
      }
    });

    return true;
  }

  function closeManagedOverlay(node,restoreFocus){
    var i;
    var record=null;
    var target;

    for(i=managedOverlayStack.length-1;i>=0;i--){
      if(managedOverlayStack[i].node===node){
        record=managedOverlayStack[i];
        managedOverlayStack.splice(i,1);
        break;
      }
    }

    if(!node) return false;
    node.removeAttribute("data-overlay-open");
    node.setAttribute("hidden","hidden");

    if(restoreFocus!==false){
      if(record){
        target=record.previous;
        if(target){
          if(target.isConnected){
            if(typeof target.focus==="function"){
              window.requestAnimationFrame(function(){
                target.focus({preventScroll:true});
              });
            }
          }
        }
      }
    }

    return true;
  }

  function trapManagedOverlayTab(event){
    var record;
    var node;
    var items;
    var first;
    var last;

    if(!managedOverlayStack.length) return false;
    record=managedOverlayStack[managedOverlayStack.length-1];
    node=record.node;
    if(!node) return false;
    if(event.key!=="Tab") return false;

    items=overlayFocusable(node);
    if(!items.length) return false;
    first=items[0];
    last=items[items.length-1];

    if(event.shiftKey){
      if(document.activeElement===first){
        event.preventDefault();
        last.focus();
        return true;
      }
    }else{
      if(document.activeElement===last){
        event.preventDefault();
        first.focus();
        return true;
      }
    }

    if(Array.prototype.indexOf.call(items,document.activeElement)<0){
      event.preventDefault();
      first.focus();
      return true;
    }

    return false;
  }

  function shortcutRowsHtml(){
    var u=currentUI();
    return ''+
      '<div class="tvm-shortcut-list">'+
        '<div><kbd>1–9</kbd><span>'+escapeHtml(u.shortcuts_choices)+'</span></div>'+
        '<div><kbd>↑ ↓</kbd><span>'+escapeHtml(u.shortcuts_move)+'</span></div>'+
        '<div><kbd>B</kbd><span>'+escapeHtml(u.shortcuts_back)+'</span></div>'+
        '<div><kbd>F</kbd><span>'+escapeHtml(u.shortcuts_focus)+'</span></div>'+
        '<div><kbd>R</kbd><span>'+escapeHtml(u.shortcuts_restart)+'</span></div>'+
        '<div><kbd>C</kbd><span>'+escapeHtml(u.shortcuts_result_copy)+'</span></div>'+
        '<div><kbd>P</kbd><span>'+escapeHtml(u.shortcuts_prompt_copy)+'</span></div>'+
        '<div><kbd>S X T L</kbd><span>'+escapeHtml(u.shortcuts_share)+'</span></div>'+
        '<div><kbd>Esc</kbd><span>'+escapeHtml(u.shortcuts_escape)+'</span></div>'+
      '</div>';
  }

  function closeShortcutSheet(restoreFocus){
    var sheet=byId("tvmShortcutSheet");
    if(!sheet) return false;

    shortcutSheetOpen=false;
    closeManagedOverlay(sheet,restoreFocus!==false);
    if(sheet.parentNode){
      sheet.parentNode.removeChild(sheet);
    }
    shortcutBefore=null;
    return true;
  }

  function openShortcutSheet(){
    var root=getRoot();
    var sheet;
    var panel;
    var close;
    var u=currentUI();

    if(!root) return false;
    if(shortcutSheetOpen){
      closeShortcutSheet(true);
      return true;
    }

    shortcutBefore=document.activeElement;
    shortcutSheetOpen=true;

    sheet=document.createElement("div");
    sheet.id="tvmShortcutSheet";
    sheet.className="tvm-shortcut-sheet";

    panel=document.createElement("div");
    panel.className="tvm-shortcut-panel";
    panel.setAttribute("role","dialog");
    panel.setAttribute("aria-modal","true");
    panel.setAttribute("aria-labelledby","tvmShortcutTitle");
    panel.setAttribute("data-surface","transient");
    panel.setAttribute("data-elevation","s3");
    panel.setAttribute("data-glass","veil");

    panel.innerHTML=
      '<div class="tvm-shortcut-head">'+
        '<p id="tvmShortcutTitle" class="tvm-shortcut-title">'+escapeHtml(u.shortcuts_title)+'</p>'+
        '<button type="button" class="tvm-shortcut-close tvm-control" id="tvmShortcutClose" aria-label="'+escapeHtml(u.shortcuts_close)+'">×</button>'+
      '</div>'+
      shortcutRowsHtml()+
      '<p class="tvm-shortcut-hint">'+escapeHtml(u.shortcuts_hint)+'</p>';

    sheet.appendChild(panel);
    root.appendChild(sheet);

    close=byId("tvmShortcutClose");
    if(close){
      close.addEventListener("click",function(){
        closeShortcutSheet(true);
      });
    }

    openManagedOverlay(sheet,{closeOnBackdrop:true});
    return true;
  }

  function applyShortcutMetadata(){
    var choices;
    var i;
    var node;

    node=byId("tvmFocusToggle");
    if(node) node.setAttribute("aria-keyshortcuts","F Escape");

    node=byId("tvmBackQuestion");
    if(node) node.setAttribute("aria-keyshortcuts","B");

    node=byId("tvmRestart");
    if(node) node.setAttribute("aria-keyshortcuts","R");

    node=byId("tvmCopy");
    if(node) node.setAttribute("aria-keyshortcuts","P");

    node=document.querySelector('.tv-magic [data-share-action="copy"]');
    if(node) node.setAttribute("aria-keyshortcuts","C");

    node=document.querySelector('.tv-magic [data-share-action="native"]');
    if(node) node.setAttribute("aria-keyshortcuts","S");

    node=document.querySelector('.tv-magic [data-share-action="x"]');
    if(node) node.setAttribute("aria-keyshortcuts","X");

    node=document.querySelector('.tv-magic [data-share-action="threads"]');
    if(node) node.setAttribute("aria-keyshortcuts","T");

    node=document.querySelector('.tv-magic [data-share-action="line"]');
    if(node) node.setAttribute("aria-keyshortcuts","L");

    choices=document.querySelectorAll(".tv-magic .tvm-choice");
    for(i=0;i<choices.length;i++){
      choices[i].setAttribute("aria-keyshortcuts",String(i+1));
    }
  }

  function syncMagicLanguageAttributes(){
    var root=getRoot();
    var u=currentUI();
    var prompt=byId("tvmPromptArea");
    var copy=byId("tvmCopy");
    var share=byId("tvmShareTitle");
    var restart=byId("tvmRestart");

    if(!root) return;

    root.setAttribute("lang",state.language==="en"?"en":"ja");

    if(prompt){
      prompt.setAttribute("aria-label",u.full_prompt);
      prompt.setAttribute("title",u.full_prompt);
    }

    if(copy){
      copy.setAttribute("aria-label",u.copy);
      copy.setAttribute("title",u.copy);
    }

    if(share){
      share.setAttribute("aria-label",u.share_title);
    }

    if(restart){
      restart.setAttribute("aria-label",u.restart);
      restart.setAttribute("title",u.restart);
    }
  }

  function syncLanguageSegmentA11y(){
    var group=document.querySelector(".tv-magic .tvm-language");
    var ja=byId("tvmChooseJA");
    var en=byId("tvmChooseEN");

    if(group){
      group.setAttribute("role","radiogroup");
      group.setAttribute("aria-label",state.language==="en"?"Language":"言語");
    }

    if(ja){
      ja.setAttribute("role","radio");
      ja.setAttribute("aria-checked",state.language==="ja"?"true":"false");
      ja.removeAttribute("aria-pressed");
    }

    if(en){
      en.setAttribute("role","radio");
      en.setAttribute("aria-checked",state.language==="en"?"true":"false");
      en.removeAttribute("aria-pressed");
    }
  }

  function escapeHtml(text){
    return String(text)
      .replace(/&#038;/g,"&amp;")
      .replace(/</g,"&lt;")
      .replace(/>/g,"&gt;")
      .replace(/"/g,"&quot;")
      .replace(/'/g,"&#039;");
  }

  function label(kind,value){
    var ja={
      principle:{preservation:"保持",recovery:"回復",anticipation:"予兆",revelation:"顕在化",transformation:"変換",boundary:"境界"},
      source:{self:"自分",place:"場所",relation:"誰かとの関係",object:"物や道具",language:"名前や言葉",accumulated_time:"積み重なった時間",relational_field:"その場の関係",mediated:"媒介"},
      access:{contact:"触れる",inscription:"書き記す",utterance:"声にする",composition:"配置する",traversal:"移動する",duration:"待つ",separation:"離れる",repetition:"戻る"},
      medium:{touch:"接触",writing:"書くこと",voice:"声",arrangement:"配置",movement:"移動",waiting:"待つこと",departure:"離れること",return:"戻ること"},
      target:{trace:"残っている痕跡",absence:"失われたもの",possibility:"まだ起きていないもの",hidden_state:"気づかれていない状態",state_change:"変化の途中",boundary:"二つのもののあいだ"},
      effect:{restore:"戻す",erase:"消す",overlay:"重ねる",transfer:"移す",delay:"遅らせる",divide:"分ける",reveal:"見えるようにする",transform:"別の形にする"},
      limit:{limited_uses:"使える回数に制限がある",location_bound:"使える場所が限られる",target_bound:"使える対象が限られる",detail_uncontrolled:"結果の細部は選べない",timing_bound:"発動できる時間が限られる",cannot_target_self:"自分自身には使えない",nonrepeatable_on_same_target:"同じ対象には二度使えない",cooldown_required:"発動後すぐには使えない"},
      control:{high:"高い",medium:"中程度",conditional:"条件付き",low:"低い"}
    };
    var en={
      principle:{preservation:"Preservation",recovery:"Recovery",anticipation:"Anticipation",revelation:"Revelation",transformation:"Transformation",boundary:"Boundary"},
      source:{self:"Self",place:"Place",relation:"Relation",object:"Object or tool",language:"Name or language",accumulated_time:"Accumulated time",relational_field:"Relational field",mediated:"Mediated source"},
      access:{contact:"Touch",inscription:"Writing",utterance:"Speaking",composition:"Arrangement",traversal:"Movement",duration:"Waiting",separation:"Leaving",repetition:"Returning"},
      medium:{touch:"Touch",writing:"Writing",voice:"Voice",arrangement:"Arrangement",movement:"Movement",waiting:"Waiting",departure:"Departure",return:"Return"},
      target:{trace:"Remaining traces",absence:"Absence",possibility:"Future possibility",hidden_state:"Unnoticed state",state_change:"Ongoing change",boundary:"The space between two things"},
      effect:{restore:"Restore",erase:"Erase",overlay:"Overlay",transfer:"Transfer",delay:"Delay",divide:"Divide",reveal:"Reveal",transform:"Transform"},
      limit:{limited_uses:"Limited number of uses",location_bound:"Limited to certain locations",target_bound:"Limited to certain targets",detail_uncontrolled:"Fine details cannot be controlled",timing_bound:"Limited activation time",cannot_target_self:"Cannot target oneself",nonrepeatable_on_same_target:"Cannot affect the same target twice",cooldown_required:"Cannot be used again immediately"},
      control:{high:"High",medium:"Medium",conditional:"Conditional",low:"Low"}
    };
    var dict=ja;
    if(state.language==="en"){
      dict=en;
    }

    if(dict[kind]){
      if(dict[kind][value]){
        return dict[kind][value];
      }
    }
    if(value){
      return value;
    }
    if(state.language==="en") return "Unresolved";
    return "未確定";
  }

  var focusMode=false;
  var focusPlaceholder=null;
  var focusOriginParent=null;
  var focusOriginNext=null;
  var focusBefore=null;
  var focusBodyStyles=null;
  var focusInert=[];
  var focusRootFontSize="";
  var focusRootFontPriority="";
  var lifecycleBound=false;
  var reducedMotionQuery=window.matchMedia?window.matchMedia("(prefers-reduced-motion: reduce)"):null;
  var viewportTimer=0;
  var interactionFrame=0;
  var pendingInteraction=null;
  var HOLD_MOVE_THRESHOLD=12;

  function isReducedMotion(){
    if(!reducedMotionQuery) return false;
    return reducedMotionQuery.matches===true;
  }

  function syncVisualViewport(){
    var root=getRoot();
    var height;
    if(!root) return;
    if(window.visualViewport){
      height=window.visualViewport.height;
      if(height>0){
        root.style.setProperty("--tvm-visual-height",height+"px");
      }
    }else{
      root.style.removeProperty("--tvm-visual-height");
    }
  }

  function scheduleViewportSync(){
    if(viewportTimer){
      window.clearTimeout(viewportTimer);
    }
    viewportTimer=window.setTimeout(function(){
      viewportTimer=0;
      syncVisualViewport();
    },80);
  }

  function focusScroller(){
    var root=getRoot();
    if(!root) return null;
    return byId("tvmagicApp");
  }

  function resetFocusScroller(){
    var scroller;
    if(!focusMode) return;
    scroller=focusScroller();
    if(!scroller) return;
    window.requestAnimationFrame(function(){
      scroller.scrollTop=0;
      scroller.scrollLeft=0;
    });
  }

  function lockFocusPage(){
    var body=document.body;
    var scrollY=window.scrollY||window.pageYOffset||0;
    var props=["position","top","left","right","width","overflow"];
    var i;
    focusBodyStyles={scrollY:scrollY,values:[]};
    for(i=0;i<props.length;i++){
      focusBodyStyles.values.push({
        property:props[i],
        value:body.style.getPropertyValue(props[i]),
        priority:body.style.getPropertyPriority(props[i])
      });
    }
    body.style.setProperty("position","fixed");
    body.style.setProperty("top","-"+scrollY+"px");
    body.style.setProperty("left","0");
    body.style.setProperty("right","0");
    body.style.setProperty("width","100%");
    body.style.setProperty("overflow","hidden");
  }

  function unlockFocusPage(){
    var body=document.body;
    var i;
    var item;
    var scrollY=0;
    if(!focusBodyStyles) return;
    scrollY=focusBodyStyles.scrollY||0;
    for(i=0;i<focusBodyStyles.values.length;i++){
      item=focusBodyStyles.values[i];
      if(item.value){
        body.style.setProperty(item.property,item.value,item.priority);
      }else{
        body.style.removeProperty(item.property);
      }
    }
    focusBodyStyles=null;
    window.scrollTo(0,scrollY);
  }

  function isolateFocusBackground(){
    var root=getRoot();
    var children=document.body.children;
    var i;
    var el;
    focusInert=[];
    for(i=0;i<children.length;i++){
      el=children[i];
      if(el===root) continue;
      if(el.tagName==="SCRIPT") continue;
      if(el.tagName==="STYLE") continue;
      focusInert.push({el:el,wasInert:el.inert===true});
      el.inert=true;
    }
  }

  function restoreFocusBackground(){
    var i;
    for(i=0;i<focusInert.length;i++){
      focusInert[i].el.inert=focusInert[i].wasInert;
    }
    focusInert=[];
  }

  function moveRootToBody(){
    var root=getRoot();
    if(!root) return;
    if(root.parentNode===document.body) return;
    focusOriginParent=root.parentNode;
    focusOriginNext=root.nextSibling;
    focusPlaceholder=document.createComment("tvm-focus-origin");
    root.parentNode.insertBefore(focusPlaceholder,root);
    document.body.appendChild(root);
  }

  function restoreRootOrigin(){
    var root=getRoot();
    if(!root) return;
    if(focusPlaceholder){
      if(focusPlaceholder.parentNode){
        focusPlaceholder.parentNode.insertBefore(root,focusPlaceholder);
        focusPlaceholder.parentNode.removeChild(focusPlaceholder);
      }
      focusPlaceholder=null;
      return;
    }
    if(focusOriginParent){
      if(focusOriginNext){
        if(focusOriginNext.parentNode===focusOriginParent){
          focusOriginParent.insertBefore(root,focusOriginNext);
          return;
        }
      }
      focusOriginParent.appendChild(root);
    }
  }

  function syncFocusUI(){
    var root=getRoot();
    var button=byId("tvmFocusToggle");
    var u=currentUI();
    var label=focusMode?u.focus_exit:u.focus_enter;
    if(root){
      if(focusMode){
        root.classList.add("is-focus");
      }else{
        root.classList.remove("is-focus");
      }
    }
    if(button){
      button.setAttribute("aria-pressed",focusMode?"true":"false");
      button.setAttribute("aria-label",label);
      button.setAttribute("title",label);
    }
  }

  function enterFocusMode(){
    var root=getRoot();
    var button=byId("tvmFocusToggle");
    var computedFontSize;
    if(!root) return;
    if(focusMode) return;
    focusBefore=document.activeElement;
    focusRootFontSize=root.style.getPropertyValue("font-size");
    focusRootFontPriority=root.style.getPropertyPriority("font-size");
    computedFontSize=window.getComputedStyle(root).fontSize;
    if(computedFontSize){
      root.style.setProperty("font-size",computedFontSize);
    }
    lockFocusPage();
    moveRootToBody();
    focusMode=true;
    syncVisualViewport();
    syncFocusUI();
    isolateFocusBackground();
    resetFocusScroller();
    button=byId("tvmQuestionShell");
    if(button){
      button.focus({preventScroll:true});
    }
  }

  function exitFocusMode(restoreFocus){
    var target;
    var root=getRoot();
    if(!focusMode) return;
    if(!root) return;
    clearTransientInteractionState();
    focusMode=false;
    syncFocusUI();
    restoreFocusBackground();
    restoreRootOrigin();
    if(focusRootFontSize){
      root.style.setProperty("font-size",focusRootFontSize,focusRootFontPriority);
    }else{
      root.style.removeProperty("font-size");
    }
    focusRootFontSize="";
    focusRootFontPriority="";
    unlockFocusPage();
    if(restoreFocus!==false){
      target=focusBefore;
      if(target){
        if(target.isConnected){
          if(typeof target.focus==="function"){
            target.focus({preventScroll:true});
          }
        }
      }
    }
    focusBefore=null;
  }

  function toggleFocusMode(){
    if(focusMode){
      exitFocusMode(true);
      preferredFocusMode=false;
      saveFocusPreference(false);
    }else{
      enterFocusMode();
      preferredFocusMode=true;
      saveFocusPreference(true);
    }
  }

  function bindFocusToggle(){
    var button=byId("tvmFocusToggle");
    if(!button) return;
    syncFocusUI();
    button.addEventListener("click",toggleFocusMode);
  }

  function cancelInteractionFrame(){
    if(interactionFrame){
      window.cancelAnimationFrame(interactionFrame);
      interactionFrame=0;
    }
    pendingInteraction=null;
  }

  function flushInteractionFrame(){
    var item=pendingInteraction;
    interactionFrame=0;
    pendingInteraction=null;
    if(!item) return;
    if(!item.node) return;
    if(!item.node.isConnected) return;
    updateReactivePoint(item.node,item.x,item.y);
    setInteractionPhysics(item.node,item.x,item.y,item.energy);
  }

  function scheduleInteractionFrame(node,x,y,energy){
    pendingInteraction={node:node,x:x,y:y,energy:energy};
    if(interactionFrame) return;
    interactionFrame=window.requestAnimationFrame(flushInteractionFrame);
  }

  function cancelNodeHold(node,clearSuppression){
    if(!node) return;
    if(node._tisHoldTimer){
      window.clearTimeout(node._tisHoldTimer);
      node._tisHoldTimer=0;
    }
    if(node._tisSuppressResetTimer){
      window.clearTimeout(node._tisSuppressResetTimer);
      node._tisSuppressResetTimer=0;
    }
    if(clearSuppression===true){
      node._tisSuppressClick=false;
    }
    node._tisPointerId=null;
    node._tisStartX=null;
    node._tisStartY=null;
    node.classList.remove("is-long-preview");
    node.removeAttribute("data-long-preview");
  }

  function clearTransientInteractionState(){
    var root=getRoot();
    var nodes;
    var i;
    var node;
    if(!root) return;
    cancelInteractionFrame();
    nodes=root.querySelectorAll(".tvm-reactive");
    for(i=0;i<nodes.length;i++){
      node=nodes[i];
      cancelNodeHold(node,true);
      node.classList.remove("is-preview");
      if(!node.classList.contains("is-selected")){
        node.removeAttribute("data-contact-state");
      }
    }
    root.style.setProperty("--tis-energy","0");
    root.setAttribute("data-calm","true");
    setInteracting(false);
  }

  function keyboardTargetIsTyping(target){
    var tag;
    if(!target) return false;
    if(target.isContentEditable) return true;
    tag=String(target.tagName||"").toLowerCase();
    if(tag==="textarea") return true;
    if(tag==="input") return true;
    if(tag==="select") return true;
    return false;
  }

  function keyboardElementIsUsable(node){
    var rect;
    var style;
    if(!node) return false;
    if(node.disabled) return false;
    if(node.getAttribute("aria-disabled")==="true") return false;
    if(node.hidden) return false;
    style=window.getComputedStyle(node);
    if(style.display==="none") return false;
    if(style.visibility==="hidden") return false;
    rect=node.getBoundingClientRect();
    if(rect.width<=0) return false;
    if(rect.height<=0) return false;
    return true;
  }

  function keyboardActivate(node,event){
    if(!keyboardElementIsUsable(node)) return false;
    if(event){
      event.preventDefault();
      event.stopPropagation();
    }
    node.click();
    return true;
  }

  function keyboardFocusChoice(direction,event){
    var choices=document.querySelectorAll(".tv-magic .tvm-choice:not(:disabled)");
    var current=document.activeElement;
    var index=-1;
    var i;
    var next;

    if(!choices.length) return false;

    for(i=0;i<choices.length;i++){
      if(choices[i]===current){
        index=i;
        break;
      }
    }

    if(direction>0){
      next=index<0?0:(index+1)%choices.length;
    }else{
      next=index<0?choices.length-1:(index-1+choices.length)%choices.length;
    }

    if(event){
      event.preventDefault();
      event.stopPropagation();
    }

    choices[next].focus({preventScroll:true});
    return true;
  }

  function handleKeyboardShortcut(event){
    var target=event.target;
    var active=document.activeElement;
    var key=event.key;
    var lower=String(key||"").toLowerCase();
    var index;
    var choices;
    var node;

    if(event.defaultPrevented) return false;
    if(event.repeat) return false;

    if(event.metaKey||event.ctrlKey){
      if(lower==="z"){
        if(!keyboardTargetIsTyping(target)){
          node=byId("tvmBackQuestion");
          if(node){
            return keyboardActivate(node,event);
          }
        }
      }
      return false;
    }

    if(event.altKey) return false;

    /* Shift is allowed for ordinary Enter/Space and the ? help key. */
    if(event.shiftKey){
      if(key!=="Enter"){
        if(key!==" "){
          if(key!=="?"){
            return false;
          }
        }
      }
    }

    /* Never hijack text-entry controls. Escape remains handled separately. */
    if(keyboardTargetIsTyping(target)){
      return false;
    }

    if(key==="?"){
      event.preventDefault();
      event.stopPropagation();
      openShortcutSheet();
      return true;
    }

    if(key==="ArrowLeft"){
      if(active){
        if(active.classList){
          if(active.classList.contains("tvm-lang")){
            node=byId("tvmChooseJA");
            if(node){
              event.preventDefault();
              node.focus({preventScroll:true});
              return true;
            }
          }
        }
      }
    }

    if(key==="ArrowRight"){
      if(active){
        if(active.classList){
          if(active.classList.contains("tvm-lang")){
            node=byId("tvmChooseEN");
            if(node){
              event.preventDefault();
              node.focus({preventScroll:true});
              return true;
            }
          }
        }
      }
    }

    if(key>="1"){
      if(key<="9"){
        choices=document.querySelectorAll(".tv-magic .tvm-choice:not(:disabled)");
        if(choices.length){
          index=parseInt(key,10)-1;
          if(index>=0){
            if(index<choices.length){
              return keyboardActivate(choices[index],event);
            }
          }
        }
      }
    }

    if(key==="ArrowDown"){
      return keyboardFocusChoice(1,event);
    }

    if(key==="ArrowUp"){
      return keyboardFocusChoice(-1,event);
    }

    if(key==="Enter"){
      if(active){
        if(active!==document.body){
          return keyboardActivate(active,event);
        }
      }
      return false;
    }

    if(key===" "){
      if(active){
        if(active!==document.body){
          return keyboardActivate(active,event);
        }
      }
      return false;
    }

    if(lower==="b"){
      node=byId("tvmBackQuestion");
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="f"){
      node=byId("tvmFocusToggle");
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="r"){
      node=byId("tvmRestart");
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="c"){
      node=document.querySelector('.tv-magic [data-share-action="copy"]');
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="p"){
      node=byId("tvmCopy");
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="s"){
      node=document.querySelector('.tv-magic [data-share-action="native"]');
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="x"){
      node=document.querySelector('.tv-magic [data-share-action="x"]');
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="t"){
      node=document.querySelector('.tv-magic [data-share-action="threads"]');
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    if(lower==="l"){
      node=document.querySelector('.tv-magic [data-share-action="line"]');
      if(node){
        return keyboardActivate(node,event);
      }
      return false;
    }

    return false;
  }

  function bindLifecycleSafety(){
    if(lifecycleBound) return;
    lifecycleBound=true;

    document.addEventListener("visibilitychange",function(){
      if(document.hidden){
        clearTransientInteractionState();
      }else{
        scheduleViewportSync();
      }
    });

    document.addEventListener("keydown",function(event){
      var root=getRoot();
      var sheet;
      var items;
      var first;
      var last;

      if(handleKeyboardShortcut(event)) return;

      if(event.key==="Escape"){
        if(shortcutSheetOpen){
          event.preventDefault();
          closeShortcutSheet(true);
          return;
        }
      }

      if(managedOverlayStack.length){
        if(trapManagedOverlayTab(event)) return;
      }

      if(!focusMode) return;
      if(event.key==="Escape"){
        event.preventDefault();
        exitFocusMode(true);
        preferredFocusMode=false;
        saveFocusPreference(false);
        return;
      }
      if(event.key!=="Tab") return;
      if(!root) return;
      items=root.querySelectorAll('button:not(:disabled),textarea:not(:disabled),a[href],[tabindex]:not([tabindex="-1"])');
      if(!items.length) return;
      first=items[0];
      last=items[items.length-1];
      if(event.shiftKey){
        if(document.activeElement===first){
          event.preventDefault();
          last.focus();
          return;
        }
        if(Array.prototype.indexOf.call(items,document.activeElement)<0){
          event.preventDefault();
          last.focus();
        }
      }else{
        if(document.activeElement===last){
          event.preventDefault();
          first.focus();
          return;
        }
        if(Array.prototype.indexOf.call(items,document.activeElement)<0){
          event.preventDefault();
          first.focus();
        }
      }
    });

    window.addEventListener("resize",scheduleViewportSync,{passive:true});
    if(window.visualViewport){
      window.visualViewport.addEventListener("resize",scheduleViewportSync,{passive:true});
      window.visualViewport.addEventListener("scroll",scheduleViewportSync,{passive:true});
    }
    if(screen.orientation){
      if(screen.orientation.addEventListener){
        screen.orientation.addEventListener("change",scheduleViewportSync);
      }
    }
    window.addEventListener("orientationchange",scheduleViewportSync,{passive:true});

    if(themeMediaQuery){
      if(themeMediaQuery.addEventListener){
        themeMediaQuery.addEventListener("change",syncAutoTheme);
      }
    }

    window.addEventListener("pageshow",function(event){
      clearTransientInteractionState();
      scheduleViewportSync();
      if(event.persisted){
        syncFocusUI();
      }
    });

    window.addEventListener("pagehide",function(){
      var root=getRoot();
      clearTransientInteractionState();
      closeShortcutSheet(false);
      if(root){
        if(root._tvmToastShowTimer){
          window.clearTimeout(root._tvmToastShowTimer);
          root._tvmToastShowTimer=0;
        }
        if(root._tvmToastHideTimer){
          window.clearTimeout(root._tvmToastHideTimer);
          root._tvmToastHideTimer=0;
        }
      }
      if(viewportTimer){
        window.clearTimeout(viewportTimer);
        viewportTimer=0;
      }
      cancelInteractionFrame();
      exitFocusMode(false);
    });
  }

  function chrome(stage){
    var current;
    var countText;
    if(!stage) return "";
    current=currentQuestionNumber();
    countText=(current<10?"0"+current:String(current));
    return '<div class="tvm-top">'+
      '<div class="tvm-question-meta">'+
        '<span class="tvm-question-meta-count">'+escapeHtml(countText)+'</span>'+ 
      '</div>'+ 
    '</div>';
  }

  function experienceToggleHtml(){
    var u=currentUI();
    var title=focusMode?u.focus_exit:u.focus_enter;
    return '<div class="tvm-experience-toggle">'+
      '<button type="button" class="tvm-focus-toggle tvm-control" id="tvmFocusToggle" aria-pressed="'+(focusMode?"true":"false")+'" aria-label="'+escapeHtml(title)+'" title="'+escapeHtml(title)+'">'+
        '<svg class="tvm-focus-icon-enter" viewBox="0 0 24 24" aria-hidden="true">'+
          '<path d="M10 14 L5 19"></path>'+
          '<path d="M10.5 19 H5 V13.5"></path>'+
          '<path d="M14 10 L19 5"></path>'+
          '<path d="M13.5 5 H19 V10.5"></path>'+
        '</svg>'+
        '<svg class="tvm-focus-icon-exit" viewBox="0 0 24 24" aria-hidden="true">'+
          '<path d="M19 5 L14 10"></path>'+
          '<path d="M14 5 V10 H19"></path>'+
          '<path d="M5 19 L10 14"></path>'+
          '<path d="M5 14 H10 V19"></path>'+
        '</svg>'+
      '</button>'+
    '</div>';
  }

  function render(){
    syncMagicLanguageAttributes();
    if(state.screen==="entry"){
      renderEntry();
    }else if(state.screen==="question"){
      renderQuestion();
    }else if(state.screen==="error"){
      renderErrorState();
    }else if(state.screen==="result"){
      renderResult();
    }
    resetFocusScroller();
  }

  function renderEntry(){
    var app=getApp();
    var ja;
    var en;
    var start;
    var u;

    if(!app) return;

    if(!state.language){
      state.language="ja";
    }

    u=currentUI();
    setStageEnvironment("outline");

    app.innerHTML=
      experienceToggleHtml()+
      '<section class="tvm-screen tvm-entry tvm-density-relaxed" data-surface="content" data-elevation="s0">'+
        '<div class="tvm-spacer tvm-spacer--entry-top" aria-hidden="true"></div>'+
        '<p class="tvm-hero tvm-align-center">'+u.entry_title+'</p>'+
        '<div class="tvm-spacer tvm-spacer--hero-lead" aria-hidden="true"></div>'+
        '<p class="tvm-lead tvm-align-center">'+u.entry_lead+'</p>'+
        '<div class="tvm-spacer tvm-spacer--lead-language" aria-hidden="true"></div>'+
        '<div class="tvm-language tvm-material-mist" data-surface="interface" data-elevation="s2" data-glass="mist" role="radiogroup" aria-label="Language">'+
          '<button type="button" class="tvm-lang tvm-control tvm-reactive'+(state.language==="ja"?" is-active":"")+'" data-material="'+(state.language==="ja"?"veil":"mist")+'" id="tvmChooseJA" role="radio" aria-checked="'+(state.language==="ja"?"true":"false")+'">日本語</button>'+
          '<button type="button" class="tvm-lang tvm-control tvm-reactive'+(state.language==="en"?" is-active":"")+'" data-material="'+(state.language==="en"?"veil":"mist")+'" id="tvmChooseEN" role="radio" aria-checked="'+(state.language==="en"?"true":"false")+'">English</button>'+
        '</div>'+
        '<div class="tvm-spacer tvm-spacer--language-start" aria-hidden="true"></div>'+
        '<div class="tvm-actions"><button type="button" class="tvm-btn is-primary tvm-control tvm-reactive" data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil" id="tvmStart">'+escapeHtml(u.start)+'</button></div>'+
      '</section>';

    ja=byId("tvmChooseJA");
    en=byId("tvmChooseEN");
    start=byId("tvmStart");

    bindInteractionControls();
    bindFocusToggle();
    syncLanguageSegmentA11y();
    applyShortcutMetadata();
    syncMagicLanguageAttributes();

    if(ja){
      ja.addEventListener("click",function(){
        state.language="ja";
        saveLanguagePreference("ja");
        if(!focusMode){
          enterFocusMode();
          preferredFocusMode=true;
          saveFocusPreference(true);
        }
        render();
      });
    }

    if(en){
      en.addEventListener("click",function(){
        state.language="en";
        saveLanguagePreference("en");
        if(!focusMode){
          enterFocusMode();
          preferredFocusMode=true;
          saveFocusPreference(true);
        }
        render();
      });
    }

    if(start){
      start.addEventListener("click",function(){
        if(!focusMode){
          enterFocusMode();
          preferredFocusMode=true;
          saveFocusPreference(true);
        }
        state.history=["q1"];
        state.screen="question";
        render();
      });
    }
  }

  function currentQuestionId(){
    if(state.history.length<1) return "";
    return state.history[state.history.length-1];
  }

  /* Adaptive question policy
     MIN 5 / TARGET 5–7 / MAX 10
     TARGET is an expected completion range, not a second cap.
     From question 5 onward, Completion Gate decides whether to finish.
     Question 10 is the single hard stop. */
  var QUESTION_MIN=5;
  var QUESTION_MAX=10;
  var PROMPT_MAX_CHARACTERS=9500;

  function currentQuestionNumber(){
    var n=state.history.length;
    if(n<1) n=1;
    return n;
  }

  function adaptiveProgressPercent(current){
    var steps=[0,15,28,42,56,68,76,83,89,94,97];
    if(current<1) return 0;
    if(current>QUESTION_MAX) current=QUESTION_MAX;
    return steps[current];
  }

  function progressHtml(){
    var current=currentQuestionNumber();
    var percent=adaptiveProgressPercent(current);
    var countText=(current<10?"0"+current:String(current));
    var u=currentUI();
    var progressAttrs=' aria-valuetext="'+escapeHtml(countText)+'"';

    return ''+
      '<div class="tvm-progress-wrap">'+
        '<div class="tvm-progress" role="progressbar" aria-label="'+escapeHtml(u.progress_label)+'"'+progressAttrs+'>'+
          '<div class="tvm-progress-track" aria-hidden="true"><span class="tvm-progress-bar" style="width:'+percent+'%"></span></div>'+
        '</div>'+
      '</div>';
  }

  function syncMaterialSemantics(node){
    var material;

    if(!node) return;

    material=node.getAttribute("data-material");
    if(!material) return;

    if(material==="lens"){
      node.setAttribute("data-surface","transient");
      node.setAttribute("data-elevation","s3");
      node.setAttribute("data-glass","lens");
      return;
    }

    node.setAttribute("data-surface","interface");
    node.setAttribute("data-elevation","s1");

    if(material==="mist"){
      node.setAttribute("data-glass","mist");
    }else if(material==="veil"){
      node.setAttribute("data-glass","veil");
    }else{
      node.removeAttribute("data-glass");
    }
  }

  function setMaterialState(node,material){
    if(!node) return;
    node.setAttribute("data-material",material);
    syncMaterialSemantics(node);
  }

  function controlLabelNode(button){
    if(!button) return null;
    return button.querySelector(".tvm-btn-label");
  }

  function setControlLabel(button,label){
    var node;
    if(!button) return false;
    node=controlLabelNode(button);
    if(node){
      node.textContent=label;
      return true;
    }
    if(button.children.length===0){
      button.textContent=label;
      return true;
    }
    return false;
  }

  function setBusyControl(button,busy,label){
    var labelNode;
    if(!button) return false;

    labelNode=controlLabelNode(button);

    if(busy){
      if(button.disabled) return false;
      button.disabled=true;
      button.setAttribute("aria-busy","true");
      button.setAttribute("data-busy","true");

      if(label){
        if(labelNode){
          button._tvmBusyPreviousLabel=labelNode.textContent;
          labelNode.textContent=label;
        }else if(button.children.length===0){
          button._tvmBusyPreviousLabel=button.textContent;
          button.textContent=label;
        }
      }
    }else{
      button.disabled=false;
      button.removeAttribute("aria-busy");
      button.removeAttribute("data-busy");

      if(button._tvmBusyPreviousLabel!==undefined){
        labelNode=controlLabelNode(button);
        if(labelNode){
          labelNode.textContent=button._tvmBusyPreviousLabel;
        }else if(button.children.length===0){
          button.textContent=button._tvmBusyPreviousLabel;
        }
        delete button._tvmBusyPreviousLabel;
      }
    }

    return true;
  }

  function showToast(message,actionLabel,actionCallback){
    var root=document.querySelector(".tv-magic");
    var toast;
    var textNode;
    var action;

    if(!root) return;

    toast=byId("tvmToast");
    if(!toast){
      toast=document.createElement("div");
      toast.id="tvmToast";
      toast.className="tvm-toast";
      toast.setAttribute("data-surface","transient");
      toast.setAttribute("data-elevation","s3");
      toast.setAttribute("data-glass","veil");
      toast.setAttribute("role","status");
      toast.setAttribute("aria-live","polite");
      toast.setAttribute("aria-atomic","true");
      root.appendChild(toast);
    }

    if(root._tvmToastShowTimer){
      window.clearTimeout(root._tvmToastShowTimer);
      root._tvmToastShowTimer=0;
    }

    if(root._tvmToastHideTimer){
      window.clearTimeout(root._tvmToastHideTimer);
      root._tvmToastHideTimer=0;
    }

    toast.innerHTML="";
    textNode=document.createElement("span");
    textNode.className="tvm-toast-message";
    textNode.textContent=message;
    toast.appendChild(textNode);

    if(actionLabel){
      if(typeof actionCallback==="function"){
        action=document.createElement("button");
        action.type="button";
        action.className="tvm-toast-action tvm-control";
        action.textContent=actionLabel;
        action.addEventListener("click",function(){
          actionCallback();
          toast.classList.remove("is-visible");
        });
        toast.appendChild(action);
      }
    }

    toast.classList.remove("is-visible");

    root._tvmToastShowTimer=window.setTimeout(function(){
      var t=byId("tvmToast");
      if(t){
        t.classList.add("is-visible");
      }
      root._tvmToastShowTimer=0;
    },10);

    root._tvmToastHideTimer=window.setTimeout(function(){
      var t=byId("tvmToast");
      if(t){
        t.classList.remove("is-visible");
      }
      root._tvmToastHideTimer=0;
    },2600);
  }

  function rootNode(){return document.querySelector(".tv-magic");}
  function setInputMode(mode){var root=rootNode();if(!root)return;root.setAttribute("data-input-mode",mode);}
  function setInteracting(active){var root=rootNode();if(!root)return;if(active){root.setAttribute("data-interacting","true");}else{root.removeAttribute("data-interacting");}}
  function localPoint(node,clientX,clientY){var rect=node.getBoundingClientRect();var x=((clientX-rect.left)/rect.width)*100;var y=((clientY-rect.top)/rect.height)*100;if(x<0)x=0;if(x>100)x=100;if(y<0)y=0;if(y>100)y=100;return {x:x,y:y};}
  function updateReactivePoint(node,clientX,clientY){var p;if(!node)return;p=localPoint(node,clientX,clientY);node.style.setProperty("--tvm-pointer-x",p.x+"%");node.style.setProperty("--tvm-pointer-y",p.y+"%");}
  function addInteractionTrace(node,clientX,clientY){var layer;var trace;var p;if(!node)return;layer=node.querySelector(".tvm-trace-layer");if(!layer){layer=document.createElement("span");layer.className="tvm-trace-layer";layer.setAttribute("aria-hidden","true");node.appendChild(layer);}p=localPoint(node,clientX,clientY);trace=document.createElement("span");trace.className="tvm-trace";trace.style.left=p.x+"%";trace.style.top=p.y+"%";layer.appendChild(trace);window.setTimeout(function(){if(trace){if(trace.parentNode){trace.parentNode.removeChild(trace);}}},620);}
  function bindInteractionControls(){
    var controls=document.querySelectorAll(".tv-magic .tvm-reactive");
    var i;

    for(i=0;i<controls.length;i++){
      syncMaterialSemantics(controls[i]);

      (function(node){
        node.addEventListener("pointerenter",function(event){
          if(event.isPrimary===false) return;
          if(event.pointerType==="mouse"){
            setInputMode("mouse");
          }
          node.setAttribute("data-contact-state","approach");
          scheduleInteractionFrame(node,event.clientX,event.clientY,.22);
        });

        node.addEventListener("pointermove",function(event){
          var dx;
          var dy;
          var dist;

          if(event.isPrimary===false) return;

          if(event.pointerType==="touch"){
            setInputMode("touch");
          }else if(event.pointerType==="pen"){
            setInputMode("pen");
          }else if(event.pointerType==="mouse"){
            setInputMode("mouse");
          }

          if(node._tisPointerId!==null){
            if(node._tisPointerId!==undefined){
              if(event.pointerId===node._tisPointerId){
                if(node._tisStartX!==null){
                  if(node._tisStartX!==undefined){
                    dx=event.clientX-node._tisStartX;
                    dy=event.clientY-node._tisStartY;
                    dist=Math.sqrt((dx*dx)+(dy*dy));
                    if(dist>HOLD_MOVE_THRESHOLD){
                      cancelNodeHold(node,true);
                    }
                  }
                }
              }
            }
          }

          scheduleInteractionFrame(node,event.clientX,event.clientY,.26);
        });

        node.addEventListener("pointerdown",function(event){
          if(event.isPrimary===false) return;

          if(event.pointerType==="touch"){
            setInputMode("touch");
          }else if(event.pointerType==="pen"){
            setInputMode("pen");
          }else if(event.pointerType==="mouse"){
            setInputMode("mouse");
          }

          setInteracting(true);
          node.setAttribute("data-contact-state","pressed");
          scheduleInteractionFrame(node,event.clientX,event.clientY,.62);
          addInteractionTrace(node,event.clientX,event.clientY);

          if(node.setPointerCapture){
            try{
              node.setPointerCapture(event.pointerId);
            }catch(error){}
          }

          if(node.classList.contains("tvm-choice")){
            if(event.pointerType!=="touch"){
              return;
            }

            cancelNodeHold(node,true);
            node._tisPointerId=event.pointerId;
            node._tisStartX=event.clientX;
            node._tisStartY=event.clientY;

            node._tisHoldTimer=window.setTimeout(function(){
              node._tisHoldTimer=0;
              node._tisSuppressClick=true;
              node.classList.add("is-long-preview");
              node.setAttribute("data-long-preview","true");

              if(node._tisSuppressResetTimer){
                window.clearTimeout(node._tisSuppressResetTimer);
              }

              node._tisSuppressResetTimer=window.setTimeout(function(){
                node._tisSuppressClick=false;
                node._tisSuppressResetTimer=0;
              },700);
            },460);
          }
        });

        node.addEventListener("pointerup",function(event){
          if(event.isPrimary===false) return;
          setInteracting(false);
          cancelNodeHold(node,false);

          if(node.releasePointerCapture){
            try{
              if(node.hasPointerCapture){
                if(node.hasPointerCapture(event.pointerId)){
                  node.releasePointerCapture(event.pointerId);
                }
              }
            }catch(error){}
          }

          if(node.classList.contains("is-selected")){
            node.setAttribute("data-contact-state","selected");
          }else{
            node.setAttribute("data-contact-state","contact");
          }
          decayInteractionPhysics();
        });

        node.addEventListener("pointerleave",function(event){
          if(event.isPrimary===false) return;
          setInteracting(false);
          cancelNodeHold(node,true);

          if(node.classList.contains("is-selected")){
            node.setAttribute("data-contact-state","selected");
          }else{
            node.removeAttribute("data-contact-state");
          }
          decayInteractionPhysics();
        });

        node.addEventListener("pointercancel",function(){
          setInteracting(false);
          cancelNodeHold(node,true);
          node.removeAttribute("data-contact-state");
          decayInteractionPhysics();
        });

        node.addEventListener("lostpointercapture",function(){
          setInteracting(false);
          cancelNodeHold(node,true);
          decayInteractionPhysics();
        });

        node.addEventListener("touchcancel",function(){
          cancelNodeHold(node,true);
          clearChoicePreview();
          decayInteractionPhysics();
        },{passive:true});

        node.addEventListener("contextmenu",function(event){
          if(node.classList.contains("tvm-choice")){
            if(node.classList.contains("is-long-preview")){
              event.preventDefault();
            }
          }
        });

        node.addEventListener("focus",function(){
          setInputMode("keyboard");
          decayInteractionPhysics();
        });

        node.addEventListener("blur",function(){
          if(node.classList.contains("is-selected")){
            node.setAttribute("data-contact-state","selected");
          }else{
            node.removeAttribute("data-contact-state");
          }
        });
      })(controls[i]);
    }

    setCalmState(true);
  }

  function clearChoicePreview(){var choices=document.querySelectorAll(".tv-magic .tvm-choice.is-preview");var i;for(i=0;i<choices.length;i++){choices[i].classList.remove("is-preview");}}
  function bindTouchSlidingPreview(){var area=document.querySelector(".tv-magic .tvm-choices");if(!area)return;area.addEventListener("touchmove",function(event){var touch;var node;if(!event.touches)return;if(event.touches.length!==1){clearChoicePreview();return;}touch=event.touches[0];node=document.elementFromPoint(touch.clientX,touch.clientY);clearChoicePreview();if(node){if(node.classList){if(node.classList.contains("tvm-choice")){node.classList.add("is-preview");scheduleInteractionFrame(node,touch.clientX,touch.clientY,.24);}}}},{passive:true});area.addEventListener("touchend",function(){clearChoicePreview();},{passive:true});area.addEventListener("touchcancel",function(){clearChoicePreview();cancelInteractionFrame();},{passive:true});}
  function transitionQuestionThen(callback){var shell=byId("tvmQuestionShell");var delay=isReducedMotion()?0:220;if(shell){shell.classList.remove("is-entering");shell.classList.add("is-leaving");window.setTimeout(function(){callback();},delay);}else{callback();}}

  function setStageEnvironment(stage){
    var root=rootNode();
    if(!root) return;

    if(stage==="outline"){
      root.setAttribute("data-stage-env","outline");
    }else if(stage==="mechanism"){
      root.setAttribute("data-stage-env","mechanism");
    }else if(stage==="almost"){
      root.setAttribute("data-stage-env","almost");
    }else{
      root.setAttribute("data-stage-env","result");
    }
  }

  function setCalmState(calm){
    var root=rootNode();
    if(!root) return;

    if(calm){
      root.setAttribute("data-calm","true");
    }else{
      root.setAttribute("data-calm","false");
    }
  }

  function setInteractionPhysics(node,clientX,clientY,energy){
    var root=rootNode();
    var p;

    if(!root) return;
    if(!node) return;

    p=localPoint(node,clientX,clientY);
    root.style.setProperty("--tis-contact-x",p.x+"%");
    root.style.setProperty("--tis-contact-y",p.y+"%");
    root.style.setProperty("--tis-energy",String(energy));
    setCalmState(false);
  }

  function decayInteractionPhysics(){
    var root=rootNode();
    if(!root) return;

    root.style.setProperty("--tis-energy","0");
    window.setTimeout(function(){
      setCalmState(true);
    },isReducedMotion()?0:360);
  }

  function progressTraceHtml(current,total){
    var html="";
    var i;
    var left;

    if(total<1) return "";

    html+='<span class="tvm-progress-traces" aria-hidden="true">';

    for(i=1;i<=current;i++){
      if(total===1){
        left=100;
      }else{
        left=((i-1)/(total-1))*100;
      }

      html+='<span class="tvm-progress-trace'+(i===current?" is-current":"")+'" style="left:'+left+'%"></span>';
    }

    html+='</span>';
    return html;
  }

  function applyQuestionVerticalDensity(){
    var frame=byId("tvmQuestionFrame");
    var choices;
    var viewportHeight;
    var frameHeight;
    var ratio;
    var count;

    if(!frame) return;

    choices=frame.querySelectorAll(".tvm-choice");
    count=choices.length;
    viewportHeight=window.innerHeight;

    if(window.visualViewport){
      if(window.visualViewport.height){
        viewportHeight=window.visualViewport.height;
      }
    }

    frame.classList.remove("is-density-relaxed");
    frame.classList.remove("is-density-regular");
    frame.classList.remove("is-density-dense");

    window.requestAnimationFrame(function(){
      if(!frame.isConnected) return;
      frameHeight=frame.getBoundingClientRect().height;
      ratio=viewportHeight>0?frameHeight/viewportHeight:0;

      if(count>=7){
        frame.classList.add("is-density-dense");
        return;
      }

      if(ratio>=.64){
        frame.classList.add("is-density-dense");
        return;
      }

      if(count<=6){
        if(ratio<=.56){
          frame.classList.add("is-density-relaxed");
          return;
        }
      }

      frame.classList.add("is-density-regular");
    });
  }

  function applyQuestionTextRhythm(){
    var frame=byId("tvmQuestionFrame");
    var question;
    var style;
    var lineHeight;
    var height;

    if(!frame) return;
    question=frame.querySelector(".tvm-question");
    if(!question) return;

    frame.classList.remove("is-question-multiline");
    style=window.getComputedStyle(question);
    lineHeight=parseFloat(style.lineHeight);
    height=question.getBoundingClientRect().height;

    if(lineHeight>0){
      if(height>(lineHeight*1.45)){
        frame.classList.add("is-question-multiline");
      }
    }
  }

  function renderQuestion(){
    var app=getApp();
    var id=currentQuestionId();
    var q=currentQuestions()[id];
    var html="";
    var i;
    var buttons;
    var back;

    if(!app) return;
    if(!q){
      state.screen="entry";
      render();
      return;
    }

    setStageEnvironment(q.stage);

    html+=experienceToggleHtml();
    html+='<section class="tvm-screen tvm-question-screen tvm-density-regular" data-surface="content" data-elevation="s0">';
    html+='<div class="tvm-question-frame" id="tvmQuestionFrame">';
    html+=chrome(q.stage);
    html+=progressHtml();
    html+='<div class="tvm-question-shell is-entering" id="tvmQuestionShell" tabindex="-1">';
    html+='<p class="tvm-question tvm-align-left">'+escapeHtml(q.text)+'</p>';
    html+='<div class="tvm-choices">';

    for(i=0;i<q.choices.length;i++){
      html+='<button type="button" class="tvm-choice tvm-control tvm-reactive" data-material="clear" data-surface="interface" data-elevation="s1" data-choice="'+escapeHtml(q.choices[i][0])+'">'+escapeHtml(q.choices[i][1])+'</button>';
    }

    html+='</div>';
    html+='</div>';
    html+='<div class="tvm-backrow"><button type="button" class="tvm-back tvm-control tvm-reactive" data-material="clear" data-surface="interface" data-elevation="s1" id="tvmBackQuestion">'+escapeHtml(currentUI().back)+'</button></div>';
    html+='</div>';
    html+='</section>';

    app.innerHTML=html;

    bindInteractionControls();
    bindTouchSlidingPreview();
    bindFocusToggle();
    applyShortcutMetadata();
    applyQuestionVerticalDensity();
    applyQuestionTextRhythm();
    syncMagicLanguageAttributes();

    buttons=app.querySelectorAll(".tvm-choice");
    for(i=0;i<buttons.length;i++){
      (function(button){
        button.addEventListener("click",function(){
          var key;
          var j;

          if(button.disabled) return;

          if(button._tisSuppressClick){
            button._tisSuppressClick=false;

            if(button._tisSuppressResetTimer){
              window.clearTimeout(button._tisSuppressResetTimer);
              button._tisSuppressResetTimer=0;
            }

            return;
          }

          key=button.getAttribute("data-choice");

          for(j=0;j<buttons.length;j++){
            buttons[j].disabled=true;
            buttons[j].setAttribute("aria-disabled","true");
          }

          if(back){
            back.disabled=true;
            back.setAttribute("aria-disabled","true");
          }

          button.classList.add("is-selected");
          setMaterialState(button,"veil");

          window.setTimeout(function(){
            transitionQuestionThen(function(){
              answerQuestion(id,key);
            });
          },isReducedMotion()?0:120);
        });
      })(buttons[i]);
    }

    back=byId("tvmBackQuestion");
    if(back){
      back.addEventListener("click",function(){
        transitionQuestionThen(function(){
          goBack();
        });
      });
    }
  }

  function answerQuestion(id,key){
    var next;
    state.answers[id]=key;
    next=chooseNextQuestion();

    if(next){
      state.history.push(next);
      state.screen="question";
      render();
      return;
    }

    finish();
  }

  function resolvedSource(){
    var a=state.answers;
    var mapped;
    if(a.q2){
      if(a.q2!=="H"){
        mapped=MAP.q2[a.q2]||{};
        return mapped.source||"";
      }
    }
    if(a.qSourceFinal){
      mapped=MAP.qSourceFinal[a.qSourceFinal]||{};
      return mapped.source||"";
    }
    if(a.qSource){
      mapped=MAP.qSource[a.qSource]||{};
      if(mapped.source){
        if(mapped.source!=="unknown") return mapped.source;
      }
    }
    return "";
  }

  function resolvedEffect(){
    var a=state.answers;
    var mapped;
    if(a.q5){
      mapped=MAP.q5[a.q5]||{};
      if(mapped.effect){
        if(mapped.effect!=="unknown") return mapped.effect;
      }
    }
    if(a.qEffectRefine){
      mapped=MAP.qEffectRefine[a.qEffectRefine]||{};
      return mapped.effect||"";
    }
    return "";
  }

  function resolvedLimit(){
    var a=state.answers;
    var mapped;
    if(a.q6){
      mapped=MAP.q6[a.q6]||{};
      if(mapped.limit){
        if(mapped.limit!=="unknown") return mapped.limit;
      }
    }
    if(a.qLimitRefine){
      mapped=MAP.qLimitRefine[a.qLimitRefine]||{};
      return mapped.limit||"";
    }
    return "";
  }

  function derivedLimitConfidence(){
    var a=state.answers;
    var q2;
    var q3=MAP.q3[a.q3]||{};
    var q4=MAP.q4[a.q4]||{};
    if(a.q2){
      if(a.q2!=="H") q2=MAP.q2[a.q2]||{};
    }
    if(!q2) q2={source:resolvedSource()};
    if(q2.source==="place") return 2;
    if(q2.source==="language") return 2;
    if(q3.medium==="return") return 2;
    if(q4.control==="low") return 2;
    return 1;
  }

  function completionGate(){
    var count=state.history.length;
    var source=resolvedSource();
    var effect=resolvedEffect();
    var limit=resolvedLimit();
    if(count<QUESTION_MIN) return false;
    if(!source) return false;
    if(!effect) return false;
    if(limit) return true;
    if(derivedLimitConfidence()>=2) return true;
    return false;
  }

  function chooseAdaptiveNeed(){
    var a=state.answers;
    var source=resolvedSource();
    var effect=resolvedEffect();
    var limit=resolvedLimit();

    if(!source){
      if(a.q2==="H"){
        if(!a.qSource) return "qSource";
        if(!a.qSourceFinal) return "qSourceFinal";
      }
    }

    if(!effect){
      if(!a.q5) return "q5";
      if(!a.qEffectRefine) return "qEffectRefine";
    }

    if(!limit){
      if(!a.q6) return "q6";
      if(!a.qLimitRefine) return "qLimitRefine";
    }

    return "";
  }

  function chooseNextQuestion(){
    var count=state.history.length;
    var next;

    if(!state.answers.q1) return "q1";
    if(!state.answers.q2) return "q2";
    if(!state.answers.q3) return "q3";
    if(!state.answers.q4) return "q4";

    if(count>=QUESTION_MAX) return "";

    next=chooseAdaptiveNeed();
    if(count<QUESTION_MIN){
      if(next) return next;
      if(!state.answers.q5) return "q5";
      if(!state.answers.q6) return "q6";
    }

    if(completionGate()) return "";
    if(next) return next;

    return "";
  }

  function goBack(){
    /* Adaptive back: remove current answer and every downstream branch answer. */
    var removed;
    var active={};
    var i;
    var key;

    if(state.history.length<=1){
      state.history=[];
      state.answers={};
      state.screen="entry";
      render();
      return;
    }

    removed=state.history.pop();
    delete state.answers[removed];

    for(i=0;i<state.history.length;i++){
      active[state.history[i]]=true;
    }

    for(key in state.answers){
      if(state.answers.hasOwnProperty(key)){
        if(!active[key]){
          delete state.answers[key];
        }
      }
    }

    render();
  }

  function renderStateSurface(stateName,title,copyText,actionsHtml){
    return ''+
      '<section class="tvm-screen" data-surface="content" data-elevation="s0">'+
        '<div class="tvm-state-surface is-entering" data-state="'+escapeHtml(stateName)+'" data-surface="transient" data-elevation="s2" data-glass="veil"'+(stateName==="error"?' role="alert" aria-live="assertive" aria-atomic="true"':' role="status" aria-live="polite" aria-atomic="true"')+'>'+
          '<p class="tvm-state-title"'+(stateName==="error"?' id="tvmErrorTitle"':'')+'>'+escapeHtml(title)+'</p>'+
          (copyText?'<p class="tvm-state-copy"'+(stateName==="error"?' id="tvmErrorDescription"':'')+'>'+escapeHtml(copyText)+'</p>':'')+
          (actionsHtml?'<div class="tvm-state-actions">'+actionsHtml+'</div>':'')+
        '</div>'+
      '</section>';
  }

  function renderErrorState(){
    var app=getApp();
    var u=currentUI();
    var actions;

    if(!app) return;

    setStageEnvironment("almost");

    actions=
      '<button type="button" class="tvm-btn is-primary tvm-control tvm-reactive" data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil" id="tvmRetry" aria-describedby="tvmErrorDescription">'+escapeHtml(u.retry)+'</button>'+
      '<button type="button" class="tvm-btn is-ghost tvm-control tvm-reactive" data-material="clear" data-surface="interface" data-elevation="s1" id="tvmErrorBack" aria-describedby="tvmErrorDescription">'+escapeHtml(u.back)+'</button>';

    app.innerHTML=
      chrome("almost")+
      renderStateSurface("error",u.error_title,u.error_help,actions);

    bindInteractionControls();

    if(byId("tvmRetry")){
      byId("tvmRetry").addEventListener("click",function(){
        finish();
      });
    }

    if(byId("tvmErrorBack")){
      byId("tvmErrorBack").addEventListener("click",function(){
        state.screen="question";
        render();
      });
    }
  }

  function mergeProfile(){
    var a=state.answers;
    var q1=MAP.q1[a.q1]||{};
    var q2;
    var q3=MAP.q3[a.q3]||{};
    var q4=MAP.q4[a.q4]||{};
    var effect=resolvedEffect();
    var limit=resolvedLimit();
    var source=resolvedSource();
    var ontology;

    if(a.q2){
      if(a.q2!=="H") q2=MAP.q2[a.q2]||{};
    }
    if(!q2) q2={source:source};

    if(!effect) effect=deriveEffect(q1.principle);
    if(!limit) limit=deriveLimit(source,q3.medium,q4.control);
    ontology=deriveOntology(q1.principle);

    return{
      schema_version:"2.0",
      magic_name:magicName(q1.principle),
      dominant_principle:{type:q1.principle||"unspecified"},
      source:{type:source||"unspecified",role:"origin"},
      access:{type:q3.access||"unspecified",role:"connection_condition"},
      medium:{type:q3.medium||"unspecified",role:"activation_action"},
      target:{type:q1.target||"unspecified",domain:"unspecified"},
      effect:{operation:effect||"unspecified",mode:"unspecified"},
      cost:{type:"none"},
      limit:buildLimit(limit||"unspecified"),
      control:{
        level:q4.control||"unspecified",
        scope:"outcome",
        dimensions:{
          activation:"unspecified",
          target_selection:"unspecified",
          range:"unspecified",
          intensity:"unspecified",
          temporal_selection:"unspecified"
        }
      },
      ontology:ontology,
      magic_core:buildCore(source,q3.access,q1.target,effect,limit,q4.control)
    };
  }

  function buildLimit(type){
    var out={type:type};
    if(type==="limited_uses"){
      out.quantity="unspecified";
      out.reset_rule="unspecified";
    }else if(type==="location_bound"){
      out.location_rule="unspecified";
    }else if(type==="target_bound"){
      out.allowed_target_rule="unspecified";
    }else if(type==="detail_uncontrolled"){
      out.uncontrolled_dimensions="unspecified";
    }else if(type==="timing_bound"){
      out.time_rule="unspecified";
    }else if(type==="cannot_target_self"){
      out.excluded_target="self";
    }else if(type==="nonrepeatable_on_same_target"){
      out.repeat_rule="once_per_target";
    }else if(type==="cooldown_required"){
      out.cooldown_duration="unspecified";
    }
    return out;
  }

  function deriveEffect(principle){
    if(principle==="revelation") return "reveal";
    if(principle==="recovery") return "restore";
    if(principle==="preservation") return "restore";
    if(principle==="anticipation") return "delay";
    if(principle==="transformation") return "transform";
    if(principle==="boundary") return "reveal";
    return "transform";
  }

  function deriveLimit(source,medium,control){
    if(source==="place") return "location_bound";
    if(medium==="return") return "nonrepeatable_on_same_target";
    if(medium==="voice") return "target_bound";
    if(source==="language") return "target_bound";
    if(control==="low") return "detail_uncontrolled";
    if(control==="conditional") return "detail_uncontrolled";
    return "limited_uses";
  }

  function deriveOntology(principle){
    var out={principle:"state_rule",reference:"unspecified",description:""};

    if(principle==="boundary"){
      out.principle="persistent_difference";
      out.reference="state_boundary";
      out.description=state.language==="en"?"A difference remains between two states instead of disappearing completely.":"二つの状態のあいだには、消えずに残る差分がある。";
    }else if(principle==="revelation"){
      out.principle="conditional_visibility";
      out.reference="hidden_state";
      out.description=state.language==="en"?"An unseen state surfaces only when the required conditions align.":"見えない状態は、条件がそろったときだけ表面に現れる。";
    }else if(principle==="recovery"){
      out.principle="persistent_connection";
      out.reference="loss_event";
      out.description=state.language==="en"?"What is lost never disappears completely and can be reconnected through a specific path.":"失われたものは完全には消えず、特定の経路からだけ再接続できる。";
    }else if(principle==="preservation"){
      out.principle="residual_difference";
      out.reference="event_state_difference";
      out.description=state.language==="en"?"What remains is preserved not as a complete form, but as a state difference associated with the event that produced the trace.":"残ったものは、完全な形ではなく、痕跡を生じさせた出来事の前後に生じた状態差として保持される。";
    }else if(principle==="anticipation"){
      out.principle="unrealized_variation";
      out.reference="possible_event";
      out.description=state.language==="en"?"Events that are not yet fixed can have the way they unfold shifted.":"まだ確定していない出来事は、進行の仕方をずらすことができる。";
    }else if(principle==="transformation"){
      out.principle="state_transition";
      out.reference="changing_state";
      out.description=state.language==="en"?"States are not fixed and may move into another form when conditions overlap.":"状態は固定されず、条件が重なると別の形へ移る。";
    }
    return out;
  }

  function magicName(principle){
    if(state.language==="en"){
      if(principle==="boundary") return "Interstice";
      if(principle==="revelation") return "Disclosure";
      if(principle==="recovery") return "Reconnection";
      if(principle==="preservation") return "Retention";
      if(principle==="anticipation") return "Foretrace";
      if(principle==="transformation") return "Phase Shift";
      return "Untitled";
    }
    if(principle==="boundary") return "間界";
    if(principle==="revelation") return "露呈";
    if(principle==="recovery") return "復片";
    if(principle==="preservation") return "留景";
    if(principle==="anticipation") return "先延";
    if(principle==="transformation") return "遷相";
    return "無題";
  }

  function buildCore(source,access,target,effect,limit,control){
    var sourceText=label("source",source);
    var accessText=label("access",access);
    var targetText=label("target",target);
    var effectText=label("effect",effect);
    var limitText=label("limit",limit);
    var controlText="";

    if(state.language==="en"){
      if(control==="high"){
        controlText="Most of the outcome can be intentionally determined.";
      }else if(control==="medium"){
        controlText="The overall direction can be chosen, but not every detail.";
      }else if(control==="conditional"){
        controlText="Part of the outcome remains open to chance.";
      }else{
        controlText="The final result cannot be fully known in advance.";
      }

      return(
        "This magic begins through "+accessText.toLowerCase()+".\n"+
        "Its power comes from "+sourceText.toLowerCase()+" and acts on "+targetText.toLowerCase()+". Its effect is to "+effectText.toLowerCase()+".\n"+
        "Its limit: "+limitText.toLowerCase()+".\n"+
        controlText
      );
    }

    if(control==="high"){
      controlText="起こす内容のほとんどを自分で決められる。";
    }else if(control==="medium"){
      controlText="起こす方向は選べるが、細部までは決められない。";
    }else if(control==="conditional"){
      controlText="結果の一部は偶然に残る。";
    }else{
      controlText="何が起きるかは最後まで完全には決められない。";
    }

    return(
      "この魔法は、"+accessText+"ことで始まる。\n"+
      sourceText+"を力の出所にして、"+targetText+"へ作用し、"+effectText+"。\n"+
      "ただし、"+limitText+"。\n"+
      controlText
    );
  }

  function yamlLine(key,value,indent){
    var spaces="";
    var i;
    var nl=String.fromCharCode(10);
    for(i=0;i<indent;i++) spaces+=" ";
    return spaces+key+": "+value+nl;
  }

  function profileYaml(p){
    var y="";
    var key;
    var nl=String.fromCharCode(10);
    y+="persona_magic_profile:"+nl;
    y+=yamlLine("schema_version",'"'+p.schema_version+'"',2);
    y+="  dominant_principle:"+nl+yamlLine("type",p.dominant_principle.type,4);
    y+="  source:"+nl+yamlLine("type",p.source.type,4)+yamlLine("role",p.source.role,4);
    y+="  access:"+nl+yamlLine("type",p.access.type,4)+yamlLine("role",p.access.role,4);
    y+="  medium:"+nl+yamlLine("type",p.medium.type,4)+yamlLine("role",p.medium.role,4);
    y+="  target:"+nl+yamlLine("type",p.target.type,4)+yamlLine("domain",p.target.domain,4);
    y+="  effect:"+nl+yamlLine("operation",p.effect.operation,4)+yamlLine("mode",p.effect.mode,4);
    y+="  cost:"+nl+yamlLine("type",p.cost.type,4);
    y+="  limit:"+nl;
    for(key in p.limit){
      if(p.limit.hasOwnProperty(key)) y+=yamlLine(key,p.limit[key],4);
    }
    y+="  control:"+nl+yamlLine("level",p.control.level,4)+yamlLine("scope",p.control.scope,4);
    y+="    dimensions:"+nl;
    for(key in p.control.dimensions){
      if(p.control.dimensions.hasOwnProperty(key)) y+=yamlLine(key,p.control.dimensions[key],6);
    }
    y+="  ontology:"+nl+yamlLine("principle",p.ontology.principle,4)+yamlLine("reference",p.ontology.reference,4)+yamlLine("description",'"'+p.ontology.description.replace(/"/g,'\\"')+'"',4);
    y+="  secondary_traits: []"+nl;
    y+="  aesthetic:"+nl;
    y+="    brightness: open"+nl+"    temperature: open"+nl+"    motion: open"+nl+"    order: open"+nl+"    density: open"+nl;
    y+="  derivation_policy:"+nl;
    y+="    unspecified_is_canon: false"+nl+"    derived_details_are_canon: false";
    return y;
  }

  function compactPrompt(language,yaml){
    var nl=String.fromCharCode(10);
    var lines=[];

    if(language==="en"){
      lines.push("Below is my Persona Magic Profile generated by https://TranquilGuides.com .");
      lines.push("Use the Profile as FIXED CORE for future generation. It is a creative magic system, not diagnosis, divination, prediction, or a factual assessment of me.");
      lines.push("");
      lines.push("Priority: FIXED CORE > legitimately accessible SUPPORTING CONTEXT > DERIVED INTERPRETATION > MANIFESTATION DETAIL. A lower layer never rewrites a higher one.");
      lines.push("Resolved Profile values are fixed. explicit unspecified / open values remain unresolved and may be concretized only for the current artifact unless I adopt them.");
      lines.push("");
      lines.push("[PERSONA MAGIC PROFILE]");
      lines.push(yaml);
      lines.push("[/PERSONA MAGIC PROFILE]");
      lines.push("");
      lines.push("Read fields causally: SOURCE -> ACCESS -> MEDIUM -> TARGET -> EFFECT -> LIMIT/COST -> CONTROL, explained by ONTOLOGY. Keep SOURCE, ACCESS, and MEDIUM distinct. COST and LIMIT are separate; cost.type=none forbids invented activation prices. Do not infer unspecified target domains, effect modes, control dimensions, quantities, reset cycles, range, or other canon.");
      lines.push("Use accessible prior context only to shape open manifestation details. Do not fabricate biography, psychology, diagnosis, motives, preferences, or sensitive personal facts. Do not add stock magic imagery merely because it feels magical, and do not imitate existing IP.");
      lines.push("Generate one concrete artifact immediately without asking what format to use. First choose one Artifact Type, then one Output Form. Preserve the same magic law across media. If a chosen form is unavailable, keep Artifact Type fixed and change only Output Form to the nearest available form or a production-ready text specification.");
      lines.push("The first artifact must show the magic operating, not merely summarize settings. Use the smallest scale that demonstrates the law. Any new person, place, object, event, name, color, sound, number, tool, or staging remains MANIFESTATION DETAIL until I adopt it.");
      lines.push("Before output, verify that FIXED CORE was not rewritten, unresolved values were not canonized, ONTOLOGY is respected, hidden costs were not added, and SOURCE / ACCESS / MEDIUM remain distinct.");
      return lines.join(nl);
    }

    lines.push("以下は、 https://TranquilGuides.com で生成した私専用のPersona Magic Profileです。");
    lines.push("このProfileを今後の生成におけるFIXED COREとして使用してください。これは診断・占い・能力判定ではなく、創作上の魔法体系です。");
    lines.push("");
    lines.push("優先順位は FIXED CORE > 正当に参照できるSUPPORTING CONTEXT > DERIVED INTERPRETATION > MANIFESTATION DETAIL。下位層から上位層を書き換えません。");
    lines.push("Profileの確定値は固定です。明示的なunspecified / openだけが未確定で、一例のために具体化しても、私が採用しない限り固定設定へ昇格させません。");
    lines.push("");
    lines.push("[PERSONA MAGIC PROFILE]");
    lines.push(yaml);
    lines.push("[/PERSONA MAGIC PROFILE]");
    lines.push("");
    lines.push("各Fieldは因果として読みます。SOURCE → ACCESS → MEDIUM → TARGET → EFFECT → LIMIT/COST → CONTROL をONTOLOGYが説明します。SOURCE / ACCESS / MEDIUMを同義化しません。COSTとLIMITを分け、cost.type=noneなら隠れた代償を追加しません。未指定のtarget domain、effect mode、control dimension、回数、reset、射程等を固定設定として発明しません。");
    lines.push("正当に参照できる既存文脈は、未確定な具現化の補助にだけ使えます。経歴・心理・診断・動機・嗜好・センシティブ情報を捏造しません。『魔法らしさ』だけを理由に定番記号を追加せず、既存IPへ寄せません。");
    lines.push("追加質問をせず、まず一つの具体的成果物を生成してください。内部でArtifact Typeを一つ選び、その後Output Formを一つ選びます。媒体が変わっても魔法法則は変えません。形式を直接生成できない場合はArtifact Typeを維持し、近いOutput Formまたはproduction-ready TEXT SPECへFallbackします。");
    lines.push("最初の成果物は設定要約ではなく、魔法が一度成立したと分かる具体物にします。法則を示せる最小スケールを優先し、新しい人物・場所・物・出来事・名前・色・音・数値・道具・演出は、私が採用するまでMANIFESTATION DETAILです。");
    lines.push("出力前に、FIXED COREを変更していないこと、未確定値をcanon化していないこと、ONTOLOGYと矛盾しないこと、隠れたCOSTを足していないこと、SOURCE / ACCESS / MEDIUMを区別していることを内部確認してください。");
    return lines.join(nl);
  }

  function minimalPrompt(language,yaml){
    var nl=String.fromCharCode(10);
    var head;
    var tail;

    if(language==="en"){
      head="Use this Persona Magic Profile as FIXED CORE. It is a creative magic system, not an assessment of me. Resolved values are fixed; only explicit unspecified/open values are unresolved. Never let context or manifestation details rewrite the Profile.";
      tail="Read causally as SOURCE -> ACCESS -> MEDIUM -> TARGET -> EFFECT -> LIMIT/COST -> CONTROL under ONTOLOGY. Keep SOURCE/ACCESS/MEDIUM distinct; never invent hidden COST, unspecified domains/modes/control dimensions, quantities, resets, or range as canon. Use legitimate context only for open manifestation details and fabricate no personal facts. Without asking first, generate one concrete artifact that demonstrates the magic. Choose Artifact Type, then an available Output Form; if necessary, keep Artifact Type and fallback only the Output Form. New implementation details remain non-canon unless I adopt them.";
    }else{
      head="このPersona Magic ProfileをFIXED COREとして使用してください。これは私の診断ではなく創作上の魔法体系です。確定値は固定し、明示的なunspecified/openだけを未確定として扱い、既存文脈や今回の具現化からProfileを書き換えないでください。";
      tail="SOURCE → ACCESS → MEDIUM → TARGET → EFFECT → LIMIT/COST → CONTROL をONTOLOGYの下で因果として読み、SOURCE/ACCESS/MEDIUMを区別してください。隠れたCOST、未指定のdomain/mode/control dimension、回数、reset、射程等をcanon化しません。正当に参照できる文脈は未確定な具現化の補助にだけ使い、個人的事実を捏造しません。追加質問をせず、魔法が一度成立したと分かる具体的成果物を一つ生成してください。Artifact Typeを決めてから利用可能なOutput Formを選び、不可ならArtifact Typeを変えずOutput FormだけFallbackします。今回補った具体化は、私が採用するまで非canonです。";
    }

    return head+nl+nl+"[PERSONA MAGIC PROFILE]"+nl+yaml+nl+"[/PERSONA MAGIC PROFILE]"+nl+nl+tail;
  }

  function buildPrompt(p){
    var template=getPromptTemplate(state.language);
    var yaml=profileYaml(p);
    var prompt;

    if(template){
      prompt=template.split("{{PERSONA_MAGIC_PROFILE}}").join(yaml);
      if(prompt.length<=PROMPT_MAX_CHARACTERS) return prompt;
    }

    prompt=compactPrompt(state.language,yaml);
    if(prompt.length<=PROMPT_MAX_CHARACTERS) return prompt;

    prompt=minimalPrompt(state.language,yaml);
    if(prompt.length<=PROMPT_MAX_CHARACTERS) return prompt;

    throw new Error("Prompt exceeds "+PROMPT_MAX_CHARACTERS+" characters without a safe fixed-core-preserving compression path.");
  }

  function finish(){
    try{
    state.profile=mergeProfile();
    state.prompt=buildPrompt(state.profile);
    state.screen="result";
    render();
    }catch(error){
      console.warn("[Tranquilvæj Magic] profile assembly failed.",error);
      state.screen="error";
      renderErrorState();
    }
  }

  function currentPageUrl(){
    var canonical;
    var href="";

    try{
      canonical=document.querySelector('link[rel="canonical"]');
      if(canonical){
        href=canonical.getAttribute("href")||"";
      }
      if(!href){
        href=window.location.href||"";
      }
    }catch(error){
      href="";
    }

    if(href.indexOf("about:")===0) return "";
    return href;
  }

  function normalizeShareText(text,maxLength){
    var value=String(text||"");
    value=value.replace(/\r/g,"");
    value=value.replace(/[ \t]+/g," ");
    value=value.replace(/\n[ \t]+/g,"\n");
    value=value.replace(/\n{3,}/g,"\n\n");
    value=value.replace(/^\s+|\s+$/g,"");

    if(maxLength){
      if(value.length>maxLength){
        value=value.substring(0,maxLength-1)+"…";
      }
    }

    return value;
  }

  function magicShareParts(profile){
    var coreLines=String(profile.magic_core||"").split("\n");
    var name=String(profile.magic_name||(state.language==="en"?"Untitled":"無題"));
    var first=coreLines.length>0?normalizeShareText(coreLines[0],120):"";
    var second=coreLines.length>1?normalizeShareText(coreLines[1],170):"";
    var core=normalizeShareText(String(profile.magic_core||""),0);

    return{
      name:name,
      first:first,
      second:second,
      core:core
    };
  }

  function standardShareText(profile,maxLength){
    var p=magicShareParts(profile);
    var text="";

    if(state.language==="en"){
      text='My magic is "'+p.name+'". ';
      if(p.first) text+=p.first+" ";
      if(p.second) text+=p.second+" ";
      text+="What is your magic?";
    }else{
      text='私の魔法は「'+p.name+'」。';
      if(p.first) text+=p.first;
      if(p.second) text+=p.second;
      text+="あなたの魔法は？";
    }

    return normalizeShareText(text,maxLength||0);
  }

  function xShareText(profile){
    var p=magicShareParts(profile);
    var url=currentPageUrl();
    var coreFirst=p.first;
    var coreSecond=p.second;
    var footer;
    var text;

    if(state.language==="en"){
      footer="@chaos_color #TakumiIIDA #TranquilGuides";
      text='My magic is "'+p.name+'". ';
      if(coreFirst) text+=coreFirst+" ";
      if(coreSecond) text+=coreSecond+" ";
      text+="What is your magic? "+footer;
    }else{
      footer="@chaos_color #TakumiIIDA #TranquilGuides";
      text='私の魔法は「'+p.name+'」。';
      if(coreFirst) text+=coreFirst;
      if(coreSecond) text+=coreSecond;
      text+="あなたの魔法は？ "+footer;
    }
    if(url) text+=" "+url;

    /* Keep X inside its hard limit without a blind substring cut. The full
       requested form is preserved whenever it fits; if a generated result is
       unusually long, the second core sentence is the first removable part. */
    if(text.length>280){
      if(state.language==="en"){
        text='My magic is "'+p.name+'". ';
        if(coreFirst) text+=coreFirst+" ";
        text+="What is your magic? "+footer;
      }else{
        text='私の魔法は「'+p.name+'」。';
        if(coreFirst) text+=coreFirst;
        text+="あなたの魔法は？ "+footer;
      }
      if(url) text+=" "+url;
    }

    return normalizeShareText(text,280);
  }

  function serviceShareText(profile,service){
    var p=magicShareParts(profile);
    var url=currentPageUrl();
    var text="";

    if(service==="x") return xShareText(profile);

    if(state.language==="en"){
      text='My magic is "'+p.name+'". ';
      if(p.first) text+=p.first+" ";
      if(p.second) text+=p.second+" ";
      text+="What is your magic? ";
      if(service==="bluesky"){
        text+="@chaoscolor.bsky.social #TakumiIIDA #Tranquilvæj #TranquilGuides";
      }else if(service==="threads"){
        text+="@chaos_color";
      }
    }else{
      text='私の魔法は「'+p.name+'」。';
      if(p.first) text+=p.first;
      if(p.second) text+=p.second;
      text+="あなたの魔法は？ ";
      if(service==="bluesky"){
        text+="@chaoscolor.bsky.social #TakumiIIDA #Tranquilvæj #TranquilGuides";
      }else if(service==="threads"){
        text+="@chaos_color";
      }
    }

    if(url) text+=" "+url;
    return normalizeShareText(text,0);
  }

  function resultCopyText(profile){
    var u=currentUI();
    var lines=[];
    var name=String(profile.magic_name||(state.language==="en"?"Untitled":"無題"));
    var sep=state.language==="en"?": ":"：";
    var url=currentPageUrl();

    lines.push(name);
    lines.push("");

    if(profile.magic_core){
      lines.push(String(profile.magic_core));
    }

    lines.push("");
    lines.push(u.summary_title);
    lines.push(u.principle+sep+label("principle",profile.dominant_principle.type));
    lines.push(u.source+sep+label("source",profile.source.type));
    lines.push(u.starting+sep+label("medium",profile.medium.type));
    lines.push(u.change+sep+label("effect",profile.effect.operation));
    lines.push(u.limit+sep+label("limit",profile.limit.type));
    lines.push(u.access+sep+label("access",profile.access.type));
    lines.push(u.target+sep+label("target",profile.target.type));
    lines.push(u.control+sep+label("control",profile.control.level));
    lines.push(u.ontology+sep+String(profile.ontology.description||""));
    lines.push("");
    lines.push(state.language==="en"?"What is your magic?":"あなたの魔法は？");
    lines.push("");
    lines.push("@chaos_color #TakumiIIDA #Tranquilvæj #TranquilGuides");

    if(url){
      lines.push("");
      lines.push(url);
    }

    return normalizeShareText(lines.join("\n"),0);
  }

  function openShareWindow(url,width,height){
    var features="noopener,noreferrer,menubar=no,toolbar=no,resizable=yes,scrollbars=yes";
    var popup;
    if(width) features+=",width="+width;
    if(height) features+=",height="+height;
    popup=window.open(url,"_blank",features);
    if(popup){
      try{
        popup.opener=null;
      }catch(error){}
    }
  }

  function shareX(profile){
    var text=serviceShareText(profile,"x");
    openShareWindow("https://twitter.com/intent/tweet?text="+encodeURIComponent(text),600,400);
  }

  function shareThreads(profile){
    var text=serviceShareText(profile,"threads");
    openShareWindow("https://www.threads.com/intent/post?text="+encodeURIComponent(text),640,720);
  }

  function shareBluesky(profile){
    var text=serviceShareText(profile,"bluesky");
    openShareWindow("https://bsky.app/intent/compose?text="+encodeURIComponent(text),640,720);
  }

  function shareLine(profile){
    var url=currentPageUrl();
    var text=standardShareText(profile,0);
    var href="https://social-plugins.line.me/lineit/share";
    var query=[];

    if(text) query.push("text="+encodeURIComponent(text));
    if(url) query.push("url="+encodeURIComponent(url));
    if(query.length>0) href+="?"+query.join("&");

    openShareWindow(href,720,720);
  }

  function shareNative(profile){
    var u=currentUI();
    var payload={
      title:String(profile.magic_name||""),
      text:standardShareText(profile,0)
    };
    var url=currentPageUrl();

    if(url) payload.url=url;

    if(navigator.share){
      navigator.share(payload).catch(function(error){
        if(error){
          if(error.name==="AbortError") return;
        }
        showToast(u.share_failed);
      });
      return;
    }

    copyShareResult(profile,null);
  }

  function shareCapabilityRegistry(profile){
    return {
      x:{
        available:true,
        run:function(){return shareX(profile);}
      },
      threads:{
        available:true,
        run:function(){return shareThreads(profile);}
      },
      bluesky:{
        available:true,
        run:function(){return shareBluesky(profile);}
      },
      line:{
        available:true,
        run:function(){return shareLine(profile);}
      },
      native:{
        available:!!navigator.share,
        run:function(){return shareNative(profile);}
      },
      copy:{
        available:true,
        run:function(button){return copyShareResult(profile,button);}
      },
      story:{
        available:true,
        run:function(button){return createMagicStoryCard(profile,button);}
      }
    };
  }

  function applyShareCapabilities(row,profile){
    var registry=shareCapabilityRegistry(profile);
    var buttons=row.querySelectorAll("[data-share-action]");
    var i;
    var action;
    var config;

    for(i=0;i<buttons.length;i++){
      action=buttons[i].getAttribute("data-share-action");
      config=registry[action];
      if(config){
        if(config.available===false){
          buttons[i].hidden=true;
          buttons[i].setAttribute("aria-hidden","true");
        }else{
          buttons[i].hidden=false;
          buttons[i].removeAttribute("aria-hidden");
        }
      }
    }

    row._tvmShareRegistry=registry;
    return registry;
  }

  function setCopyVisualState(button,copied){
    var u=currentUI();

    if(!button) return;

    if(button._tvmCopyStateTimer){
      window.clearTimeout(button._tvmCopyStateTimer);
      button._tvmCopyStateTimer=0;
    }

    if(copied){
      button.classList.add("is-copied");
      button.setAttribute("aria-label",u.share_copy_done);
      button.setAttribute("data-tooltip",u.share_copy_done);
      button._tvmCopyStateTimer=window.setTimeout(function(){
        if(!button.isConnected) return;
        button.classList.remove("is-copied");
        button.setAttribute("aria-label",u.share_copy);
        button.setAttribute("data-tooltip",u.share_copy);
        button._tvmCopyStateTimer=0;
      },1800);
    }else{
      button.classList.remove("is-copied");
      button.setAttribute("aria-label",u.share_copy);
      button.setAttribute("data-tooltip",u.share_copy);
    }
  }

  function copyShareResult(profile,button){
    var u=currentUI();
    return copyText(resultCopyText(profile)).then(function(){
      setCopyVisualState(button,true);
      showToast(u.share_copied);
      return true;
    }).catch(function(error){
      setCopyVisualState(button,false);
      showToast(u.share_failed,u.recovery_retry,function(){
        copyShareResult(profile,button);
      });
      reportRecovery(error,"copyResult",false,function(){
        return copyShareResult(profile,button);
      });
      return false;
    });
  }

  function setShareBusy(button,busy){
    setBusyControl(button,busy);
  }

  function downloadBlob(blob,filename){
    var link=document.createElement("a");
    var url;

    try{
      url=URL.createObjectURL(blob);
      link.href=url;
      link.download=filename;
      link.style.display="none";
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      window.setTimeout(function(){
        URL.revokeObjectURL(url);
      },1000);
      return true;
    }catch(error){
      if(link.parentNode){
        link.parentNode.removeChild(link);
      }
      return false;
    }
  }

  function canvasToBlob(canvas,callback){
    if(canvas.toBlob){
      canvas.toBlob(function(blob){
        callback(blob);
      },"image/png");
      return;
    }

    try{
      var data=canvas.toDataURL("image/png");
      var bin=window.atob(data.split(",")[1]);
      var bytes=new Uint8Array(bin.length);
      var i;
      for(i=0;i<bin.length;i++){
        bytes[i]=bin.charCodeAt(i);
      }
      callback(new Blob([bytes],{type:"image/png"}));
    }catch(error){
      callback(null);
    }
  }

  function wrapCanvasText(ctx,text,maxWidth){
    var source=String(text);
    var tokens;
    var separator="";
    var lines=[];
    var line="";
    var i;
    var token;
    var test;

    if(source.indexOf(" ")>=0){
      tokens=source.split(" ");
      separator=" ";
    }else{
      tokens=source.split("");
    }

    for(i=0;i<tokens.length;i++){
      token=tokens[i];

      if(token.indexOf("\n")>=0){
        token=token.replace(/\n/g,"");
        if(token){
          test=line?(line+separator+token):token;
          if(ctx.measureText(test).width<=maxWidth){
            line=test;
          }
        }
        if(line) lines.push(line);
        line="";
        continue;
      }

      test=line?(line+separator+token):token;
      if(ctx.measureText(test).width>maxWidth){
        if(line) lines.push(line);
        line=token;
      }else{
        line=test;
      }
    }

    if(line) lines.push(line);
    return lines;
  }

  /* =========================================================
     Story image — Canvas 2D / PNG / no SVG
     1080 × 1920. The generated image is a portable result:
     save it, revisit it, show it, or share it.

     Typography contract inside the image:
     - Magic name: independent responsive size.
     - URL: independent fixed size.
     - Every other text element uses exactly three base sizes:
       LARGE 32px / MEDIUM 25px / SMALL 20px.
     Weight and line-height are style properties, not extra sizes.
     ========================================================= */
  var STORY_TEXT_LARGE=32;
  var STORY_TEXT_MEDIUM=25;
  var STORY_TEXT_SMALL=20;
  var STORY_TEXT_COLOR="#F4F1EA";

  function storyFont(size,weight){
    return String(weight||400)+" "+String(size)+'px -apple-system,BlinkMacSystemFont,"Hiragino Sans","Yu Gothic",sans-serif';
  }

  function storyLineHeight(size){
    if(size===STORY_TEXT_LARGE) return Math.round(size*1.65);
    if(size===STORY_TEXT_MEDIUM) return Math.round(size*1.60);
    return Math.round(size*1.55);
  }

  function fitCanvasTitle(ctx,text,maxWidth,maxLines){
    var size=92;
    var lines=[];

    while(size>=56){
      ctx.font=storyFont(size,600);
      lines=wrapCanvasText(ctx,text,maxWidth);
      if(lines.length<=maxLines) break;
      size-=4;
    }

    return{
      size:size,
      lines:lines
    };
  }

  function storyHash(text){
    var source=String(text||"");
    var hash=2166136261;
    var i;
    for(i=0;i<source.length;i++){
      hash^=source.charCodeAt(i);
      hash+=(hash<<1)+(hash<<4)+(hash<<7)+(hash<<8)+(hash<<24);
    }
    return hash>>>0;
  }

  function storyPalette(profile){
    var principle=String(profile.dominant_principle.type||"");
    var source=String(profile.source.type||"");
    var effect=String(profile.effect.operation||"");
    var key=principle+"|"+source+"|"+effect;
    var h=storyHash(key)%360;
    var warm=(h+28)%360;
    var cool=(h+204)%360;
    return{
      paper:"hsl("+warm+", 20%, 94%)",
      glow:"hsla("+warm+", 52%, 76%, .34)",
      veil:"hsla("+cool+", 24%, 74%, .18)",
      trace:"hsla("+h+", 34%, 54%, .17)",
      ink:"#202624",
      muted:"rgba(32,38,36,.52)"
    };
  }

  function storyManifestAnchor(profile){
    var source=String(profile.source.type||"");
    if(source==="self") return{x:850,y:320};
    if(source==="place") return{x:845,y:710};
    if(source==="relation") return{x:760,y:600};
    if(source==="object") return{x:880,y:1010};
    if(source==="language") return{x:760,y:420};
    if(source==="accumulated_time") return{x:820,y:1230};
    if(source==="relational_field") return{x:760,y:820};
    return{x:850,y:940};
  }

  function storyControlFactor(profile){
    var level=String(profile.control.level||"");
    if(level==="high") return .92;
    if(level==="medium") return .72;
    if(level==="conditional") return .56;
    return .42;
  }

  function drawStoryPrincipleMotif(ctx,profile,palette,seed){
    var principle=String(profile.dominant_principle.type||"");
    var effect=String(profile.effect.operation||"");
    var limit=String(profile.limit.type||"");
    var anchor=storyManifestAnchor(profile);
    var control=storyControlFactor(profile);
    var i;
    var count=6;
    var radius;
    var x;
    var y;
    var phase;

    if(limit==="limited_uses") count=5;
    if(limit==="nonrepeatable_on_same_target") count=4;
    if(limit==="cooldown_required") count=5;
    if(limit==="timing_bound") count=3;

    ctx.save();
    ctx.globalCompositeOperation="source-over";
    ctx.lineCap="round";
    ctx.lineJoin="round";

    if(principle==="preservation"){
      /* Preservation appears as retained traces rather than a target-like
         stack of circles: several incomplete echoes remain in place. */
      ctx.strokeStyle=palette.trace;
      ctx.lineWidth=1.5;
      for(i=0;i<count;i++){
        radius=58+(i*38);
        ctx.beginPath();
        ctx.arc(anchor.x-(i*5),anchor.y+(i*4),radius,-2.55,.72-(i*.05));
        ctx.globalAlpha=.20+(control*.10)-(i*.015);
        ctx.stroke();
      }
      ctx.fillStyle=palette.veil;
      ctx.globalAlpha=.18+(control*.08);
      ctx.beginPath();
      ctx.ellipse(anchor.x-34,anchor.y+18,118,72,-.22,0,Math.PI*2);
      ctx.fill();
    }else if(principle==="recovery"){
      ctx.strokeStyle=palette.trace;
      ctx.globalAlpha=.58;
      ctx.lineWidth=2;
      for(i=0;i<count;i++){
        radius=80+(i*38);
        ctx.beginPath();
        ctx.arc(anchor.x,anchor.y,radius,-2.6,.55);
        ctx.stroke();
      }
      ctx.beginPath();
      ctx.moveTo(anchor.x-235,anchor.y+10);
      ctx.quadraticCurveTo(anchor.x-95,anchor.y-95,anchor.x-28,anchor.y-12);
      ctx.stroke();
    }else if(principle==="anticipation"){
      ctx.strokeStyle=palette.trace;
      ctx.globalAlpha=.56;
      ctx.lineWidth=2;
      for(i=0;i<count;i++){
        ctx.beginPath();
        ctx.moveTo(anchor.x-210+(i*18),anchor.y+120-(i*26));
        ctx.quadraticCurveTo(anchor.x-20,anchor.y-70-(i*10),anchor.x+235,anchor.y-130+(i*16));
        ctx.stroke();
      }
    }else if(principle==="revelation"){
      for(i=0;i<count;i++){
        radius=34+(i*42);
        ctx.beginPath();
        ctx.arc(anchor.x,anchor.y,radius,-1.15,1.15);
        ctx.strokeStyle=palette.trace;
        ctx.globalAlpha=.42+(control*.16);
        ctx.lineWidth=2;
        ctx.stroke();
      }
      ctx.beginPath();
      ctx.arc(anchor.x,anchor.y,18,0,Math.PI*2);
      ctx.fillStyle=palette.glow;
      ctx.globalAlpha=.82;
      ctx.fill();
    }else if(principle==="transformation"){
      for(i=0;i<count;i++){
        seed=(seed*1664525+1013904223)>>>0;
        phase=(seed%360)*(Math.PI/180);
        x=anchor.x+Math.cos(phase)*(80+(i*34));
        y=anchor.y+Math.sin(phase)*(55+(i*30));
        ctx.beginPath();
        ctx.ellipse(x,y,30+(i*8),18+(i*6),phase,0,Math.PI*2);
        ctx.fillStyle=i%2===0?palette.trace:palette.veil;
        ctx.globalAlpha=.27+(control*.13);
        ctx.fill();
      }
    }else if(principle==="boundary"){
      ctx.strokeStyle=palette.trace;
      ctx.globalAlpha=.52;
      ctx.lineWidth=2;
      for(i=0;i<count;i++){
        ctx.beginPath();
        ctx.moveTo(anchor.x-220+(i*30),anchor.y-180);
        ctx.lineTo(anchor.x-80+(i*30),anchor.y+210);
        ctx.stroke();
      }
    }else{
      for(i=0;i<count;i++){
        radius=28+(i*35);
        ctx.beginPath();
        ctx.arc(anchor.x,anchor.y,radius,0,Math.PI*2);
        ctx.fillStyle=palette.trace;
        ctx.globalAlpha=.18;
        ctx.fill();
      }
    }

    /* Effect changes the trace without changing the fixed magic law. */
    ctx.strokeStyle=palette.trace;
    ctx.fillStyle=palette.trace;
    ctx.globalAlpha=.48;
    ctx.lineWidth=2;
    if(effect==="restore"){
      ctx.beginPath();
      ctx.arc(anchor.x+30,anchor.y+300,170,-2.45,.48);
      ctx.stroke();
    }else if(effect==="erase"){
      for(i=0;i<4;i++){
        ctx.fillRect(anchor.x-150+(i*74),anchor.y+270,44,2);
      }
    }else if(effect==="overlay"){
      ctx.beginPath();
      ctx.arc(anchor.x-35,anchor.y+300,90,0,Math.PI*2);
      ctx.stroke();
      ctx.beginPath();
      ctx.arc(anchor.x+55,anchor.y+300,90,0,Math.PI*2);
      ctx.stroke();
    }else if(effect==="transfer"){
      ctx.beginPath();
      ctx.moveTo(anchor.x-175,anchor.y+305);
      ctx.bezierCurveTo(anchor.x-65,anchor.y+240,anchor.x+80,anchor.y+360,anchor.x+205,anchor.y+285);
      ctx.stroke();
    }else if(effect==="delay"){
      for(i=0;i<5;i++){
        ctx.beginPath();
        ctx.arc(anchor.x-120+(i*60),anchor.y+300,12,0,Math.PI*2);
        ctx.fill();
      }
    }else if(effect==="divide"){
      ctx.beginPath();
      ctx.moveTo(anchor.x-120,anchor.y+230);
      ctx.lineTo(anchor.x+120,anchor.y+370);
      ctx.moveTo(anchor.x+120,anchor.y+230);
      ctx.lineTo(anchor.x-120,anchor.y+370);
      ctx.stroke();
    }else if(effect==="reveal"){
      ctx.beginPath();
      ctx.arc(anchor.x,anchor.y+300,88,-.9,.9);
      ctx.stroke();
      ctx.beginPath();
      ctx.arc(anchor.x,anchor.y+300,13,0,Math.PI*2);
      ctx.fill();
    }else if(effect==="transform"){
      ctx.beginPath();
      ctx.ellipse(anchor.x-55,anchor.y+300,72,42,-.4,0,Math.PI*2);
      ctx.stroke();
      ctx.beginPath();
      ctx.ellipse(anchor.x+70,anchor.y+300,48,82,.5,0,Math.PI*2);
      ctx.stroke();
    }

    ctx.restore();
  }

  function storyUsableImageUrl(url){
    var a;
    if(!url) return "";
    try{
      a=document.createElement("a");
      a.href=url;
      if(a.protocol!=="http:"){
        if(a.protocol!=="https:") return "";
      }
      return a.href;
    }catch(error){
      return "";
    }
  }

  function resolveStoryImageSource(){
    var root=getRoot();
    var value="";
    var meta;
    var image;

    if(root){
      value=root.getAttribute("data-story-image")||"";
      value=storyUsableImageUrl(value);
      if(value) return value;
    }

    meta=document.querySelector('meta[property="og:image"]');
    if(meta){
      value=storyUsableImageUrl(meta.getAttribute("content")||"");
      if(value) return value;
    }

    meta=document.querySelector('meta[name="twitter:image"]');
    if(meta){
      value=storyUsableImageUrl(meta.getAttribute("content")||"");
      if(value) return value;
    }

    image=document.querySelector(".wp-post-image, .p-articleThumb img, .c-postThumb__figure img, article .wp-block-post-featured-image img");
    if(image){
      value=image.currentSrc||image.src||"";
      value=storyUsableImageUrl(value);
      if(value) return value;
    }

    return "";
  }

  function drawStoryImageCover(ctx,image){
    var cw=1080;
    var ch=1920;
    var iw=image.naturalWidth||image.width;
    var ih=image.naturalHeight||image.height;
    var scale;
    var sw;
    var sh;
    var sx;
    var sy;

    if(!iw) return;
    if(!ih) return;

    scale=Math.max(cw/iw,ch/ih);
    sw=cw/scale;
    sh=ch/scale;
    sx=(iw-sw)/2;
    sy=(ih-sh)/2;

    ctx.save();
    if("filter" in ctx){
      ctx.filter="blur(2px) saturate(.84) contrast(.98)";
    }
    ctx.globalAlpha=.86;
    ctx.drawImage(image,sx,sy,sw,sh,0,0,cw,ch);
    if("filter" in ctx){ctx.filter="none";}
    ctx.restore();

    /* Readability veil uses the same ink family as the typography.
       It deliberately suppresses photographic contrast so typography remains primary. */
    ctx.save();
    ctx.fillStyle="rgba(20,24,23,.50)";
    ctx.fillRect(0,0,cw,ch);

    /* A second, broad ink-family gradient suppresses the busiest upper/middle
       image zones without creating a card or local text panel. */
    var readability=ctx.createLinearGradient(0,0,0,ch);
    readability.addColorStop(0,"rgba(20,24,23,.15)");
    readability.addColorStop(.48,"rgba(20,24,23,.10)");
    readability.addColorStop(.72,"rgba(20,24,23,.04)");
    readability.addColorStop(1,"rgba(20,24,23,0)");
    ctx.fillStyle=readability;
    ctx.fillRect(0,0,cw,ch);
    ctx.restore();
  }

  function drawStoryAbstractField(ctx,profile,palette,seed,withImage){
    var lightA;
    var lightB;
    var shadow;
    var i;
    var x;
    var y;
    var r;
    var fieldAlpha=withImage?0.82:1;

    lightA=ctx.createRadialGradient(900,250,20,900,250,650);
    lightA.addColorStop(0,withImage?"rgba(255,244,214,.22)":palette.glow);
    lightA.addColorStop(.58,withImage?"rgba(255,255,255,.08)":"rgba(255,255,255,.16)");
    lightA.addColorStop(1,"rgba(255,255,255,0)");
    ctx.save();
    ctx.globalAlpha=fieldAlpha;
    ctx.fillStyle=lightA;
    ctx.fillRect(300,0,780,980);
    ctx.restore();

    lightB=ctx.createRadialGradient(220,1530,20,220,1530,760);
    lightB.addColorStop(0,withImage?"rgba(190,203,202,.13)":palette.veil);
    lightB.addColorStop(.65,"rgba(255,255,255,.05)");
    lightB.addColorStop(1,"rgba(255,255,255,0)");
    ctx.save();
    ctx.globalAlpha=fieldAlpha;
    ctx.fillStyle=lightB;
    ctx.fillRect(0,820,900,1100);
    ctx.restore();

    shadow=ctx.createLinearGradient(0,0,1080,0);
    shadow.addColorStop(0,"rgba(32,38,36,0)");
    shadow.addColorStop(.46,withImage?"rgba(32,38,36,.025)":"rgba(32,38,36,.035)");
    shadow.addColorStop(.72,withImage?"rgba(32,38,36,.06)":"rgba(32,38,36,.085)");
    shadow.addColorStop(1,"rgba(32,38,36,0)");
    ctx.save();
    ctx.globalAlpha=fieldAlpha;
    ctx.fillStyle=shadow;
    ctx.fillRect(0,0,1080,1920);
    ctx.restore();

    /* Blurred residue: visible enough to be part of the record, never a panel. */
    ctx.save();
    ctx.globalAlpha=withImage?0.24:0.44;
    if("filter" in ctx){ctx.filter=withImage?"blur(24px)":"blur(17px)";}
    for(i=0;i<4;i++){
      seed=(seed*1664525+1013904223)>>>0;
      x=65+(seed%390);
      seed=(seed*1664525+1013904223)>>>0;
      y=1320+(seed%410);
      seed=(seed*1664525+1013904223)>>>0;
      r=62+(seed%110);
      ctx.beginPath();
      ctx.ellipse(x,y,r,Math.max(38,Math.round(r*.56)),-.34+(i*.14),0,Math.PI*2);
      ctx.fillStyle=i%2===0?palette.trace:palette.veil;
      ctx.fill();
    }
    if("filter" in ctx){ctx.filter="none";}
    ctx.restore();
  }

  function drawStoryBackground(ctx,profile,image){
    var palette=storyPalette(profile);
    var bg=ctx.createLinearGradient(0,0,1080,1920);
    var seed=storyHash(String(profile.magic_name||"")+"|"+String(profile.ontology.principle||"")+"|"+String(profile.target.type||""));
    var i;
    var hasImage=false;

    bg.addColorStop(0,palette.paper);
    bg.addColorStop(.48,"#f3f1eb");
    bg.addColorStop(1,"#eceae4");
    ctx.fillStyle=bg;
    ctx.fillRect(0,0,1080,1920);

    if(image){
      if(image.naturalWidth){
        if(image.naturalHeight){
          hasImage=true;
          drawStoryImageCover(ctx,image);
        }
      }
    }

    drawStoryAbstractField(ctx,profile,palette,seed,hasImage);

    /* Medium / access / target remain secondary traces. They become slightly
       stronger when no eye-catch is available, and quieter over photography. */
    ctx.save();
    ctx.strokeStyle=palette.trace;
    ctx.fillStyle=palette.trace;
    ctx.lineWidth=1.25;
    ctx.globalAlpha=hasImage?0.20:0.40;

    if(String(profile.medium.type||"")==="touch"){
      ctx.beginPath();
      ctx.arc(800,1035,20,0,Math.PI*2);
      ctx.arc(800,1035,48,0,Math.PI*2);
      ctx.stroke();
    }else if(String(profile.medium.type||"")==="inscription"){
      ctx.beginPath();
      ctx.moveTo(660,1035);
      ctx.bezierCurveTo(715,1002,770,1082,840,1050);
      ctx.stroke();
    }else if(String(profile.medium.type||"")==="speech"){
      for(i=0;i<3;i++){
        ctx.beginPath();
        ctx.arc(770,1045,34+(i*26),-.72,.72);
        ctx.stroke();
      }
    }

    if(String(profile.access.type||"")==="contact"){
      ctx.beginPath();
      ctx.arc(710,1265,38,0,Math.PI*2);
      ctx.arc(750,1265,38,0,Math.PI*2);
      ctx.stroke();
    }else if(String(profile.access.type||"")==="proximity"){
      for(i=0;i<4;i++){
        ctx.beginPath();
        ctx.arc(735,1265,28+(i*22),0,Math.PI*2);
        ctx.stroke();
      }
    }

    if(String(profile.target.type||"")==="trace"){
      for(i=0;i<5;i++){
        ctx.beginPath();
        ctx.arc(185+(i*70),1515-(i*18),15+(i*3),0,Math.PI*2);
        ctx.fill();
      }
    }else if(String(profile.target.type||"")==="memory"){
      for(i=0;i<4;i++){
        ctx.fillRect(140+(i*82),1500-(i*12),44,1.5);
      }
    }
    ctx.restore();

    ctx.save();
    ctx.globalAlpha=hasImage?0.50:0.86;
    drawStoryPrincipleMotif(ctx,profile,palette,seed);
    ctx.restore();
  }

  function drawStoryWrappedText(ctx,text,x,y,maxWidth,size,weight,color,maxLines){
    var lines;
    var lineHeight=storyLineHeight(size);
    var i;
    ctx.font=storyFont(size,weight||400);
    ctx.fillStyle=color;
    ctx.textAlign="left";
    lines=wrapCanvasText(ctx,String(text||""),maxWidth);
    for(i=0;i<lines.length;i++){
      if(maxLines){
        if(i>=maxLines) break;
      }
      ctx.fillText(lines[i],x,y);
      y+=lineHeight;
    }
    return y;
  }

  var STORY_LAW_ROW_GAP=30;
  var STORY_LAW_INLINE_WIDTH=220;
  var STORY_LAW_WRAP_WIDTH=275;
  var STORY_LAW_STACK_THRESHOLD=265;

  function measureStoryText(ctx,text,size){
    ctx.font=storyFont(size,400);
    return ctx.measureText(String(text||"")).width;
  }

  function storyLawLayout(ctx,valueText){
    var width=measureStoryText(ctx,valueText,STORY_TEXT_MEDIUM);
    if(width<=STORY_LAW_INLINE_WIDTH) return "inline";
    if(width<=STORY_LAW_STACK_THRESHOLD) return "inline-wrap";
    return "stacked";
  }

  function storyVisibleTextHeight(ctx,text){
    var metrics=ctx.measureText(String(text||""));
    var height=0;
    if(typeof metrics.actualBoundingBoxAscent==="number"){
      if(typeof metrics.actualBoundingBoxDescent==="number"){
        height=metrics.actualBoundingBoxAscent+metrics.actualBoundingBoxDescent;
      }
    }
    if(!height){
      height=Math.round(parseFloat(ctx.font)||STORY_TEXT_MEDIUM);
    }
    return Math.max(1,Math.ceil(height));
  }

  function drawStoryLawRow(ctx,labelText,valueText,y){
    var labelX=388;
    var valueX=428;
    var blockLeft=274;
    var valueWidth=STORY_LAW_WRAP_WIDTH;
    var valueLineHeight=storyLineHeight(STORY_TEXT_MEDIUM);
    var layout=storyLawLayout(ctx,valueText);
    var valueLines=[];
    var lineCount=1;
    var labelHeight;
    var valueHeight;
    var valueY;
    var lastLineY;
    var i;

    ctx.textBaseline="top";

    if(layout==="stacked"){
      ctx.textAlign="left";
      ctx.fillStyle=STORY_TEXT_COLOR;
      ctx.font=storyFont(STORY_TEXT_SMALL,400);
      ctx.fillText(String(labelText||""),blockLeft,y);
      labelHeight=storyVisibleTextHeight(ctx,labelText);

      valueY=y+labelHeight+14;
      ctx.fillStyle=STORY_TEXT_COLOR;
      ctx.font=storyFont(STORY_TEXT_MEDIUM,400);
      valueLines=wrapCanvasText(ctx,String(valueText||""),560);
      lineCount=valueLines.length;
      if(lineCount<1) lineCount=1;
      if(lineCount>3) lineCount=3;
      for(i=0;i<lineCount;i++){
        ctx.fillText(valueLines[i]||"",blockLeft,valueY+(i*valueLineHeight));
      }
      lastLineY=valueY+((lineCount-1)*valueLineHeight);
      valueHeight=storyVisibleTextHeight(ctx,valueLines[lineCount-1]||valueText);
      ctx.textBaseline="alphabetic";
      return lastLineY+valueHeight+STORY_LAW_ROW_GAP;
    }

    ctx.textAlign="right";
    ctx.fillStyle=STORY_TEXT_COLOR;
    ctx.font=storyFont(STORY_TEXT_SMALL,400);
    ctx.fillText(String(labelText||""),labelX,y);
    labelHeight=storyVisibleTextHeight(ctx,labelText);

    ctx.textAlign="left";
    ctx.fillStyle=STORY_TEXT_COLOR;
    ctx.font=storyFont(STORY_TEXT_MEDIUM,400);

    if(layout==="inline-wrap"){
      valueLines=wrapCanvasText(ctx,String(valueText||""),valueWidth);
      lineCount=valueLines.length;
      if(lineCount<1) lineCount=1;
      if(lineCount>2) lineCount=2;
    }else{
      valueLines=[String(valueText||"")];
      lineCount=1;
    }

    for(i=0;i<lineCount;i++){
      ctx.fillText(valueLines[i]||"",valueX,y+(i*valueLineHeight));
    }

    lastLineY=y+((lineCount-1)*valueLineHeight);
    valueHeight=storyVisibleTextHeight(ctx,valueLines[lineCount-1]||valueText);
    ctx.textBaseline="alphabetic";
    return Math.max(y+labelHeight,lastLineY+valueHeight)+STORY_LAW_ROW_GAP;
  }

  function storyDateStamp(date){
    function pad(n){return n<10?"0"+n:String(n);}
    return String(date.getFullYear())+
      pad(date.getMonth()+1)+
      pad(date.getDate())+"_"+
      pad(date.getHours())+
      pad(date.getMinutes())+
      pad(date.getSeconds());
  }

  function safeStoryFilename(){
    return storyDateStamp(new Date())+"_your_magic.png";
  }

  function createMagicStoryCard(profile,button){
    var source=resolveStoryImageSource();
    var image;
    var finished=false;

    setShareBusy(button,true);

    function complete(img){
      if(finished) return;
      finished=true;
      renderMagicStoryCard(profile,button,img||null);
    }

    if(!source){
      complete(null);
      return;
    }

    image=new Image();
    if(source.indexOf(window.location.origin)!==0){
      image.crossOrigin="anonymous";
    }
    image.onload=function(){complete(image);};
    image.onerror=function(){complete(null);};
    image.src=source;

    window.setTimeout(function(){
      complete(null);
    },2200);
  }

  function renderMagicStoryCard(profile,button,storyImage){
    var u=currentUI();
    var canvas=document.createElement("canvas");
    var ctx=canvas.getContext("2d");
    var name=String(profile.magic_name||"");
    var core=String(profile.magic_core||"");
    var titleLayout;
    var y;
    var i;
    var filename;
    var lawRows=[
      [u.principle,label("principle",profile.dominant_principle.type)],
      [u.source,label("source",profile.source.type)],
      [u.starting,label("medium",profile.medium.type)],
      [u.change,label("effect",profile.effect.operation)],
      [u.limit,label("limit",profile.limit.type)],
      [u.access,label("access",profile.access.type)],
      [u.target,label("target",profile.target.type)],
      [u.control,label("control",profile.control.level)]
    ];

    if(!ctx){
      showToast(u.share_failed);
      return;
    }

    canvas.width=1080;
    canvas.height=1920;
    drawStoryBackground(ctx,profile,storyImage);

    /* Photography can cross behind any text position. A very soft light halo
       is applied only when an eye-catch is present; it is not a card or band. */
    if(storyImage){
      ctx.shadowColor="rgba(0,0,0,.28)";
      ctx.shadowBlur=5;
      ctx.shadowOffsetX=0;
      ctx.shadowOffsetY=1;
    }

    ctx.textBaseline="alphabetic";
    ctx.textAlign="left";

    /* Left axis: the magic itself. */
    ctx.fillStyle=STORY_TEXT_COLOR;
    titleLayout=fitCanvasTitle(ctx,name,820,2);
    ctx.font=storyFont(titleLayout.size,600);
    y=190;
    for(i=0;i<titleLayout.lines.length;i++){
      if(i>=2) break;
      ctx.fillText(titleLayout.lines[i],96,y);
      y+=Math.round(titleLayout.size*1.22);
    }

    y+=56;
    y=drawStoryWrappedText(ctx,core,96,y,835,STORY_TEXT_LARGE,400,STORY_TEXT_COLOR,6);

    /* Center axis: heading belongs to the law block below it. */
    y+=54;
    ctx.textAlign="center";
    ctx.fillStyle=STORY_TEXT_COLOR;
    ctx.font=storyFont(STORY_TEXT_MEDIUM,400);
    ctx.fillText(state.language==="en"?"THE LAWS OF THIS MAGIC":"この魔法の法則",402,y);

    y+=48;
    for(i=0;i<lawRows.length;i++){
      y=drawStoryLawRow(ctx,lawRows[i][0],lawRows[i][1],y);
    }

    /* World law returns to the central axis. It remains a separate section
       through vertical whitespace rather than a different text alignment. */
    y+=26;
    ctx.textBaseline="alphabetic";
    ctx.textAlign="center";
    ctx.fillStyle=STORY_TEXT_COLOR;
    ctx.font=storyFont(STORY_TEXT_SMALL,400);
    ctx.fillText(u.ontology,540,y);
    y+=50;
    ctx.font=storyFont(STORY_TEXT_MEDIUM,400);
    ctx.fillStyle=STORY_TEXT_COLOR;
    ctx.textAlign="center";
    var ontologyLines=wrapCanvasText(ctx,String(profile.ontology.description||""),650);
    for(i=0;i<ontologyLines.length;i++){
      if(i>=5) break;
      ctx.fillText(ontologyLines[i],540,y);
      y+=storyLineHeight(STORY_TEXT_MEDIUM);
    }

    /* No explanatory closing sentence: the Story Card itself is the record. */

    /* Credits — independent typography. No separator lines or text panels. */
    ctx.textAlign="center";
    ctx.fillStyle=STORY_TEXT_COLOR;
    ctx.font=storyFont(18,500);
    ctx.fillText("Tranquilvæj",540,1768);
    ctx.fillStyle=STORY_TEXT_COLOR;
    ctx.font=storyFont(17,400);
    ctx.fillText("TranquilGuides.com",540,1804);

    filename=safeStoryFilename();

    canvasToBlob(canvas,function(blob){
      var file;
      var canShareFiles=false;
      var downloaded=false;

      if(!blob){
        setShareBusy(button,false);
        showToast(u.share_failed);
        return;
      }

      /* On supported mobile browsers the native share sheet allows saving
         the PNG to Photos. Desktop/fallback browsers receive a PNG download. */
      if(navigator.share){
        if(window.File){
          try{
            file=new File([blob],filename,{type:"image/png"});
            if(navigator.canShare){
              try{
                canShareFiles=navigator.canShare({files:[file]});
              }catch(error){
                canShareFiles=false;
              }
            }
          }catch(error){
            canShareFiles=false;
          }

          if(canShareFiles){
            navigator.share({
              title:name,
              text:standardShareText(profile,0),
              files:[file]
            }).then(function(){
              setShareBusy(button,false);
              showToast(u.share_story_ready);
            }).catch(function(error){
              setShareBusy(button,false);
              if(error){
                if(error.name==="AbortError") return;
              }
              downloaded=downloadBlob(blob,filename);
              showToast(downloaded?u.share_story_ready:u.share_failed);
            });
            return;
          }
        }
      }

      downloaded=downloadBlob(blob,filename);
      setShareBusy(button,false);
      showToast(downloaded?u.share_story_ready:u.share_failed);
    });
  }

  function shareHtml(){
    var u=currentUI();

    return ''+
      '<section class="tvm-result-section tvm-share" data-surface="content" data-elevation="s0" aria-labelledby="tvmShareTitle">'+
        '<p class="tvm-share-title tvm-align-center" id="tvmShareTitle">'+escapeHtml(u.share_title)+'</p>'+
        '<div class="tvm-share-row" id="tvmShareRow">'+
          '<span class="tvm-share-group tvm-share-group--social">'+
            '<span class="tvm-share-unit"><button type="button" class="tvm-share-btn tvm-control" data-share-action="x" aria-label="'+escapeHtml(u.share_x)+'" data-tooltip="'+escapeHtml(u.share_x)+'">'+
              '<span class="tvm-share-icon-wrap" aria-hidden="true"><i class="snsicon icon-twitter-x tvm-share-font-icon"></i></span>'+
              '<span class="tvm-share-fallback" aria-hidden="true">X</span>'+
            '</button></span>'+
            '<span class="tvm-share-unit"><button type="button" class="tvm-share-btn tvm-control" data-share-action="threads" aria-label="'+escapeHtml(u.share_threads)+'" data-tooltip="'+escapeHtml(u.share_threads)+'">'+
              '<span class="tvm-share-icon-wrap" aria-hidden="true"><svg class="tvm-share-icon tvm-share-icon--brand" viewBox="0 0 201 201" aria-hidden="true">'+
                '<path d="M133.099 94.3599C151.029 101.908 159.85 119.977 154 138.676C150.013 151.439 138.655 161.749 126.484 166.41C111.14 172.305 90.5326 171.926 75.3981 165.646C44.7016 152.925 37.5408 117.601 40.5887 88.2132C42.7118 67.6424 51.274 47.5902 70.1781 37.2802C84.4228 29.4795 102.654 28.372 118.251 31.6381C134.444 35.0304 147.589 44.6115 155.555 59.1197C158.015 63.5703 160.004 68.4904 161.49 73.9642C161.532 74.1745 161.448 74.3918 161.238 74.4339L149.964 77.4056C149.754 77.4476 149.536 77.3215 149.494 77.1533C147.799 70.7052 145.129 64.979 141.437 59.9817C129.903 44.2891 108.75 40.0908 90.5187 43.3569C69.022 47.2187 57.1526 62.3157 53.6773 83.0477C50.8395 99.8828 51.7294 119.388 59.4859 134.913C66.0161 147.977 77.8435 155.308 92.0882 157.348C99.7606 158.406 107.265 158.28 114.601 156.92C125.118 154.972 136.392 148.012 140.967 138.046C143.938 131.598 144.232 123.418 140.967 117.012C139.103 113.368 136.301 110.438 132.615 108.237C132.447 108.111 132.188 108.195 132.104 108.363C132.062 108.406 132.062 108.448 132.062 108.49C131.634 111.629 130.92 114.72 129.855 117.734C128.327 122.017 126.127 125.71 123.198 128.717C113.361 138.852 96.2363 139.742 84.6612 132.446C75.4193 126.593 71.9439 114.636 76.3511 104.796C80.9265 94.6191 92.1232 90.2107 102.759 89.699C108.778 89.4047 114.335 89.657 119.464 90.3789C119.674 90.4209 119.842 90.2527 119.891 90.0425V89.9163C119.421 87.5823 118.875 85.676 118.195 84.1901C114.636 76.3473 106.62 74.2656 98.6115 75.2819C93.4826 75.9197 89.4536 78.3378 86.4407 82.494C86.3146 82.6622 86.1044 82.7042 85.9293 82.5781L76.3511 76.0459C76.1829 75.9198 76.141 75.7095 76.2671 75.4922C81.396 68.2801 88.3466 64.0819 97.1681 62.9394C104.462 61.9652 112.639 63.1076 119.001 66.9695C128.537 72.8218 131.928 83.342 132.776 93.9814C132.86 94.1917 132.944 94.3178 133.071 94.3599H133.099ZM87.3516 110.985C85.4458 117.391 89.8531 122.437 95.8298 123.958C104.224 126.082 113.55 124.21 117.537 115.603C119.106 112.211 120.038 108.223 120.332 103.689C120.332 103.478 120.206 103.31 120.038 103.31C113.809 102.084 107.405 101.824 100.875 102.462C95.5776 103.016 89.0052 105.434 87.3516 110.985Z" fill="currentColor"/>'+
              '</svg></span>'+
            '</button></span>'+
            '<span class="tvm-share-unit"><button type="button" class="tvm-share-btn tvm-control" data-share-action="bluesky" aria-label="'+escapeHtml(u.share_bluesky)+'" data-tooltip="'+escapeHtml(u.share_bluesky)+'">'+
              '<span class="tvm-share-icon-wrap" aria-hidden="true"><svg class="tvm-share-icon tvm-share-icon--brand" viewBox="0 0 600 530" aria-hidden="true"><path fill="currentColor" d="M135.72 44.03C202.216 93.951 273.689 195.17 300 249.46c26.311-54.29 97.784-155.509 164.28-205.43C512.25 8.014 590-19.92 590 68.84c0 17.733-10.155 148.573-16.111 169.893-20.703 74.044-96.144 92.956-163.325 81.504 117.3 19.996 147.14 86.092 82.697 152.188-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.379-3.69-10.832-3.631-7.896-.059-2.936-1.117.517-3.631 7.896-13.72 40.255-67.24 197.356-189.63 71.766-64.443-66.096-34.603-132.192 82.697-152.188-67.181 11.452-142.622-7.46-163.325-81.504C20.155 217.413 10 86.573 10 68.84 10-19.92 87.75 8.014 135.72 44.03Z"/></svg></span>'+
            '</button></span>'+
            '<span class="tvm-share-unit"><button type="button" class="tvm-share-btn tvm-control" data-share-action="line" aria-label="'+escapeHtml(u.share_line)+'" data-tooltip="'+escapeHtml(u.share_line)+'">'+
              '<span class="tvm-share-icon-wrap" aria-hidden="true"><i class="snsicon icon-line tvm-share-font-icon"></i></span>'+
              '<span class="tvm-share-fallback" aria-hidden="true">L</span>'+
            '</button></span>'+
          '</span>'+
          '<span class="tvm-share-group tvm-share-group--utility">'+
            '<span class="tvm-share-unit"><button type="button" class="tvm-share-btn tvm-control" data-share-action="native" aria-label="'+escapeHtml(u.share_native)+'" data-tooltip="'+escapeHtml(u.share_native)+'">'+
              '<span class="tvm-share-icon-wrap" aria-hidden="true"><svg class="tvm-share-icon" viewBox="0 0 512 512" aria-hidden="true">'+
                '<path d="M336 192h40a40 40 0 0 1 40 40v192a40 40 0 0 1-40 40H136a40 40 0 0 1-40-40V232a40 40 0 0 1 40-40h40" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/>'+
                '<polyline points="336 128 256 48 176 128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/>'+
                '<line x1="256" y1="321" x2="256" y2="48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"/>'+
              '</svg></span>'+
            '</button></span>'+
            '<span class="tvm-share-unit"><button type="button" class="tvm-share-btn tvm-control" data-share-action="story" aria-label="'+escapeHtml(u.share_story)+'" data-tooltip="'+escapeHtml(u.share_story)+'">'+
              '<span class="tvm-share-icon-wrap" aria-hidden="true"><svg class="tvm-share-icon" viewBox="0 0 24 24" aria-hidden="true">'+
                '<rect x="3" y="4" width="18" height="16" rx="2" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>'+
                '<path d="M3 15.75 L7.72 11.03 C7.86 10.89 8.05 10.81 8.25 10.81 C8.45 10.81 8.64 10.89 8.78 11.03 L12.97 15.22 C13.11 15.36 13.30 15.44 13.50 15.44 C13.70 15.44 13.89 15.36 14.03 15.22 L15.97 13.28 C16.11 13.14 16.30 13.06 16.50 13.06 C16.70 13.06 16.89 13.14 17.03 13.28 L21 17.25" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>'+
                '<circle cx="16.5" cy="8.5" r="1.5" fill="currentColor"/>'+
              '</svg></span>'+
            '</button></span>'+
            '<span class="tvm-share-unit"><button type="button" class="tvm-share-btn tvm-control" data-share-action="copy" aria-label="'+escapeHtml(u.share_copy)+'" data-tooltip="'+escapeHtml(u.share_copy)+'">'+
              '<span class="tvm-share-icon-wrap" aria-hidden="true"><svg class="tvm-copy-icon" viewBox="0 0 32 32" aria-hidden="true">'+
                '<g class="tvm-copy-icon__default"><rect x="11" y="11" width="14" height="14" rx="2.5" fill="none" stroke="currentColor" stroke-width="2"/><path d="M9 21H7.5A2.5 2.5 0 0 1 5 18.5v-11A2.5 2.5 0 0 1 7.5 5h11A2.5 2.5 0 0 1 21 7.5V9" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></g>'+
                '<g class="tvm-copy-icon__copied"><rect x="6" y="6" width="20" height="20" rx="2" fill="none" stroke="currentColor" stroke-width="2.2"/><path d="M10.5 16l3.5 3.5 7.5-8" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></g>'+
              '</svg></span>'+
            '</button></span>'+
          '</span>'+
        '</div>'+
      '</section>';
  }

  function ensureShareFontFallbacks(row){
    var icons;
    var i;
    var icon;
    var before;
    var button;

    if(!row) return;
    icons=row.querySelectorAll(".tvm-share-font-icon");

    for(i=0;i<icons.length;i++){
      icon=icons[i];
      before=window.getComputedStyle(icon,"::before").content;
      if(!before){
        button=icon.parentNode;
        if(button) button=button.parentNode;
        if(button) button.classList.add("is-font-icon-missing");
      }else if(before==="none"){
        button=icon.parentNode;
        if(button) button=button.parentNode;
        if(button) button.classList.add("is-font-icon-missing");
      }else if(before==="normal"){
        button=icon.parentNode;
        if(button) button=button.parentNode;
        if(button) button.classList.add("is-font-icon-missing");
      }
    }
  }

  function bindShareControls(profile){
    var row=byId("tvmShareRow");
    var registry;
    if(!row) return;

    ensureShareFontFallbacks(row);
    registry=applyShareCapabilities(row,profile);

    row.addEventListener("click",function(event){
      var button=event.target;
      var action;
      var config;
      var result;

      while(button){
        if(button===row) break;
        action=button.getAttribute("data-share-action");
        if(action) break;
        button=button.parentNode;
      }

      if(!button) return;
      if(button===row) return;
      if(button.disabled) return;

      config=registry[action];
      if(!config) return;
      if(config.available===false) return;

      try{
        result=config.run(button);
        if(result){
          if(typeof result.then==="function"){
            result.catch(function(error){
              reportRecovery(error,"share:"+action,true,function(){
                return config.run(button);
              });
            });
          }
        }
      }catch(error){
        reportRecovery(error,"share:"+action,true,function(){
          return config.run(button);
        });
      }
    });
  }

  function renderResult(){
    var app=getApp();
    var p=state.profile;
    var html="";
    var restart;
    var copy;
    var u=currentUI();

    if(!app) return;
    if(!p){
      finish();
      return;
    }

    state.detail=true;
    setStageEnvironment("result");

    html+=experienceToggleHtml();
    html+='<section class="tvm-screen tvm-result-screen tvm-density-compact" data-surface="content" data-elevation="s0">';
    html+='<div class="tvm-result-discovery">';
    html+='<div class="tvm-kicker tvm-align-center">'+escapeHtml(u.result_kicker)+'</div>';

    if(p.magic_name!=="無題"){
      if(p.magic_name!=="Untitled"){
        html+='<div class="tvm-result-name tvm-align-center">'+escapeHtml(p.magic_name)+'</div>';
      }
    }

    html+='<div class="tvm-core tvm-align-center">'+escapeHtml(p.magic_core).replace(/\n/g,"<br>")+'</div>';
    html+='</div>';
    html+='<div class="tvm-result-axis">';
    html+=resultSummaryHtml(p);
    html+=carryPromptHtml(p);
    html+=shareHtml();

    html+='<div class="tvm-result-restart">';
    html+='<div class="tvm-actions"><button type="button" class="tvm-btn is-ghost tvm-control tvm-reactive" data-material="clear" data-surface="interface" data-elevation="s1" id="tvmRestart">'+escapeHtml(u.restart)+'</button></div>';
    html+='</div>';
    html+='</div>';
    html+='</section>';

    app.innerHTML=html;

    bindInteractionControls();
    bindFocusToggle();
    applyShortcutMetadata();

    copy=byId("tvmCopy");
    syncMagicLanguageAttributes();
    restart=byId("tvmRestart");

    if(copy){
      copy.addEventListener("click",function(){
        copyPrompt();
      });
    }

    bindShareControls(p);

    if(restart){
      restart.addEventListener("click",restartExperience);
    }
  }

  function resultSummaryHtml(p){
    var html="";
    var u=currentUI();

    html+='<section class="tvm-result-section tvm-summary-section" data-surface="content" data-elevation="s0">';
    html+='<div class="tvm-law-group">';
    html+='<p class="tvm-result-section-title tvm-align-center">'+escapeHtml(u.summary_title)+'</p>';
    html+='<dl class="tvm-summary-grid tvm-law-list">';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.principle)+'</dt><dd>'+escapeHtml(label("principle",p.dominant_principle.type))+'</dd></div>';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.source)+'</dt><dd>'+escapeHtml(label("source",p.source.type))+'</dd></div>';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.starting)+'</dt><dd>'+escapeHtml(label("medium",p.medium.type))+'</dd></div>';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.change)+'</dt><dd>'+escapeHtml(label("effect",p.effect.operation))+'</dd></div>';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.limit)+'</dt><dd>'+escapeHtml(label("limit",p.limit.type))+'</dd></div>';
    html+='</dl>';

    html+='<div class="tvm-detail">';
    html+='<dl class="tvm-grid tvm-grid--secondary tvm-law-list tvm-law-list--detail">';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.access)+'</dt><dd>'+escapeHtml(label("access",p.access.type))+'</dd></div>';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.target)+'</dt><dd>'+escapeHtml(label("target",p.target.type))+'</dd></div>';
    html+='<div class="tvm-law-row"><dt>'+escapeHtml(u.control)+'</dt><dd>'+escapeHtml(label("control",p.control.level))+'</dd></div>';
    html+='</dl>';
    html+='<div class="tvm-ontology-block">';
    html+='<p class="tvm-ontology-label">'+escapeHtml(u.ontology)+'</p>';
    html+='<p class="tvm-ontology-text">'+escapeHtml(p.ontology.description)+'</p>';
    html+='</div>';
    html+='</div>';
    html+='</div>';
    html+='</section>';

    return html;
  }

  function carryPromptHtml(){
    var html="";
    var u=currentUI();

    html+='<section class="tvm-result-section tvm-carry-section" data-surface="content" data-elevation="s0">';
    html+='<p class="tvm-result-section-title tvm-align-center">'+escapeHtml(u.carry_title)+'</p>';
    html+='<div class="tvm-carry-lead tvm-align-center">';
    html+='<p class="tvm-carry-lead-line">'+escapeHtml(u.carry_lead_first||u.carry_lead)+'</p>';
    html+='<span class="tvm-carry-lead-gap" aria-hidden="true"></span>';
    html+='<p class="tvm-carry-lead-line">'+escapeHtml(u.carry_lead_second||"")+'</p>';
    html+='</div>';
    html+='<div class="tvm-copy-action"><button type="button" class="tvm-btn is-primary tvm-control tvm-reactive" data-material="veil" data-surface="interface" data-elevation="s1" data-glass="veil" id="tvmCopy"><span class="tvm-btn-label">'+escapeHtml(u.copy)+'</span></button></div>';
    html+='<p class="tvm-copy-status" id="tvmCopyMessage" role="status" aria-live="polite" aria-atomic="true"></p>';

    html+='<div class="tvm-spacer tvm-spacer--copy-to-prompt" aria-hidden="true"></div>';
    html+='<div class="tvm-prompt-group">';
    html+='<textarea class="tvm-prompt tvm-align-left" id="tvmPromptArea" readonly>'+escapeHtml(state.prompt)+'</textarea>';
    html+='</div>';
    html+='</section>';
    return html;
  }

  function legacyCopyText(text){
    return new Promise(function(resolve,reject){
      var area;
      var copied;

      try{
        area=document.createElement("textarea");
        area.value=text;
        area.setAttribute("readonly","");
        area.style.position="fixed";
        area.style.left="-9999px";
        area.style.top="0";
        document.body.appendChild(area);
        area.focus();
        area.select();
        copied=document.execCommand("copy");
        area.remove();

        if(copied){
          resolve();
        }else{
          reject(new Error("copy command failed"));
        }
      }catch(error){
        if(area){
          if(area.parentNode){
            area.parentNode.removeChild(area);
          }
        }
        reject(error);
      }
    });
  }

  function copyText(text){
    if(navigator.clipboard){
      if(window.isSecureContext){
        if(navigator.clipboard.writeText){
          return navigator.clipboard.writeText(text).catch(function(){
            return legacyCopyText(text);
          });
        }
      }
    }

    return legacyCopyText(text);
  }

  function copyPrompt(){
    var message=byId("tvmCopyMessage");
    var button=byId("tvmCopy");
    var root=getRoot();
    var u=currentUI();

    if(root){
      if(root._tvmCopySuccessTimer){
        window.clearTimeout(root._tvmCopySuccessTimer);
        root._tvmCopySuccessTimer=0;
      }
    }

    if(button){
      setBusyControl(button,true,u.copy_working);
      button.setAttribute("data-state","working");
      setMaterialState(button,"lens");
    }

    copyText(state.prompt).then(function(){
      var b=byId("tvmCopy");
      var localRoot=getRoot();
      if(b){
        setBusyControl(b,false);
        b.setAttribute("data-state","success");
        setMaterialState(b,"veil");
        setControlLabel(b,"✓ "+u.copied);
      }

      if(message){
        message.textContent=u.copy_success_help;
      }

      showToast(u.copied);

      if(localRoot){
        localRoot._tvmCopySuccessTimer=window.setTimeout(function(){
          var btn=byId("tvmCopy");
          if(btn){
            btn.removeAttribute("data-state");
            setControlLabel(btn,u.copy);
          }
          localRoot._tvmCopySuccessTimer=0;
        },2000);
      }
    }).catch(function(error){
      var area;
      var b;

      state.detail=true;
      render();

      area=byId("tvmPromptArea");
      if(area){
        area.focus();
        area.select();
      }

      b=byId("tvmCopy");
      if(b){
        setBusyControl(b,false);
        b.removeAttribute("data-state");
        setMaterialState(b,"veil");
        setControlLabel(b,u.copy);
      }

      message=byId("tvmCopyMessage");
      if(message){
        message.textContent=u.copy_fail;
      }

      showToast(u.copy_fail,u.recovery_retry,function(){
        copyPrompt();
      });
      reportRecovery(error,"copyPrompt",false,function(){
        return copyPrompt();
      });
    });
  }

  function restartExperience(){
    var language=state.language;
    clearTransientInteractionState();
    cancelInteractionFrame();
    state={
      screen:"entry",
      history:[],
      answers:{},
      profile:null,
      prompt:"",
      language:language,
      detail:false
    };
    render();
  }

  function initMagic(){
    var root=getRoot();
    if(!root) return;
    if(root.dataset.initialized==="true") return;

    root.dataset.initialized="true";
    root.setAttribute("data-tis-version","4.9");
    root.setAttribute("data-responsive-contract","single-dom");
    root.setAttribute("data-glass-contract","semantic");
    root.setAttribute("data-input-contract","single-primary-mouse-touch-pen-keyboard");
    root.setAttribute("data-viewport-contract","safe-area-visual-viewport");

    guardRun("storageCapabilities",function(){initStorageCapabilities();},false);
    guardRun("preferences",function(){restorePreferences();},false);
    guardRun("recoverySafety",function(){bindRecoverySafety();},false);
    guardRun("lifecycleSafety",function(){bindLifecycleSafety();},false);
    guardRun("theme",function(){applyThemeMode(themeMode,false);},false);
    guardRun("viewport",function(){syncVisualViewport();},false);

    try{
      /* v5.8: experience state is intentionally ephemeral; reload starts at Entry. */
      render();
      if(preferredFocusMode){
        enterFocusMode();
      }
    }catch(error){
      reportRecovery(error,"init",true);
      var app=getApp();
      if(app){
        app.innerHTML='<div class="tvm-error" role="alert">'+escapeHtml(currentUI().error)+'</div>';
      }
    }
  }

  window.TranquilMagicTheme={
    get:function(){return themeMode;},
    set:function(mode){return applyThemeMode(mode,true);},
    resolved:function(){return resolvedTheme(themeMode);}
  };

  window.TranquilMagicRecovery={
    report:reportRecovery,
    guard:guardRun,
    storage:function(){
      return {
        localStorage:storageCapabilities.localStorage
      };
    }
  };

  if(document.readyState==="loading"){
    document.addEventListener("DOMContentLoaded",initMagic,{once:true});
  }else{
    initMagic();
  }
})();
</script>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/unnamed-magic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2936</post-id>	</item>
		<item>
		<title>洗濯物の共同生活</title>
		<link>https://tranquilguides.com/laundry-together/</link>
					<comments>https://tranquilguides.com/laundry-together/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 15:13:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[小説]]></category>
		<category><![CDATA[愛着]]></category>
		<category><![CDATA[暮らし]]></category>
		<category><![CDATA[短編]]></category>
		<category><![CDATA[関係]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=2953</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/09/IMG_20260922_120112.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>歯ブラシ、下着、牛乳、引き出し、傷、まだ温かいTシャツ。誰かと暮らすほどではない関係の中で、身体は少しずつ生活に残っていく。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/09/IMG_20260922_120112.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">最初に置いていったのは、歯ブラシだった。</p>



<p class="wp-block-paragraph">朝、洗面台に二本並んでいた。</p>



<p class="wp-block-paragraph">昨夜まで一本だったかどうか、もう思い出せない。</p>



<p class="wp-block-paragraph">白い柄に、青い毛がついている。</p>



<p class="wp-block-paragraph">ドラッグストアで三本まとめて売っているような、ごく普通の歯ブラシだった。</p>



<p class="wp-block-paragraph">歯を磨きながら鏡を見る。</p>



<p class="wp-block-paragraph">眠そうな自分の顔。<br>その後ろに、半分だけ開いた浴室の扉。</p>



<p class="wp-block-paragraph">床にはバスタオルが二枚落ちている。</p>



<p class="wp-block-paragraph">一枚は自分の。<br>もう一枚は、その人が使ったもの。</p>



<p class="wp-block-paragraph">まだ少し湿っていた。</p>



<p class="wp-block-paragraph">歯を磨き終えて、口をゆすぐ。</p>



<p class="wp-block-paragraph">コップを戻す。</p>



<p class="wp-block-paragraph">二本の歯ブラシが触れた。</p>



<p class="wp-block-paragraph">離そうとして、やめた。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">寝室へ戻ると、まだ眠っていた。</p>



<p class="wp-block-paragraph">布団の中で背中を向けている。</p>



<p class="wp-block-paragraph">床には昨日の服。</p>



<p class="wp-block-paragraph">黒い靴下。<br>薄いシャツ。<br>ジーンズ。</p>



<p class="wp-block-paragraph">下着は見えなかった。</p>



<p class="wp-block-paragraph">どこにあるのだろうと思ってから、カーテンへ手を伸ばした。</p>



<p class="wp-block-paragraph">朝の光が入る。</p>



<p class="wp-block-paragraph">「まぶしい」</p>



<p class="wp-block-paragraph">布団の中から声がした。</p>



<p class="wp-block-paragraph">「起きてた？」</p>



<p class="wp-block-paragraph">「今起きた」</p>



<p class="wp-block-paragraph">目は閉じたままだった。</p>



<p class="wp-block-paragraph">カーテンを閉める。</p>



<p class="wp-block-paragraph">「何時？」</p>



<p class="wp-block-paragraph">「九時半」</p>



<p class="wp-block-paragraph">「まだ寝る」</p>



<p class="wp-block-paragraph">「どうぞ」</p>



<p class="wp-block-paragraph">返事はなかった。</p>



<p class="wp-block-paragraph">台所へ行く。</p>



<p class="wp-block-paragraph">冷蔵庫を開ける。</p>



<p class="wp-block-paragraph">卵。<br>納豆。<br>豆腐。<br>昨日の残り。<br>ビールが一本。</p>



<p class="wp-block-paragraph">牛乳はない。</p>



<p class="wp-block-paragraph">その人が来ると、牛乳がなくなる。</p>



<p class="wp-block-paragraph">自分はコーヒーに少し入れるだけだが、その人はそのまま飲む。</p>



<p class="wp-block-paragraph">冷蔵庫を開け、牛乳を出し、コップに注ぎ、立ったまま飲む。</p>



<p class="wp-block-paragraph">前に一度、</p>



<p class="wp-block-paragraph">「座れば」</p>



<p class="wp-block-paragraph">と言った。</p>



<p class="wp-block-paragraph">「すぐ飲み終わるから」</p>



<p class="wp-block-paragraph">それから何度も、その光景を見ている。</p>



<p class="wp-block-paragraph">冷蔵庫の前。<br>裸足。<br>片手に牛乳。<br>寝起きの髪。</p>



<p class="wp-block-paragraph">思い出そうとしなくても、残っている。</p>



<p class="wp-block-paragraph">卵を二つ割る。</p>



<p class="wp-block-paragraph">一つは黄身が崩れた。</p>



<p class="wp-block-paragraph">トースターへパンを二枚入れる。</p>



<p class="wp-block-paragraph">一人でいる朝は、何も作らないことも多い。</p>



<p class="wp-block-paragraph">コーヒーだけで終わる。</p>



<p class="wp-block-paragraph">今日は皿を二枚出す。</p>



<p class="wp-block-paragraph">白と灰色。</p>



<p class="wp-block-paragraph">一人暮らしを始めた頃、食器は一つずつあれば足りた。</p>



<p class="wp-block-paragraph">皿。<br>茶碗。<br>箸。<br>コップ。</p>



<p class="wp-block-paragraph">いまは二人分ある。</p>



<p class="wp-block-paragraph">二枚セットで買った皿。<br>もらいもののマグカップ。<br>コンビニでもらったスプーン。</p>



<p class="wp-block-paragraph">増やそうとした覚えはない。</p>



<p class="wp-block-paragraph">捨てなかったものが残った。</p>



<p class="wp-block-paragraph">寝室から足音がする。</p>



<p class="wp-block-paragraph">昨日貸したTシャツを着ている。</p>



<p class="wp-block-paragraph">裾が太腿の途中まである。</p>



<p class="wp-block-paragraph">下に何か履いているのか、一瞬分からなかった。</p>



<p class="wp-block-paragraph">見ようとしたわけではない。</p>



<p class="wp-block-paragraph">見えてしまっただけだった。</p>



<p class="wp-block-paragraph">「牛乳ない」</p>



<p class="wp-block-paragraph">冷蔵庫を開けながら言う。</p>



<p class="wp-block-paragraph">「昨日飲んだでしょ」</p>



<p class="wp-block-paragraph">「全部飲んだっけ」</p>



<p class="wp-block-paragraph">「たぶん」</p>



<p class="wp-block-paragraph">「買わないと」</p>



<p class="wp-block-paragraph">「帰りに」</p>



<p class="wp-block-paragraph">「今日帰るの？」</p>



<p class="wp-block-paragraph">振り向かずに聞かれる。</p>



<p class="wp-block-paragraph">「帰るんじゃないの」</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">冷蔵庫を閉める。</p>



<p class="wp-block-paragraph">何も持たずにこちらへ来る。</p>



<p class="wp-block-paragraph">「何作ってる？」</p>



<p class="wp-block-paragraph">「卵」</p>



<p class="wp-block-paragraph">「見れば分かる」</p>



<p class="wp-block-paragraph">フライパンを覗き込む。</p>



<p class="wp-block-paragraph">肩が触れそうになって、自分の身体を少しずらす。</p>



<p class="wp-block-paragraph">「パン焦げてない？」</p>



<p class="wp-block-paragraph">言われてトースターを見る。</p>



<p class="wp-block-paragraph">少し焦げていた。</p>



<p class="wp-block-paragraph">後ろで笑っている。</p>



<h2 class="wp-block-heading">二人で食べる。</h2>



<p class="wp-block-paragraph">向かいではなく、テーブルの角を挟んで座る。</p>



<p class="wp-block-paragraph">足を伸ばすと当たりそうな距離だった。</p>



<p class="wp-block-paragraph">途中で、本当に当たる。</p>



<p class="wp-block-paragraph">「ごめん」</p>



<p class="wp-block-paragraph">どちらからともなく言う。</p>



<p class="wp-block-paragraph">足を引く。</p>



<p class="wp-block-paragraph">数分後、また当たる。</p>



<p class="wp-block-paragraph">今度は何も言わなかった。</p>



<p class="wp-block-paragraph">食べ終わると、その人は皿を流しへ持っていく。</p>



<p class="wp-block-paragraph">水を出す。</p>



<p class="wp-block-paragraph">「置いといていいよ」</p>



<p class="wp-block-paragraph">「洗う」</p>



<p class="wp-block-paragraph">「あとでまとめてやる」</p>



<p class="wp-block-paragraph">「二枚しかない」</p>



<p class="wp-block-paragraph">スポンジに洗剤をつける。</p>



<p class="wp-block-paragraph">自分は座ったまま、その背中を見る。</p>



<p class="wp-block-paragraph">借りたTシャツの肩が少し伸びている。</p>



<p class="wp-block-paragraph">昨日まで、自分が着ていた服だ。</p>



<p class="wp-block-paragraph">水の音。</p>



<p class="wp-block-paragraph">皿が触れる音。</p>



<p class="wp-block-paragraph">鼻をすする音。</p>



<p class="wp-block-paragraph">咳。</p>



<p class="wp-block-paragraph">呼吸。</p>



<p class="wp-block-paragraph">テレビはついていない。</p>



<p class="wp-block-paragraph">帰る前にシャワーを浴びたいと言う。</p>



<p class="wp-block-paragraph">「タオル借りる」</p>



<p class="wp-block-paragraph">「昨日のあるよ」</p>



<p class="wp-block-paragraph">「昨日のは洗うんじゃないの」</p>



<p class="wp-block-paragraph">「まだ洗ってない」</p>



<p class="wp-block-paragraph">「じゃあ新しいの」</p>



<p class="wp-block-paragraph">棚から白いタオルを出す。</p>



<p class="wp-block-paragraph">渡す。</p>



<p class="wp-block-paragraph">指が少し触れる。</p>



<p class="wp-block-paragraph">浴室の扉が閉まる。</p>



<p class="wp-block-paragraph">水の音が始まる。</p>



<p class="wp-block-paragraph">自分は床に落ちた服を拾う。</p>



<p class="wp-block-paragraph">靴下。<br>シャツ。<br>ジーンズ。</p>



<p class="wp-block-paragraph">ジーンズは椅子へかける。</p>



<p class="wp-block-paragraph">シャツを拾った時、匂いがした。</p>



<p class="wp-block-paragraph">汗。<br>柔軟剤。<br>その人が使っている何か。</p>



<p class="wp-block-paragraph">香水ではない。</p>



<p class="wp-block-paragraph">シャンプーかもしれない。</p>



<p class="wp-block-paragraph">少しだけ鼻を近づけた。</p>



<p class="wp-block-paragraph">浴室の水音は続いている。</p>



<p class="wp-block-paragraph">シャツをすぐ洗濯かごへ入れる。</p>



<p class="wp-block-paragraph">シャワーが止まる。</p>



<p class="wp-block-paragraph">しばらくして扉が開く。</p>



<p class="wp-block-paragraph">湯気が廊下へ流れる。</p>



<p class="wp-block-paragraph">「ドライヤーどこ？」</p>



<p class="wp-block-paragraph">「洗面台の下」</p>



<p class="wp-block-paragraph">「ない」</p>



<p class="wp-block-paragraph">見に行く。</p>



<p class="wp-block-paragraph">その人は濡れた髪をタオルで押さえている。</p>



<p class="wp-block-paragraph">首に水滴が残っている。</p>



<p class="wp-block-paragraph">肩にも。</p>



<p class="wp-block-paragraph">服はもう着ていた。</p>



<p class="wp-block-paragraph">昨日着てきたシャツ。</p>



<p class="wp-block-paragraph">しゃがんで洗面台の奥からドライヤーを出す。</p>



<p class="wp-block-paragraph">「そこ」</p>



<p class="wp-block-paragraph">「ほんとだ」</p>



<p class="wp-block-paragraph">渡す。</p>



<p class="wp-block-paragraph">コンセントを差す。</p>



<p class="wp-block-paragraph">大きな音がして、会話が途切れる。</p>



<p class="wp-block-paragraph">浴室の床にタオルが二枚ある。</p>



<p class="wp-block-paragraph">昨日のもの。<br>今日のもの。</p>



<p class="wp-block-paragraph">拾って洗濯かごへ入れる。</p>



<p class="wp-block-paragraph">その上にシャツ。<br>その上から靴下。</p>



<p class="wp-block-paragraph">自分の服と混ざる。</p>



<p class="wp-block-paragraph">帰る時、その人は歯ブラシを持っていかなかった。</p>



<p class="wp-block-paragraph">「これ忘れてる」</p>



<p class="wp-block-paragraph">玄関で言う。</p>



<p class="wp-block-paragraph">「置いといて」</p>



<p class="wp-block-paragraph">「いいの？」</p>



<p class="wp-block-paragraph">「また使うし」</p>



<p class="wp-block-paragraph">「いつ？」</p>



<p class="wp-block-paragraph">「また来た時」</p>



<p class="wp-block-paragraph">靴を履く。</p>



<p class="wp-block-paragraph">立ち上がる。</p>



<p class="wp-block-paragraph">「邪魔？」</p>



<p class="wp-block-paragraph">「別に」</p>



<p class="wp-block-paragraph">「じゃあ置いといて」</p>



<p class="wp-block-paragraph">扉が閉まる。</p>



<p class="wp-block-paragraph">足音が遠ざかる。</p>



<p class="wp-block-paragraph">洗面台へ戻る。</p>



<p class="wp-block-paragraph">白い歯ブラシ。</p>



<p class="wp-block-paragraph">自分の歯ブラシ。</p>



<p class="wp-block-paragraph">二本。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">午後、洗濯をする。</p>



<p class="wp-block-paragraph">自分の服。<br>タオル。<br>その人のシャツ。<br>靴下。</p>



<p class="wp-block-paragraph">洗濯かごの底に、黒い下着が一枚あった。</p>



<p class="wp-block-paragraph">忘れていったらしい。</p>



<p class="wp-block-paragraph">手に取る。</p>



<p class="wp-block-paragraph">一度だけ迷う。</p>



<p class="wp-block-paragraph">連絡するほどでもない。</p>



<p class="wp-block-paragraph">洗っておけばいい。</p>



<p class="wp-block-paragraph">他の服と一緒に洗濯機へ入れる。</p>



<p class="wp-block-paragraph">スタートを押す。</p>



<p class="wp-block-paragraph">水が溜まる。</p>



<p class="wp-block-paragraph">服が沈む。</p>



<p class="wp-block-paragraph">シャツもタオルも靴下も下着も、白い泡の中で絡まる。</p>



<p class="wp-block-paragraph">一時間後。</p>



<p class="wp-block-paragraph">洗濯機の蓋を開ける。</p>



<p class="wp-block-paragraph">湿った空気が上がってくる。</p>



<p class="wp-block-paragraph">一枚ずつ取り出す。</p>



<p class="wp-block-paragraph">シャツ。<br>タオル。<br>靴下。<br>下着。</p>



<p class="wp-block-paragraph">同じ洗剤の匂いがする。</p>



<p class="wp-block-paragraph">ベランダへ出る。</p>



<p class="wp-block-paragraph">下着をどこへ干すか少し迷う。</p>



<p class="wp-block-paragraph">外から見えにくい場所にする。</p>



<p class="wp-block-paragraph">隣に自分のものも干す。</p>



<p class="wp-block-paragraph">風が吹く。</p>



<p class="wp-block-paragraph">二枚が同じ方向へ揺れる。</p>



<p class="wp-block-paragraph">その人の身体は、もう知らないものではない。</p>



<p class="wp-block-paragraph">それでも、干された黒い布を見ている方が、少し落ち着かなかった。</p>



<p class="wp-block-paragraph">風だけが触れている。</p>



<p class="wp-block-paragraph">夜、連絡が来る。</p>



<p class="wp-block-paragraph">「パンツない」</p>



<p class="wp-block-paragraph">画面を見て笑う。</p>



<p class="wp-block-paragraph">「ある」</p>



<p class="wp-block-paragraph">「やっぱり」</p>



<p class="wp-block-paragraph">「洗った」</p>



<p class="wp-block-paragraph">数秒して、</p>



<p class="wp-block-paragraph">「勝手に洗った？」</p>



<p class="wp-block-paragraph">と来る。</p>



<p class="wp-block-paragraph">「嫌だった？」</p>



<p class="wp-block-paragraph">「いや」</p>



<p class="wp-block-paragraph">そのあと、</p>



<p class="wp-block-paragraph">「なんか恥ずかしい」</p>



<p class="wp-block-paragraph">と来る。</p>



<p class="wp-block-paragraph">ベランダを見る。</p>



<p class="wp-block-paragraph">暗い中で、黒い布が揺れている。</p>



<p class="wp-block-paragraph">「今さら」</p>



<p class="wp-block-paragraph">と返す。</p>



<p class="wp-block-paragraph">「そうなんだけど」</p>



<p class="wp-block-paragraph">そこで終わる。</p>



<h2 class="wp-block-heading">四日後、その人が来る。</h2>



<p class="wp-block-paragraph">仕事帰りだった。</p>



<p class="wp-block-paragraph">玄関を開けると、スーパーの袋を持っている。</p>



<p class="wp-block-paragraph">「牛乳買った」</p>



<p class="wp-block-paragraph">最初にそれを言った。</p>



<p class="wp-block-paragraph">「自分で飲んだくせに」</p>



<p class="wp-block-paragraph">「だから買った」</p>



<p class="wp-block-paragraph">冷蔵庫へ入れる。</p>



<p class="wp-block-paragraph">取り込んで畳んでおいた下着を渡す。</p>



<p class="wp-block-paragraph">「畳んだの？」</p>



<p class="wp-block-paragraph">「畳むでしょ」</p>



<p class="wp-block-paragraph">「パンツまで？」</p>



<p class="wp-block-paragraph">「他のと一緒に」</p>



<p class="wp-block-paragraph">受け取る。</p>



<p class="wp-block-paragraph">少し笑う。</p>



<p class="wp-block-paragraph">「何」</p>



<p class="wp-block-paragraph">「いや」</p>



<p class="wp-block-paragraph">「何」</p>



<p class="wp-block-paragraph">「別に」</p>



<p class="wp-block-paragraph">鞄へしまう。</p>



<p class="wp-block-paragraph">夕飯を作る。</p>



<p class="wp-block-paragraph">玉ねぎを切る。</p>



<p class="wp-block-paragraph">その人は冷蔵庫からビールを二本出す。</p>



<p class="wp-block-paragraph">一本渡される。</p>



<p class="wp-block-paragraph">「まだ料理中」</p>



<p class="wp-block-paragraph">「一口だけ」</p>



<p class="wp-block-paragraph">開ける。</p>



<p class="wp-block-paragraph">飲む。</p>



<p class="wp-block-paragraph">冷たい。</p>



<p class="wp-block-paragraph">玉ねぎを炒めていると、後ろから腕が伸びる。</p>



<p class="wp-block-paragraph">棚の塩を取る。</p>



<p class="wp-block-paragraph">「邪魔」</p>



<p class="wp-block-paragraph">「ごめん」</p>



<p class="wp-block-paragraph">背中に身体が少し触れた。</p>



<p class="wp-block-paragraph">ほんの一瞬。</p>



<p class="wp-block-paragraph">その人はもうテーブルへ戻っている。</p>



<p class="wp-block-paragraph">油が跳ねる。</p>



<p class="wp-block-paragraph">玉ねぎを混ぜる。</p>



<p class="wp-block-paragraph">ビールを一口飲む。</p>



<h2 class="wp-block-heading">食べ終わってソファに座る。</h2>



<p class="wp-block-paragraph">映画を見る。</p>



<p class="wp-block-paragraph">途中で、その人が横になる。</p>



<p class="wp-block-paragraph">頭が膝に乗る。</p>



<p class="wp-block-paragraph">「重い」</p>



<p class="wp-block-paragraph">「知ってる」</p>



<p class="wp-block-paragraph">動かない。</p>



<p class="wp-block-paragraph">髪が腿に触れる。</p>



<p class="wp-block-paragraph">呼吸するたびに少し動く。</p>



<p class="wp-block-paragraph">手は腹の上に置いたまま。</p>



<p class="wp-block-paragraph">そのまま映画を見る。</p>



<p class="wp-block-paragraph">いつの間にか眠っている。</p>



<p class="wp-block-paragraph">エンドロールになっても起きない。</p>



<p class="wp-block-paragraph">「終わったよ」</p>



<p class="wp-block-paragraph">返事はない。</p>



<p class="wp-block-paragraph">頬が膝に押しつけられている。</p>



<p class="wp-block-paragraph">口が少し開いている。</p>



<p class="wp-block-paragraph">しばらくそのままにする。</p>



<p class="wp-block-paragraph">足が痺れてくる。</p>



<p class="wp-block-paragraph">首の後ろへ手を入れ、頭を持ち上げる。</p>



<p class="wp-block-paragraph">重い。</p>



<p class="wp-block-paragraph">ソファへ下ろす。</p>



<p class="wp-block-paragraph">ブランケットをかける。</p>



<p class="wp-block-paragraph">テーブルには、その人のスマートフォンと眼鏡と鍵と財布がある。</p>



<p class="wp-block-paragraph">本人は何も持たずに眠っている。</p>



<p class="wp-block-paragraph">夜中に起こす。</p>



<p class="wp-block-paragraph">「ベッド行く？」</p>



<p class="wp-block-paragraph">目を開ける。</p>



<p class="wp-block-paragraph">「何時？」</p>



<p class="wp-block-paragraph">「一時」</p>



<p class="wp-block-paragraph">「寝てた？」</p>



<p class="wp-block-paragraph">「ずっと」</p>



<p class="wp-block-paragraph">起き上がる。</p>



<p class="wp-block-paragraph">ブランケットが落ちる。</p>



<p class="wp-block-paragraph">ベッドへ行く。</p>



<p class="wp-block-paragraph">照明を消す。</p>



<p class="wp-block-paragraph">暗くなる。</p>



<p class="wp-block-paragraph">手を伸ばす。</p>



<p class="wp-block-paragraph">向こうからも触れる。</p>



<p class="wp-block-paragraph">キスをする。</p>



<p class="wp-block-paragraph">服を脱ぐ。</p>



<p class="wp-block-paragraph">どこへ手を置くか。</p>



<p class="wp-block-paragraph">どこで息が変わるか。</p>



<p class="wp-block-paragraph">身体はもう、互いに知っている。</p>



<p class="wp-block-paragraph">途中で、昼間の黒い布が浮かぶ。</p>



<p class="wp-block-paragraph">洗濯ばさみに挟まれ、風に揺れていた。</p>



<p class="wp-block-paragraph">すぐ消える。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">終わったあと、その人は水を飲みに行く。</p>



<p class="wp-block-paragraph">裸のまま台所へ向かう。</p>



<p class="wp-block-paragraph">「服着れば」</p>



<p class="wp-block-paragraph">「なんで」</p>



<p class="wp-block-paragraph">「別に」</p>



<p class="wp-block-paragraph">冷蔵庫を開ける。</p>



<p class="wp-block-paragraph">中の明かりが身体を照らす。</p>



<p class="wp-block-paragraph">ペットボトルを取り出し、そのまま飲む。</p>



<p class="wp-block-paragraph">「それ、俺も飲むんだけど」</p>



<p class="wp-block-paragraph">その人が笑う。</p>



<p class="wp-block-paragraph">「飲む？」</p>



<p class="wp-block-paragraph">渡される。</p>



<p class="wp-block-paragraph">同じ場所へ口をつける。</p>



<h2 class="wp-block-heading">朝</h2>



<p class="wp-block-paragraph">台所から包丁の音がする。</p>



<p class="wp-block-paragraph">目を開ける。</p>



<p class="wp-block-paragraph">「何してる？」</p>



<p class="wp-block-paragraph">「朝ごはん」</p>



<p class="wp-block-paragraph">「勝手に？」</p>



<p class="wp-block-paragraph">「卵使うよ」</p>



<p class="wp-block-paragraph">「どうぞ」</p>



<p class="wp-block-paragraph">また眠る。</p>



<p class="wp-block-paragraph">次に起きた時、味噌汁の匂いがしている。</p>



<p class="wp-block-paragraph">台所へ行く。</p>



<p class="wp-block-paragraph">その人は昨日のTシャツと、自分のスウェットを履いている。</p>



<p class="wp-block-paragraph">「それも俺の」</p>



<p class="wp-block-paragraph">「服なかった」</p>



<p class="wp-block-paragraph">「あるでしょ」</p>



<p class="wp-block-paragraph">「昨日着てたの着たくない」</p>



<p class="wp-block-paragraph">「帰る時どうするの」</p>



<p class="wp-block-paragraph">「着る」</p>



<p class="wp-block-paragraph">味噌汁をよそう。</p>



<p class="wp-block-paragraph">卵焼き。<br>ご飯。<br>味噌汁。</p>



<p class="wp-block-paragraph">向かいで食べている。</p>



<p class="wp-block-paragraph">口元に少し汁がつく。</p>



<p class="wp-block-paragraph">舌で取る。</p>



<p class="wp-block-paragraph">一瞬だけ目が止まる。</p>



<p class="wp-block-paragraph">「何」</p>



<p class="wp-block-paragraph">「何でもない」</p>



<p class="wp-block-paragraph">味噌汁を飲む。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">帰る前、洗面台で並んで歯を磨く。</p>



<p class="wp-block-paragraph">鏡に二人。</p>



<p class="wp-block-paragraph">口の中は泡だらけだった。</p>



<p class="wp-block-paragraph">肘が当たる。</p>



<p class="wp-block-paragraph">「狭い」</p>



<p class="wp-block-paragraph">「一人用だから」</p>



<p class="wp-block-paragraph">「二人用買えば」</p>



<p class="wp-block-paragraph">「なんで」</p>



<p class="wp-block-paragraph">返事はない。</p>



<p class="wp-block-paragraph">うがいをする。</p>



<p class="wp-block-paragraph">白い歯ブラシが洗われ、また自分の隣へ戻る。</p>



<h2 class="wp-block-heading">その週、その人は来なかった。</h2>



<p class="wp-block-paragraph">歯ブラシだけがある。</p>



<p class="wp-block-paragraph">冷蔵庫の牛乳も残っている。</p>



<p class="wp-block-paragraph">賞味期限まであと三日。</p>



<p class="wp-block-paragraph">コーヒーへ多めに入れる。</p>



<p class="wp-block-paragraph">翌日も。</p>



<p class="wp-block-paragraph">その次の日、まだ残る。</p>



<p class="wp-block-paragraph">夜、冷蔵庫の前に立つ。</p>



<p class="wp-block-paragraph">牛乳を出す。</p>



<p class="wp-block-paragraph">そのまま口をつけそうになって、止まる。</p>



<p class="wp-block-paragraph">コップを一つ出す。</p>



<p class="wp-block-paragraph">連絡は普通に来る。</p>



<p class="wp-block-paragraph">忙しいだけらしい。</p>



<p class="wp-block-paragraph">洗面台に歯ブラシ。</p>



<p class="wp-block-paragraph">風呂場にシャンプー。</p>



<p class="wp-block-paragraph">冷蔵庫に牛乳。</p>



<p class="wp-block-paragraph">棚にヘアゴム。</p>



<p class="wp-block-paragraph">コンセントには充電器。</p>



<p class="wp-block-paragraph">一本だけ違うメーカーの缶ビール。</p>



<p class="wp-block-paragraph">ヘアゴムは何週間も同じ場所にある。</p>



<p class="wp-block-paragraph">黒い輪。</p>



<p class="wp-block-paragraph">次に来た時、その人は何も言わず、それで髪を結んだ。</p>



<p class="wp-block-paragraph">物は少しずつ増えた。</p>



<p class="wp-block-paragraph">替えの下着。<br>靴下。<br>Tシャツ。<br>小さな容器。<br>文庫本。<br>薬。</p>



<p class="wp-block-paragraph">棚の隅。<br>洗面台。<br>ベッド脇。</p>



<p class="wp-block-paragraph">空いているところに入っていく。</p>



<p class="wp-block-paragraph">ある日、引き出しを一つ空ける。</p>



<p class="wp-block-paragraph">「ここ使えば」</p>



<p class="wp-block-paragraph">「何で？」</p>



<p class="wp-block-paragraph">「物増えてるから」</p>



<p class="wp-block-paragraph">「そんなにない」</p>



<p class="wp-block-paragraph">「ある」</p>



<p class="wp-block-paragraph">開ける。</p>



<p class="wp-block-paragraph">空っぽ。</p>



<p class="wp-block-paragraph">その人はしばらく見ている。</p>



<p class="wp-block-paragraph">「いいの？」</p>



<p class="wp-block-paragraph">「空いてるし」</p>



<p class="wp-block-paragraph">「住んでるみたい」</p>



<p class="wp-block-paragraph">「住んでないでしょ」</p>



<p class="wp-block-paragraph">「そうだけど」</p>



<p class="wp-block-paragraph">一つずつ入れていく。</p>



<p class="wp-block-paragraph">下着。</p>



<p class="wp-block-paragraph">靴下。</p>



<p class="wp-block-paragraph">Tシャツ。</p>



<p class="wp-block-paragraph">ポーチ。</p>



<p class="wp-block-paragraph">「見ないで」</p>



<p class="wp-block-paragraph">「何で」</p>



<p class="wp-block-paragraph">「なんとなく」</p>



<p class="wp-block-paragraph">「もう見えてるけど」</p>



<p class="wp-block-paragraph">「だから見ないで」</p>



<p class="wp-block-paragraph">背中を向ける。</p>



<p class="wp-block-paragraph">後ろで引き出しが閉まる。</p>



<p class="wp-block-paragraph">夜、買い物へ行く。</p>



<p class="wp-block-paragraph">卵。<br>牛乳。<br>ビール。<br>歯磨き粉。<br>トイレットペーパー。</p>



<p class="wp-block-paragraph">シャンプーの棚で、その人が止まる。</p>



<p class="wp-block-paragraph">「これ高くない？」</p>



<p class="wp-block-paragraph">「じゃあ別の買えば」</p>



<p class="wp-block-paragraph">「ここでしか使わないのに？」</p>



<p class="wp-block-paragraph">「知らない」</p>



<p class="wp-block-paragraph">少し迷って、いつものものをかごへ入れる。</p>



<p class="wp-block-paragraph">家に帰る。</p>



<p class="wp-block-paragraph">牛乳は冷蔵庫へ。</p>



<p class="wp-block-paragraph">歯磨き粉は洗面台へ。</p>



<p class="wp-block-paragraph">シャンプーは浴室へ。</p>



<p class="wp-block-paragraph">トイレットペーパーはトイレへ。</p>



<p class="wp-block-paragraph">少しして、その人が出てくる。</p>



<p class="wp-block-paragraph">「紙替えといた」</p>



<p class="wp-block-paragraph">「ありがとう」</p>



<p class="wp-block-paragraph">あとで入ると、新しいロールがついている。</p>



<p class="wp-block-paragraph">端だけ、きれいに折れていた。</p>



<h2 class="wp-block-heading">夏になる。</h2>



<p class="wp-block-paragraph">ある夜、その人は風呂上がりのまま床に座ってアイスを食べていた。</p>



<p class="wp-block-paragraph">片足を立てている。</p>



<p class="wp-block-paragraph">膝に小さな傷がある。</p>



<p class="wp-block-paragraph">「それどうした？」</p>



<p class="wp-block-paragraph">「何」</p>



<p class="wp-block-paragraph">「膝」</p>



<p class="wp-block-paragraph">見る。</p>



<p class="wp-block-paragraph">「ああ」</p>



<p class="wp-block-paragraph">指で触る。</p>



<p class="wp-block-paragraph">「どこかでぶつけた」</p>



<p class="wp-block-paragraph">「いつ」</p>



<p class="wp-block-paragraph">「知らない」</p>



<p class="wp-block-paragraph">数日後。</p>



<p class="wp-block-paragraph">同じ場所に、かさぶたができている。</p>



<p class="wp-block-paragraph">また数日後。</p>



<p class="wp-block-paragraph">薄くなる。</p>



<p class="wp-block-paragraph">その次に見た時には、どこだったか分からなくなっていた。</p>



<p class="wp-block-paragraph">夜、眠っている。</p>



<p class="wp-block-paragraph">布団から片足だけ出ている。</p>



<p class="wp-block-paragraph">足の裏がこちらを向いている。</p>



<p class="wp-block-paragraph">かかと。<br>少し乾いた皮膚。<br>爪。</p>



<p class="wp-block-paragraph">照明を消す。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">冬になる。</p>



<p class="wp-block-paragraph">布団へ入るなり、</p>



<p class="wp-block-paragraph">「冷たい」</p>



<p class="wp-block-paragraph">と言って、足をこちらへ押しつけてくる。</p>



<p class="wp-block-paragraph">「やめて」</p>



<p class="wp-block-paragraph">「温かい」</p>



<p class="wp-block-paragraph">「冷たい」</p>



<p class="wp-block-paragraph">足を離す。</p>



<p class="wp-block-paragraph">追いかけてくる。</p>



<p class="wp-block-paragraph">「やめろって」</p>



<p class="wp-block-paragraph">笑う。</p>



<p class="wp-block-paragraph">結局、そのままになる。</p>



<p class="wp-block-paragraph">しばらくすると、冷たさがなくなる。</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<p class="wp-block-paragraph">朝。</p>



<p class="wp-block-paragraph">先に起きる。</p>



<p class="wp-block-paragraph">その人は丸まったまま寝ている。</p>



<p class="wp-block-paragraph">台所へ行く。</p>



<p class="wp-block-paragraph">湯を沸かす。</p>



<p class="wp-block-paragraph">マグカップを二つ出す。</p>



<p class="wp-block-paragraph">一つは自分の。</p>



<p class="wp-block-paragraph">もう一つは、いつからかその人が使うものになった。</p>



<p class="wp-block-paragraph">コーヒーを淹れる。</p>



<p class="wp-block-paragraph">牛乳を入れる。</p>



<p class="wp-block-paragraph">片方だけ、少し多め。</p>



<p class="wp-block-paragraph">カップをテーブルに置く。</p>



<p class="wp-block-paragraph">少しして、寝室から足音がする。</p>



<p class="wp-block-paragraph">「コーヒー？」</p>



<p class="wp-block-paragraph">「うん」</p>



<p class="wp-block-paragraph">椅子に座る。</p>



<p class="wp-block-paragraph">飲む。</p>



<p class="wp-block-paragraph">「ちょうどいい」</p>



<p class="wp-block-paragraph">自分のカップを持つ。</p>



<p class="wp-block-paragraph">窓の外を見る。</p>



<p class="wp-block-paragraph">ベランダに二人分の洗濯物がある。</p>



<p class="wp-block-paragraph">タオル。</p>



<p class="wp-block-paragraph">シャツ。</p>



<p class="wp-block-paragraph">靴下。</p>



<p class="wp-block-paragraph">下着。</p>



<p class="wp-block-paragraph">「今日、洗濯する？」</p>



<p class="wp-block-paragraph">「する」</p>



<p class="wp-block-paragraph">「これも」</p>



<p class="wp-block-paragraph">着ていたTシャツを脱ぐ。</p>



<p class="wp-block-paragraph">下には薄い肌着を着ている。</p>



<p class="wp-block-paragraph">渡される。</p>



<p class="wp-block-paragraph">受け取る。</p>



<p class="wp-block-paragraph">まだ少し温かい。</p>



<p class="wp-block-paragraph">その人はもう冷蔵庫へ向かっている。</p>



<p class="wp-block-paragraph">「何してるの」</p>



<p class="wp-block-paragraph">「何も」</p>



<p class="wp-block-paragraph">Tシャツを洗濯かごへ入れる。</p>



<p class="wp-block-paragraph">洗濯機を回す。</p>



<p class="wp-block-paragraph">水の音。</p>



<p class="wp-block-paragraph">その人は冷蔵庫の前で牛乳を飲んでいる。</p>



<p class="wp-block-paragraph">午後には、</p>



<p class="wp-block-paragraph">タオルは乾く。</p>



<p class="wp-block-paragraph">食器は棚へ戻る。</p>



<p class="wp-block-paragraph">床の髪は吸われる。</p>



<p class="wp-block-paragraph">シーツの皺も伸びる。</p>



<p class="wp-block-paragraph">洗濯機が止まる。</p>



<p class="wp-block-paragraph">蓋を開ける。</p>



<p class="wp-block-paragraph">湿った空気が上がる。</p>



<p class="wp-block-paragraph">一枚ずつ取り出す。</p>



<p class="wp-block-paragraph">タオル。</p>



<p class="wp-block-paragraph">シャツ。</p>



<p class="wp-block-paragraph">靴下。</p>



<p class="wp-block-paragraph">その人がさっきまで着ていたTシャツ。</p>



<p class="wp-block-paragraph">もう冷たい。</p>



<p class="wp-block-paragraph">広げる。</p>



<p class="wp-block-paragraph">皺を伸ばす。</p>



<p class="wp-block-paragraph">ハンガーへ通す。</p>



<p class="wp-block-paragraph">ベランダへ出る。</p>



<p class="wp-block-paragraph">風が吹く。</p>



<p class="wp-block-paragraph">隣に自分の服を掛ける。</p>



<p class="wp-block-paragraph">部屋の中から、冷蔵庫の扉が閉まる音がする。</p>



<p class="wp-block-paragraph">「牛乳、もうないよ」</p>



<p class="wp-block-paragraph">と声がする。</p>



<p class="wp-block-paragraph">「また買えばいい」</p>



<p class="wp-block-paragraph">そう返して、次の洗濯物を取る。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/laundry-together/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2953</post-id>	</item>
		<item>
		<title>Quiet Letter 12</title>
		<link>https://tranquilguides.com/2026-10-05/</link>
					<comments>https://tranquilguides.com/2026-10-05/#respond</comments>
		
		<dc:creator><![CDATA[案内人のアシカ]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 14:30:00 +0000</pubDate>
				<category><![CDATA[生存ログ]]></category>
		<category><![CDATA[Quiet Letter]]></category>
		<category><![CDATA[お世話]]></category>
		<category><![CDATA[不調]]></category>
		<category><![CDATA[他者]]></category>
		<category><![CDATA[労働]]></category>
		<guid isPermaLink="false">https://tranquilguides.com/?p=3040</guid>

					<description><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20261004_011543.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>休むのか、続けるのか、辞めるのか。私はあなたの代わりに決めることはできません。でも、決められない時間に付き合うことはできます。体調を崩し、仕事やこれからのことを考えるだけでもしんどい人へ送る手紙。]]></description>
										<content:encoded><![CDATA[<p><img src="https://i0.wp.com/tranquilguides.com/wp-content/uploads/2026/10/IMG_20261004_011543.png?fit=1024%2C683&ssl=1" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">体調の悪い人へ送る手紙。</p>



<p class="wp-block-paragraph">最近、あなたが仕事のことを考えるだけでもしんどいと聞いてから、何を書けばいいのか迷っていました。</p>



<p class="wp-block-paragraph">休んだ方がいい。</p>



<p class="wp-block-paragraph">辞めてもいい。</p>



<p class="wp-block-paragraph">もう少し続けてみてもいい。</p>



<p class="wp-block-paragraph">そういう言葉やアドバイスは、どれも簡単に言えます。</p>



<p class="wp-block-paragraph">けれど、そのあとを実際に生きるのは私ではありません。</p>



<p class="wp-block-paragraph">先日、こんな言葉に出会いました。</p>



<h2 class="wp-block-heading">「自分がやりたい事をやらなかったら、一体それは誰の人生なんだ？」</h2>



<p class="wp-block-paragraph">読んだとき、少し立ち止まりました。</p>



<p class="wp-block-paragraph">朝、仕事へ行くかどうかを考える時間も、</p>



<p class="wp-block-paragraph">電車に乗るまでの時間も、</p>



<p class="wp-block-paragraph">会社へ着いてから帰るまでの時間も、</p>



<p class="wp-block-paragraph">帰ったあとに翌日のことを考える時間も。</p>



<p class="wp-block-paragraph">私は、その一日を代わりに過ごすことができません。</p>



<p class="wp-block-paragraph">だから、答えを決めるようなことは言いたくないと思いました。</p>



<p class="wp-block-paragraph">それでも、何も言わずにいるのも違う気がしました。</p>



<p class="wp-block-paragraph">調子が悪いときは、「どうしたい？」と聞かれることさえ、しんどいことがあると思います。</p>



<p class="wp-block-paragraph">仕事へ行くのか。<br>休むのか。</p>



<p class="wp-block-paragraph">お腹が空いたのか。<br>何を食べるのか。</p>



<p class="wp-block-paragraph">これからどうするのか。</p>



<p class="wp-block-paragraph">はい／いいえ</p>



<p class="wp-block-paragraph">何かを選ばなければいけないことばかり増えていく。</p>



<p class="wp-block-paragraph">その前に、今日をどう過ごすかだけでいっぱいの日もある。</p>



<p class="wp-block-paragraph">私は、あなたの代わりに決めることはできません。</p>



<p class="wp-block-paragraph">でも、決められない時間に付き合うことはできます。</p>



<p class="wp-block-paragraph">話したくなったら聞く。</p>



<p class="wp-block-paragraph">仕事と関係のない話をしたくなったら、そっちを話す。</p>



<p class="wp-block-paragraph">何も話したくないなら、何も話さない。</p>



<p class="wp-block-paragraph">返事がなくても、しばらく会えなくても、あなたが今どうしているのかを気にしていることまで、なくなるわけではありません。</p>



<p class="wp-block-paragraph">何かを決めることに疲れているとき、すぐに答えを出す言葉より、ただそこに残っている言葉の方が必要なこともあるのだと思います。</p>



<p class="wp-block-paragraph">だから今日は、何かを勧めるためではなく、</p>



<p class="wp-block-paragraph"><strong>あなたのことを気にしている。</strong></p>



<p class="wp-block-paragraph">それだけを書いておきます。</p>



<p class="wp-block-paragraph">またね。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tranquilguides.com/2026-10-05/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3040</post-id>	</item>
	</channel>
</rss>
