@hjmds/design-contracts 1.46.1 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/behaviors.d.ts +2 -1
  2. package/dist/behaviors.d.ts.map +1 -1
  3. package/dist/bottom-navigation.d.ts +4 -0
  4. package/dist/bottom-navigation.d.ts.map +1 -1
  5. package/dist/bottom-navigation.js +12 -0
  6. package/dist/bottom-navigation.js.map +1 -1
  7. package/dist/card.d.ts +2 -2
  8. package/dist/card.d.ts.map +1 -1
  9. package/dist/card.js +3 -2
  10. package/dist/card.js.map +1 -1
  11. package/dist/carousel.d.ts +1 -0
  12. package/dist/carousel.d.ts.map +1 -1
  13. package/dist/carousel.js +1 -0
  14. package/dist/carousel.js.map +1 -1
  15. package/dist/catalog.d.ts +151 -31
  16. package/dist/catalog.d.ts.map +1 -1
  17. package/dist/catalog.js +14 -13
  18. package/dist/catalog.js.map +1 -1
  19. package/dist/color-picker.d.ts +51 -1
  20. package/dist/color-picker.d.ts.map +1 -1
  21. package/dist/color-picker.js +56 -2
  22. package/dist/color-picker.js.map +1 -1
  23. package/dist/component-recipes.d.ts +28 -10
  24. package/dist/component-recipes.d.ts.map +1 -1
  25. package/dist/component-recipes.js +28 -20
  26. package/dist/component-recipes.js.map +1 -1
  27. package/dist/conversation-row.d.ts +1 -1
  28. package/dist/conversation-row.d.ts.map +1 -1
  29. package/dist/conversation-row.js +2 -1
  30. package/dist/conversation-row.js.map +1 -1
  31. package/dist/data-table.d.ts +12 -0
  32. package/dist/data-table.d.ts.map +1 -1
  33. package/dist/data-table.js +2 -0
  34. package/dist/data-table.js.map +1 -1
  35. package/dist/date-range.d.ts +122 -3
  36. package/dist/date-range.d.ts.map +1 -1
  37. package/dist/date-range.js +139 -5
  38. package/dist/date-range.js.map +1 -1
  39. package/dist/icon.d.ts +2 -1
  40. package/dist/icon.d.ts.map +1 -1
  41. package/dist/icon.js +2 -0
  42. package/dist/icon.js.map +1 -1
  43. package/dist/recipes.d.ts +1 -0
  44. package/dist/recipes.d.ts.map +1 -1
  45. package/dist/recipes.js +1 -0
  46. package/dist/recipes.js.map +1 -1
  47. package/dist/screen-patterns.d.ts +33 -2
  48. package/dist/screen-patterns.d.ts.map +1 -1
  49. package/dist/screen-patterns.js +27 -2
  50. package/dist/screen-patterns.js.map +1 -1
  51. package/dist/share-sheet.d.ts +115 -0
  52. package/dist/share-sheet.d.ts.map +1 -0
  53. package/dist/share-sheet.js +62 -0
  54. package/dist/share-sheet.js.map +1 -0
  55. package/dist/version.d.ts +1 -1
  56. package/dist/version.js +1 -1
  57. package/dist/version.js.map +1 -1
  58. package/docs/bottom-navigation.md +16 -0
  59. package/docs/color-picker.md +24 -19
  60. package/docs/dialog.md +2 -3
  61. package/docs/generated/component-maturity.md +12 -12
  62. package/docs/generated/renderer-evidence.json +71 -19
  63. package/docs/generated/renderer-evidence.md +15 -14
  64. package/docs/generated/showcase-manifest.json +35 -21
  65. package/docs/optional-adapters.md +21 -5
  66. package/docs/stable-core.md +37 -0
  67. package/docs/usage/README.md +14 -10
  68. package/docs/usage/SELECTION.md +109 -0
  69. package/docs/usage/components/avatar.md +31 -6
  70. package/docs/usage/components/badge.md +10 -1
  71. package/docs/usage/components/bottom-navigation.md +16 -0
  72. package/docs/usage/components/button.md +11 -0
  73. package/docs/usage/components/card.md +6 -0
  74. package/docs/usage/components/chat-message.md +9 -1
  75. package/docs/usage/components/chat-room-members.md +4 -0
  76. package/docs/usage/components/chat-screen.md +10 -1
  77. package/docs/usage/components/color-picker.md +65 -28
  78. package/docs/usage/components/comment-thread-screen.md +16 -1
  79. package/docs/usage/components/conversation-list-screen.md +81 -0
  80. package/docs/usage/components/conversation-row.md +5 -1
  81. package/docs/usage/components/data-table.md +2 -0
  82. package/docs/usage/components/date-range-picker.md +15 -5
  83. package/docs/usage/components/dialog.md +3 -3
  84. package/docs/usage/components/event-attendance-card.md +4 -0
  85. package/docs/usage/components/follow-list-screen.md +109 -0
  86. package/docs/usage/components/follow-profile-card.md +4 -0
  87. package/docs/usage/components/list-row.md +6 -0
  88. package/docs/usage/components/menu.md +12 -0
  89. package/docs/usage/components/notice.md +8 -3
  90. package/docs/usage/components/notification-inbox-screen.md +10 -0
  91. package/docs/usage/components/notification-row.md +4 -0
  92. package/docs/usage/components/page-indicator.md +1 -0
  93. package/docs/usage/components/profile-summary.md +32 -3
  94. package/docs/usage/components/section.md +2 -2
  95. package/docs/usage/components/settings-screen.md +1 -1
  96. package/docs/usage/components/share-sheet.md +139 -0
  97. package/docs/usage/components/shared-transition-element.md +1 -1
  98. package/docs/usage/components/sheet.md +1 -0
  99. package/docs/usage/components/statistic.md +1 -1
  100. package/docs/usage/compositions/interaction-adapters.md +2 -2
  101. package/docs/usage/compositions/optional-adapters.md +2 -2
  102. package/docs/usage/compositions/web-additions.md +5 -5
  103. package/docs/usage/screens/common-comments.md +1 -0
  104. package/docs/usage/screens/common-conversation-list.md +22 -1
  105. package/docs/usage/screens/common-follow-list.md +87 -0
  106. package/docs/usage/screens/common-settings.md +23 -0
  107. package/package.json +7 -1
@@ -1,6 +1,6 @@
1
1
  /** Conversation previews reserve metadata and unread status while truncating the message. */
