@aiquants/daily-report 0.47.0 → 0.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,40 @@
2
2
 
3
3
  All notable changes to `@aiquants/daily-report` are documented here.
4
4
 
5
+ ## 0.48.0 (2026-10-21)
6
+
7
+ ### Added
8
+
9
+ - **一覧と詳細ペインの境界の取っ手は、クリックで決まった幅を順に切り替える (WCAG 2.5.7 Dragging Movements)**: `@aiquants/resize-panels` 2.2.0 の
10
+ `activationSizes` へ一覧のパネルの最小・既定・最大の幅 (160・360・520px) を渡すので、ドラッグの閾値に届かないクリックかタップが一覧の幅を次の止まり先へ
11
+ 進める (最後の後は最初へ)。resize-panels のピアの下限は 2.2.0。
12
+ - **ラベル `resizeHandleHint`**: 取っ手のツールチップ (`title`) の文言。これまでのツールチップは resize-panels の英語の既定の名前で、`locale: "ja"` でも
13
+ 英語だった。固有のキーは 114 になる。
14
+
15
+ ### Changed
16
+
17
+ - **ラベルのカタログのエンジンのキーは、組み込む `@aiquants/virtualscroll` のキーに従う**: スクロールバーの値を持つ要素を `role="scrollbar"` の
18
+ トラック 1 つにした `@aiquants/virtualscroll` の版は、つまみが名前を持たなくなったので、カタログから `verticalScrollThumb` /
19
+ `horizontalScrollThumb` を外した。日報のカタログはエンジンのキー (`VIRTUAL_SCROLL_LABEL_KEYS`) を値で再利用するので、その版の上では
20
+ `DAILY_REPORT_LABEL_KEYS` からも 2 キーが減り (エンジン 9。固有のキーは下の `resizeHandleHint` を足して 114)、`config.labels` にその 2 キーを渡すと未知のキーとして描画時に
21
+ `RangeError` になる。両ビューのバーはこれまでどおりポインター専用で支援技術から隠れ、隠れたバーの `role="scrollbar"` の要素が
22
+ `verticalScrollBar` の名前を持つ。README と設計仕様書は、エンジンのキーの件数を書き写さない形に改めた。
23
+
24
+ ### Tests
25
+
26
+ - `report-views.scroll-bar-a11y.spec.tsx` と `virtual-scroll-stand-in.conformance.spec.tsx` は、本物のバーを包み (`data-aqvs-scrollbar`) と、その
27
+ 中の `role="scrollbar"` の要素で引く (矢印は `role="scrollbar"` の要素の兄弟になった)。バーと矢印の押下に加えて、`role="scrollbar"` の要素の
28
+ 押下も既定動作を取り消すことを確かめる。
29
+
30
+ ## 0.47.1 (2026-10-16)
31
+
32
+ 版番号は 0.47.1 (patch) とする: 公開の名前を 1 つ足すだけで、振る舞いは変えない。
33
+
34
+ ### Added
35
+
36
+ - **読みの状態の規則を共有の入口から公開する** (`dailyReportReadStateOf(report, viewerUserId)`): パッケージのビューと `labels.rowState` が示す閲覧者の読みの状態
37
+ (`unread`・`read`・`updatedSinceRead`) の 1 つの規則。ラベルで自分の行を組むホスト (と、行の読み上げを確かめるホストの試験) が、規則を書き写さずに同じ状態を読む。
38
+
5
39
  ## 0.47.0 (2026-10-16)
6
40
 
7
41
  版番号は 0.47.0 (minor) とする: 状態の表に列を求め、公開の型・アクション・SSE のワイヤの形を変える (下の Breaking)。
