Commit Graph

591 Commits

Author SHA1 Message Date
kjh2064 b12fc7411d feat(fe): Add form field navigation - Enter key moves to next field
- Create useFormFieldNavigation composable for Tab-like Enter behavior
- KsTextField: Enter -> next field
- KsTextArea: Ctrl+Enter for newline, Enter -> next field
- KsSelect: Enter -> next field after selection
- Implements standard form navigation pattern across input components
2026-08-16 21:50:50 +09:00
kjh2064 5213ea142b fix: KsDataGrid - replicate focusRow complete logic in Enter key handler
deploy / deploy (push) Failing after 48s
deploy / notify (push) Successful in 1s
- Use exact focusRow pattern: ensureIndexVisible + setFocusedCell + startEditingCell
- Apply retry logic to all three operations
- Ensures next cell gets full focus + edit mode like focusRow
2026-08-16 21:44:45 +09:00
kjh2064 eb410c8076 fix: KsDataGrid - add retry logic to Enter key edit mode like focusRow
- Apply same ensureEditMode retry pattern to onCellKeyDown
- Retry startEditingCell at 0ms, 10ms, 50ms after tabToNextCell
- Ensures next cell enters edit mode reliably after Enter key
2026-08-16 21:36:16 +09:00
kjh2064 6dacf069c7 fix: KsDataGrid - simplify Enter key handler, rely on AG Grid tabToNextCell
- Remove redundant startEditingCell calls that override AG Grid native behavior
- Use only stopEditing + tabToNextCell with setTimeout
- Let AG Grid handle edit mode auto-start for next cell
2026-08-16 21:31:24 +09:00
kjh2064 16522855a6 fix: KsDataGrid - add retry logic for Enter key edit mode
- Use multiple setTimeout attempts after tabToNextCell
- Ensures next cell enters edit mode reliably
- Matches focusRow() reliability pattern
2026-08-16 21:26:14 +09:00
kjh2064 43e239d5e4 fix: KsDataGrid - improve focusRow edit mode reliability with retry logic
- Use multiple setTimeout attempts to ensure startEditingCell succeeds
- Retry at 10ms and 50ms intervals for DOM/Grid stability
- Addresses issue where keyboard input not available after focusRow
2026-08-16 21:24:29 +09:00
kjh2064 55341661fc fix: KsDataGrid - ensure edit mode starts after focusing and Enter key navigation
- Add setTimeout in focusRow to ensure DOM updates before startEditingCell
- Add startEditingCell after tabToNextCell in Enter key handler
- Ensures smooth edit mode transition: focus → edit mode immediately
2026-08-16 21:22:40 +09:00
kjh2064 4f20ca24d2 fix: KsDataGrid - use correct cellKeyDown event handler from AgGridVue
- Remove invalid onCellKeyDown from colDef
- Add onCellKeyDown handler to AgGridVue component
- Enter key now properly triggers tabToNextCell for editable columns
2026-08-16 21:12:45 +09:00
kjh2064 28a22b1a96 feat: KsDataGrid - add explicit Enter key handling to all editable columns
- Implement onCellKeyDown callback for editable columns
- Enter key now calls tabToNextCell() like Tab key
- Addresses user request: 넥스트 셀을 네가 찾지말고 tab key와 같은 기능이 동작하면 됀다
2026-08-16 21:09:03 +09:00
kjh2064 8aad550c77 refactor: KsDataGrid - simplify focusRow and rely on AG Grid native Enter navigation 2026-08-16 21:04:41 +09:00
kjh2064 823312fd26 fix(fe): KsDataGrid - remove onCellFocused to allow Enter key navigation
deploy / deploy (push) Failing after 48s
deploy / notify (push) Successful in 0s
Problem: onCellFocused was auto-starting edit mode on every focus,
preventing AG Grid's native Enter-key navigation from working.

Solution: Remove onCellFocused function and @cell-focused event handler.

Now Enter key can properly navigate to next cell (Tab behavior).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:56:09 +09:00
kjh2064 8d52001d35 fix(fe): KsDataGrid - use AG Grid native Enter-to-Tab behavior
deploy / deploy (push) Failing after 51s
deploy / notify (push) Successful in 0s
Removed custom navigateToNextCell function and binding.
Now relies on AG Grid's native :enter-navigates-to-next-cell setting.