2
2
  export declare const conversationRowRecipe: {
3
- readonly avatarSize: 56;
3
+ readonly avatarSize: 48;
4
4
  readonly unreadSize: 10;
5
5
  readonly gap: 12;
6
6
  readonly paddingInline: 16;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-row.d.ts","sourceRoot":"","sources":["../src/conversation-row.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,eAAO,MAAM,qBAAqB;;;;;;;;;;CAYxB,CAAC"}
1
+ {"version":3,"file":"conversation-row.d.ts","sourceRoot":"","sources":["../src/conversation-row.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,eAAO,MAAM,qBAAqB;;;;;;;;;;CAaxB,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import { fontWeight, spacing, typography } from "./foundations.js";
2
2
  /** Conversation previews reserve metadata and unread status while truncating the message. */
3
3
  export const conversationRowRecipe = {
4
- avatarSize: 56,
4
+ // Standard member portrait (2026-10-25); message bubbles retain their compact avatar recipe.
5
+ avatarSize: 48,
5
6
  unreadSize: 10,
6
7
  gap: spacing.sm,
7
8
  paddingInline: spacing.md,
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-row.js","sourceRoot":"","sources":["../src/conversation-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnE,6FAA6F;AAC7F,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,GAAG,EAAE,OAAO,CAAC,EAAE;IACf,aAAa,EAAE,OAAO,CAAC,EAAE;IACzB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,CAAC;IACb,mGAAmG;IACnG,6DAA6D;IAC7D,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU;IACxC,iBAAiB,EAAE,UAAU,CAAC,QAAQ;IACtC,mBAAmB,EAAE,UAAU,CAAC,QAAQ;CAChC,CAAC","sourcesContent":["import { fontWeight, spacing, typography } from \"./foundations.js\";\n\n/** Conversation previews reserve metadata and unread status while truncating the message. */\nexport const conversationRowRecipe = {\n avatarSize: 56,\n unreadSize: 10,\n gap: spacing.sm,\n paddingInline: spacing.md,\n paddingBlock: 10,\n contentGap: 2,\n // Read rows use the title weight; unread rows step up to semibold, the heaviest non-display weight\n // (800/700 before the 2026-10-17 lighter scale, \"굵기 좀더 줄여\").\n titleWeight: typography.title.fontWeight,\n unreadTitleWeight: fontWeight.semibold,\n unreadPreviewWeight: fontWeight.semibold,\n} as const;\n"]}
1
+ {"version":3,"file":"conversation-row.js","sourceRoot":"","sources":["../src/conversation-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnE,6FAA6F;AAC7F,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,6FAA6F;IAC7F,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,GAAG,EAAE,OAAO,CAAC,EAAE;IACf,aAAa,EAAE,OAAO,CAAC,EAAE;IACzB,YAAY,EAAE,EAAE;IAChB,UAAU,EAAE,CAAC;IACb,mGAAmG;IACnG,6DAA6D;IAC7D,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU;IACxC,iBAAiB,EAAE,UAAU,CAAC,QAAQ;IACtC,mBAAmB,EAAE,UAAU,CAAC,QAAQ;CAChC,CAAC","sourcesContent":["import { fontWeight, spacing, typography } from \"./foundations.js\";\n\n/** Conversation previews reserve metadata and unread status while truncating the message. */\nexport const conversationRowRecipe = {\n // Standard member portrait (2026-10-25); message bubbles retain their compact avatar recipe.\n avatarSize: 48,\n unreadSize: 10,\n gap: spacing.sm,\n paddingInline: spacing.md,\n paddingBlock: 10,\n contentGap: 2,\n // Read rows use the title weight; unread rows step up to semibold, the heaviest non-display weight\n // (800/700 before the 2026-10-17 lighter scale, \"굵기 좀더 줄여\").\n titleWeight: typography.title.fontWeight,\n unreadTitleWeight: fontWeight.semibold,\n unreadPreviewWeight: fontWeight.semibold,\n} as const;\n"]}
@@ -384,6 +384,18 @@ export declare const dataTableFamilyRecipe: {
384
384
  alpha?: number;
385
385
  }>;
386
386
  };
387
+ readonly currentPeriod: {
388
+ readonly background: Readonly<{
389
+ source: "theme";
390
+ key: "surfaceSelected";
391
+ alpha?: number;
392
+ }>;
393
+ readonly color: Readonly<{
394
+ source: "theme";
395
+ key: "text";
396
+ alpha?: number;
397
+ }>;
398
+ };
387
399
  };
388
400
  export type LineScoreTeam = Readonly<{
389
401
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../src/data-table.ts"],"names":[],"mappings":"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"}
@@ -367,6 +367,8 @@ export const dataTableFamilyRecipe = {
367
367
  * canvas-colored selected row read as a white gap that split the table (2026-10-17 review E17).
368
368
  */
369
369
  highlight: { background: semanticColors.surface.brand },
370
+ // 2026-10-26: current inning follows category selection; my-team emphasis retains its brand role.
371
+ currentPeriod: { background: semanticColors.selection.background, color: semanticColors.selection.content },
370
372
  };
371
373
  /**
372
374
  * Period columns are padded to `minPeriods` (9 innings) and extend for extra innings; totals follow.
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","sourceRoot":"","sources":["../src/data-table.ts"],"names":[],"mappings":"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","sourcesContent":["import { accentColor, themeColor, type ColorReference } from \"./color-references.js\";\nimport type {\n AsyncCollectionState,\n BehaviorContract,\n CheckboxState,\n CollectionKey,\n CollectionSelectionModel,\n} from \"./behaviors.js\";\nimport { collectionItemContract, focusIndicatorContract } from \"./component-contracts.js\";\nimport { control, fontWeight, spacing, type FontWeightValue, type TextVariant } from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\n\nexport type DataTableAlign = \"start\" | \"center\" | \"end\";\n\nexport type DataTableColumnDescriptor<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: Key;\n /** Visible column header text; also the columnheader's accessible name. */\n header: string;\n align?: DataTableAlign;\n sortable?: boolean;\n /** Layout hint only (px or flex-basis); renderers may ignore or clamp it. */\n width?: number;\n /**\n * First press sorts descending (TanStack Table `sortDescFirst`). Stat tables read \"highest first\";\n * lower-is-better columns (ERA, rank) leave it false. Added 2026-10-14 with the Native renderer.\n */\n sortDescFirst?: boolean;\n /**\n * Keeps the column visible while the others scroll horizontally (AG Grid / TanStack column\n * pinning, start edge only). Only a leading run of pinned columns is honored.\n */\n pinned?: \"start\";\n}>;\n\nexport const dataTableColumnDefaults = {\n align: \"start\",\n sortable: false,\n} as const satisfies Readonly<{ align: DataTableAlign; sortable: boolean }>;\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`DataTable ${field} must not be empty`);\n }\n}\n\nexport function validateDataTableColumns<Key extends CollectionKey>(\n columns: readonly DataTableColumnDescriptor<Key>[],\n): void {\n if (columns.length === 0) {\n throw new TypeError(\"DataTable must declare at least one column\");\n }\n const ids = new Set<Key>();\n for (const column of columns) {\n assertNonEmpty(column.id, \"column id\");\n if (ids.has(column.id)) {\n throw new TypeError(`Duplicate DataTable column id: ${column.id}`);\n }\n ids.add(column.id);\n assertNonEmpty(column.header, `column \"${column.id}\" header`);\n if (column.width !== undefined && (!Number.isFinite(column.width) || column.width <= 0)) {\n throw new RangeError(`DataTable column \"${column.id}\" width must be a positive finite number`);\n }\n }\n}\n\n/**\n * Row identity and selection deliberately do NOT reuse `CollectionItemDescriptor`\n * verbatim: a table row has no single visible `label`/`textValue` the way a\n * Menu or Select item does — its \"content\" is however many columns the\n * product renders per row. Only the parts of the Collection base contract\n * that are genuinely row-shaped (`CollectionKey` identity, `disabled`) apply.\n */\nexport type DataTableRowDescriptor<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: Key;\n disabled?: boolean;\n /** Sub-row nesting (TanStack `depth`): 1 indents a substitute under a starter. 0–3. */\n depth?: number;\n}>;\n\nexport function validateDataTableRows<Key extends CollectionKey>(\n rows: readonly DataTableRowDescriptor<Key>[],\n): void {\n const ids = new Set<Key>();\n for (const row of rows) {\n assertNonEmpty(row.id, \"row id\");\n if (ids.has(row.id)) {\n throw new TypeError(`Duplicate DataTable row id: ${row.id}`);\n }\n ids.add(row.id);\n if (row.depth !== undefined && (!Number.isInteger(row.depth) || row.depth < 0 || row.depth > 3)) {\n throw new RangeError(`DataTable row \"${String(row.id)}\" depth must be an integer from 0 to 3`);\n }\n }\n}\n\n/** Row selection is the unmodified Collection base contract — no DataTable-only selection shape. */\nexport type DataTableSelection<Key extends CollectionKey = CollectionKey> =\n CollectionSelectionModel<Key>;\n\n/**\n * Header \"select all\" state as the same tri-state `CheckboxState` the\n * selection column's checkbox already renders (check/dash), instead of a new\n * `\"none\" | \"some\" | \"all\"` enum the recipe would have to translate again.\n * Disabled rows are excluded from both the denominator and the count.\n */\nexport function resolveDataTableSelectAllState<Key extends CollectionKey>(\n rows: readonly DataTableRowDescriptor<Key>[],\n selectedKeys: ReadonlySet<Key>,\n): CheckboxState {\n const selectable = rows.filter((row) => !row.disabled);\n if (selectable.length === 0) return false;\n const selectedCount = selectable.filter((row) => selectedKeys.has(row.id)).length;\n if (selectedCount === 0) return false;\n if (selectedCount === selectable.length) return true;\n return \"mixed\";\n}\n\n/**\n * Values are the literal `aria-sort` vocabulary (minus `\"none\"`, which is\n * `null`) so the Web renderer passes them through without a translation\n * table — the same \"pass the platform value through\" choice Slider makes\n * for `valueText`.\n */\nexport type DataTableSortDirection = \"ascending\" | \"descending\";\n\nexport type DataTableSortState<Key extends CollectionKey = CollectionKey> = Readonly<{\n columnId: Key;\n direction: DataTableSortDirection;\n}> | null;\n\nexport type DataTableSortCycle = \"two-state\" | \"three-state\";\n\nexport const dataTableDefaults = {\n sortCycle: \"three-state\",\n} as const satisfies Readonly<{ sortCycle: DataTableSortCycle }>;\n\nexport function validateDataTableSortState<Key extends CollectionKey>(\n state: DataTableSortState<Key>,\n columns: readonly DataTableColumnDescriptor<Key>[],\n): void {\n if (state === null) return;\n if (state.direction !== \"ascending\" && state.direction !== \"descending\") {\n throw new TypeError(`Unsupported DataTable sort direction: ${String(state.direction)}`);\n }\n const column = columns.find((candidate) => candidate.id === state.columnId);\n if (!column) {\n throw new TypeError(`DataTable sort references unknown column id: ${String(state.columnId)}`);\n }\n if (!column.sortable) {\n throw new TypeError(`DataTable column \"${String(state.columnId)}\" is not sortable`);\n }\n}\n\n/**\n * Pure toggle: does not read or write product data. The product still owns\n * actually re-sorting rows (Combobox's local/external filtering split is the\n * same boundary — HJM judges intent, never executes the data operation).\n */\nexport function getNextDataTableSortState<Key extends CollectionKey>(\n current: DataTableSortState<Key>,\n columnId: Key,\n cycle: DataTableSortCycle = dataTableDefaults.sortCycle,\n firstDirection: DataTableSortDirection = \"ascending\",\n): DataTableSortState<Key> {\n const second: DataTableSortDirection = firstDirection === \"ascending\" ? \"descending\" : \"ascending\";\n if (current === null || current.columnId !== columnId) {\n return { columnId, direction: firstDirection };\n }\n if (current.direction === firstDirection) {\n return { columnId, direction: second };\n }\n return cycle === \"three-state\" ? null : { columnId, direction: firstDirection };\n}\n\n/** The first direction a column's header applies, from `sortDescFirst`. */\nexport function dataTableFirstSortDirection(column: Pick<DataTableColumnDescriptor, \"sortDescFirst\">): DataTableSortDirection {\n return column.sortDescFirst ? \"descending\" : \"ascending\";\n}\n\nexport type DataTableSortValue = number | string | null | undefined;\n\n/**\n * Sort key for a displayed cell string: \"0.340\", \".340\", \"36 ⅓\", \"13.5억\", \"61.0%\" → numbers;\n * text such as \"7승0무3패\" or names stay strings; \"—\", \"-\" and \"\" are missing.\n */\nexport function toDataTableSortValue(value: unknown): DataTableSortValue {\n if (value === null || value === undefined) return null;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n const text = String(value).trim();\n if (!text || text === \"—\" || text === \"-\" || text === \"–\") return null;\n // Two or more letters (any script) mean a label, not a number with a unit.\n if (/\\p{L}.*\\p{L}/u.test(text.replace(/[⅓⅔]/g, \"\"))) return text;\n const number = Number.parseFloat(text.replace(/[^0-9.+-]/g, \"\"));\n return Number.isFinite(number) ? number : text;\n}\n\n/**\n * Pure comparison: numbers numerically, strings with `localeCompare`, numbers before strings.\n * Missing values are not compared here; `sortDataTableRows` always sinks them.\n */\nexport function compareDataTableValues(a: Exclude<DataTableSortValue, null | undefined>, b: Exclude<DataTableSortValue, null | undefined>, locale?: string): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"number\") return -1;\n if (typeof b === \"number\") return 1;\n return a.localeCompare(b, locale);\n}\n\n/**\n * Optional row-model helper (TanStack `getSortedRowModel` with `sortUndefined: \"last\"`): stable,\n * missing values always last in both directions. 1.20 left all sorting to products; Yajalal and\n * other stat tables reimplemented the same rules, so the shared helper exists now. Products with\n * server-side sorting keep calling `getNextDataTableSortState` only.\n */\nexport function sortDataTableRows<Row, Key extends CollectionKey>(\n rows: readonly Row[],\n sort: DataTableSortState<Key>,\n getValue: (row: Row, columnId: Key) => DataTableSortValue,\n options: Readonly<{ locale?: string }> = {},\n): Row[] {\n const indexed = rows.map((row, index) => ({ row, index }));\n if (!sort) return indexed.map(item => item.row);\n const sign = sort.direction === \"ascending\" ? 1 : -1;\n return indexed.sort((x, y) => {\n const a = getValue(x.row, sort.columnId), b = getValue(y.row, sort.columnId);\n const missingA = a === null || a === undefined, missingB = b === null || b === undefined;\n if (missingA || missingB) return missingA === missingB ? x.index - y.index : missingA ? 1 : -1;\n return sign * compareDataTableValues(a, b, options.locale) || x.index - y.index;\n }).map(item => item.row);\n}\n\n/** Leading pinned columns (only an unbroken run from the start is pinned). */\nexport function splitPinnedDataTableColumns<Column extends Pick<DataTableColumnDescriptor, \"pinned\">>(columns: readonly Column[]): Readonly<{ pinned: readonly Column[]; scrolling: readonly Column[] }> {\n let count = 0;\n while (count < columns.length && columns[count]!.pinned === \"start\") count++;\n return { pinned: columns.slice(0, count), scrolling: columns.slice(count) };\n}\n\n/** The whole table's row-loading status — the unmodified Collection base async contract. */\nexport type DataTableAsyncState = AsyncCollectionState;\n\nexport type DataTableDensity = \"compact\" | \"regular\";\n\n/**\n * Reuses `collectionItemContract`'s hover/selected/focus tokens instead of a\n * second set of row-interaction colors — Menu, Select, and DataTable rows\n * stay one visual vocabulary.\n */\nexport const dataTableRecipe = {\n slots: [\n \"root\",\n \"header\",\n \"headerCell\",\n \"sortButton\",\n \"sortIcon\",\n \"row\",\n \"cell\",\n \"selectionCell\",\n \"emptyState\",\n \"errorState\",\n ] as const,\n defaults: { density: \"regular\" },\n density: {\n compact: { paddingVertical: spacing.xs, paddingHorizontal: spacing.sm },\n regular: { paddingVertical: spacing.sm, paddingHorizontal: spacing.md },\n },\n header: {\n background: semanticColors.canvas,\n color: semanticColors.content.secondary,\n textVariant: \"label\",\n fontWeight: fontWeight.medium,\n borderBottom: semanticColors.border.default,\n },\n row: {\n borderBottom: semanticColors.border.subtle,\n hoverBackground: collectionItemContract.highlightedBackground,\n selectedBackground: collectionItemContract.selectedBackground,\n },\n cell: {\n color: semanticColors.content.body,\n textVariant: \"body\",\n },\n sortButton: {\n minTarget: control.minTouchTarget,\n color: semanticColors.content.secondary,\n activeColor: semanticColors.content.brand,\n },\n selectionCell: {\n width: control.minTouchTarget,\n },\n emptyState: {\n color: semanticColors.content.secondary,\n textVariant: \"body\",\n },\n errorState: {\n color: semanticColors.content.danger,\n textVariant: \"body\",\n },\n states: {\n focus: focusIndicatorContract,\n },\n} as const satisfies {\n slots: readonly [\n \"root\",\n \"header\",\n \"headerCell\",\n \"sortButton\",\n \"sortIcon\",\n \"row\",\n \"cell\",\n \"selectionCell\",\n \"emptyState\",\n \"errorState\",\n ];\n defaults: { density: DataTableDensity };\n density: Record<DataTableDensity, { paddingVertical: number; paddingHorizontal: number }>;\n header: {\n background: ColorReference;\n color: ColorReference;\n textVariant: TextVariant;\n fontWeight: FontWeightValue;\n borderBottom: ColorReference;\n };\n row: {\n borderBottom: ColorReference;\n hoverBackground: ColorReference;\n selectedBackground: ColorReference;\n };\n cell: { color: ColorReference; textVariant: TextVariant };\n sortButton: { minTarget: number; color: ColorReference; activeColor: ColorReference };\n selectionCell: { width: number };\n emptyState: { color: ColorReference; textVariant: TextVariant };\n errorState: { color: ColorReference; textVariant: TextVariant };\n states: { focus: typeof focusIndicatorContract };\n};\n\nexport const dataTableFamilyScenarios = [\n \"header-groups-span-contiguous-leaf-columns-and-pad-ungrouped-columns\",\n \"row-groups-insert-a-section-label-before-their-rows\",\n \"cell-tone-and-heat-are-product-decided-semantic-emphasis\",\n \"percentile-rank-flips-for-lower-is-better-stats-and-ties-take-the-midpoint\",\n \"bounded-height-tables-keep-the-header-fixed-while-the-body-scrolls\",\n \"line-score-pads-to-nine-periods-and-extends-for-extra-periods\",\n \"matrix-diagonal-is-a-blank-self-cell\",\n \"comparison-bars-favor-the-better-side-even-when-lower-is-better\",\n] as const;\n\n/**\n * No roving-tabindex grid keyboard navigation (arrow keys between cells):\n * no product using this contract has measured demand for full ARIA-grid\n * traversal, and it is a materially bigger accessibility surface than a\n * sortable header button plus native checkbox/radio tab stops.\n */\nexport const dataTableBehavior = {\n controlled: [\"selection\"],\n inputs: [\"columns\", \"rows\", \"sortState\", \"asyncState\"],\n events: [\"onSortChange\"],\n configuration: { sortCycle: [\"two-state\", \"three-state\"] },\n defaults: dataTableDefaults,\n stateAxes: {\n value: [\"selected\"],\n content: [\"idle\", \"loading\", \"loadingMore\", \"empty\", \"error\"],\n },\n web: {\n roles: [\"table\", \"row\", \"columnheader\", \"cell\", \"button\", \"checkbox\", \"radio\"],\n keyboard: [\"Tab\", \"Enter\", \"Space\"],\n focus: \"native\",\n },\n native: { roles: [\"button\", \"header\"], states: [\"selected\"], actions: [\"activate\"] },\n scenarios: [\n \"sort-desc-first-columns-start-descending-and-cycle-back\",\n \"missing-values-sink-to-the-bottom-in-both-directions\",\n \"pinned-start-columns-stay-visible-while-the-rest-scrolls\",\n \"row-selection-reuses-the-shared-collection-selection-model-unchanged\",\n \"select-all-reuses-the-shared-tri-state-checkbox-value\",\n \"async-state-reuses-the-shared-collection-async-state-unchanged\",\n \"sortable-header-is-a-button-inside-the-columnheader-not-the-header-itself\",\n \"sort-direction-values-pass-through-to-aria-sort-without-translation\",\n \"disabled-rows-are-excluded-from-select-all-accounting\",\n \"pagination-or-load-more-is-composed-beneath-the-table-not-owned-by-it\",\n \"row-expansion-is-not-owned-here-compose-the-disclosure-group-contract-per-row\",\n \"a-data-cell-exposes-at-most-one-focusable-control\",\n \"no-roving-tabindex-grid-navigation-is-implied\",\n ...dataTableFamilyScenarios,\n ],\n} as const satisfies BehaviorContract;\n\n/* ------------------------------------------------------------------------------------------------\n * Table family, 2026-10-14 (user request: research table libraries and absorb several table types).\n * Concepts re-derived, nothing vendored:\n * - column header groups (TanStack Table `getHeaderGroups`, AG Grid column groups),\n * - row groups with a section label and indented sub-rows (AG Grid row grouping, TanStack expanding),\n * - conditional cell tone and percentile heat (AG Grid `cellClassRules`/cellStyle heatmaps,\n * Baseball Savant percentile color: deeper red toward the best, deeper blue toward the worst),\n * - a vertically bounded body with a fixed header (react-native-sticky-table, CSS sticky headers),\n * - sports layouts that products kept hand-building: line score (period columns + totals, MLB/ESPN),\n * cross-table matrix (head-to-head records), and two-sided comparison rows (ESPN matchup).\n * ---------------------------------------------------------------------------------------------- */\n\n/** One header band above leaf columns. Columns not listed in any group get an empty placeholder cell. */\nexport type DataTableColumnGroup<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: string;\n header: string;\n columns: readonly Key[];\n}>;\n\nexport type DataTableHeaderBand = Readonly<{ id: string; header: string | null; span: number; columnIds: readonly string[] }>;\n\n/**\n * Resolves group bands over the given (already pinned-split) column order. A group must cover a\n * contiguous run; columns outside every group become placeholder bands so leaf widths still line up.\n */\nexport function resolveDataTableHeaderBands<Key extends CollectionKey>(\n columns: readonly Pick<DataTableColumnDescriptor<Key>, \"id\">[],\n groups: readonly DataTableColumnGroup<Key>[],\n): DataTableHeaderBand[] {\n const owner = new Map<Key, DataTableColumnGroup<Key>>();\n for (const group of groups) {\n assertNonEmpty(group.id, \"column group id\");\n assertNonEmpty(group.header, `column group \"${group.id}\" header`);\n for (const id of group.columns) {\n if (owner.has(id)) throw new TypeError(`DataTable column \"${String(id)}\" belongs to two groups`);\n owner.set(id, group);\n }\n }\n const bands: { id: string; header: string | null; columnIds: string[] }[] = [];\n for (const column of columns) {\n const group = owner.get(column.id) ?? null;\n const last = bands.at(-1);\n if (group && last && last.id === group.id) { last.columnIds.push(column.id); continue; }\n if (group && bands.some((band) => band.id === group.id)) throw new TypeError(`DataTable column group \"${group.id}\" must be contiguous`);\n bands.push({ id: group ? group.id : `placeholder-${column.id}`, header: group ? group.header : null, columnIds: [column.id] });\n }\n return bands.map((band) => ({ ...band, span: band.columnIds.length }));\n}\n\n/** Labeled row section (e.g. 선발 / 교체, 동부 / 서부). Rows not in any group render first, ungrouped. */\nexport type DataTableRowGroup<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: string;\n label: string;\n rows: readonly Key[];\n}>;\n\nexport type DataTableBodyItem<Key extends CollectionKey = CollectionKey> =\n | Readonly<{ kind: \"group\"; id: string; label: string }>\n | Readonly<{ kind: \"row\"; id: Key }>;\n\n/** Flattens rows + groups into the body order renderers draw. Unknown or duplicated ids throw. */\nexport function resolveDataTableBody<Key extends CollectionKey>(\n rows: readonly DataTableRowDescriptor<Key>[],\n groups: readonly DataTableRowGroup<Key>[] = [],\n): DataTableBodyItem<Key>[] {\n if (groups.length === 0) return rows.map((row) => ({ kind: \"row\", id: row.id }));\n const known = new Set(rows.map((row) => row.id)), placed = new Set<Key>();\n const grouped: DataTableBodyItem<Key>[] = [];\n for (const group of groups) {\n assertNonEmpty(group.id, \"row group id\");\n assertNonEmpty(group.label, `row group \"${group.id}\" label`);\n grouped.push({ kind: \"group\", id: group.id, label: group.label });\n for (const id of group.rows) {\n if (!known.has(id)) throw new TypeError(`DataTable row group \"${group.id}\" references unknown row id: ${String(id)}`);\n if (placed.has(id)) throw new TypeError(`DataTable row \"${String(id)}\" belongs to two row groups`);\n placed.add(id);\n grouped.push({ kind: \"row\", id });\n }\n }\n const loose: DataTableBodyItem<Key>[] = rows.filter((row) => !placed.has(row.id)).map((row) => ({ kind: \"row\", id: row.id }));\n return [...loose, ...grouped];\n}\n\n/**\n * Semantic cell emphasis, decided by the product per cell (AG Grid cellClassRules):\n * `leader` marks a league/table best, `positive`/`negative` a direction, `muted` a non-qualifying value.\n */\nexport type DataTableCellTone = \"leader\" | \"positive\" | \"negative\" | \"muted\";\n\n/** Percentile heat (Savant): `high` side toward the best values, `low` toward the worst; strength 1–3. */\nexport type DataTableCellHeat = Readonly<{ side: \"high\" | \"low\"; strength: 1 | 2 | 3 }>;\n\n/**\n * Percentile rank (0–100, best = 100) of `value` among `sample`. `lowerIsBetter` flips ERA-style stats.\n * Ties take the midpoint rank, missing values return null. A one-value sample is the 50th percentile.\n */\nexport function percentileRank(value: number | null | undefined, sample: readonly (number | null | undefined)[], options: Readonly<{ lowerIsBetter?: boolean }> = {}): number | null {\n if (value === null || value === undefined || !Number.isFinite(value)) return null;\n const values = sample.filter((item): item is number => item !== null && item !== undefined && Number.isFinite(item));\n if (values.length <= 1) return 50;\n let below = 0, equal = 0;\n for (const item of values) {\n const better = options.lowerIsBetter ? item > value : item < value;\n if (item === value) equal++;\n else if (better) below++;\n }\n return Math.round(((below + (equal - 1) / 2) / (values.length - 1)) * 100);\n}\n\n/** Maps a percentile to heat: ≥90/≥75/≥60 high, ≤10/≤25/≤40 low, the middle stays neutral (null). */\nexport function percentileHeat(percentile: number | null): DataTableCellHeat | null {\n if (percentile === null) return null;\n if (percentile >= 90) return { side: \"high\", strength: 3 };\n if (percentile >= 75) return { side: \"high\", strength: 2 };\n if (percentile >= 60) return { side: \"high\", strength: 1 };\n if (percentile <= 10) return { side: \"low\", strength: 3 };\n if (percentile <= 25) return { side: \"low\", strength: 2 };\n if (percentile <= 40) return { side: \"low\", strength: 1 };\n return null;\n}\n\nexport const dataTableFamilyRecipe = {\n /** Heat background alpha per strength, over the high/low base colors. */\n heatAlpha: { 1: 0.14, 2: 0.26, 3: 0.42 },\n heat: { high: themeColor(\"danger\"), low: accentColor(\"info\") },\n tone: {\n leader: { color: semanticColors.content.primary, fontWeight: fontWeight.medium },\n positive: { color: themeColor(\"danger\"), fontWeight: fontWeight.medium },\n negative: { color: accentColor(\"info\"), fontWeight: fontWeight.medium },\n muted: { color: semanticColors.content.tertiary, fontWeight: fontWeight.regular },\n },\n groupRow: { background: semanticColors.surface.sunken, color: semanticColors.content.secondary, textVariant: \"label\" as TextVariant },\n /** Indent per sub-row depth level (substitutes under a starter, players under a team). */\n depthIndent: spacing.md,\n headerBand: { color: semanticColors.content.secondary, borderBottom: semanticColors.border.subtle },\n /**\n * Live period (LineScore) and \"my team\" row (MatrixTable). These tables sit on the surface tone, where DataTable's\n * canvas-colored selected row read as a white gap that split the table (2026-10-17 review E17).\n */\n highlight: { background: semanticColors.surface.brand },\n} as const;\n\n/* ---------------------------------------------- Line score ------------------------------------- */\n\nexport type LineScoreTeam = Readonly<{\n id: string;\n name: string;\n /** Runs per period; null = not played yet, \"X\" = home team did not bat in the last inning. */\n periods: readonly (number | \"X\" | null)[];\n /** Totals in display order, e.g. { R: 5, H: 9, E: 0, B: 4 }. */\n totals: Readonly<Record<string, number | null>>;\n}>;\n\nexport type LineScoreColumn = Readonly<{ id: string; header: string; kind: \"period\" | \"total\" }>;\n\n/**\n * Period columns are padded to `minPeriods` (9 innings) and extend for extra innings; totals follow.\n * The current period (live game) is reported so renderers can highlight it.\n */\nexport function resolveLineScore(teams: readonly LineScoreTeam[], options: Readonly<{ minPeriods?: number; totals: readonly string[]; currentPeriod?: number | null }>): Readonly<{ columns: LineScoreColumn[]; currentPeriod: number | null; leaderId: string | null }> {\n if (teams.length < 2) throw new TypeError(\"LineScore needs at least two teams\");\n const ids = new Set<string>();\n for (const team of teams) {\n assertNonEmpty(team.id, \"line score team id\");\n if (ids.has(team.id)) throw new TypeError(`Duplicate LineScore team id: ${team.id}`);\n ids.add(team.id);\n }\n const played = Math.max(...teams.map((team) => team.periods.length));\n const count = Math.max(options.minPeriods ?? 9, played);\n const columns: LineScoreColumn[] = Array.from({ length: count }, (_, i) => ({ id: `p${i + 1}`, header: String(i + 1), kind: \"period\" }));\n for (const total of options.totals) columns.push({ id: `t-${total}`, header: total, kind: \"total\" });\n const runs = options.totals[0];\n let leaderId: string | null = null;\n if (runs) {\n const scores = teams.map((team) => ({ id: team.id, value: team.totals[runs] ?? null }));\n const best = Math.max(...scores.map((score) => score.value ?? -Infinity));\n const leaders = scores.filter((score) => score.value === best && Number.isFinite(best));\n leaderId = leaders.length === 1 ? leaders[0]!.id : null;\n }\n const current = options.currentPeriod ?? null;\n return { columns, currentPeriod: current !== null && current >= 1 && current <= count ? current : null, leaderId };\n}\n\nexport function formatLineScoreCell(value: number | \"X\" | null | undefined): string {\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/* ---------------------------------------------- Matrix table ----------------------------------- */\n\nexport type MatrixCell = Readonly<{ label: string; tone?: DataTableCellTone | null; heat?: DataTableCellHeat | null }>;\n\n/**\n * Square cross table (team × team head-to-head). Rows and columns share one id list; the diagonal is\n * a self cell and renders blank. `getCell(row, column)` returns null for no record.\n */\nexport function resolveMatrix<Key extends string>(ids: readonly Key[], getCell: (row: Key, column: Key) => MatrixCell | null): readonly (readonly (MatrixCell | \"self\" | null)[])[] {\n if (new Set(ids).size !== ids.length) throw new TypeError(\"Matrix ids must be unique\");\n return ids.map((row) => ids.map((column) => (row === column ? \"self\" : getCell(row, column))));\n}\n\n/* ---------------------------------------------- Comparison table ------------------------------- */\n\nexport type ComparisonRow = Readonly<{\n id: string;\n label: string;\n values: readonly [number | null, number | null];\n /** Display strings; defaults to String(value). */\n display?: readonly [string, string];\n lowerIsBetter?: boolean;\n}>;\n\n/** Which side wins a row (null on ties/missing), and each side's bar share of the pair (0–1). */\nexport function resolveComparisonRow(row: ComparisonRow): Readonly<{ winner: 0 | 1 | null; shares: readonly [number, number] }> {\n const [a, b] = row.values;\n if (a === null || b === null || !Number.isFinite(a) || !Number.isFinite(b)) return { winner: null, shares: [a === null ? 0 : 0.5, b === null ? 0 : 0.5] };\n const winner = a === b ? null : (row.lowerIsBetter ? a < b : a > b) ? 0 : 1;\n // Lower-is-better rows invert the magnitudes so the better side still draws the longer bar.\n const left = Math.abs(row.lowerIsBetter ? b : a), right = Math.abs(row.lowerIsBetter ? a : b), sum = left + right;\n return { winner, shares: sum === 0 ? [0.5, 0.5] : [left / sum, right / sum] };\n}\n\n"]}
1
+ {"version":3,"file":"data-table.js","sourceRoot":"","sources":["../src/data-table.ts"],"names":[],"mappings":"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","sourcesContent":["import { accentColor, themeColor, type ColorReference } from \"./color-references.js\";\nimport type {\n AsyncCollectionState,\n BehaviorContract,\n CheckboxState,\n CollectionKey,\n CollectionSelectionModel,\n} from \"./behaviors.js\";\nimport { collectionItemContract, focusIndicatorContract } from \"./component-contracts.js\";\nimport { control, fontWeight, spacing, type FontWeightValue, type TextVariant } from \"./foundations.js\";\nimport { semanticColors } from \"./semantic-colors.js\";\n\nexport type DataTableAlign = \"start\" | \"center\" | \"end\";\n\nexport type DataTableColumnDescriptor<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: Key;\n /** Visible column header text; also the columnheader's accessible name. */\n header: string;\n align?: DataTableAlign;\n sortable?: boolean;\n /** Layout hint only (px or flex-basis); renderers may ignore or clamp it. */\n width?: number;\n /**\n * First press sorts descending (TanStack Table `sortDescFirst`). Stat tables read \"highest first\";\n * lower-is-better columns (ERA, rank) leave it false. Added 2026-10-14 with the Native renderer.\n */\n sortDescFirst?: boolean;\n /**\n * Keeps the column visible while the others scroll horizontally (AG Grid / TanStack column\n * pinning, start edge only). Only a leading run of pinned columns is honored.\n */\n pinned?: \"start\";\n}>;\n\nexport const dataTableColumnDefaults = {\n align: \"start\",\n sortable: false,\n} as const satisfies Readonly<{ align: DataTableAlign; sortable: boolean }>;\n\nfunction assertNonEmpty(value: string, field: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`DataTable ${field} must not be empty`);\n }\n}\n\nexport function validateDataTableColumns<Key extends CollectionKey>(\n columns: readonly DataTableColumnDescriptor<Key>[],\n): void {\n if (columns.length === 0) {\n throw new TypeError(\"DataTable must declare at least one column\");\n }\n const ids = new Set<Key>();\n for (const column of columns) {\n assertNonEmpty(column.id, \"column id\");\n if (ids.has(column.id)) {\n throw new TypeError(`Duplicate DataTable column id: ${column.id}`);\n }\n ids.add(column.id);\n assertNonEmpty(column.header, `column \"${column.id}\" header`);\n if (column.width !== undefined && (!Number.isFinite(column.width) || column.width <= 0)) {\n throw new RangeError(`DataTable column \"${column.id}\" width must be a positive finite number`);\n }\n }\n}\n\n/**\n * Row identity and selection deliberately do NOT reuse `CollectionItemDescriptor`\n * verbatim: a table row has no single visible `label`/`textValue` the way a\n * Menu or Select item does — its \"content\" is however many columns the\n * product renders per row. Only the parts of the Collection base contract\n * that are genuinely row-shaped (`CollectionKey` identity, `disabled`) apply.\n */\nexport type DataTableRowDescriptor<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: Key;\n disabled?: boolean;\n /** Sub-row nesting (TanStack `depth`): 1 indents a substitute under a starter. 0–3. */\n depth?: number;\n}>;\n\nexport function validateDataTableRows<Key extends CollectionKey>(\n rows: readonly DataTableRowDescriptor<Key>[],\n): void {\n const ids = new Set<Key>();\n for (const row of rows) {\n assertNonEmpty(row.id, \"row id\");\n if (ids.has(row.id)) {\n throw new TypeError(`Duplicate DataTable row id: ${row.id}`);\n }\n ids.add(row.id);\n if (row.depth !== undefined && (!Number.isInteger(row.depth) || row.depth < 0 || row.depth > 3)) {\n throw new RangeError(`DataTable row \"${String(row.id)}\" depth must be an integer from 0 to 3`);\n }\n }\n}\n\n/** Row selection is the unmodified Collection base contract — no DataTable-only selection shape. */\nexport type DataTableSelection<Key extends CollectionKey = CollectionKey> =\n CollectionSelectionModel<Key>;\n\n/**\n * Header \"select all\" state as the same tri-state `CheckboxState` the\n * selection column's checkbox already renders (check/dash), instead of a new\n * `\"none\" | \"some\" | \"all\"` enum the recipe would have to translate again.\n * Disabled rows are excluded from both the denominator and the count.\n */\nexport function resolveDataTableSelectAllState<Key extends CollectionKey>(\n rows: readonly DataTableRowDescriptor<Key>[],\n selectedKeys: ReadonlySet<Key>,\n): CheckboxState {\n const selectable = rows.filter((row) => !row.disabled);\n if (selectable.length === 0) return false;\n const selectedCount = selectable.filter((row) => selectedKeys.has(row.id)).length;\n if (selectedCount === 0) return false;\n if (selectedCount === selectable.length) return true;\n return \"mixed\";\n}\n\n/**\n * Values are the literal `aria-sort` vocabulary (minus `\"none\"`, which is\n * `null`) so the Web renderer passes them through without a translation\n * table — the same \"pass the platform value through\" choice Slider makes\n * for `valueText`.\n */\nexport type DataTableSortDirection = \"ascending\" | \"descending\";\n\nexport type DataTableSortState<Key extends CollectionKey = CollectionKey> = Readonly<{\n columnId: Key;\n direction: DataTableSortDirection;\n}> | null;\n\nexport type DataTableSortCycle = \"two-state\" | \"three-state\";\n\nexport const dataTableDefaults = {\n sortCycle: \"three-state\",\n} as const satisfies Readonly<{ sortCycle: DataTableSortCycle }>;\n\nexport function validateDataTableSortState<Key extends CollectionKey>(\n state: DataTableSortState<Key>,\n columns: readonly DataTableColumnDescriptor<Key>[],\n): void {\n if (state === null) return;\n if (state.direction !== \"ascending\" && state.direction !== \"descending\") {\n throw new TypeError(`Unsupported DataTable sort direction: ${String(state.direction)}`);\n }\n const column = columns.find((candidate) => candidate.id === state.columnId);\n if (!column) {\n throw new TypeError(`DataTable sort references unknown column id: ${String(state.columnId)}`);\n }\n if (!column.sortable) {\n throw new TypeError(`DataTable column \"${String(state.columnId)}\" is not sortable`);\n }\n}\n\n/**\n * Pure toggle: does not read or write product data. The product still owns\n * actually re-sorting rows (Combobox's local/external filtering split is the\n * same boundary — HJM judges intent, never executes the data operation).\n */\nexport function getNextDataTableSortState<Key extends CollectionKey>(\n current: DataTableSortState<Key>,\n columnId: Key,\n cycle: DataTableSortCycle = dataTableDefaults.sortCycle,\n firstDirection: DataTableSortDirection = \"ascending\",\n): DataTableSortState<Key> {\n const second: DataTableSortDirection = firstDirection === \"ascending\" ? \"descending\" : \"ascending\";\n if (current === null || current.columnId !== columnId) {\n return { columnId, direction: firstDirection };\n }\n if (current.direction === firstDirection) {\n return { columnId, direction: second };\n }\n return cycle === \"three-state\" ? null : { columnId, direction: firstDirection };\n}\n\n/** The first direction a column's header applies, from `sortDescFirst`. */\nexport function dataTableFirstSortDirection(column: Pick<DataTableColumnDescriptor, \"sortDescFirst\">): DataTableSortDirection {\n return column.sortDescFirst ? \"descending\" : \"ascending\";\n}\n\nexport type DataTableSortValue = number | string | null | undefined;\n\n/**\n * Sort key for a displayed cell string: \"0.340\", \".340\", \"36 ⅓\", \"13.5억\", \"61.0%\" → numbers;\n * text such as \"7승0무3패\" or names stay strings; \"—\", \"-\" and \"\" are missing.\n */\nexport function toDataTableSortValue(value: unknown): DataTableSortValue {\n if (value === null || value === undefined) return null;\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n const text = String(value).trim();\n if (!text || text === \"—\" || text === \"-\" || text === \"–\") return null;\n // Two or more letters (any script) mean a label, not a number with a unit.\n if (/\\p{L}.*\\p{L}/u.test(text.replace(/[⅓⅔]/g, \"\"))) return text;\n const number = Number.parseFloat(text.replace(/[^0-9.+-]/g, \"\"));\n return Number.isFinite(number) ? number : text;\n}\n\n/**\n * Pure comparison: numbers numerically, strings with `localeCompare`, numbers before strings.\n * Missing values are not compared here; `sortDataTableRows` always sinks them.\n */\nexport function compareDataTableValues(a: Exclude<DataTableSortValue, null | undefined>, b: Exclude<DataTableSortValue, null | undefined>, locale?: string): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"number\") return -1;\n if (typeof b === \"number\") return 1;\n return a.localeCompare(b, locale);\n}\n\n/**\n * Optional row-model helper (TanStack `getSortedRowModel` with `sortUndefined: \"last\"`): stable,\n * missing values always last in both directions. 1.20 left all sorting to products; Yajalal and\n * other stat tables reimplemented the same rules, so the shared helper exists now. Products with\n * server-side sorting keep calling `getNextDataTableSortState` only.\n */\nexport function sortDataTableRows<Row, Key extends CollectionKey>(\n rows: readonly Row[],\n sort: DataTableSortState<Key>,\n getValue: (row: Row, columnId: Key) => DataTableSortValue,\n options: Readonly<{ locale?: string }> = {},\n): Row[] {\n const indexed = rows.map((row, index) => ({ row, index }));\n if (!sort) return indexed.map(item => item.row);\n const sign = sort.direction === \"ascending\" ? 1 : -1;\n return indexed.sort((x, y) => {\n const a = getValue(x.row, sort.columnId), b = getValue(y.row, sort.columnId);\n const missingA = a === null || a === undefined, missingB = b === null || b === undefined;\n if (missingA || missingB) return missingA === missingB ? x.index - y.index : missingA ? 1 : -1;\n return sign * compareDataTableValues(a, b, options.locale) || x.index - y.index;\n }).map(item => item.row);\n}\n\n/** Leading pinned columns (only an unbroken run from the start is pinned). */\nexport function splitPinnedDataTableColumns<Column extends Pick<DataTableColumnDescriptor, \"pinned\">>(columns: readonly Column[]): Readonly<{ pinned: readonly Column[]; scrolling: readonly Column[] }> {\n let count = 0;\n while (count < columns.length && columns[count]!.pinned === \"start\") count++;\n return { pinned: columns.slice(0, count), scrolling: columns.slice(count) };\n}\n\n/** The whole table's row-loading status — the unmodified Collection base async contract. */\nexport type DataTableAsyncState = AsyncCollectionState;\n\nexport type DataTableDensity = \"compact\" | \"regular\";\n\n/**\n * Reuses `collectionItemContract`'s hover/selected/focus tokens instead of a\n * second set of row-interaction colors — Menu, Select, and DataTable rows\n * stay one visual vocabulary.\n */\nexport const dataTableRecipe = {\n slots: [\n \"root\",\n \"header\",\n \"headerCell\",\n \"sortButton\",\n \"sortIcon\",\n \"row\",\n \"cell\",\n \"selectionCell\",\n \"emptyState\",\n \"errorState\",\n ] as const,\n defaults: { density: \"regular\" },\n density: {\n compact: { paddingVertical: spacing.xs, paddingHorizontal: spacing.sm },\n regular: { paddingVertical: spacing.sm, paddingHorizontal: spacing.md },\n },\n header: {\n background: semanticColors.canvas,\n color: semanticColors.content.secondary,\n textVariant: \"label\",\n fontWeight: fontWeight.medium,\n borderBottom: semanticColors.border.default,\n },\n row: {\n borderBottom: semanticColors.border.subtle,\n hoverBackground: collectionItemContract.highlightedBackground,\n selectedBackground: collectionItemContract.selectedBackground,\n },\n cell: {\n color: semanticColors.content.body,\n textVariant: \"body\",\n },\n sortButton: {\n minTarget: control.minTouchTarget,\n color: semanticColors.content.secondary,\n activeColor: semanticColors.content.brand,\n },\n selectionCell: {\n width: control.minTouchTarget,\n },\n emptyState: {\n color: semanticColors.content.secondary,\n textVariant: \"body\",\n },\n errorState: {\n color: semanticColors.content.danger,\n textVariant: \"body\",\n },\n states: {\n focus: focusIndicatorContract,\n },\n} as const satisfies {\n slots: readonly [\n \"root\",\n \"header\",\n \"headerCell\",\n \"sortButton\",\n \"sortIcon\",\n \"row\",\n \"cell\",\n \"selectionCell\",\n \"emptyState\",\n \"errorState\",\n ];\n defaults: { density: DataTableDensity };\n density: Record<DataTableDensity, { paddingVertical: number; paddingHorizontal: number }>;\n header: {\n background: ColorReference;\n color: ColorReference;\n textVariant: TextVariant;\n fontWeight: FontWeightValue;\n borderBottom: ColorReference;\n };\n row: {\n borderBottom: ColorReference;\n hoverBackground: ColorReference;\n selectedBackground: ColorReference;\n };\n cell: { color: ColorReference; textVariant: TextVariant };\n sortButton: { minTarget: number; color: ColorReference; activeColor: ColorReference };\n selectionCell: { width: number };\n emptyState: { color: ColorReference; textVariant: TextVariant };\n errorState: { color: ColorReference; textVariant: TextVariant };\n states: { focus: typeof focusIndicatorContract };\n};\n\nexport const dataTableFamilyScenarios = [\n \"header-groups-span-contiguous-leaf-columns-and-pad-ungrouped-columns\",\n \"row-groups-insert-a-section-label-before-their-rows\",\n \"cell-tone-and-heat-are-product-decided-semantic-emphasis\",\n \"percentile-rank-flips-for-lower-is-better-stats-and-ties-take-the-midpoint\",\n \"bounded-height-tables-keep-the-header-fixed-while-the-body-scrolls\",\n \"line-score-pads-to-nine-periods-and-extends-for-extra-periods\",\n \"matrix-diagonal-is-a-blank-self-cell\",\n \"comparison-bars-favor-the-better-side-even-when-lower-is-better\",\n] as const;\n\n/**\n * No roving-tabindex grid keyboard navigation (arrow keys between cells):\n * no product using this contract has measured demand for full ARIA-grid\n * traversal, and it is a materially bigger accessibility surface than a\n * sortable header button plus native checkbox/radio tab stops.\n */\nexport const dataTableBehavior = {\n controlled: [\"selection\"],\n inputs: [\"columns\", \"rows\", \"sortState\", \"asyncState\"],\n events: [\"onSortChange\"],\n configuration: { sortCycle: [\"two-state\", \"three-state\"] },\n defaults: dataTableDefaults,\n stateAxes: {\n value: [\"selected\"],\n content: [\"idle\", \"loading\", \"loadingMore\", \"empty\", \"error\"],\n },\n web: {\n roles: [\"table\", \"row\", \"columnheader\", \"cell\", \"button\", \"checkbox\", \"radio\"],\n keyboard: [\"Tab\", \"Enter\", \"Space\"],\n focus: \"native\",\n },\n native: { roles: [\"button\", \"header\"], states: [\"selected\"], actions: [\"activate\"] },\n scenarios: [\n \"sort-desc-first-columns-start-descending-and-cycle-back\",\n \"missing-values-sink-to-the-bottom-in-both-directions\",\n \"pinned-start-columns-stay-visible-while-the-rest-scrolls\",\n \"row-selection-reuses-the-shared-collection-selection-model-unchanged\",\n \"select-all-reuses-the-shared-tri-state-checkbox-value\",\n \"async-state-reuses-the-shared-collection-async-state-unchanged\",\n \"sortable-header-is-a-button-inside-the-columnheader-not-the-header-itself\",\n \"sort-direction-values-pass-through-to-aria-sort-without-translation\",\n \"disabled-rows-are-excluded-from-select-all-accounting\",\n \"pagination-or-load-more-is-composed-beneath-the-table-not-owned-by-it\",\n \"row-expansion-is-not-owned-here-compose-the-disclosure-group-contract-per-row\",\n \"a-data-cell-exposes-at-most-one-focusable-control\",\n \"no-roving-tabindex-grid-navigation-is-implied\",\n ...dataTableFamilyScenarios,\n ],\n} as const satisfies BehaviorContract;\n\n/* ------------------------------------------------------------------------------------------------\n * Table family, 2026-10-14 (user request: research table libraries and absorb several table types).\n * Concepts re-derived, nothing vendored:\n * - column header groups (TanStack Table `getHeaderGroups`, AG Grid column groups),\n * - row groups with a section label and indented sub-rows (AG Grid row grouping, TanStack expanding),\n * - conditional cell tone and percentile heat (AG Grid `cellClassRules`/cellStyle heatmaps,\n * Baseball Savant percentile color: deeper red toward the best, deeper blue toward the worst),\n * - a vertically bounded body with a fixed header (react-native-sticky-table, CSS sticky headers),\n * - sports layouts that products kept hand-building: line score (period columns + totals, MLB/ESPN),\n * cross-table matrix (head-to-head records), and two-sided comparison rows (ESPN matchup).\n * ---------------------------------------------------------------------------------------------- */\n\n/** One header band above leaf columns. Columns not listed in any group get an empty placeholder cell. */\nexport type DataTableColumnGroup<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: string;\n header: string;\n columns: readonly Key[];\n}>;\n\nexport type DataTableHeaderBand = Readonly<{ id: string; header: string | null; span: number; columnIds: readonly string[] }>;\n\n/**\n * Resolves group bands over the given (already pinned-split) column order. A group must cover a\n * contiguous run; columns outside every group become placeholder bands so leaf widths still line up.\n */\nexport function resolveDataTableHeaderBands<Key extends CollectionKey>(\n columns: readonly Pick<DataTableColumnDescriptor<Key>, \"id\">[],\n groups: readonly DataTableColumnGroup<Key>[],\n): DataTableHeaderBand[] {\n const owner = new Map<Key, DataTableColumnGroup<Key>>();\n for (const group of groups) {\n assertNonEmpty(group.id, \"column group id\");\n assertNonEmpty(group.header, `column group \"${group.id}\" header`);\n for (const id of group.columns) {\n if (owner.has(id)) throw new TypeError(`DataTable column \"${String(id)}\" belongs to two groups`);\n owner.set(id, group);\n }\n }\n const bands: { id: string; header: string | null; columnIds: string[] }[] = [];\n for (const column of columns) {\n const group = owner.get(column.id) ?? null;\n const last = bands.at(-1);\n if (group && last && last.id === group.id) { last.columnIds.push(column.id); continue; }\n if (group && bands.some((band) => band.id === group.id)) throw new TypeError(`DataTable column group \"${group.id}\" must be contiguous`);\n bands.push({ id: group ? group.id : `placeholder-${column.id}`, header: group ? group.header : null, columnIds: [column.id] });\n }\n return bands.map((band) => ({ ...band, span: band.columnIds.length }));\n}\n\n/** Labeled row section (e.g. 선발 / 교체, 동부 / 서부). Rows not in any group render first, ungrouped. */\nexport type DataTableRowGroup<Key extends CollectionKey = CollectionKey> = Readonly<{\n id: string;\n label: string;\n rows: readonly Key[];\n}>;\n\nexport type DataTableBodyItem<Key extends CollectionKey = CollectionKey> =\n | Readonly<{ kind: \"group\"; id: string; label: string }>\n | Readonly<{ kind: \"row\"; id: Key }>;\n\n/** Flattens rows + groups into the body order renderers draw. Unknown or duplicated ids throw. */\nexport function resolveDataTableBody<Key extends CollectionKey>(\n rows: readonly DataTableRowDescriptor<Key>[],\n groups: readonly DataTableRowGroup<Key>[] = [],\n): DataTableBodyItem<Key>[] {\n if (groups.length === 0) return rows.map((row) => ({ kind: \"row\", id: row.id }));\n const known = new Set(rows.map((row) => row.id)), placed = new Set<Key>();\n const grouped: DataTableBodyItem<Key>[] = [];\n for (const group of groups) {\n assertNonEmpty(group.id, \"row group id\");\n assertNonEmpty(group.label, `row group \"${group.id}\" label`);\n grouped.push({ kind: \"group\", id: group.id, label: group.label });\n for (const id of group.rows) {\n if (!known.has(id)) throw new TypeError(`DataTable row group \"${group.id}\" references unknown row id: ${String(id)}`);\n if (placed.has(id)) throw new TypeError(`DataTable row \"${String(id)}\" belongs to two row groups`);\n placed.add(id);\n grouped.push({ kind: \"row\", id });\n }\n }\n const loose: DataTableBodyItem<Key>[] = rows.filter((row) => !placed.has(row.id)).map((row) => ({ kind: \"row\", id: row.id }));\n return [...loose, ...grouped];\n}\n\n/**\n * Semantic cell emphasis, decided by the product per cell (AG Grid cellClassRules):\n * `leader` marks a league/table best, `positive`/`negative` a direction, `muted` a non-qualifying value.\n */\nexport type DataTableCellTone = \"leader\" | \"positive\" | \"negative\" | \"muted\";\n\n/** Percentile heat (Savant): `high` side toward the best values, `low` toward the worst; strength 1–3. */\nexport type DataTableCellHeat = Readonly<{ side: \"high\" | \"low\"; strength: 1 | 2 | 3 }>;\n\n/**\n * Percentile rank (0–100, best = 100) of `value` among `sample`. `lowerIsBetter` flips ERA-style stats.\n * Ties take the midpoint rank, missing values return null. A one-value sample is the 50th percentile.\n */\nexport function percentileRank(value: number | null | undefined, sample: readonly (number | null | undefined)[], options: Readonly<{ lowerIsBetter?: boolean }> = {}): number | null {\n if (value === null || value === undefined || !Number.isFinite(value)) return null;\n const values = sample.filter((item): item is number => item !== null && item !== undefined && Number.isFinite(item));\n if (values.length <= 1) return 50;\n let below = 0, equal = 0;\n for (const item of values) {\n const better = options.lowerIsBetter ? item > value : item < value;\n if (item === value) equal++;\n else if (better) below++;\n }\n return Math.round(((below + (equal - 1) / 2) / (values.length - 1)) * 100);\n}\n\n/** Maps a percentile to heat: ≥90/≥75/≥60 high, ≤10/≤25/≤40 low, the middle stays neutral (null). */\nexport function percentileHeat(percentile: number | null): DataTableCellHeat | null {\n if (percentile === null) return null;\n if (percentile >= 90) return { side: \"high\", strength: 3 };\n if (percentile >= 75) return { side: \"high\", strength: 2 };\n if (percentile >= 60) return { side: \"high\", strength: 1 };\n if (percentile <= 10) return { side: \"low\", strength: 3 };\n if (percentile <= 25) return { side: \"low\", strength: 2 };\n if (percentile <= 40) return { side: \"low\", strength: 1 };\n return null;\n}\n\nexport const dataTableFamilyRecipe = {\n /** Heat background alpha per strength, over the high/low base colors. */\n heatAlpha: { 1: 0.14, 2: 0.26, 3: 0.42 },\n heat: { high: themeColor(\"danger\"), low: accentColor(\"info\") },\n tone: {\n leader: { color: semanticColors.content.primary, fontWeight: fontWeight.medium },\n positive: { color: themeColor(\"danger\"), fontWeight: fontWeight.medium },\n negative: { color: accentColor(\"info\"), fontWeight: fontWeight.medium },\n muted: { color: semanticColors.content.tertiary, fontWeight: fontWeight.regular },\n },\n groupRow: { background: semanticColors.surface.sunken, color: semanticColors.content.secondary, textVariant: \"label\" as TextVariant },\n /** Indent per sub-row depth level (substitutes under a starter, players under a team). */\n depthIndent: spacing.md,\n headerBand: { color: semanticColors.content.secondary, borderBottom: semanticColors.border.subtle },\n /**\n * Live period (LineScore) and \"my team\" row (MatrixTable). These tables sit on the surface tone, where DataTable's\n * canvas-colored selected row read as a white gap that split the table (2026-10-17 review E17).\n */\n highlight: { background: semanticColors.surface.brand },\n // 2026-10-26: current inning follows category selection; my-team emphasis retains its brand role.\n currentPeriod: { background: semanticColors.selection.background, color: semanticColors.selection.content },\n} as const;\n\n/* ---------------------------------------------- Line score ------------------------------------- */\n\nexport type LineScoreTeam = Readonly<{\n id: string;\n name: string;\n /** Runs per period; null = not played yet, \"X\" = home team did not bat in the last inning. */\n periods: readonly (number | \"X\" | null)[];\n /** Totals in display order, e.g. { R: 5, H: 9, E: 0, B: 4 }. */\n totals: Readonly<Record<string, number | null>>;\n}>;\n\nexport type LineScoreColumn = Readonly<{ id: string; header: string; kind: \"period\" | \"total\" }>;\n\n/**\n * Period columns are padded to `minPeriods` (9 innings) and extend for extra innings; totals follow.\n * The current period (live game) is reported so renderers can highlight it.\n */\nexport function resolveLineScore(teams: readonly LineScoreTeam[], options: Readonly<{ minPeriods?: number; totals: readonly string[]; currentPeriod?: number | null }>): Readonly<{ columns: LineScoreColumn[]; currentPeriod: number | null; leaderId: string | null }> {\n if (teams.length < 2) throw new TypeError(\"LineScore needs at least two teams\");\n const ids = new Set<string>();\n for (const team of teams) {\n assertNonEmpty(team.id, \"line score team id\");\n if (ids.has(team.id)) throw new TypeError(`Duplicate LineScore team id: ${team.id}`);\n ids.add(team.id);\n }\n const played = Math.max(...teams.map((team) => team.periods.length));\n const count = Math.max(options.minPeriods ?? 9, played);\n const columns: LineScoreColumn[] = Array.from({ length: count }, (_, i) => ({ id: `p${i + 1}`, header: String(i + 1), kind: \"period\" }));\n for (const total of options.totals) columns.push({ id: `t-${total}`, header: total, kind: \"total\" });\n const runs = options.totals[0];\n let leaderId: string | null = null;\n if (runs) {\n const scores = teams.map((team) => ({ id: team.id, value: team.totals[runs] ?? null }));\n const best = Math.max(...scores.map((score) => score.value ?? -Infinity));\n const leaders = scores.filter((score) => score.value === best && Number.isFinite(best));\n leaderId = leaders.length === 1 ? leaders[0]!.id : null;\n }\n const current = options.currentPeriod ?? null;\n return { columns, currentPeriod: current !== null && current >= 1 && current <= count ? current : null, leaderId };\n}\n\nexport function formatLineScoreCell(value: number | \"X\" | null | undefined): string {\n return value === null || value === undefined ? \"\" : String(value);\n}\n\n/* ---------------------------------------------- Matrix table ----------------------------------- */\n\nexport type MatrixCell = Readonly<{ label: string; tone?: DataTableCellTone | null; heat?: DataTableCellHeat | null }>;\n\n/**\n * Square cross table (team × team head-to-head). Rows and columns share one id list; the diagonal is\n * a self cell and renders blank. `getCell(row, column)` returns null for no record.\n */\nexport function resolveMatrix<Key extends string>(ids: readonly Key[], getCell: (row: Key, column: Key) => MatrixCell | null): readonly (readonly (MatrixCell | \"self\" | null)[])[] {\n if (new Set(ids).size !== ids.length) throw new TypeError(\"Matrix ids must be unique\");\n return ids.map((row) => ids.map((column) => (row === column ? \"self\" : getCell(row, column))));\n}\n\n/* ---------------------------------------------- Comparison table ------------------------------- */\n\nexport type ComparisonRow = Readonly<{\n id: string;\n label: string;\n values: readonly [number | null, number | null];\n /** Display strings; defaults to String(value). */\n display?: readonly [string, string];\n lowerIsBetter?: boolean;\n}>;\n\n/** Which side wins a row (null on ties/missing), and each side's bar share of the pair (0–1). */\nexport function resolveComparisonRow(row: ComparisonRow): Readonly<{ winner: 0 | 1 | null; shares: readonly [number, number] }> {\n const [a, b] = row.values;\n if (a === null || b === null || !Number.isFinite(a) || !Number.isFinite(b)) return { winner: null, shares: [a === null ? 0 : 0.5, b === null ? 0 : 0.5] };\n const winner = a === b ? null : (row.lowerIsBetter ? a < b : a > b) ? 0 : 1;\n // Lower-is-better rows invert the magnitudes so the better side still draws the longer bar.\n const left = Math.abs(row.lowerIsBetter ? b : a), right = Math.abs(row.lowerIsBetter ? a : b), sum = left + right;\n return { winner, shares: sum === 0 ? [0.5, 0.5] : [left / sum, right / sum] };\n}\n\n"]}
@@ -15,7 +15,28 @@ export type DateRangeValue = Readonly<{
15
15
  end: string | null;
16
16
  }>;
