Commit Graph

561 Commits

Author SHA1 Message Date
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
kjh2064 a6659bc840 fix(fe): add width 100% to .filters - ensure filters span full container width
CRITICAL FIX: Filters container must explicitly set width: 100% to span
the full parent width and prevent content-based shrink-to-fit.

Without width: 100%, .filters collapses to content width, causing
filter inputs to wrap to multiple lines when parent container width
changes.

Added 'width: 100%;' to .filters in:
- ModelsList.vue
- ShadowRunQueue.vue
- ApprovalQueue.vue
- DataQualityPage.vue

Result: Filters now correctly span full width and display on single line.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:28:30 +09:00
kjh2064 fada81f216 style(fe): fix filter layout - add display flex to .filters
CRITICAL FIX: Restored .filters { display: flex } to all pages.

Previous commit removed this necessary style, causing filters to
wrap to 2 lines instead of staying inline.

All filter sections now display in a single line with:
- display: flex
- align-items: center
- gap: var(--ks-space-3)

This ensures:
- Input fields stay inline (1 line)
- 52px filter height maintained
- 34px input height maintained
- Standard layout across all pages

Affected pages:
- ModelsList.vue
- ShadowRunQueue.vue
- ApprovalQueue.vue
- DataQualityPage.vue (already had this)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:18:59 +09:00
kjh2064 33df3abbf4 style(fe): remove redundant input styles - use PageLayout defaults
Removed duplicate input field styling from individual pages:
- ModelsList.vue: removed .input height/padding/border styles
- ShadowRunQueue.vue: removed .input height/padding/border styles
- ApprovalQueue.vue: removed .filters and .input styles

PageLayout now provides the authoritative source for input styling:
- All inputs in .ks-page__filters use consistent 34px height
- Padding: 0 0.75rem
- Border-radius: 4px
- Box-sizing: border-box

Individual pages now only define width constraints (max-width: 350px for search).

This applies the DRY principle - single source of truth for filter input
styling across all pages. Reduces code duplication and improves
maintainability.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:16:39 +09:00
kjh2064 1e48b4987d style(fe): centralize filter input standardization in PageLayout
PageLayout now provides default styles for all filter inputs:
- Height: 34px
- Padding: 0 0.75rem
- Line-height: 34px
- Border-radius: 4px
- Box-sizing: border-box

This eliminates the need for each page to redefine input styles.
Individual pages now only override width constraints (search-input max-width).

Aligns with DRY principle - single source of truth for input styling.

DataQualityPage:
- Added scoped styles for search-input max-width (350px)

Future: Consider extracting filter inputs into dedicated components
(<KsFilterInput>, <KsFilterSelect>) for even better reusability.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:15:51 +09:00
kjh2064 4ec9af9b7c style(fe): standardize filter inputs in ApprovalQueue page
- Input height: 34px (standard KBX compact)
- Padding: 0 0.75rem
- Line-height: 34px for vertical centering
- Box-sizing: border-box for consistent sizing
- Change filters from grid to flex layout
- Remove margin-bottom (handled by PageLayout)
- Filter gap: var(--ks-space-3) (matches other pages)

Aligns with PageLayout + ModelsList + ShadowRunQueue standardization.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:14:41 +09:00
kjh2064 00a4840eb3 style(fe): standardize filter inputs in ShadowRunQueue page
- Input height: 34px (standard KBX compact)
- Search input: max-width 350px (matches ModelsList)
- Padding: 0 0.75rem
- Line-height: 34px for vertical centering
- Box-sizing: border-box for consistent sizing
- Status select: min-width 150px

Aligns with PageLayout + ModelsList standardization.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:13:25 +09:00
kjh2064 60722576a6 style(fe): standardize filter section height across all pages
PageLayout:
- Filter section: min-height 52px (standard height)
- Display: flex with center alignment
- Consistent gap between elements

ModelsList:
- Filter container: align-items center
- Remove bottom margin (handled by PageLayout)

Ensures all pages have consistent filter bar heights
and alignment without per-page CSS adjustments.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:04:59 +09:00
kjh2064 9223f5d288 style(fe): set max-width for search input field
- Search input: max-width 350px (standard size)
- Prevents oversized input fields across different screen sizes
- Maintains responsive min-width 200px

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:04:03 +09:00
kjh2064 83b8f2e72f style(fe): apply theme-aware colors to SkeletonLoader
- Light theme: neutral-100/200 with white background
- Dark theme: dark grays (2d3748/4a5568) with dark background
- Uses CSS variables for dark mode support
- Shimmer animation adapts to theme
- Automatic light/dark switching via prefers-color-scheme

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:01:43 +09:00
kjh2064 8f52521a79 refactor(fe): implement responsive flex-based layout for ModelsList
- Grid height: height: 100% (leverages PageLayout flex)
- Filter inputs: Standard 34px height (KBX compact)
- Removes hardcoded calc() and max/min constraints
- Automatically adjusts to viewport/container changes
- No manual adjustments needed per screen size