This allows Enter key to properly use Tab navigation as intended.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:52:23 +09:00
kjh2064 56a5eb9391 fix(fe): KsDataGrid - Enter key uses Tab navigation (suggestedNextCell)
deploy / deploy (push) Failing after 49s
deploy / notify (push) Successful in 0s
Simplified navigateToNextCell to let Enter key use default AG Grid Tab behavior.

Previous: Custom Enter navigation (next editable column only)
New: Return suggestedNextCell for Enter, which is Tab's default behavior

This makes Enter and Tab fully equivalent, consistent with user expectation.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:50:59 +09:00
kjh2064 69cee5a159 feat(fe): KsDataGrid - Enter key acts like Tab (column-only navigation)
deploy / deploy (push) Failing after 50s
deploy / notify (push) Successful in 1s
Changed Enter key behavior to move only to next editable column within same row
(no row change, just like Tab key).

Previous: Enter → next column OR next row (if last column)
New: Enter → next column only (last column does nothing)

This makes data entry more predictable and consistent with Tab behavior.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:49:57 +09:00
kjh2064 d7551dd2a4 fix(fe): KsDataGrid - add missing redrawRows method
deploy / deploy (push) Failing after 47s
deploy / notify (push) Successful in 1s
Problem: DataGridShell expects gridRef to have redrawRows() method
but KsDataGrid.vue only exposed focusRow and gridApi

Fixed:
1. Added redrawRows() function that calls gridApi.redrawRows()
2. Updated defineExpose to include redrawRows
3. Removed unused CellEditingStoppedEvent import

Result: CommonCodeManagementPage.redrawRows() calls now work

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:48:53 +09:00
kjh2064 844f1eae4a fix(fe): KsDataGrid - prevent duplicate edit mode on cell focus
deploy / deploy (push) Failing after 46s
deploy / notify (push) Successful in 0s
Improved onCellFocused to check if already editing same cell before starting edit mode.

Problem: Enter key moves to next cell + startEditingCell(), then onCellFocused fires
and tries to startEditingCell() again on same cell, causing timing issues.

Solution: Check getEditingCell() to see if we're already editing the focused cell
- If same cell: skip (already editing)
- If different cell: enter edit mode

Result: Enter key → next cell → auto edit mode (no duplication)
Tab/Click/Arrow → auto edit mode (only once)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:47:07 +09:00
kjh2064 3a1340eabd feat(fe): KsDataGrid - auto-enter edit mode on cell focus
deploy / deploy (push) Failing after 47s
deploy / notify (push) Successful in 1s
Added onCellFocused handler to automatically enter edit mode when a cell receives focus.

- Listen to @cell-focused event
- Check if column is editable
- Call startEditingCell() on focus
- Result: Tab key, arrow keys, or any navigation auto-enters edit mode

Affects: All pages using KsDataGrid with editable cells

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:43:54 +09:00
kjh2064 f3ddd4d84b fix(fe): KsDataGrid + CommonCodeManagementPage - grid edit issues
deploy / deploy (push) Failing after 48s
deploy / notify (push) Successful in 1s
Fixed 3 critical bugs in grid editing:

1. onCellValueChanged redrawRows() removal
   - Removed event.api.redrawRows() that was resetting cell input
   - Issue: redrawRows() triggered computed property re-evaluation
   - Result: Array reference changed, grid lost input value

2. ScrollApiModule registration
   - Added ScrollApiModule to ModuleRegistry
   - Issue: focusRow() called ensureIndexVisible without module
   - Result: AG Grid #200 error, page hung

3. onCellEditingStopped removal
   - Removed auto-restart of edit mode on cell exit
   - Issue: Prevented navigateToNextCell from working on Enter key
   - Result: Enter key now properly moves focus to next cell

4. CommonCodeManagementPage focusRow safety
   - Wrapped focusRow() in try-catch
   - Issue: focusRow may not be available, causing errors
   - Result: Grid continues even if focusRow unavailable