17
17
  export declare const emptyDateRange: DateRangeValue;
18
- export declare function validateDateRange(value: DateRangeValue): void;
18
+ /**
19
+ * 구간이 덮을 수 있는 최대 길이. 일수가 아니라 달력 단위로 센다 — "1년"을 365일로 두면 윤년을 낀
20
+ * 1월 1일~12월 31일이 막힌다. 끝은 포함이라 `{ years: 1 }`은 2026-01-01부터 2026-12-31까지다.
21
+ * 2026-10-25 사용자 요청으로 DateRangePicker 기본값은 1년이고, `null`이면 제한하지 않는다.
22
+ */
23
+ export type DateRangeLimit = Readonly<{
24
+ years?: number;
25
+ months?: number;
26
+ days?: number;
27
+ }>;
28
+ export declare const defaultDateRangeLimit: DateRangeLimit;
29
+ /** `start`를 한쪽 끝으로 둘 때 다른 끝이 올 수 있는 가장 이른·늦은 날(둘 다 포함). */
30
+ export declare function resolveDateRangeLimitBounds(start: string, limit: DateRangeLimit): Readonly<{
31
+ earliest: string;
32
+ latest: string;
33
+ }>;
34
+ export declare function validateDateRange(value: DateRangeValue, limit?: DateRangeLimit | null): void;
35
+ /**
36
+ * 고르는 중에 이 날짜를 끝으로 고를 수 있는지. 비었거나 완성된 구간에서는 누르면 새로 시작하므로
37
+ * 언제나 고를 수 있다. 막힌 날은 renderer가 비활성으로 그린다 — 눌렀다가 거절하면 이유를 알 수 없다.
38
+ */
39
+ export declare function isDateWithinRangeLimit(value: DateRangeValue, date: string, limit: DateRangeLimit | null): boolean;
19
40
  /**
20
41
  * 날짜 하나를 눌렀을 때의 다음 값.
21
42
  *
@@ -25,13 +46,110 @@ export declare function validateDateRange(value: DateRangeValue): void;
25
46
  * - 고르는 중이면 **끝**을 정한다. 시작보다 앞선 날짜를 누르면 두 값을 바꿔 담는다 —
26
47
  * 거절하면 사용자가 왜 안 되는지 알 수 없다.
27
48
  */