package/README.md CHANGED
@@ -101,7 +101,7 @@ keyboard themselves; see [Keyboard, focus and selection](#keyboard-focus-and-sel
101
101
  own parts under `prefers-reduced-motion: reduce` (3.8.2;
102
102
  see [Selection and focus appearance](#selection-and-focus-appearance)); and both views re-record their scroll anchor from its `onScrollAdjust`
103
103
  notification and rely on its edge-keeping snap (3.9.0; see **Host selections and list changes** and [View height](#view-height-host-layout)). The
104
- label catalog reuses its 11 engine keys, the names of the scroll bar and its thumb among them (3.10.0; see
104
+ label catalog reuses its engine keys (every label key `@aiquants/virtualscroll` exports), the name of the scroll bar among them (3.10.0; see
105
105
  [Localization](#localization-locale--labels)).
106
106
  `DailyReportRevealOptions`, the options of the test handle's `revealIndex`, is `@aiquants/virtualscroll`'s `scrollToIndex` options type, which takes
107
107
  `align: "nearest"` since 3.11.0, and DetailList rows stay at the tree's tops and heights after a batch of re-measurements whose deltas cancel only
@@ -2951,10 +2951,10 @@ the resize handle and the side pane lie outside the list.
2951
2951
  `enableArrowButtonTabStops: false`, `@aiquants/virtualscroll`'s one signal that the host scrolls by keyboard itself (3.10.0, its README "Scrollbar
2952
2952
  accessibility and the Tab order").
2953
2953
  The bar carries `aria-hidden="true"`, so assistive technology sees no `scrollbar` and no `slider` in either view, named or not; its arrow buttons
2954
- have `tabIndex=-1` and the bar and its thumb no `tabindex`, so the bar adds no Tab stop; and a press anywhere on the bar has its default prevented,
2954
+ have `tabIndex=-1` and its `role="scrollbar"` element no `tabindex`, so the bar adds no Tab stop; and a press anywhere on the bar has its default prevented,
2955
2955
  so it moves no focus, neither onto a part of the bar nor away from the composite. Every pointer interaction still scrolls: the arrows on a press and
2956
2956
  while held, the track, the thumb and the tap-scroll circle.
2957
- The bar and its thumb still carry their names (the engine keys `verticalScrollBar` and `verticalScrollThumb`, below), which the hidden bar does not
2957
+ The bar's `role="scrollbar"` element still carries its name (the engine key `verticalScrollBar`, below), which the hidden bar does not
2958
2958
  expose.
2959
2959
  - **Leaving the list** (`Ctrl+Home` / `Ctrl+End`, as in the WAI-ARIA feed pattern): focus moves to the last Tab stop before the list or the first one
2960
2960
  after it — where real `Shift+Tab` from the list's first stop and real `Tab` from its last stop go — and the browser scrolls it into view as it does
@@ -3776,12 +3776,10 @@ luminance by 0.026 in the light theme, and a `shadow-md` brings the ring down to
3776
3776
  The centres of their 24 px circles are 12 px apart (the handle's on the panel boundary, the bar's 12 px before it), so the circles intersect and the
3777
3777
  spacing exception does not apply either. Both keep the specified frame — the 2G channel and the 8 px scroll bar of both views — and no wider
3778
3778
  construction has been decided yet.
3779
- The splitter also falls short of WCAG 2.5.7 (Dragging Movements, AA): the handle moves the boundary by dragging or by the arrow keys, and a keyboard
3780
- path does not satisfy 2.5.7, which asks that a single pointer can do it without dragging (a click or a tap). `@aiquants/resize-panels` 2.1.0 has no
3781
- such path on the handle: a press and release without movement does nothing.
3782
- The step belongs in the handle's own gesture model, which every consumer of the handle shares, so it is handed over to resize-panels as an issue (an
3783
- optional `activationSizes` prop that a click under the drag threshold steps through, to which the List will pass its panel's minimum, default and
3784
- maximum widths, 160, 360 and 520 px); until it ships, a pointer user who cannot drag keeps the List panel's width.
3779
+ The splitter meets WCAG 2.5.7 (Dragging Movements, AA): besides dragging and the arrow keys, a click or a tap on the handle that stays under
3780
+ `@aiquants/resize-panels`' drag threshold steps the List panel to its next preset width — the panel's minimum, default and maximum widths, 160, 360
3781
+ and 520 px, in that order and back to the first after the last (the handle's `activationSizes`; the stops are clipped to what the pair of panels can
3782
+ reach, and a stop where the border already is gets skipped). The handle's tooltip (`resizeHandleHint`) names all three ways.
3785
3783
  The side-pane panel is at least 200 px wide: the frame around its centred selection prompt — 2G = 16 (the pane sits G inside its panel), the card
3786
3784
  surface's insets 2 × 16 and the placeholder panel's insets 2 × 12, 72 in all — plus the prompt's longest phrase at the default 16 px root,
3787
3785
  「選択してください。」 (9 full-width glyphs of `text-sm`, 9 × 0.875 rem = 126 px), is 198, rounded up to the 4 px lattice.
@@ -3858,8 +3856,7 @@ luminance by 0.026 in the light theme, and a `shadow-md` brings the ring down to
3858
3856
  and the report headings tell where the viewer is), 2.4.9 (links name their purpose), 2.4.10 (sections carry headings), 2.4.12 and 2.4.13 (the focus
3859
3857
  is never obscured, and its outline is 2 px at 3:1), 3.1.3, 3.1.4 (abbreviated source badges, **External Source Badge Configuration**), 3.2.5 and
3860
3858
  3.3.6. Not met, by decision: 2.2.4 (Interruptions): live updates (SSE) apply as they arrive, with no pause, and
3861
- the scroll anchoring keeps the rows on screen in place. Not met at AA: 2.5.8 for the List's resize handle and the scroll bar beside it, and 2.5.7 for
3862
- the List's splitter (**Side pane** above): a path without dragging belongs to `@aiquants/resize-panels`, and larger hit areas for the handle and the
3859
+ the scroll anchoring keeps the rows on screen in place. Not met at AA: 2.5.8 for the List's resize handle and the scroll bar beside it (**Side pane** above): larger hit areas for the handle and the
3863
3860
  bar wait for the same layout pass as 2.5.5. Not claimed yet: 2.5.5 (44 px targets), 1.4.8 (a line measure and the List preview's
3864
3861
  leading) and 3.3.5 (a help control for the search syntax), which need a layout pass, and 3.1.6 (readings of names), which needs readings from the
3865
3862
  host's directory. 2.2.5 is met by the package for a refused comment post (**One comment section rule** above); keeping work across a
@@ -4215,14 +4212,14 @@ locale**: English (`"en"`, the default) and Japanese (`"ja"`). Pick the language
4215
4212
  />
4216
4213
  ```
4217
4214
 
4218
- - **One surface for all wording.** The catalog covers the 11 engine chrome keys of `@aiquants/virtualscroll` plus 113 own keys: field headings, the
4215
+ - **One surface for all wording.** The catalog covers the engine chrome keys of `@aiquants/virtualscroll` (every label key it exports) plus 114 own keys: field headings, the
4219
4216
  page title (`title`, passed to `renderHeader` and used as the accessible name of both lists), the lists' keyboard help, the row states (read, read and updated since, and
4220
4217
  starred, editing), the updated-since-read pill and the List card's position read to screen readers, tabs, buttons, placeholders, the `confirm()` text, stream badges, the search box, its filter row and the
4221
4218
  search's match indicator, the status screen and the page's status region and the mutation-failure message with its repeat count. The engine part of
4222
- each catalog is `@aiquants/virtualscroll`'s own catalog of the same locale, reused by value, so the scroll arrows, the names of the scroll bar and
4223
- its thumb, and the "No items" text always speak the same language as the rest.
4219
+ each catalog is `@aiquants/virtualscroll`'s own catalog of the same locale, reused by value, so the scroll arrows, the name of the scroll bar and
4220
+ the "No items" text always speak the same language as the rest.
4224
4221
  - **Forwarded to every embedded `VirtualScroll`.** Both the List and the DetailList pass `locale`
4225
- and the 11 engine keys of the resolved labels to their `VirtualScroll`. The engine label object keeps
4222
+ and the engine keys of the resolved labels to their `VirtualScroll`. The engine label object keeps
4226
4223
  its identity while its values are unchanged, so rebuilding `config.labels` on every render does not
4227
4224
  re-render the memoized list subtree.
4228
4225
  - **Formatter keys.** Twenty-two keys take arguments and are functions: `totalCount(count)`,
@@ -4241,7 +4238,7 @@ locale**: English (`"en"`, the default) and Japanese (`"ja"`). Pick the language
4241
4238
  locale built once (the row positions and counts re-render on every stream publish); a host override receives
4242
4239
  the raw number and formats it itself.
4243
4240
  - **Fail-fast**: an unsupported `locale` (`"EN"`, `"ja-JP"`, `"fr"`, `""`, `null`, ...) throws a
4244
- `RangeError` at render. So do an unknown `labels` key (a key error that lists the 124 keys), a string
4241
+ `RangeError` at render. So do an unknown `labels` key (a key error that lists every key of `DAILY_REPORT_LABEL_KEYS`), a string
4245
4242
  key whose value is not a string with non-whitespace content, and a formatter key whose value is not a
4246
4243
  function. An `undefined` value keeps the catalog value.
4247
4244
  - **`config` has a closed key set**: `apiBasePath`, `ssePath`, `locale`, `labels`,
@@ -4279,8 +4276,8 @@ locale**: English (`"en"`, the default) and Japanese (`"ja"`). Pick the language
4279
4276
  grouping follows `locale` (`en` → `"en-US"`, `ja` → `"ja-JP"`) and dates stay in ISO form. Packages
4280
4277
  that do format dates (for example `@aiquants/period-slider`) name that separate axis `formatLocale`.
4281
4278
 
4282
- Exported API (`@aiquants/daily-report/client`): `DAILY_REPORT_LABEL_KEYS` (all 124 keys, the 11 engine keys
4283
- first), `DAILY_REPORT_LABEL_CATALOGS` (the frozen catalogs), `resolveDailyReportLabels(locale, labels)`
4279
+ Exported API (`@aiquants/daily-report/client`): `DAILY_REPORT_LABEL_KEYS` (every key: the engine keys `@aiquants/virtualscroll` exports, in its order,
4280
+ first, then the 114 own keys), `DAILY_REPORT_LABEL_CATALOGS` (the frozen catalogs), `resolveDailyReportLabels(locale, labels)`
4284
4281
  (the effective frozen labels — the catalog object itself when `labels` is `undefined`), the resolved
4285
4282
  `locale` / `labels` on `useDailyReportConfig()`, and the types `DailyReportLocale` (= `VirtualScrollLocale`),
4286
4283
  `DailyReportLabels`, `DailyReportLabelOverrides` and `DailyReportOperation`.
@@ -4293,8 +4290,6 @@ first), `DAILY_REPORT_LABEL_CATALOGS` (the frozen catalogs), `resolveDailyReport
4293
4290
  | `scrollRight` | engine: horizontal arrow (not rendered by this package) | Scroll right | 右へスクロール |
4294
4291
  | `verticalScrollBar` | engine: name (`aria-label`) of the vertical ScrollBar (`role="scrollbar"`); both views hide their pointer-only bar from assistive technology, so it is not announced | Vertical | 縦方向 |
4295
4292
  | `horizontalScrollBar` | engine: name of the horizontal ScrollBar (not rendered by this package) | Horizontal | 横方向 |
4296
- | `verticalScrollThumb` | engine: name (`aria-label`) of the vertical ScrollBar's thumb (`role="slider"`), inside the hidden bar | Vertical scroll position | 縦スクロール位置 |
4297
- | `horizontalScrollThumb` | engine: name of the horizontal ScrollBar's thumb (not rendered by this package) | Horizontal scroll position | 横スクロール位置 |
4298
4293
  | `scrollToTop` | engine: top pill (not enabled by this package) | Top | 先頭へ |
4299
4294
  | `scrollToBottom` | engine: bottom pill (not enabled by this package) | Bottom | 末尾へ |
4300
4295
  | `noItems` | engine: the one message of an empty List or DetailList, over the top of the list | No items | 項目がありません |
@@ -4358,6 +4353,7 @@ first), `DAILY_REPORT_LABEL_CATALOGS` (the frozen catalogs), `resolveDailyReport
4358
4353
  | `deleteReport` | report delete button | Delete | 削除する |
4359
4354
  | `edit` | edit button of the viewer's own report (`aria-label` / tooltip) | Edit | 編集 |
4360
4355
  | `resizeHandle` | list / detail resize handle `aria-label` | Resize the border between the report list and the detail pane | 日報一覧と詳細ペインの境界のサイズ変更ハンドル |
4356
+ | `resizeHandleHint` | list / detail resize handle tooltip (`title`): the ways to move the border | Drag or use the arrow keys to resize, or click to step through the preset widths | ドラッグか矢印キーで幅を変え、クリックで決まった幅を順に切り替える |
4361
4357
  | `close` | mobile overlay close button, the error notice's close `aria-label` | Close | 閉じる |
4362
4358
  | `formTitle` | edit form | Title | タイトル |
4363
4359
  | `formTitlePlaceholder` | edit form | Enter the report title | 日報のタイトルを入力 |
@@ -4540,6 +4536,8 @@ Documenting a name here is no reason to export it, and the values that tune the
4540
4536
  `encodeDailyReportActionCommand(command)` (a command as its `FormData`), `parseDailyReportActionResult(intent, json)` (the strict reading of a 200
4541
4537
  answer: `{ result }` or `{ mismatch }`), `DAILY_REPORT_API_ENDPOINTS` / `DAILY_REPORT_API_QUERY_PARAMS` (the endpoint and GET query-parameter
4542
4538
  names) and `DAILY_REPORT_CLIENT_TEMP_ID_PATTERN` (the echo id's two canonical forms),
4539
+ the viewer's read state `dailyReportReadStateOf(report, viewerUserId)` (`unread`, `read` or `updatedSinceRead`: the one rule the package's
4540
+ views and `labels.rowState` show, for a host that composes its own rows; [Read after update](#read-after-update)),
4543
4541
  and the source-type vocabulary a host builds its visibility port with: `DAILY_REPORT_INTERNAL_SOURCE_TYPE` (`"Internal"`, the source type of the
4544
4542
  reports the package creates) and `foldDailyReportSourceTypeToken(token)` (the one fold the server applies to the tokens the port returns:
4545
4543
  surrounding blanks removed, then lower case; [Source-type visibility](#source-type-visibility)).
package/dist/client.d.mts CHANGED
@@ -6,7 +6,7 @@ import { D as DailyReportItem, a as DailyReportUser, b as DailyReportDetail } fr
6
6
  import { VirtualScrollLocale, VirtualScrollLabels } from "@aiquants/virtualscroll";
7
7
  import { D as DailyReportActionIntent, U as UIComment } from "./source-types-a15dGIN1.mjs";
8
8
  export { f as foldDailyReportSourceTypeToken } from "./source-types-a15dGIN1.mjs";
9
- import { D as DailyReportReadState, a as DailyReportSseStreamAnchor, b as DailyReportSseTerminalEvent, c as DailyReportSseMessage, d as DailyReportReadMark, e as DailyReportReadStatus } from "./sse-schema-Bk_iO1vF.mjs";
9
+ import { D as DailyReportReadState, a as DailyReportSseStreamAnchor, b as DailyReportSseTerminalEvent, c as DailyReportSseMessage, d as DailyReportReadMark, e as DailyReportReadStatus } from "./sse-schema-DoLUV1Ow.mjs";
10
10
  import { D as DailyReportSearchFilterFacet } from "./search-filters-wire-5MWi6GWu.mjs";
11
11
  export { a as DAILY_REPORT_SEARCH_FILTER_FACETS } from "./search-filters-wire-5MWi6GWu.mjs";
12
12
  import { UseReopeningEventSourceResult } from "@aiquants/sse/react";
@@ -101,6 +101,7 @@ type DailyReportLabels = VirtualScrollLabels & {
101
101
  readonly deleteReport: string;
102
102
  readonly edit: string;
103
103
  readonly resizeHandle: string;
104
+ readonly resizeHandleHint: string;
104
105
  readonly close: string;
105
106
  readonly formTitle: string;
106
107
  readonly formTitlePlaceholder: string;
@@ -170,8 +171,6 @@ declare const DAILY_REPORT_LABEL_KEYS: readonly [
170
171
  "scrollRight",
171
172
  "verticalScrollBar",
172
173
  "horizontalScrollBar",
173
- "verticalScrollThumb",
174
- "horizontalScrollThumb",
175
174
  "scrollToTop",
176
175
  "scrollToBottom",
177
176
  "noItems",
@@ -235,6 +234,7 @@ declare const DAILY_REPORT_LABEL_KEYS: readonly [
235
234
  "deleteReport",
236
235
  "edit",
237
236
  "resizeHandle",
237
+ "resizeHandleHint",
238
238
  "close",
239
239
  "formTitle",
240
240
  "formTitlePlaceholder",
package/dist/client.d.ts CHANGED
@@ -6,7 +6,7 @@ import { D as DailyReportItem, a as DailyReportUser, b as DailyReportDetail } fr
6
6
  import { VirtualScrollLocale, VirtualScrollLabels } from "@aiquants/virtualscroll";
7
7
  import { D as DailyReportActionIntent, U as UIComment } from "./source-types-C1LvfRRJ.js";
8
8
  export { f as foldDailyReportSourceTypeToken } from "./source-types-C1LvfRRJ.js";
9
- import { D as DailyReportReadState, a as DailyReportSseStreamAnchor, b as DailyReportSseTerminalEvent, c as DailyReportSseMessage, d as DailyReportReadMark, e as DailyReportReadStatus } from "./sse-schema-BLe0x7BD.js";
9
+ import { D as DailyReportReadState, a as DailyReportSseStreamAnchor, b as DailyReportSseTerminalEvent, c as DailyReportSseMessage, d as DailyReportReadMark, e as DailyReportReadStatus } from "./sse-schema-ZdgeTkbk.js";
10
10
  import { D as DailyReportSearchFilterFacet } from "./search-filters-wire-5MWi6GWu.js";
11
11
  export { a as DAILY_REPORT_SEARCH_FILTER_FACETS } from "./search-filters-wire-5MWi6GWu.js";
12
12
  import { UseReopeningEventSourceResult } from "@aiquants/sse/react";
@@ -101,6 +101,7 @@ type DailyReportLabels = VirtualScrollLabels & {
101
101
  readonly deleteReport: string;
102
102
  readonly edit: string;
103
103
  readonly resizeHandle: string;
104
+ readonly resizeHandleHint: string;
104
105
  readonly close: string;
105
106
  readonly formTitle: string;
106
107
  readonly formTitlePlaceholder: string;
@@ -170,8 +171,6 @@ declare const DAILY_REPORT_LABEL_KEYS: readonly [
170
171
  "scrollRight",
171
172
  "verticalScrollBar",
172
173
  "horizontalScrollBar",
173
- "verticalScrollThumb",
174
- "horizontalScrollThumb",
175
174
  "scrollToTop",
176
175
  "scrollToBottom",
177
176
  "noItems",
@@ -235,6 +234,7 @@ declare const DAILY_REPORT_LABEL_KEYS: readonly [
235
234
  "deleteReport",
236
235
  "edit",
237
236
  "resizeHandle",
237
+ "resizeHandleHint",
238
238
  "close",
239
239
  "formTitle",
240
240
  "formTitlePlaceholder",