Affects: /system/common-codes grid editing and all pages using KsDataGrid

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:42:18 +09:00
kjh2064 bd971cacdd fix(fe): CommonCodeManagementPage - input reset bug on new row edit
deploy / deploy (push) Failing after 47s
deploy / notify (push) Successful in 0s
Problem: Adding a group row then typing in cells caused continuous reset
Root Cause: Vue reactivity lost when assigning new array to reactive object
Solution: Use Object.assign() to maintain reactivity tracking

- Changed: mockChildCodesMap[key] = list
- To: Object.assign(mockChildCodesMap, { [key]: list })
- Result: Cell input now persists without reset

Affects: /system/common-codes grid editing

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:29:36 +09:00
kjh2064 bc1e4a656a chore(docs): update tech debt registry with viewport-fit + CLAUDE.md optimization
deploy / deploy (push) Failing after 51s
deploy / notify (push) Successful in 0s
- DEBT-033: Viewport-fit 11개 페이지 적용 완료 (Low impact, Low effort)
  - CSS flex: 1; min-height: 0; overflow-y: auto 적용
  - 4개 샘플 페이지 Chrome automation 검증
  - commit 1be7029에서 CSS 변경사항 확인

- DEBT-034: CLAUDE.md 47KB→12KB 최적화 완료 (Low impact, Low effort)
  - 문서 거버넌스 lock: AGENTS.md만 engineering guidelines
  - CLAUDE.md는 프로젝트 context만 (status, timeline, overview)
  - commit 07ad98e에서 최적화 적용

- Summary: Completed 8→10 (18 pts → 20 pts)
- AGENTS.md v16.0 decision criteria 적용 (Necessity, Simplicity, Traceability, Debt Management)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:26:41 +09:00
kjh2064 1be7029f8f refactor(fe): viewport-fit zero-scroll layout for 11 pages (Part 2)
deploy / deploy (push) Failing after 51s
deploy / notify (push) Successful in 1s
## Summary
- BatchOperationsPageV2: add overflow-y: auto (ShadowRunQueue, DataQualityPage)
- ModelsList: add flex:1 + min-height:0 + overflow-y:auto
- ShadowRunList: change height to 100% (from calc(100vh - 210px))
- ModelOperationsPage: add overflow-y: auto
- WbsWorkspacePage: add flex:1 + min-height:0 + overflow-y:auto
- IngestionStatus, CommonCodeManagementPage: already fitted (via component inheritance)
- MarketDataIngestion: already fitted (EditFormPage)
- HomePage, RebalanceForm, UiStandardPage: already fitted (earlier session)

Total: 11 pages viewport-fit, 7 pages already compliant

Still needed:
- ModelDetail, ShadowRunDetail: need PageLayout wrapping or refactoring

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 15:00:03 +09:00
kjh2064 07ad98ec12 refactor(docs): Optimize CLAUDE.md structure (47KB→12KB) + expand AGENTS.md v16.0
## Summary
- **CLAUDE.md optimization:** Move engineering guidelines to AGENTS.md only (governance lock)
  - Removed: Governance, Testing Strategy, Observability details, Common Workflows, Guardrails
  - Kept: Project status, timeline, architecture high-level overview, quick reference
  - Result: 47KB → 12.1KB (75% reduction, well within 40KB limit)

- **AGENTS.md expansion:** Add 5 missing engineering procedure sections
  - v16.0 Testing Strategy (xUnit/Vitest/Playwright organization, commands, rules)
  - v16.0 Backend Architecture (Vertical Slice, Database/Migrations, Hangfire Job Design)
  - v16.0 Frontend Architecture (Registry-driven screens, KBX contracts, UI adapter boundary)
  - v16.0 Observability (Logging, Tracing, Dashboards, Metrics)
  - v16.0 Common Workflows (Adding Vertical Slices, Refactoring, Creating Jobs)

- **New companion docs** (no duplication, supplement AGENTS.md):
  - docs/ARCHITECTURE_DETAILED.md — Deep dive on backend/frontend patterns
  - docs/COMMON_WORKFLOWS.md — Workflow procedures with examples
  - docs/GITEA_API_REFERENCE.md — Gitea API + External data sources