28
- export declare function resolveDateRangeSelection(current: DateRangeValue, date: string): DateRangeValue;
49
+ export declare function resolveDateRangeSelection(current: DateRangeValue, date: string, limit?: DateRangeLimit | null): DateRangeValue;
29
50
  export type DateRangeCellState = "start" | "end" | "between" | "none";
30
51
  /**
31
52
  * 한 칸이 구간 안에서 어떤 자리인지. 미리보기(`hoveredDate`)는 아직 확정되지 않은 끝을
32
53
  * 가리키므로 같은 함수가 처리한다 — renderer가 두 벌의 칠하기 규칙을 만들지 않게 한다.
33
54
  */
34
55
  export declare function resolveDateRangeCellState(value: DateRangeValue, date: string, hoveredDate?: string | null): DateRangeCellState;
56
+ /**
57
+ * 칸 하나를 어떻게 칠하는지. `edge`는 채운 원(시작·끝), `band`는 시작과 끝을 잇는 띠의 모양이다.
58
+ * 띠는 시작 칸에서 끝 쪽 절반(`toEnd`), 끝 칸에서 시작 쪽 절반(`toStart`), 사이 칸 전체(`full`)를 덮는다.
59
+ * 시작과 끝이 같은 날(하루 구간)이거나 끝이 아직 없으면 띠가 없다.
60
+ *
61
+ * 2026-10-25 개편(Spint 기간 시트 사용자 지적): 점 표시는 구간이 이어져 보이지 않았고, 점 줄 때문에 행이
62
+ * 라벨 한 줄만큼 높아졌다. Material 3·Airbnb처럼 띠로 잇고 두 끝을 같은 채운 원으로 그린다.
63
+ */
64
+ export type DateRangeCellPaint = Readonly<{
65
+ edge: boolean;
66
+ band: "none" | "full" | "toEnd" | "toStart";
67
+ }>;
68
+ export declare function resolveDateRangeCellPaint(value: DateRangeValue, date: string, hoveredDate?: string | null): DateRangeCellPaint;
69
+ /**
70
+ * 요약 칸에서 강조할 끝. 비었으면 시작, 고르는 중이면 끝을 강조한다. 완성된 구간은 아무것도 강조하지 않는다 —
71
+ * 다음 탭이 새 시작이 되긴 하지만, 완성 직후 시작 칸이 강조되면 시작일을 고치는 중으로 읽혔다(2026-10-25 실화면).
72
+ */
73
+ export declare function resolveDateRangeActiveEdge(value: DateRangeValue): "start" | "end" | null;
74
+ /** 프리셋 길이. `days`는 오늘 포함 n일, `months`는 n개월 전 다음 날부터 오늘까지다. */
75
+ export type DateRangePresetLength = Readonly<{
76
+ days: number;
77
+ } | {
78
+ months: number;
79
+ }>;
80
+ /**
81
+ * 오늘로 끝나는 프리셋 구간(최근 7일·1개월 등). 날짜 계산은 UTC 달력 날짜로만 해 서머타임·시간대에 흔들리지 않는다.
82
+ * 달 길이가 다르면 그 달의 마지막 날로 맞춘다(3/31의 1개월 전 = 2/28, 구간은 3/1부터).
83
+ */
84
+ export declare function resolveDateRangePreset(today: string, length: DateRangePresetLength): DateRangeValue;
85
+ export declare const dateRangeRecipe: {
86
+ readonly slots: readonly ["root", "summary", "summaryField", "summaryLabel", "summaryValue", "presets", "band", "edge"];
87
+ readonly band: {
88
+ readonly background: Readonly<{
89
+ source: "theme";
90
+ key: "primary";
91
+ alpha?: number;
92
+ }>;
93
+ };
94
+ readonly edge: {
95
+ readonly background: Readonly<{
96
+ source: "theme";
97
+ key: "primary";
98
+ alpha?: number;
99
+ }>;
100
+ readonly content: Readonly<{
101
+ source: "theme";
102
+ key: "onPrimary";
103
+ alpha?: number;
104
+ }>;
105
+ };
106
+ readonly summary: {
107
+ readonly gap: 8;
108
+ readonly field: {
109
+ readonly paddingVertical: 8;
110
+ readonly paddingHorizontal: 12;
111
+ readonly radius: "md";
112
+ readonly gap: 4;
113
+ readonly background: Readonly<{
114
+ source: "theme";
115
+ key: "surfaceAlt";
116
+ alpha?: number;
117
+ }>;
118
+ readonly activeBorder: Readonly<{
119
+ source: "theme";
120
+ key: "primary";
121
+ alpha?: number;
122
+ }>;
123
+ readonly activeBorderWidth: 2;
124
+ };
125
+ readonly label: {
126
+ readonly textVariant: "label";
127
+ readonly color: Readonly<{
128
+ source: "theme";
129
+ key: "textMuted";
130
+ alpha?: number;
131
+ }>;
132
+ };
133
+ readonly value: {
134
+ readonly textVariant: "body";
135
+ readonly color: Readonly<{
136
+ source: "theme";
137
+ key: "text";
138
+ alpha?: number;
139
+ }>;
140
+ readonly placeholderColor: Readonly<{
141
+ source: "theme";
142
+ key: "textSub";
143
+ alpha?: number;
144
+ }>;
145
+ };
146
+ };
147
+ readonly presets: {
148
+ readonly gap: 8;
149
+ readonly chipSize: "small";
150
+ };
151
+ readonly gap: 16;
152
+ };
35
153
  /** 구간이 실제로 쓸 수 있는 값인지. 제품의 제출 버튼이 읽는다. */