This allows the component to scale responsively within
the PageLayout flex container without additional CSS.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:00:55 +09:00
kjh2064 7d835372fb style(fe): apply KBX design token standardization to ModelsList
- Filter inputs: Use KBX tokens for height, padding, font-size, border-radius
- Grid container: Dynamic height (calc 100vh-400px) with min/max constraints
- Consistent spacing with KBX spacing tokens
- Box-sizing: border-box for consistent sizing
- Prevents grid overflow beyond viewport

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 22:59:02 +09:00
kjh2064 8a3ee0a1d7 feat(fe): implement working ModelsList grid with mock data
- Simplified data fetching (removed TanStack Query for now)
- Added direct mock API client in component
- Fixed state management (isLoading, isError, modelsData)
- Grid now renders with 3 sample model records
- Updated v-if conditions for loading/error/empty states
- Added grid container height and filter styling

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 22:56:04 +09:00
kjh2064 48a3da30d0 fix(fe): remove duplicate script setup block in ModelsList.vue
Removed the incomplete first <script setup> block that was causing
Vite plugin errors. The complete implementation in the second block
already contains all necessary logic.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 22:48:18 +09:00
kjh2064 48cd7d82ee style(fe): enforce 100% viewport-fit zero-scroll dynamic height calculation for ModelOperationTable AG Grid 2026-08-15 22:37:49 +09:00
kjh2064 f73c1e3453 fix(fe): set explicit container height for KsDataGrid wrapper in ModelOperationTable 2026-08-15 22:36:48 +09:00
kjh2064 43e3f88368 feat(fe): replace custom HTML table with standard KsDataGrid in ModelOperationTable for 100% AG Grid & constitution compliance 2026-08-15 22:35:56 +09:00
kjh2064 319ee354d3 style(fe): fix contrast and theme token bindings for Page Title and Command Bar in PageLayout 2026-08-15 22:34:10 +09:00
kjh2064 7ad5b96bf8 style(fe): align Page Header strictly with KBX UX Standard (Breadcrumb/Title on left, Help/AI on right) 2026-08-15 22:32:58 +09:00
kjh2064 ea2f251fb8 feat(fe): implement dedicated KBX Command Bar row in PageLayout for 100% UX Standard §3/§5 alignment 2026-08-15 22:30:58 +09:00
kjh2064 2b1dc13852 style(fe): standardize Model Operations & Versioning page UI components and layout 2026-08-15 22:28:51 +09:00
kjh2064 ecc5c641dc style(fe): move F3 search button to Page Action Toolbar (#actions) in ModelList page for 100% KBX Command Bar standard compliance 2026-08-15 22:27:04 +09:00
kjh2064 135d0fdded feat(fe): add F3 search button and keyboard shortcut to ModelList page filter bar 2026-08-15 22:25:12 +09:00
kjh2064 fe96bae516 feat(fe): implement KsSplitter with resizer handle and localStorage ratio persistence for master-detail pages 2026-08-15 22:24:23 +09:00
kjh2064 7893b2020e fix(fe): conditionally render filters slot container in MasterDetailCrudPage and BatchOperationsPageV2 2026-08-15 22:22:01 +09:00
kjh2064 292572e845 revert(fe): restore original search input bar in header 2026-08-15 22:20:36 +09:00
kjh2064 3e6f333ff8 style(fe): apply KBX Design System Side Navigation standards (Expanded 220px, Collapsed 56px, max 2-depth) 2026-08-15 22:19:49 +09:00
kjh2064 8d8355b323 style(fe): refine PageLayout filters container to inline toolbar without heavy card borders 2026-08-15 22:18:34 +09:00
kjh2064 5aeadb79c1 style(fe): restore Quick Links Toolbar in header according to user specifications 2026-08-15 22:17:52 +09:00
kjh2064 cc5b4757c4 style(fe): align tabs bar background with central canvas token var(--ks-color-canvas) 2026-08-15 22:14:36 +09:00
kjh2064 1476225c21 style(fe): standardize Tabs bar, Help button badge, and Header Quick Menu dropdown 2026-08-15 22:13:50 +09:00