## Governance (enforced)
- All engineering procedures now in AGENTS.md ONLY
- CLAUDE.md = project context only (status, timeline, overview)
- Companion docs reference AGENTS.md (no duplicate guidance)
- No conflicting guidance across multiple sources

## Result
- CLAUDE.md: 12.1KB  (within 40KB limit)
- AGENTS.md: 44.8KB (comprehensive procedures)
- Single source of truth for all engineering guidelines

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 14:47:41 +09:00
kjh2064 266db96576 refactor(fe): SellDecisionPage - EditFormPage pattern
- Migrate from PageLayout to EditFormPage (standard form pattern)
- Add state management (PROCESSING/ERROR/READY)
- Separate form input and result preview sections
- Use #preview slot for policy evaluation results
- Add evidence tracking (asOf, version)
- Add dirty state (form has potential changes)
- Improve result display: semantic HTML (dl/dt/dd)
- Add CSS styles for result presentation

Result: Consistent form pattern across all research tools

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 01:25:32 +09:00
kjh2064 71f76787b1 fix(fe): RiskDashboard - add empty state handling and data validation
- Add EMPTY state to StandardScreenState when portfolio has no positions
- Condition all template slots on dashboard data presence
- Validate dashboard.healthScore, riskMetrics, portfolio, stressResults
- Update empty message: '보유 종목이 없습니다' → '포트폴리오 보유 종목이 없습니다'
- Display 'EMPTY' state instead of blank screen when no data
- Improve state computation: LOADING → ERROR/WARN → EMPTY → READY

Result: Better UX for empty/error states, clearer data validation

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 01:22:52 +09:00
kjh2064 8ae6bf6429 refactor(fe): ApprovalQueue - EditFormPage pattern
- Restructure detail panel as approval form (EditFormPage pattern)
- Separate concerns: Header (read-only) + Content (form) + Footer (actions)
- Use form/fieldset semantics for read-only vs editable sections
- Request Details and Metrics as disabled fieldsets (read-only)
- Review Comment as textarea form input
- Footer buttons (Approve/Reject) with validation
- CSS refactor: approval-form, form-header/content/footer structure
- Improved accessibility and semantic HTML

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 01:21:39 +09:00
kjh2064 4d1bdb467e refactor(fe): ApprovalQueue - compact layout to eliminate scroll
- Reduce .request-detail gap: var(--spacing-4) → var(--spacing-2)
- Reduce .request-detail padding: var(--spacing-4) → var(--spacing-3)
- Reduce textarea height: 80-120px → 60-80px
- Reduce .detail-header padding and gap for compact header
- Reduce h3 font-size and margin for section headers
- Reduce .detail-item gap for tight item spacing

Result: All content (Request Details, Validation Metrics, Review Comment) fits in viewport without internal scroll

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 01:15:12 +09:00
kjh2064 c1951dfa0e fix(fe): PageLayout - change workspace to flexbox (grid gap issue)
- Change .ks-page__workspace from grid to flex
- Reason: Grid gap calculation breaks flex: 1 height propagation
- Add flex-direction: column for proper child alignment
- Update .has-aside to use flex-direction: row

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 01:11:53 +09:00
kjh2064 53e91acc52 refactor(fe): ApprovalQueue - MasterDetailCrudPage + UX improvements
- Migrate from ApprovalWorkbenchPage to MasterDetailCrudPage (more appropriate structure)
- Move Approve/Reject buttons to detail header (always visible)
- Compact Validation Metrics (reduced padding and font size)
- Optimize Review Comment textarea (80-120px height)
- Improve layout flow: fixed header + scrollable content in detail panel
- Title: Approval Queue (Maker-Checker Governance)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 01:06:49 +09:00
kjh2064 a5a952fd43 refactor(fe): simplify ApprovalQueue summary structure - remove unnecessary wrapper
Removed unnecessary <div class="stats" role="toolbar"> wrapper.
Stats are now direct children of ks-page__summary (which has CSS Grid layout).