36
154
  export declare function isCompleteDateRange(value: DateRangeValue): boolean;
37
155
  export declare const dateRangeBehavior: {
@@ -51,6 +169,7 @@ export declare const dateRangeBehavior: {
51
169
  readonly states: readonly ["selected", "disabled"];
52
170
  readonly actions: readonly ["select"];
53
171
  };
54
- readonly scenarios: readonly ["a-click-on-a-complete-range-starts-a-new-one-instead-of-guessing-which-end-to-move", "picking-an-earlier-date-while-selecting-swaps-the-two-instead-of-rejecting-it", "the-selecting-state-is-start-without-end-not-a-separate-flag", "a-hovered-date-previews-the-end-through-the-same-cell-state-function", "an-end-without-a-start-is-rejected-by-validation-not-rendered-as-something", "calendar-keeps-single-selection-this-module-never-adds-a-mode-axis-to-it"];
172
+ readonly scenarios: readonly ["a-click-on-a-complete-range-starts-a-new-one-instead-of-guessing-which-end-to-move", "picking-an-earlier-date-while-selecting-swaps-the-two-instead-of-rejecting-it", "the-selecting-state-is-start-without-end-not-a-separate-flag", "a-hovered-date-previews-the-end-through-the-same-cell-state-function", "an-end-without-a-start-is-rejected-by-validation-not-rendered-as-something", "calendar-keeps-single-selection-this-module-never-adds-a-mode-axis-to-it", "the-range-is-one-band-between-two-filled-edges-and-a-one-day-range-has-no-band", "the-summary-marks-the-edge-being-picked-and-nothing-once-complete", "a-preset-ends-today-and-is-selected-only-while-the-value-equals-it"];
55
173
  };
