[{"data":1,"prerenderedAt":899},["ShallowReactive",2],{"content-/2026-05-03-closing-transfer-example-component":3,"all-pages-for-dir":897,"og-image-/2026-05-03-closing-transfer-example-component":898},{"id":4,"title":5,"body":6,"category":879,"description":880,"extension":881,"meta":882,"navigation":225,"path":883,"project_name":884,"published":885,"publishedAt":886,"seo":887,"stem":888,"tags":889,"todo":895,"updatedAt":895,"__hash__":896},"pages/2026-05/2026-05-03/closing-transfer-example-component.md","簿記3級の決算振替仕訳に専用Vueコンポーネントを切り出した話",{"type":7,"value":8,"toc":865},"minimark",[9,22,27,37,40,44,47,54,348,351,358,361,367,371,374,377,381,387,390,394,397,408,561,570,574,577,589,743,746,750,753,764,770,773,777,780,783,786,827,830,861],[10,11,12,13,17,18,21],"p",{},"簿記3級の equity 例題C「決算振替仕訳」を既存の ",[14,15,16],"code",{},"JournalExample.vue"," に乗せようとして、3時間粘ってから諦めた。期中仕訳と決算整理仕訳と決算振替仕訳が混ざる構造を1つのコンポーネントで表現しようとすると、props と分岐がツリー状に膨らんで、テストの意図が読めなくなる。別物として ",[14,19,20],{},"ClosingTransferExample.vue"," を切り出したら、計画→実装→Codexレビュー→アニメ追加まで1日で着地した。",[23,24,26],"h2",{"id":25},"やったこと時系列","やったこと（時系列）",[10,28,29,30,32,33,36],{},"朝、equity 例題Cの画面を開いて手が止まった。c5（収益→損益）、c6（費用→損益）、c7（損益→繰越利益剰余金）の3本が「決算振替仕訳」で、c1〜c4 の期中取引とは性質がまるで違う。",[14,31,16],{}," に決算振替モードを追加するか別物として切り出すかを15分くらい悩んで、計画書を ",[14,34,35],{},"memo/2026-05-03/closing-transfer-example-component-plan.md"," に書き出した。",[10,38,39],{},"計画書ができたら Codex（GPT-5.5）に2ラウンドでレビューを回した。1ラウンド目で7件、2ラウンド目で4件の致命指摘が返ってきて、全部反映してから承認をもらった。指摘の中で重かったのは「c5を取り消したらc6・c7のT勘定への加算も巻き戻さないと整合性が崩れる」という連鎖取消の話で、設計を「連鎖取消・再構築方式」に書き換えた。",[23,41,43],{"id":42},"連鎖取消再構築方式c5取消でc6c7も自動取消","連鎖取消・再構築方式：c5取消でc6・c7も自動取消",[10,45,46],{},"決算振替仕訳は依存関係が強い。c5（売上→損益）が消えたのに、c7（損益→繰越利益剰余金）が損益5,000のまま残っていたら、T勘定が破綻する。",[10,48,49,50,53],{},"実装方針は単純で、「取消されたエントリーより後ろを全部破棄して再構築する」。c5を取り消したら c6・c7 も巻き戻し、T勘定を初期状態から c1〜c4 まで再生する。これで純粋関数 ",[14,51,52],{},"buildTLedgerStateView(entries)"," だけで状態が一意に決まる。",[55,56,61],"pre",{"className":57,"code":58,"language":59,"meta":60,"style":60},"language-typescript shiki shiki-themes vitesse-light vitesse-light","const canUnpostEntry = (entryId: string, allEntries: Entry[]): boolean => {\n  // c1〜c4 は期中取引なので取消禁止\n  const entry = allEntries.find(e => e.id === entryId)\n  if (entry?.phase === 'operating') return false\n  return true\n}\n\nconst unpostEntry = (entryId: string, posted: Entry[]): Entry[] => {\n  const idx = posted.findIndex(e => e.id === entryId)\n  return idx === -1 ? posted : posted.slice(0, idx)\n}\n","typescript","",[14,62,63,117,124,167,205,214,220,227,266,301,343],{"__ignoreMap":60},[64,65,68,72,76,80,83,87,90,94,97,100,102,105,108,111,114],"span",{"class":66,"line":67},"line",1,[64,69,71],{"class":70},"stQ0i","const ",[64,73,75],{"class":74},"senZ8","canUnpostEntry",[64,77,79],{"class":78},"shFtX"," =",[64,81,82],{"class":78}," (",[64,84,86],{"class":85},"s4oTP","entryId",[64,88,89],{"class":78},": ",[64,91,93],{"class":92},"sSkh3","string",[64,95,96],{"class":78},",",[64,98,99],{"class":85}," allEntries",[64,101,89],{"class":78},[64,103,104],{"class":92},"Entry",[64,106,107],{"class":78},"[]):",[64,109,110],{"class":92}," boolean",[64,112,113],{"class":78}," =>",[64,115,116],{"class":78}," {\n",[64,118,120],{"class":66,"line":119},2,[64,121,123],{"class":122},"sxvE3","  // c1〜c4 は期中取引なので取消禁止\n",[64,125,127,130,133,135,137,140,143,146,149,151,154,156,159,162,164],{"class":66,"line":126},3,[64,128,129],{"class":70},"  const ",[64,131,132],{"class":85},"entry",[64,134,79],{"class":78},[64,136,99],{"class":85},[64,138,139],{"class":78},".",[64,141,142],{"class":74},"find",[64,144,145],{"class":78},"(",[64,147,148],{"class":85},"e",[64,150,113],{"class":78},[64,152,153],{"class":85}," e",[64,155,139],{"class":78},[64,157,158],{"class":85},"id",[64,160,161],{"class":70}," === ",[64,163,86],{"class":85},[64,165,166],{"class":78},")\n",[64,168,170,174,176,178,181,184,186,190,194,196,199,202],{"class":66,"line":169},4,[64,171,173],{"class":172},"sHkkW","  if",[64,175,82],{"class":78},[64,177,132],{"class":85},[64,179,180],{"class":78},"?.",[64,182,183],{"class":85},"phase",[64,185,161],{"class":70},[64,187,189],{"class":188},"sMJiu","'",[64,191,193],{"class":192},"sdGka","operating",[64,195,189],{"class":188},[64,197,198],{"class":78},")",[64,200,201],{"class":172}," return",[64,203,204],{"class":172}," false\n",[64,206,208,211],{"class":66,"line":207},5,[64,209,210],{"class":172},"  return",[64,212,213],{"class":172}," true\n",[64,215,217],{"class":66,"line":216},6,[64,218,219],{"class":78},"}\n",[64,221,223],{"class":66,"line":222},7,[64,224,226],{"emptyLinePlaceholder":225},true,"\n",[64,228,230,232,235,237,239,241,243,245,247,250,252,254,256,259,262,264],{"class":66,"line":229},8,[64,231,71],{"class":70},[64,233,234],{"class":74},"unpostEntry",[64,236,79],{"class":78},[64,238,82],{"class":78},[64,240,86],{"class":85},[64,242,89],{"class":78},[64,244,93],{"class":92},[64,246,96],{"class":78},[64,248,249],{"class":85}," posted",[64,251,89],{"class":78},[64,253,104],{"class":92},[64,255,107],{"class":78},[64,257,258],{"class":92}," Entry",[64,260,261],{"class":78},"[]",[64,263,113],{"class":78},[64,265,116],{"class":78},[64,267,269,271,274,276,278,280,283,285,287,289,291,293,295,297,299],{"class":66,"line":268},9,[64,270,129],{"class":70},[64,272,273],{"class":85},"idx",[64,275,79],{"class":78},[64,277,249],{"class":85},[64,279,139],{"class":78},[64,281,282],{"class":74},"findIndex",[64,284,145],{"class":78},[64,286,148],{"class":85},[64,288,113],{"class":78},[64,290,153],{"class":85},[64,292,139],{"class":78},[64,294,158],{"class":85},[64,296,161],{"class":70},[64,298,86],{"class":85},[64,300,166],{"class":78},[64,302,304,306,309,312,316,319,322,325,327,329,332,334,337,339,341],{"class":66,"line":303},10,[64,305,210],{"class":172},[64,307,308],{"class":85}," idx",[64,310,311],{"class":70}," === -",[64,313,315],{"class":314},"sM54T","1",[64,317,318],{"class":70}," ? ",[64,320,321],{"class":85},"posted",[64,323,324],{"class":70}," : ",[64,326,321],{"class":85},[64,328,139],{"class":78},[64,330,331],{"class":74},"slice",[64,333,145],{"class":78},[64,335,336],{"class":314},"0",[64,338,96],{"class":78},[64,340,308],{"class":85},[64,342,166],{"class":78},[64,344,346],{"class":66,"line":345},11,[64,347,219],{"class":78},[10,349,350],{},"純粋関数に閉じ込めたので、Vitest で取消後のT勘定残高をスナップショット検証できる。Codex指摘で「c1〜c4 取消禁止のテストが無い」と言われて、後から3本追加した。",[23,352,354,355],{"id":353},"t勘定をbspl2段構成にタブナンバリングは-1-2-3-4-決算整理-5-6-7","T勘定をBS／PL2段構成に：タブナンバリングは ",[14,356,357],{},"1 2 3 4 ｜決算整理｜ 5 6 7",[10,359,360],{},"T勘定の並びを最初は勘定科目順にしていたが、決算振替の流れが目で追えない。BS（資産→負債→純資産）／ PL（収益→費用）の2段構成に組み替えたら、c5・c6 の「PL勘定が損益勘定に集約される動き」と c7 の「損益勘定が繰越利益剰余金に流れる動き」が画面上で1直線に見えるようになった。",[10,362,363,364,366],{},"タブナンバリングは仕訳7本ぶん ",[14,365,357],{}," という並び。決算整理セパレーターはマゼンタの縦線で、期中と決算をひと目で区切る。Codex には「セパレーターを文字で書くか線で書くか」を聞いて、線のほうがクリック可能領域と誤認されないと判定された。",[23,368,370],{"id":369},"縦並びとタブの差し戻し最初は縦1列モーダル拡大時のみ縦並びに","縦並びとタブの差し戻し：最初は縦1列、モーダル拡大時のみ縦並びに",[10,372,373],{},"最初の実装で「縦1列のシンプル並び」にしたら、ユーザーから差し戻しが入った。「7枚のカードが縦に並んでいると、c1〜c4 の期中取引が長くて c5〜c7 まで視線が届かない。タブで集約して」。",[10,375,376],{},"通常時は1枚ずつタブ集約、モーダル拡大時のみ縦並び一覧という二段構えに変更。モーダルでは7枚を全部見渡せて、通常時はタブで切り替えて1枚に集中できる。差し戻しから実装変更まで30分。最初に勝手に「縦並びがシンプルでよいだろう」と決めつけたのが失敗で、モードを2つ持たせるべきだった。",[23,378,380],{"id":379},"レイアウトシフト0pxt勘定と仕訳帳をプレースホルダーで事前確保","レイアウトシフト0px：T勘定と仕訳帳をプレースホルダーで事前確保",[10,382,383,384,386],{},"昨日の ",[14,385,16],{}," で得た学びをそのまま流用した。T勘定の高さは「最終行数」で事前確保し、空行をプレースホルダーで表示する。仕訳帳も全7エントリー分のプレースホルダー行を最初から確保する。",[10,388,389],{},"これでアニメ着弾時にレイアウトが1pxも動かない。pillが飛んできたあとにカウントアップ表示が起動して、プレースホルダーが実データに置き換わる。",[23,391,393],{"id":392},"pill飛行アニメの座標バグ3コミ目から座標がズレる","pill飛行アニメの座標バグ：3コミ目から座標がズレる",[10,395,396],{},"仕訳→T勘定への飛行pillアニメを実装した。c1・c2 までは綺麗に飛ぶのに、c3 以降から着弾点が右下にズレる。3回試行錯誤した。",[10,398,399,400,403,404,407],{},"原因はモーダルの zoom 倍率と左カラムのスクロール量だった。",[14,401,402],{},"document.documentElement.style.zoom = '130%'"," で全体を拡大しているので、",[14,405,406],{},"getBoundingClientRect()"," は zoom 後の座標を返す。一方、pillの translate 値は zoom 前の論理座標で書いていた。さらにモーダル左カラムが内部でスクロールするので、c3 を発火する時点でスクロール量が0pxではない。",[55,409,411],{"className":57,"code":410,"language":59,"meta":60,"style":60},"// 修正後: zoom倍率を逆算してスクロール量を加味\nconst zoom = parseFloat(getComputedStyle(modalRoot).zoom || '1')\nconst fromRect = pillEl.getBoundingClientRect()\nconst toRect = targetCellEl.getBoundingClientRect()\nconst dx = (toRect.left - fromRect.left) / zoom\nconst dy = (toRect.top - fromRect.top) / zoom\n",[14,412,413,418,456,476,494,529],{"__ignoreMap":60},[64,414,415],{"class":66,"line":67},[64,416,417],{"class":122},"// 修正後: zoom倍率を逆算してスクロール量を加味\n",[64,419,420,422,425,427,430,432,435,437,440,443,445,448,450,452,454],{"class":66,"line":119},[64,421,71],{"class":70},[64,423,424],{"class":85},"zoom",[64,426,79],{"class":78},[64,428,429],{"class":74}," parseFloat",[64,431,145],{"class":78},[64,433,434],{"class":74},"getComputedStyle",[64,436,145],{"class":78},[64,438,439],{"class":85},"modalRoot",[64,441,442],{"class":78},").",[64,444,424],{"class":85},[64,446,447],{"class":70}," || ",[64,449,189],{"class":188},[64,451,315],{"class":192},[64,453,189],{"class":188},[64,455,166],{"class":78},[64,457,458,460,463,465,468,470,473],{"class":66,"line":126},[64,459,71],{"class":70},[64,461,462],{"class":85},"fromRect",[64,464,79],{"class":78},[64,466,467],{"class":85}," pillEl",[64,469,139],{"class":78},[64,471,472],{"class":74},"getBoundingClientRect",[64,474,475],{"class":78},"()\n",[64,477,478,480,483,485,488,490,492],{"class":66,"line":169},[64,479,71],{"class":70},[64,481,482],{"class":85},"toRect",[64,484,79],{"class":78},[64,486,487],{"class":85}," targetCellEl",[64,489,139],{"class":78},[64,491,472],{"class":74},[64,493,475],{"class":78},[64,495,496,498,501,503,505,507,509,512,515,517,519,521,523,526],{"class":66,"line":207},[64,497,71],{"class":70},[64,499,500],{"class":85},"dx",[64,502,79],{"class":78},[64,504,82],{"class":78},[64,506,482],{"class":85},[64,508,139],{"class":78},[64,510,511],{"class":85},"left",[64,513,514],{"class":70}," - ",[64,516,462],{"class":85},[64,518,139],{"class":78},[64,520,511],{"class":85},[64,522,198],{"class":78},[64,524,525],{"class":70}," / ",[64,527,528],{"class":85},"zoom\n",[64,530,531,533,536,538,540,542,544,547,549,551,553,555,557,559],{"class":66,"line":216},[64,532,71],{"class":70},[64,534,535],{"class":85},"dy",[64,537,79],{"class":78},[64,539,82],{"class":78},[64,541,482],{"class":85},[64,543,139],{"class":78},[64,545,546],{"class":85},"top",[64,548,514],{"class":70},[64,550,462],{"class":85},[64,552,139],{"class":78},[64,554,546],{"class":85},[64,556,198],{"class":78},[64,558,525],{"class":70},[64,560,528],{"class":85},[10,562,563,565,566,569],{},[14,564,406],{}," の返値同士の差分を取ってから zoom で割る、と書いたら3コミ目以降も追従した。最初は zoom を ",[14,567,568],{},"transform: scale()"," に変えようとしたが、座標計算がさらに複雑になるので zoom のまま倍率逆算で対処した。",[23,571,573],{"id":572},"残高6000のバグ対借が一致しません表示の許容できない不整合","残高6,000のバグ：「対借が一致しません」表示の許容できない不整合",[10,575,576],{},"c5・c6・c7 を全部プッシュした状態で画面を開いたとき、ユーザーから「残高6,000の表示で対借が一致しない。これは許容できない」と指摘が入った。",[10,578,579,580,583,584,588],{},"最初は計算ロジックのバグかと思って ",[14,581,582],{},"buildTLedgerStateView"," を疑った。テストを書いて回したら、純粋関数の出力は正しい。",[585,586,587],"strong",{},"T勘定の借方に期首残高（前期繰越）が表示されていなかった","だけの、表示側のバグだった。データは合っていて、画面に出していなかった。",[55,590,592],{"className":57,"code":591,"language":59,"meta":60,"style":60},"// 修正後: 期首残高を借方の最初の行に「前期繰越」として表示\nconst renderDebitColumn = (account: Account, openingBalance: number) => {\n  const lines: TLedgerLine[] = []\n  if (openingBalance > 0) {\n    lines.push({ label: '前期繰越', amount: openingBalance })\n  }\n  return [...lines, ...account.debitEntries]\n}\n",[14,593,594,599,634,652,671,710,715,739],{"__ignoreMap":60},[64,595,596],{"class":66,"line":67},[64,597,598],{"class":122},"// 修正後: 期首残高を借方の最初の行に「前期繰越」として表示\n",[64,600,601,603,606,608,610,613,615,618,620,623,625,628,630,632],{"class":66,"line":119},[64,602,71],{"class":70},[64,604,605],{"class":74},"renderDebitColumn",[64,607,79],{"class":78},[64,609,82],{"class":78},[64,611,612],{"class":85},"account",[64,614,89],{"class":78},[64,616,617],{"class":92},"Account",[64,619,96],{"class":78},[64,621,622],{"class":85}," openingBalance",[64,624,89],{"class":78},[64,626,627],{"class":92},"number",[64,629,198],{"class":78},[64,631,113],{"class":78},[64,633,116],{"class":78},[64,635,636,638,641,643,646,649],{"class":66,"line":126},[64,637,129],{"class":70},[64,639,640],{"class":85},"lines",[64,642,89],{"class":78},[64,644,645],{"class":92},"TLedgerLine",[64,647,648],{"class":78},"[] =",[64,650,651],{"class":78}," []\n",[64,653,654,656,658,661,664,667,669],{"class":66,"line":169},[64,655,173],{"class":172},[64,657,82],{"class":78},[64,659,660],{"class":85},"openingBalance",[64,662,663],{"class":78}," >",[64,665,666],{"class":314}," 0",[64,668,198],{"class":78},[64,670,116],{"class":78},[64,672,673,676,678,681,684,688,690,692,695,697,700,703,705,707],{"class":66,"line":207},[64,674,675],{"class":85},"    lines",[64,677,139],{"class":78},[64,679,680],{"class":74},"push",[64,682,683],{"class":78},"({ ",[64,685,687],{"class":686},"sz8Xr","label",[64,689,89],{"class":78},[64,691,189],{"class":188},[64,693,694],{"class":192},"前期繰越",[64,696,189],{"class":188},[64,698,699],{"class":78},", ",[64,701,702],{"class":686},"amount",[64,704,89],{"class":78},[64,706,660],{"class":85},[64,708,709],{"class":78}," })\n",[64,711,712],{"class":66,"line":216},[64,713,714],{"class":78},"  }\n",[64,716,717,719,722,724,726,729,731,733,736],{"class":66,"line":222},[64,718,210],{"class":172},[64,720,721],{"class":78}," [...",[64,723,640],{"class":85},[64,725,96],{"class":78},[64,727,728],{"class":78}," ...",[64,730,612],{"class":85},[64,732,139],{"class":78},[64,734,735],{"class":85},"debitEntries",[64,737,738],{"class":78},"]\n",[64,740,741],{"class":66,"line":229},[64,742,219],{"class":78},[10,744,745],{},"画面に出ている数字を電卓で検算したわけではなく、画面の貸借合計が違和感のある数字だったから気付いた。AI が書く表示ロジックは、計算と描画のどっちで欠けても結果が同じに見えることがある。テストで保証していなかった残高表示のT勘定 line 数まで合計17本のテストを追加した（7→10→17）。",[23,747,749],{"id":748},"codexレビューで2点重要指摘step-3-一時誤表示と-c1c4-取消禁止テスト","Codexレビューで2点重要指摘：STEP 3 一時誤表示と c1〜c4 取消禁止テスト",[10,751,752],{},"実装が一段落して Codex に再レビューを回したら、瑣末な指摘を切り捨てたあとに2点が残った。",[10,754,755,756,759,760,763],{},"1つ目は「STEP 3 一時誤表示」。c6 を押下した直後の1.3秒間、画面に「当期純利益=5,000」と一時的に出ていた。c6 の時点では損益勘定の貸借差額が確定していないので、表示してはいけない値だった。",[14,757,758],{},"showStep3"," フラグの立ち上げタイミングが c6 の処理中に挟まっていて、「c7 を押下したあと」に変える必要があった。これも純粋関数 ",[14,761,762],{},"shouldShowStep3(entries)"," に切り出して、テストで「c6 直後は false」「c7 直後は true」を明示した。",[10,765,766,767,769],{},"2つ目は前述の「c1〜c4 取消禁止のテスト未追加」。",[14,768,75],{}," の実装はあったがテストが無かった。3本追加した。",[10,771,772],{},"両方とも実装の自己テストでは見つからず、Codex の第三者レビューで初めて言語化された。指摘の半分は瑣末なので切り捨てるが、残り半分が致命点に当たる確率が高い。",[23,774,776],{"id":775},"細かい仕上げ決算整理仕訳フラグ列損益貸方山のパルス表示","細かい仕上げ：決算整理仕訳フラグ列、損益貸方山のパルス表示",[10,778,779],{},"仕上げに2つ追加した。仕訳帳の貸方右に「決算整理仕訳フラグ列」を立てて、c5〜c7 にだけマゼンタの「決」アイコンを表示する。期中と決算のリズムが仕訳帳上でも見える。",[10,781,782],{},"もう1つは損益勘定の貸方山のパルス表示。c5 でプッシュされた売上5,000 が損益勘定の貸方に積まれた瞬間、その金額にパルスとフェードイン効果を出す。「ここに数字が積まれた」という視覚的な合図で、c7 で繰越利益剰余金に流れていく前段の溜まりを強調する。",[23,784,785],{"id":785},"学び",[787,788,789,801,807,821],"ul",{},[790,791,792,89,795,797,798,800],"li",{},[585,793,794],{},"既存コンポーネントを変に拡張せず、別物として切り出す判断が結果的に早い",[14,796,16],{}," に決算振替モードを足そうとして3時間溶かしたが、",[14,799,20],{}," を新規で切り出してから1日で完走した。「props で分岐」が3階層を超えたら別物として書く",[790,802,803,806],{},[585,804,805],{},"画面の数字に違和感を覚えた瞬間、テストで保証する",": 残高6,000のバグは電卓で検算したのではなく、画面の貸借合計が変だと目で気付いた。気付いた瞬間にテストを書き足して、再発を防ぐ",[790,808,809,89,812,814,815,814,817,820],{},[585,810,811],{},"純粋関数化は連鎖取消・タイミングバグ両方に効く",[14,813,582],{}," ",[14,816,75],{},[14,818,819],{},"shouldShowStep3"," の3つを純粋関数に切り出したことで、状態が引数だけで一意に決まり、Codex指摘のタイミングバグもテストで言語化できた",[790,822,823,826],{},[585,824,825],{},"Codexの指摘は瑣末を切り捨てれば致命点だけ残る",": 11件の指摘から瑣末を半分切り、残った2点が STEP 3 誤表示と取消禁止テスト未追加。第三者レビューで初めて言語化される設計穴がある",[23,828,829],{"id":829},"明日やること",[787,831,834,845,855],{"className":832},[833],"contains-task-list",[790,835,838,814,842,844],{"className":836},[837],"task-list-item",[839,840],"input",{"disabled":225,"type":841},"checkbox",[14,843,20],{}," を他章（商品売買・固定資産）の決算振替に流用できるか、props 設計を見直す",[790,846,848,850,851,854],{"className":847},[837],[839,849],{"disabled":225,"type":841}," 損益勘定の貸方山のパルス表示が連続発火するとフレームが落ちるので、Web Animations API の ",[14,852,853],{},"composite: 'add'"," で重ね合わせる方式に変える",[790,856,858,860],{"className":857},[837],[839,859],{"disabled":225,"type":841}," 整合性保証テストを17本→各章ごとに展開して、決算振替系全例題で同じ純粋関数を回せる構造にする",[862,863,864],"style",{},"html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sSkh3, html code.shiki .sSkh3{--shiki-default:#2E8F82;--shiki-dark:#2E8F82}html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}",{"title":60,"searchDepth":119,"depth":119,"links":866},[867,868,869,871,872,873,874,875,876,877,878],{"id":25,"depth":119,"text":26},{"id":42,"depth":119,"text":43},{"id":353,"depth":119,"text":870},"T勘定をBS／PL2段構成に：タブナンバリングは 1 2 3 4 ｜決算整理｜ 5 6 7",{"id":369,"depth":119,"text":370},{"id":379,"depth":119,"text":380},{"id":392,"depth":119,"text":393},{"id":572,"depth":119,"text":573},{"id":748,"depth":119,"text":749},{"id":775,"depth":119,"text":776},{"id":785,"depth":119,"text":785},{"id":829,"depth":119,"text":829},"dev","既存 JournalExample.vue で表現できない決算振替仕訳のために ClosingTransferExample.vue を新規作成。T勘定可視化・連鎖取消・pillアニメ・整合性保証テストまで1日で完走","md",{},"/2026-05-03-closing-transfer-example-component","eurekapu-nuxt4",false,"2026-05-03T00:00:00.000Z",{"title":5,"description":880},"2026-05/2026-05-03/closing-transfer-example-component",[890,891,892,893,894],"簿記3級","Vue","決算振替","T勘定","Codexレビュー",null,"xO4xfq20_95GHXuTabKhxNEKDWqRKOD_BAlFvOKw7Lk",[],"https://log.eurekapu.com/favicon.svg",1778379990235]