Benefits:
- Simpler DOM structure (fewer nesting levels)
- Role="toolbar" was misleading (this is a stats summary, not a toolbar)
- PageLayout.summary already handles grid layout
- Follows AGENTS.md Necessity-driven & Simplicity principles

Before: 1 wrapper + 3 stats = 4 divs
After: 3 stats = 3 divs (25% reduction)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:57:59 +09:00
kjh2064 bacde3f529 fix(fe): revert PageLayout to flexbox - fix grid gap calculation issue
Root cause: CSS Grid with optional (v-if) children caused inconsistent row counts.
Grid-template-rows: auto auto auto auto 1fr auto auto (7 rows) didn't match
actual child count (5-6 rows), causing 1fr collapse to 3px.

Solution: Revert to flexbox (proven stable).
- .ks-page: display: grid → display: flex; flex-direction: column
- .ks-page__workspace: add flex: 1 (replaces 1fr grid expansion)
- All flex children have min-height: 0 (height propagation chain)

Result: ShadowRunQueue grid now expands to full viewport height.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:54:19 +09:00
kjh2064 cd313ded65 fix(fe): eliminate page-level scroll via viewport-fit shell layout
Root cause (Part 2): Both KsAppShell and AppShellLayout used min-height: 100vh,
allowing flex containers to grow beyond viewport when content exceeded height.

Solution: Convert shell layouts from min-height: 100vh → height: 100vh (fixed).
Add min-height: 0 to intermediate flex containers (.ks-app-shell__container,
.ks-app-shell__main) for proper height propagation.

Changes:
- KsAppShell.vue: min-height: 100vh → height: 100vh
- KsAppShell.vue: add min-height: 0 to __container and __main
- AppShellLayout.vue: min-height: 100vh → height: 100vh (backup fix)

Tested: models-master now fits viewport perfectly, no page-level scroll.

Combined with previous PageLayout grid fix, all layout components now
follow single-screen principle: viewport-fit without overflow.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:46:17 +09:00
kjh2064 1d0fdcc013 fix(fe): PageLayout grid-based layout - eliminate flex gap height calculation error
Root cause: PageLayout's flex-direction: column + gap was not counted in flex: 1 height calculations, causing children to overflow and trigger scroll.

Solution: Convert PageLayout from flexbox to CSS Grid with explicit grid-template-rows. Grid automatically accounts for gaps in row sizing.

Changes:
- PageLayout.vue: display: flex → display: grid
- grid-template-rows: auto auto auto auto 1fr auto auto
- .ks-page__content/.ks-page__aside: height: 100% → flex: 1
- .ks-page__workspace: removed flex: 1 (grid cell, not flex)

Impact:
- models-master fits viewport without page-level scroll ✓
- All screen-types layouts auto-fit with correct height propagation
- Fix applies to all pages using PageLayout

AGENTS.md v16.0: Added Layout Rule #7 (PageLayout grid requirement)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:41:30 +09:00
kjh2064 b2aaf3ed75 fix(fe): sidebar footer alignment and scroll structure
Changes:
  • Reorganize footer: buttons first, version text below
  • Add .ks-sidebar__footer-buttons wrapper for proper layout
  • Style .ks-sidebar__version as small caption text (10px)
  • Fix sidebar scroll: sidebar overflow: hidden, nav: overflow-y: auto only
  • Add flex-shrink: 0 to footer (prevent size collapse)

This prevents:
  ✓ Nested scroll (sidebar + nav both scrolling)
  ✓ Awkward footer alignment
  ✓ Footer contributing to layout scroll

Single-scroll principle: only .nav scrolls, header/footer fixed

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:32:04 +09:00
kjh2064 d897515614 feat(fe): add app version display in sidebar footer
- Display app version (v0.1.0 or VITE_APP_VERSION) in sidebar footer
- Hidden when sidebar is collapsed
- Positioned above Help/Settings buttons

This provides system version visibility without requiring footer.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:30:54 +09:00
kjh2064 dbbfaca4d8 fix(fe): fix ModelList (models-master) scroll on first load - apply height propagation standard
Problem: .master-list had hardcoded height: calc(100vh - 210px), causing scroll on first load

