職務経歴書PDFの余白修正とフォーム・出力表記の調整#302
Conversation
- PDF: 1ページ目の余分な余白を解消(.project の page-break-inside 削除、 body margin:0)。表がページ分割される際は thead で列見出しを繰り返す - PDF: プロジェクト表の体制カラムを廃止し、役割行へ 「役割:X、体制:6名(PM:1名、SE:6名)」形式で併記。空いた幅を業務内容へ - PDF/Markdown: 出力表記を統一(開発環境/技術スタック→スキルセット、 取引先名→案件名) - フォーム: IT企業チェックを会社名・事業内容と同一行・入力欄と横並びに配置 (幅比 会社名:事業内容:IT企業 = 4.5:5:0.5) - フォーム: 資格入力の幅比を 資格名:取得日 = 7:3 に調整 - フォーム: スキル入力ラベルを「技術スタック」→「スキルセット」に統一 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Important Review skippedReview was skipped due to path filters ⛔ Files ignored due to path filters (1)
CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughTerminology, data layout, and presentation updates: "技術スタック" → "スキルセット" across backend/frontend; project team moved into project header and removed from table; client label changed to "案件名"; form grids adjusted; PDF pagination and project-table column widths updated. ChangesCareer Form and Resume Refactoring
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (2)
frontend/src/components/forms/ProjectModal.tsx (1)
28-28: 💤 Low valueConsider updating JSDoc comment for terminology consistency.
While the prop name
techStackNamesByCategorywas appropriately left unchanged to avoid breaking changes, the JSDoc comment still uses the old terminology "技術スタック". Consider updating it to "スキルセット" to match the standardized user-facing terminology throughout the UI.📝 Suggested consistency update
- /** カテゴリごとの技術スタック名称リスト */ + /** カテゴリごとのスキルセット名称リスト */ techStackNamesByCategory: Map<string, string[]>;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@frontend/src/components/forms/ProjectModal.tsx` at line 28, Update the JSDoc comment above the prop usage in ProjectModal.tsx to use the standardized user-facing term "スキルセット" instead of "技術スタック" while keeping the prop name techStackNamesByCategory unchanged; locate the comment that currently reads "カテゴリごとの技術スタック名称リスト" and change its text to "カテゴリごとのスキルセット名称リスト" (or equivalent) so documentation matches UI terminology without altering the techStackNamesByCategory identifier.frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx (1)
119-120: 💤 Low valueUpdate comment terminology to match code changes.
The comment still uses "取引先" terminology. If the migration to "案件" terminology is intended to be complete, update the comment for consistency:
- {/* IT企業かどうか(非ITは取引先を持たず詳細のみ)。会社名・事業内容と同じ行に配置。 + {/* IT企業かどうか(非ITは案件を持たず詳細のみ)。会社名・事業内容と同じ行に配置。🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx` around lines 119 - 120, Update the in-file Japanese comment in the CareerExperienceEditor component to use the new terminology "案件" instead of the old "取引先" so it matches recent code changes; locate the comment block inside frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx (within the CareerExperienceEditor component) and replace occurrences of "取引先" with "案件", keeping the rest of the explanatory text and layout notes unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@backend/app/services/pdf/templates/resume.css`:
- Line 44: Replace the deprecated CSS property page-break-after with the modern
break-after in the resume stylesheet: for selectors h2, .company-header, and
.client-name, change the rule page-break-after: avoid to break-after: avoid so
the behavior is preserved while using the CSS Fragmentation Level 3 property
(WeasyPrint supports both).
In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx`:
- Line 261: The heading and action button in CareerExperienceEditor are
inconsistent: the h3 shows "案件情報" while the action button still reads "取引先を追加";
pick one terminology and make labels consistent across the component and related
editors (e.g., CareerExperienceEditor and ClientEditor). Either change the h3 to
"取引先情報" or change all button/label text "取引先を追加"/"取引先" to "案件を追加"/"案件" (and
update any shared label props, translation keys or constants used by
ClientEditor and CareerExperienceEditor) so the UI uses a single term
throughout.
In `@frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx`:
- Line 70: ClientEditor currently mixes “案件名” UI with leftover “取引先…” literals
and hard-coded strings; update ClientEditor.tsx to use single terminology
(“案件名”) consistently by replacing occurrences of "取引先なし" and "取引先を削除" with the
equivalent “案件名” wording, and move all user-facing literals (e.g. "案件名",
"取引先なし", "取引先を削除", and placeholder "例: 〇〇社(略称)") into
frontend/src/constants/messages.ts following .claude/rules/frontend/messages.md,
then import the message constants into ClientEditor.tsx and use them in the JSX
(replace the literal strings and placeholder props). Ensure the message keys you
add are clearly named (e.g. CASE_NAME, CASE_NONE, CASE_DELETE_LABEL,
CASE_PLACEHOLDER) and update any labels/placeholders in ClientEditor component
to reference those keys so terminology is consistent.
---
Nitpick comments:
In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx`:
- Around line 119-120: Update the in-file Japanese comment in the
CareerExperienceEditor component to use the new terminology "案件" instead of the
old "取引先" so it matches recent code changes; locate the comment block inside
frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx
(within the CareerExperienceEditor component) and replace occurrences of "取引先"
with "案件", keeping the rest of the explanatory text and layout notes unchanged.
In `@frontend/src/components/forms/ProjectModal.tsx`:
- Line 28: Update the JSDoc comment above the prop usage in ProjectModal.tsx to
use the standardized user-facing term "スキルセット" instead of "技術スタック" while keeping
the prop name techStackNamesByCategory unchanged; locate the comment that
currently reads "カテゴリごとの技術スタック名称リスト" and change its text to "カテゴリごとのスキルセット名称リスト"
(or equivalent) so documentation matches UI terminology without altering the
techStackNamesByCategory identifier.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 00435b05-532c-4844-a067-2af5be982955
📒 Files selected for processing (8)
backend/app/services/markdown/generators/resume_generator.pybackend/app/services/pdf/generators/resume_generator.pybackend/app/services/pdf/templates/resume.cssfrontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsxfrontend/src/components/forms/CareerFormEditors/ClientEditor.tsxfrontend/src/components/forms/CareerResumeForm.module.cssfrontend/src/components/forms/ProjectModal.tsxfrontend/src/components/forms/sections/CareerQualificationsSection.tsx
| padding-bottom: 1mm; | ||
| margin: 6mm 0 3mm 0; | ||
| /* 見出しがページ末尾に孤立して直後の本文だけ次ページに行くのを防ぐ */ | ||
| page-break-after: avoid; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check WeasyPrint documentation for break-after support
python -c "import weasyprint; print(f'WeasyPrint version: {weasyprint.__version__}')"Repository: yusuke0610/devforge
Length of output: 187
🏁 Script executed:
#!/bin/bash
# Locate all page-break-after usages in the CSS template and show nearby context.
rg -n "page-break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true
# Also show any break-after usages for comparison.
rg -n "break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true
# Print the relevant line ranges around the originally referenced lines (43-44, 62-63, 114-115).
# Use sed with absolute line numbers from the file.
sed -n '35,75p' backend/app/services/pdf/templates/resume.css
echo "----"
sed -n '95,130p' backend/app/services/pdf/templates/resume.cssRepository: yusuke0610/devforge
Length of output: 1635
🏁 Script executed:
#!/bin/bash
# Locate all page-break-after usages in the CSS template and show nearby context.
rg -n "page-break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true
# Also show any break-after usages for comparison.
rg -n "break-after\s*:\s*avoid" backend/app/services/pdf/templates/resume.css || true
# Print the relevant line ranges around the originally referenced lines (43-44, 62-63, 114-115).
# Use sed with absolute line numbers from the file.
sed -n '35,75p' backend/app/services/pdf/templates/resume.css
echo "----"
sed -n '95,130p' backend/app/services/pdf/templates/resume.cssRepository: yusuke0610/devforge
Length of output: 1635
🌐 Web query:
WeasyPrint support for break-after CSS Fragmentation Module Level 3 page-break-after
💡 Result:
WeasyPrint support for “break-after” from the CSS Fragmentation Module Level 3 (and CSS2’s page-break-after alias) is only for page fragmentation, not for multi-column/region fragmentation. 1) Fragmentation Module Level 3: break-after is supported for pages WeasyPrint’s documentation states that the “break-before”, “break-after”, and “break-inside” properties are supported, specifically for pages (but not for columns and regions). [1] So, in terms of the exact question (“break-after CSS Fragmentation Module Level 3 … page-break-after”): - break-after: page (and related break-after values that create page breaks) should work because break-after is supported for pages. [1][2] - page-break-after (CSS2 alias) is also supported. [1] 2) Not supported for columns and regions The same WeasyPrint docs explicitly say break properties are not supported “for columns and regions”. [1] So if you are inside a multi-column container or other fragmentation context where columns/regions apply, break-after may not behave as expected (and WeasyPrint’s multi-column docs also note break-before/after/inside are not supported for multi-column layout). [3] 3) Practical note for your template pattern In a simple single-column paged flow, using page-break-after: always should usually force page breaks after each repeated section. However, real-world behavior can be affected by surrounding layout (e.g., margins, flex/grid/other supported-but-not-perfect layout scenarios, and where in the DOM the break element lands). If you’re trying to force a break after each “section”, a common reliable pattern is to apply the break to an element that produces/ends the section content and is not empty (e.g., a block-level element wrapping the section), and to test with a single instance first. (Your own experience of “it only works when I add it twice” can happen with edge cases where the break opportunity is suppressed or where the added element creates additional layout that changes break positioning.) Bottom line - Yes: WeasyPrint supports break-after (Fragmentation Module Level 3) for pages, and supports page-break-* aliases too. [1] - No: It does not support break-after for columns and regions. [1][3] If you share whether your template is single-column or uses multi-columns (or any CSS that creates column/region fragmentation), I can suggest the most WeasyPrint-compatible way to structure the break element.
Citations:
- 1: https://doc.courtbouillon.org/weasyprint/v62.0/_sources/api_reference.rst.txt
- 2: https://www.w3.org/TR/css-break-3/
- 3: https://doc.courtbouillon.org/weasyprint/v0.42.3/features.html
🌐 Web query:
WeasyPrint page-break-after break-after
💡 Result:
WeasyPrint supports both the modern break-after CSS property and the legacy page-break-after alias [1]. Key points regarding their usage: 1. Compatibility: WeasyPrint supports the properties defined in the CSS Fragmentation Module (Level 3/4), specifically break-before, break-after, and break-inside [1]. It also maintains support for legacy page-break-* aliases, such as page-break-after [1]. 2. Preferred Usage: While both work, break-after is the modern standard [2][3]. When using these properties, common values include always (to force a break), avoid (to prevent a break), and position-specific values like left or right [1][4][2]. 3. Troubleshooting Common Issues: - Empty Pages: If you experience unexpected blank pages, ensure that you are not applying breaks to elements that are already at the end of a page or applying them in a way that forces multiple breaks unintentionally [5]. - Box Model Effects: WeasyPrint relies on the box model to determine break points [6]. Applying a break property to an empty element (e.g., <p style="page-break-after: always;"></p>) can sometimes lead to unpredictable behavior if the element itself creates layout interference. - Alternative Approaches: If a standard break is not working as expected within complex layouts (like tables), try applying the CSS property directly to the block-level element (e.g., a or
Citations:
- 1: https://doc.courtbouillon.org/weasyprint/latest/api_reference.html
- 2: https://drafts.csswg.org/css-break/
- 3: https://github.com/w3c/csswg-drafts/blob/main/css-break-3/Overview.bs
- 4: 'break-before' left vs. right page Kozea/WeasyPrint#241
- 5: https://stackoverflow.com/questions/74305460/weasyprint-page-break-after-not-functioning-properly
- 6: https://doc.courtbouillon.org/weasyprint/stable/going_further.html
- 7: https://stackoverflow.com/questions/72230179/how-to-force-a-page-break-on-weasyprint
🌐 Web query:
CSS Fragmentation Module Level 3 page-break-after deprecated break-after avoid
💡 Result:
The page-break-after property is deprecated and has been superseded by the break-after property [1][2][3]. As part of the CSS Fragmentation Module Level 3 specification, browsers are required to treat page-break-after as a legacy shorthand alias for break-after to maintain backward compatibility [4][5][6]. While it remains supported for compatibility reasons, its use is no longer recommended, and developers are encouraged to update their code to use break-after [1][3]. The following table summarizes how the legacy property maps to the modern property: Legacy (page-break-after) | Modern (break-after) --- | --- auto | auto left | left right | right avoid | avoid always | page Note that the legacy always value is aliased to page in the modern specification [5][6]. The break-after property is more robust, as it extends beyond paged media (printing) to support fragmentation in multi-column layouts and regions [2][6].
Citations:
- 1: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/page-break-after
- 2: https://css-tricks.com/almanac/properties/b/break-after/
- 3: https://github.com/mdn/content/blob/main/files/en-us/web/css/reference/properties/page-break-after/index.md
- 4: https://www.w3.org/TR/css-break-3/
- 5: https://github.com/w3c/csswg-drafts/blob/main/css-break-3/Overview.bs
- 6: https://github.com/mdn/content/blob/main/files/en-us/web/css/reference/properties/break-after/index.md
Replace deprecated page-break-after with modern break-after
backend/app/services/pdf/templates/resume.css uses page-break-after: avoid in h2, .company-header, and .client-name (lines 44, 63, 115). page-break-after is deprecated in favor of CSS Fragmentation Level 3 break-after; WeasyPrint supports both, so this keeps behavior while aligning with the current standard.
♻️ Proposed fix
h2 {
font-size: 12pt;
border-bottom: 2px solid `#333`;
padding-bottom: 1mm;
margin: 6mm 0 3mm 0;
/* 見出しがページ末尾に孤立して直後の本文だけ次ページに行くのを防ぐ */
- page-break-after: avoid;
+ break-after: avoid;
} .company-header {
background: `#d6dce8`;
padding: 3px 4px;
font-size: 10pt;
font-weight: bold;
border-bottom: 0.3px solid `#999`;
/* ヘッダがページ末尾に孤立し本文だけ次ページに分かれるのを防ぐ */
- page-break-after: avoid;
+ break-after: avoid;
} .client-name {
font-size: 10pt;
font-weight: bold;
margin: 3mm 0 2mm 0;
padding-bottom: 1mm;
border-bottom: 2px solid `#333`;
/* 案件名見出しの孤立防止 */
- page-break-after: avoid;
+ break-after: avoid;
}🧰 Tools
🪛 Stylelint (17.12.0)
[error] 44-44: Expected "page-break-after" to be "break-after" (property-no-deprecated)
(property-no-deprecated)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@backend/app/services/pdf/templates/resume.css` at line 44, Replace the
deprecated CSS property page-break-after with the modern break-after in the
resume stylesheet: for selectors h2, .company-header, and .client-name, change
the rule page-break-after: avoid to break-after: avoid so the behavior is
preserved while using the CSS Fragmentation Level 3 property (WeasyPrint
supports both).
| {exp.is_it_company && ( | ||
| <div className={styles.stackSection}> | ||
| <h3>取引先</h3> | ||
| <h3>案件情報</h3> |
There was a problem hiding this comment.
Incomplete terminology migration creates user confusion.
The section heading now reads "案件情報" (Project Information), but the action button below at line 280 still says "取引先を追加" (Add Client). This inconsistency confuses users—are they adding "案件" or "取引先"?
For a coherent user experience, either complete the terminology migration throughout (all "取引先" → "案件") or reconsider whether the heading should remain "取引先情報" to match the button text.
Proposed fix for terminology consistency
If the intent is to fully migrate to "案件" terminology:
- <button type="button" className="ghost" onClick={() => onAddClient(expIndex)}>
- 取引先を追加
- </button>
+ <button type="button" className="ghost" onClick={() => onAddClient(expIndex)}>
+ 案件を追加
+ </button>And similarly update ClientEditor.tsx line 232:
- {client.is_vacation ? "休業を削除" : "取引先を削除"}
+ {client.is_vacation ? "休業を削除" : "案件を削除"}And line 91:
- 取引先なし
+ 案件なし🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@frontend/src/components/forms/CareerFormEditors/CareerExperienceEditor.tsx`
at line 261, The heading and action button in CareerExperienceEditor are
inconsistent: the h3 shows "案件情報" while the action button still reads "取引先を追加";
pick one terminology and make labels consistent across the component and related
editors (e.g., CareerExperienceEditor and ClientEditor). Either change the h3 to
"取引先情報" or change all button/label text "取引先を追加"/"取引先" to "案件を追加"/"案件" (and
update any shared label props, translation keys or constants used by
ClientEditor and CareerExperienceEditor) so the UI uses a single term
throughout.
| <label className={styles.clientNameLabel}> | ||
| <span> | ||
| 取引先名(呼称) | ||
| 案件名 |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Search for remaining "取引先" usage in frontend form components
rg -n --type=tsx -C2 '取引先' frontend/src/components/forms/Repository: yusuke0610/devforge
Length of output: 91
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Correctly search for remaining Japanese terminology in the target area
echo "== occurrences of '取引先' in frontend/src/components/forms/ (ts/tsx/js/ts?) =="
rg -n -C2 -g'*.{ts,tsx,js,jsx}' '取引先' frontend/src/components/forms/ || true
# 2) Inspect the specific file around the cited lines
echo
echo "== ClientEditor.tsx around label change =="
# show manageable ranges around the referenced line numbers
nl -ba frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx | sed -n '50,120p'
echo
echo "== ClientEditor.tsx around line 220-260 =="
nl -ba frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx | sed -n '210,260p'
# 3) Open the frontend message management guidelines to confirm SSoT / literal rules
echo
echo "== .claude/rules/frontend/messages.md =="
nl -ba .claude/rules/frontend/messages.md | sed -n '1,220p'
# 4) Also confirm if there's any message/i18n pattern used in this file
echo
echo "== ClientEditor.tsx: find uses of i18n/message helpers =="
rg -n 'useTranslation|t\(|message\.|i18n|SSoT|messages' frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx || true
echo
echo "== ClientEditor.tsx: find occurrences of '案件名' =="
rg -n '案件名' frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx || trueRepository: yusuke0610/devforge
Length of output: 7667
🏁 Script executed:
#!/bin/bash
set -euo pipefail
TARGET="frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx"
FORMS_DIR="frontend/src/components/forms/"
echo "== occurrences of '取引先' in $FORMS_DIR (ts/tsx/js/jsx) =="
rg -n -C2 -t ts -t tsx -t js -t jsx '取引先' "$FORMS_DIR" || true
echo
echo "== occurrences of '案件名' in $TARGET =="
rg -n '案件名' "$TARGET" || true
echo
echo "== ClientEditor.tsx line 60-110 (around the label change) =="
awk 'NR>=60 && NR<=110 {printf "%d\t%s\n", NR, $0}' "$TARGET"
echo
echo "== ClientEditor.tsx line 210-250 (around delete button) =="
awk 'NR>=210 && NR<=250 {printf "%d\t%s\n", NR, $0}' "$TARGET"
echo
echo "== .claude/rules/frontend/messages.md (message-literal / SSoT rules) =="
# Print only the sections that mention literals/SSoT/i18n to keep output small
rg -n 'SSoT|literal|message|i18n|t\(' .claude/rules/frontend/messages.md || true
awk 'NR>=1 && NR<=260 {printf "%d\t%s\n", NR, $0}' .claude/rules/frontend/messages.mdRepository: yusuke0610/devforge
Length of output: 7603
Fix remaining “client” terminology + move UI strings to frontend SSoT messages
ClientEditor.tsxは「案件名」へ変えている一方、UI はまだ「取引先なし」(line 91)や「取引先を削除」(line 232)を表示しており、文言が混在してユーザーが迷います(“案件名” 側の用語に統一するか、意図を明確に)。.claude/rules/frontend/messages.mdに従い、ts/tsx のユーザー表示文言はリテラル直書き禁止です。案件名(line 70)、取引先なし(line 91)、取引先を削除(line 232)、placeholder="例: 〇〇社(略称)"(line 77)などをfrontend/src/constants/messages.tsから取得する形に置き換えてください。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@frontend/src/components/forms/CareerFormEditors/ClientEditor.tsx` at line 70,
ClientEditor currently mixes “案件名” UI with leftover “取引先…” literals and
hard-coded strings; update ClientEditor.tsx to use single terminology (“案件名”)
consistently by replacing occurrences of "取引先なし" and "取引先を削除" with the
equivalent “案件名” wording, and move all user-facing literals (e.g. "案件名",
"取引先なし", "取引先を削除", and placeholder "例: 〇〇社(略称)") into
frontend/src/constants/messages.ts following .claude/rules/frontend/messages.md,
then import the message constants into ClientEditor.tsx and use them in the JSX
(replace the literal strings and placeholder props). Ensure the message keys you
add are clearly named (e.g. CASE_NAME, CASE_NONE, CASE_DELETE_LABEL,
CASE_PLACEHOLDER) and update any labels/placeholders in ClientEditor component
to reference those keys so terminology is consistent.
techStackNamesByCategory prop の JSDoc が「技術スタック」のままで、 UI ラベル(スキルセット)と表記が不一致だったため修正。 prop 名(techStackNamesByCategory)は変更しない。 https://claude.ai/code/session_01JS3tqwNQxUSpyvfCfmtWgC
UI/出力の表記統一(取引先名→案件名)に合わせ、IT企業トグル周辺の 説明コメント内の「取引先」を「案件」へ修正。レイアウト注記は変更なし。 https://claude.ai/code/session_01JS3tqwNQxUSpyvfCfmtWgC
|
CodeRabbit の指摘 2 件(表記統一に取り残されたコード内コメント)を修正しました。
いずれもコメント文言のみの変更で、挙動・型・識別子に変更はありません。本ブランチ ( Generated by Claude Code |
react-router/react-router-dom 7.13.1 が GHSA-49rj-9fvp-4h2h(turbo-stream 経由の未認証 RCE)等の high 脆弱性範囲(7.0.0-7.14.2)に該当し、CI の npm audit --audit-level=high が fail していた。package.json の ^7.13.1 範囲内で lockfile のみ 7.17.0 に更新して解消(package.json は変更なし)。 https://claude.ai/code/session_01JS3tqwNQxUSpyvfCfmtWgC
概要
職務経歴書の PDF 出力で 1 ページ目に余分な余白が残る問題の修正を中心に、PDF/Markdown の出力表記とフォーム UI の調整をまとめて行います。
変更内容
PDF 出力(
backend/app/services/pdf/).project { page-break-inside: avoid }を削除(収まらない案件が丸ごと次ページへ送られ、枠付き company 内に約 48mm の余白が残っていた)。あわせてbody { margin: 0 }で先頭の既定余白も除去<thead>/<tbody>化し、ページ境界で分割された際に列見出しを継続ページにも表示役割:X、体制:6名(PM:1名、SE:6名)形式で併記。空いた幅は業務内容(.desc60%→75%)へMarkdown 出力(
backend/app/services/markdown/)フォーム UI(
frontend/src/components/forms/)テスト
make ci通過(backend lint/test、frontend lint、vitest 205 passed、build 成功)🤖 Generated with Claude Code
Summary by CodeRabbit
Style
Refactor
Localization