174
+ export declare function dateRangeSpans(value: DateRangeValue, hoveredDate?: string | null): boolean;
56
175
  //# sourceMappingURL=date-range.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-range.d.ts","sourceRoot":"","sources":["../src/date-range.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2DAA2D;IAC3D,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,cAA2C,CAAC;AAEzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAS7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,GACX,cAAc,CAShB;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,kBAAkB,CASpB;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAGlE;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;CAqBO,CAAC"}
1
+ {"version":3,"file":"date-range.d.ts","sourceRoot":"","sources":["../src/date-range.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2DAA2D;IAC3D,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB,CAAC,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,cAA2C,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE1F,eAAO,MAAM,qBAAqB,EAAE,cAA6B,CAAC;AA6BlE,2DAA2D;AAC3D,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,QAAQ,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAQhI;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,GAAE,cAAc,GAAG,IAAW,GAAG,IAAI,CAalG;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAMjH;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,cAAc,GAAG,IAAW,GAClC,cAAc,CAUhB;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;AAEtE;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,kBAAkB,CASpB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AAI1G,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,kBAAkB,CASpB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,GAAG,KAAK,GAAG,IAAI,CAIxF;AAED,8DAA8D;AAC9D,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAIpF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,cAAc,CAUnG;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BlB,CAAC;AAEX,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAGlE;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;CAwBO,CAAC;AAEtC,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAK1F"}