Changes:
  • .master-list: calc(100vh - 210px) → flex: 1; min-height: 0;
  • .items: Added missing min-height: 0; (required for flex children)

Result: Single-screen principle restored (no page-level scroll, height fills viewport)

This aligns with AGENTS.md Height Propagation Chain standard.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:30:00 +09:00
kjh2064 17bb6ed72d refactor(fe): centralize footer exclusion to base.css - single source of truth
Changes:
  • base.css: Add global footer hiding rule (applies to all .ks-page__footer, .ks-shell__footer, footer[class*=ks-])
  • PageLayout: Remove individual footer CSS (use global rule)
  • AppShellLayout: Remove individual footer CSS (use global rule)

Benefits:
  ✓ Single source of truth (base.css)
  ✓ Easier to maintain and update globally
  ✓ Consistent behavior across all layouts
  ✓ Can enable/disable with one change if needed
  ✓ Structure preserved (v-if, grid-areas intact)

Design principle: Single-screen + content-first
  • All controls in header/command-bar/summary
  • Recover ~48-64px per page for content
  • Mobile-friendly (no hard-to-reach footer)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:25:25 +09:00
kjh2064 2b4f043989 fix(fe): exclude all footers - maximize screen real estate
Changes:
  • PageLayout: .ks-page__footer { display: none; }
  • AppShellLayout: .ks-shell__footer { display: none; }
  • AGENTS.md: Enhanced footer policy (all levels excluded)

