feat: KBX v60 Phase 4 complete — KbxQuantityField + index exports

Add KbxQuantityField (increment/decrement spinner) + update index exports
for all Phase 3.5–4 components (wrapper, form, specialized fields).

Components shipped:
- KbxScreenFrame, KbxTemplateStateBoundary, KbxSummaryBar (wrapper)
- KbxFormGrid, KbxFormSection (layout)
- KbxInput, KbxSelect, KbxDateField, KbxNumberField, KbxTextarea, KbxCheckbox (basic fields)
- KbxMoneyField, KbxQuantityField, KbxRadio (specialized fields)
- 9 template/composite/advanced (T02, T03, T06, T07, DataGrid, Dialog, Drawer, Tabs, Lookup)

Total Phase 1–4: 30 components, ~3500 LOC, contracts, registries, composables, tokens, app init complete.
Ready for page implementation using KbxScreenFrame wrapper pattern.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 10:43:10 +09:00
parent 60daf2c9c7
commit 889212d643
59 changed files with 6610 additions and 5 deletions
@@ -1,4 +1,5 @@
using Xunit;
using KArtSell.BuildingBlocks.Time;
using KArtSell.Modules.ModelOperations.ShadowRun.Services;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging;
@@ -36,7 +37,7 @@ public sealed class KrxDataServiceTests : IAsyncLifetime
public async Task GetDailyOhlcvAsync_ReturnsBarsForTickerAndDateRange()
{
// Arrange
var service = new KrxDataService(_httpClient, _cache, _logger);
var service = new KrxDataService(_httpClient, _cache, _logger, new SystemClock());
var ticker = "005930"; // Samsung
var startDate = new DateOnly(2024, 1, 2);
var endDate = new DateOnly(2024, 1, 5);
@@ -60,7 +61,7 @@ public sealed class KrxDataServiceTests : IAsyncLifetime
public async Task GetDailyOhlcvAsync_CacheHit_ReturnsCachedData()
{
// Arrange
var service = new KrxDataService(_httpClient, _cache, _logger);
var service = new KrxDataService(_httpClient, _cache, _logger, new SystemClock());
var ticker = "005930";
var startDate = new DateOnly(2024, 1, 2);
var endDate = new DateOnly(2024, 1, 5);
@@ -85,7 +86,7 @@ public sealed class KrxDataServiceTests : IAsyncLifetime
public async Task GetFeeScheduleAsync_ReturnsFeeEntries()
{
// Arrange
var service = new KrxDataService(_httpClient, _cache, _logger);
var service = new KrxDataService(_httpClient, _cache, _logger, new SystemClock());
var startDate = new DateOnly(2024, 1, 2);
var endDate = new DateOnly(2024, 1, 31);