Policy: Single-screen principle
  ✓ NO page-level footers (PageLayout #footer)
  ✓ NO global footers (AppShellLayout footer)
  ✓ All controls → header/command-bar/summary
  ✓ Maximize content area (recover ~48-64px per page)
  ✓ Mobile-friendly (bottom footer = hard to reach)

Structure preserved (v-if, grid-areas) for backward compatibility.
CSS hiding allows future restoration if needed.

Reference: Session 2026-08-16, responsive design + content-first UX

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:24:59 +09:00
kjh2064 2c934f866c docs(AGENTS): add page footer exclusion policy - consolidate controls to header/command-bar
Policy: No footer sections in PageLayout. All footer functionality must move to:
  • Header actions slot (Help, AI Suggest, etc.)
  • Command bar (Save, Reset, Approve buttons)
  • Summary area (Status, watermark, owner info)

Rationale:
  ✓ Single-screen principle: all interactive controls in initial viewport
  ✓ Mobile UX: bottom footer buttons are hard to reach
  ✓ Information density: header/command-bar conveys status
  ✓ Eliminates wasted ~48px footer space

Example: Move button actions from <template #footer> to <template #commandBar>

Reference: Session 2026-08-16, responsive design standardization

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:22:39 +09:00
kjh2064 66d0788cfa docs: update responsive design standard - all layouts standardized (v1.1)
- FormPageLayout, ReviewWorkbenchLayout, OperationsConsoleLayout:  FIXED
- PageLayout footer:  FIXED
- CrudWorkspaceLayout:  COMPLIANT (already using CSS variables)
- DashboardLayout, AppShellLayout:  FIXED

All 7 layouts now use:
  • CSS variables for widths (no hardcoded values)
  • Unified 1100px tablet breakpoint (768px mobile)
  • Proper height propagation (flex: 1 + min-height: 0)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:17:06 +09:00
kjh2064 5e686a0613 fix(fe): complete responsive design standardization for all layouts
- DashboardLayout: breakpoint 900px → 1100px
- AppShellLayout: hardcoded 16rem → var(--ks-sidebar-width), breakpoint 900px → 1100px
- CrudWorkspaceLayout: already compliant (CSS variables + 1100px)

All 7 layouts now use:
   CSS variables (no hardcoded widths)
   Unified breakpoints (1100px tablet, 768px mobile)
   Flex: 1 / min-height: 0 height propagation

Reference: docs/FRONTEND-RESPONSIVE-DESIGN-STANDARD.md

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:16:47 +09:00
kjh2064 ffc1f5b1b5 fix(fe): responsive design standardization - CSS variables and unified breakpoints
- FormPageLayout: hardcoded minmax(18rem, 26rem) → var(--ks-preview-width)
- ReviewWorkbenchLayout: hardcoded minmax values → var(--ks-detail-width) + var(--ks-aside-width)
- OperationsConsoleLayout: hardcoded minmax(18rem, 28rem) → var(--ks-detail-width)
- Unified all breakpoints: 950px/1000px/1200px → 1100px (tablet), 768px (mobile)
- PageLayout: footer sticky overflow issue fixed (flex: 0 0 auto)

Fixes responsive design for all screen sizes (768px mobile → 1920px fullHD → 2560px 4K).
Reference: docs/FRONTEND-RESPONSIVE-DESIGN-STANDARD.md

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:12:21 +09:00
kjh2064 4d45d8c7f0 fix(fe): add height propagation to FormPageLayout - standardize form pages
- Add flex: 1; min-height: 0; height: 100% to .ks-form-layout
- Add overflow-y: auto; min-height: 0 to form/preview panes
- Ensures single-screen principle for form-based pages
- Affects: MarketDataIngestion, EditFormPage, and similar layouts
2026-08-16 00:04:56 +09:00
kjh2064 09abf45c13 docs: add ADR-LAYOUT-HEIGHT-PROPAGATION standard
- Defines height propagation chain for all pages
- Establishes PageLayout → QueryBoundary → Content pattern
- Documents KsSplitter master-detail implementation
- Includes verification checklist for new pages
- Rationale: flex children need 'min-height: 0' to respect parent constraints
2026-08-16 00:03:17 +09:00
kjh2064 4ff5aaf97f fix(fe): add flex height constraint to .request-detail - prevent overflow 2026-08-16 00:01:04 +09:00
kjh2064 05e279174f refactor(fe): migrate ApprovalQueue to KsSplitter - standardize master-detail layout
- Replace custom grid layout with KsSplitter component
- Add storageKey to prevent ratio conflicts with other pages
- Remove dead .content CSS class
- Update .request-list height constraint (flex: 1 → height: 100%)
- Maintain overflow-y: auto for scrollable panes
- Simplifies code by ~50 lines, adds drag-to-resize functionality
2026-08-15 23:59:26 +09:00
kjh2064 a1eccadca1 style(fe): add standard flex & grid layout utility classes - .ks-flex-column-1, .ks-flex-row-1, .ks-overflow-auto 2026-08-15 23:56:34 +09:00
kjh2064 b299939cb8 fix(fe): remove max-height constraint on approval request list - single screen fit 2026-08-15 23:50:53 +09:00
kjh2064 61ca97956e fix(fe): enforce flex layout for .ks-stack - grid grid display working 2026-08-15 23:48:39 +09:00
kjh2064 c1c55e2dce fix(fe): enforce grid height to fill available viewport space
ISSUE: Grid height was constrained to min-height: 220px, leaving large
unused space on page (3 rows visible, lots of empty area below).

PRINCIPLE: Grid must expand to fill available vertical space in viewport.

CHANGES:
ModelOperationTable.vue (.grid-wrapper)
- Removed: min-height: 220px (artificial constraint)
- Added: height: 100%
- Added: min-height: 0 (critical for flex overflow behavior)

RESULT: Grid now spans full available height in flex container,
utilizing screen space efficiently.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:41:27 +09:00
kjh2064 8ea0bf4d99 fix(fe): enforce single-screen viewport principle for ApprovalQueue
PRINCIPLE: First load must fit within single viewport (no scroll required,
excluding dashboard summary section).

CHANGES:
1. ReviewWorkbenchLayout.vue
   - Changed: height: calc(100vh - 220px) → height: 100%
   - Reason: calc() was hardcoded to fixed pixels, not respecting parent flex layout
   - Added: min-height: 0 (critical for flex overflow behavior)

2. ApprovalQueue.vue (.content)
   - Added: height: 100% + min-height: 0

3. ApprovalQueue.vue (.detail-panel)
   - Removed: max-height: 700px (was hard limit, causing overflow)
   - Added: height: 100% + min-height: 0

RESULT: Page now fits single viewport without scroll.
Individual panels (list, detail) maintain internal scroll as needed.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:32:03 +09:00