@hjmds/design-contracts 1.10.0 → 1.12.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/dist/action-session.d.ts +47 -0
- package/dist/action-session.d.ts.map +1 -0
- package/dist/action-session.js +60 -0
- package/dist/action-session.js.map +1 -0
- package/dist/activity-heatmap.d.ts +22 -0
- package/dist/activity-heatmap.d.ts.map +1 -0
- package/dist/activity-heatmap.js +29 -0
- package/dist/activity-heatmap.js.map +1 -0
- package/dist/auth-screen.d.ts +4 -0
- package/dist/auth-screen.d.ts.map +1 -1
- package/dist/auth-screen.js +2 -0
- package/dist/auth-screen.js.map +1 -1
- package/dist/avatar-fallback.d.ts +25 -0
- package/dist/avatar-fallback.d.ts.map +1 -0
- package/dist/avatar-fallback.js +17 -0
- package/dist/avatar-fallback.js.map +1 -0
- package/dist/behaviors.d.ts +2 -2
- package/dist/bottom-navigation-defaults.d.ts +1 -1
- package/dist/bottom-navigation-defaults.d.ts.map +1 -1
- package/dist/bottom-navigation-defaults.js.map +1 -1
- package/dist/bottom-navigation.d.ts.map +1 -1
- package/dist/bottom-navigation.js +5 -1
- package/dist/bottom-navigation.js.map +1 -1
- package/dist/catalog.d.ts +30 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/code-block.d.ts +23 -0
- package/dist/code-block.d.ts.map +1 -0
- package/dist/code-block.js +13 -0
- package/dist/code-block.js.map +1 -0
- package/dist/component-definitions.d.ts +2 -3
- package/dist/component-definitions.d.ts.map +1 -1
- package/dist/component-definitions.js +1 -2
- package/dist/component-definitions.js.map +1 -1
- package/dist/component-recipes.d.ts +25 -1
- package/dist/component-recipes.d.ts.map +1 -1
- package/dist/component-recipes.js +12 -1
- package/dist/component-recipes.js.map +1 -1
- package/dist/component-references.d.ts +0 -6
- package/dist/component-references.d.ts.map +1 -1
- package/dist/component-references.js +0 -5
- package/dist/component-references.js.map +1 -1
- package/dist/content-transition.d.ts +17 -0
- package/dist/content-transition.d.ts.map +1 -0
- package/dist/content-transition.js +15 -0
- package/dist/content-transition.js.map +1 -0
- package/dist/duration-field.d.ts +22 -0
- package/dist/duration-field.d.ts.map +1 -0
- package/dist/duration-field.js +20 -0
- package/dist/duration-field.js.map +1 -0
- package/dist/effect-surface.d.ts +29 -0
- package/dist/effect-surface.d.ts.map +1 -0
- package/dist/effect-surface.js +26 -0
- package/dist/effect-surface.js.map +1 -0
- package/dist/gooey-navigation.d.ts +13 -0
- package/dist/gooey-navigation.d.ts.map +1 -0
- package/dist/gooey-navigation.js +11 -0
- package/dist/gooey-navigation.js.map +1 -0
- package/dist/gravity-letters.d.ts +12 -0
- package/dist/gravity-letters.d.ts.map +1 -0
- package/dist/gravity-letters.js +11 -0
- package/dist/gravity-letters.js.map +1 -0
- package/dist/grid-reveal.d.ts +8 -0
- package/dist/grid-reveal.d.ts.map +1 -0
- package/dist/grid-reveal.js +5 -0
- package/dist/grid-reveal.js.map +1 -0
- package/dist/internal/object-validation.d.ts +3 -0
- package/dist/internal/object-validation.d.ts.map +1 -0
- package/dist/internal/object-validation.js +12 -0
- package/dist/internal/object-validation.js.map +1 -0
- package/dist/internal/thinking-orb/braid.d.ts.map +1 -1
- package/dist/internal/thinking-orb/braid.js +2 -9
- package/dist/internal/thinking-orb/braid.js.map +1 -1
- package/dist/internal/thinking-orb/core.d.ts +1 -0
- package/dist/internal/thinking-orb/core.d.ts.map +1 -1
- package/dist/internal/thinking-orb/core.js +12 -0
- package/dist/internal/thinking-orb/core.js.map +1 -1
- package/dist/internal/thinking-orb/presentation.d.ts +4 -0
- package/dist/internal/thinking-orb/presentation.d.ts.map +1 -0
- package/dist/internal/thinking-orb/presentation.js +28 -0
- package/dist/internal/thinking-orb/presentation.js.map +1 -0
- package/dist/internal/thinking-orb/ribbon.d.ts.map +1 -1
- package/dist/internal/thinking-orb/ribbon.js +2 -9
- package/dist/internal/thinking-orb/ribbon.js.map +1 -1
- package/dist/layout.d.ts +0 -5
- package/dist/layout.d.ts.map +1 -1
- package/dist/layout.js +0 -7
- package/dist/layout.js.map +1 -1
- package/dist/otp-field.d.ts +2 -0
- package/dist/otp-field.d.ts.map +1 -1
- package/dist/otp-field.js.map +1 -1
- package/dist/popover.d.ts.map +1 -1
- package/dist/popover.js +3 -12
- package/dist/popover.js.map +1 -1
- package/dist/progress-recipe.d.ts +1 -0
- package/dist/progress-recipe.d.ts.map +1 -1
- package/dist/progress-recipe.js +2 -1
- package/dist/progress-recipe.js.map +1 -1
- package/dist/reactions.d.ts +10 -0
- package/dist/reactions.d.ts.map +1 -0
- package/dist/reactions.js +20 -0
- package/dist/reactions.js.map +1 -0
- package/dist/scroll-progress.d.ts +8 -0
- package/dist/scroll-progress.d.ts.map +1 -0
- package/dist/scroll-progress.js +10 -0
- package/dist/scroll-progress.js.map +1 -0
- package/dist/steps.d.ts +1 -1
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +2 -1
- package/dist/steps.js.map +1 -1
- package/dist/task-list.d.ts +7 -0
- package/dist/task-list.d.ts.map +1 -0
- package/dist/task-list.js +4 -0
- package/dist/task-list.js.map +1 -0
- package/dist/theme-studio.d.ts +14 -0
- package/dist/theme-studio.d.ts.map +1 -0
- package/dist/theme-studio.js +16 -0
- package/dist/theme-studio.js.map +1 -0
- package/dist/thinking-orb.d.ts +4 -2
- package/dist/thinking-orb.d.ts.map +1 -1
- package/dist/thinking-orb.js +8 -3
- package/dist/thinking-orb.js.map +1 -1
- package/dist/toast-liquid.d.ts +4 -4
- package/dist/toast-liquid.d.ts.map +1 -1
- package/dist/toast-liquid.js +11 -10
- package/dist/toast-liquid.js.map +1 -1
- package/dist/toast.d.ts +4 -4
- package/dist/toast.d.ts.map +1 -1
- package/dist/toast.js +4 -3
- package/dist/toast.js.map +1 -1
- package/dist/tooltip.d.ts.map +1 -1
- package/dist/tooltip.js +3 -12
- package/dist/tooltip.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/voice-note.d.ts +20 -0
- package/dist/voice-note.d.ts.map +1 -0
- package/dist/voice-note.js +16 -0
- package/dist/voice-note.js.map +1 -0
- package/docs/action-session.md +73 -0
- package/docs/activity-heatmap.md +32 -0
- package/docs/anchor.md +1 -1
- package/docs/auth-screen.md +44 -4
- package/docs/authoring-brief.md +5 -0
- package/docs/avatar-fallback.md +74 -0
- package/docs/bottom-navigation.md +16 -1
- package/docs/breadcrumb.md +1 -1
- package/docs/calendar.md +1 -1
- package/docs/cascader.md +1 -1
- package/docs/code-block.md +32 -0
- package/docs/command-palette.md +1 -1
- package/docs/compound-controls.md +83 -0
- package/docs/confirm-popover.md +1 -1
- package/docs/consumer-policy.md +30 -23
- package/docs/cross-platform-core-normalization.md +23 -21
- package/docs/data-table.md +8 -5
- package/docs/dialog.md +2 -0
- package/docs/effect-surface.md +50 -0
- package/docs/floating-action-button.md +1 -1
- package/docs/folder-preview.md +26 -0
- package/docs/generated/component-maturity.md +1 -1
- package/docs/generated/renderer-evidence.json +3 -3
- package/docs/generated/renderer-evidence.md +1 -1
- package/docs/generated/showcase-manifest.json +1 -1
- package/docs/gooey-navigation.md +36 -0
- package/docs/gravity-letters.md +26 -0
- package/docs/grid-reveal.md +11 -0
- package/docs/icon.md +26 -0
- package/docs/image.md +2 -2
- package/docs/layout.md +1 -2
- package/docs/load-more.md +3 -1
- package/docs/migration-0.5.md +4 -1
- package/docs/migration-native-legacy-removal.md +60 -0
- package/docs/navigation-bar.md +28 -0
- package/docs/optional-adapters.md +24 -1
- package/docs/otp-field.md +23 -1
- package/docs/pagination.md +1 -1
- package/docs/popover.md +2 -2
- package/docs/product-adoption-1.4.md +7 -0
- package/docs/product-audit-2026-09-15.md +1 -1
- package/docs/progress.md +8 -0
- package/docs/provider-button.md +10 -3
- package/docs/rating.md +1 -1
- package/docs/react-native-completion.md +4 -4
- package/docs/screen-chrome.md +2 -2
- package/docs/scroll-progress.md +29 -0
- package/docs/sheet.md +2 -0
- package/docs/sidebar.md +6 -0
- package/docs/splitter.md +1 -1
- package/docs/step-player.md +16 -0
- package/docs/steps.md +9 -3
- package/docs/task-list.md +32 -0
- package/docs/theme-studio.md +13 -0
- package/docs/thinking-orb.md +9 -2
- package/docs/time-picker.md +1 -1
- package/docs/toast.md +8 -7
- package/docs/tour.md +1 -1
- package/docs/tree-select.md +2 -2
- package/docs/voice-note.md +19 -0
- package/package.json +91 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Avatar fallback and Blobatar
|
|
2
|
+
|
|
3
|
+
Reviewed: 2026-10-01. Implemented locally; package publication and consumer adoption are separate.
|
|
4
|
+
|
|
5
|
+
`Avatar` remains the sole canonical component. Both renderers accept
|
|
6
|
+
`renderFallback({ size, decorative: true })`. The factory is called only while a
|
|
7
|
+
photo is absent or has failed. Returning null/undefined preserves the existing
|
|
8
|
+
Web `fallback` or Native initials. Existing consumers are unchanged.
|
|
9
|
+
|
|
10
|
+
The Avatar owns the accessible name; custom fallback content is decorative and
|
|
11
|
+
must not contain interactive controls. Native hides fallback descendants from
|
|
12
|
+
accessibility. Photo source changes retry loading rather than retaining an old
|
|
13
|
+
failure. Web continues forwarding the image error callback.
|
|
14
|
+
|
|
15
|
+
## Optional adapter
|
|
16
|
+
|
|
17
|
+
Import `createBlobatarFallback` from `@hjmds/react/avatar-blobatar` or
|
|
18
|
+
`@hjmds/react-native/avatar-blobatar`. Neither root imports the adapter.
|
|
19
|
+
Install `blobatar@2.7.0` and the matching `@blobatar/react@2.7.0` or
|
|
20
|
+
`@blobatar/react-native@2.7.0`; Native additionally uses the existing supported
|
|
21
|
+
`react-native-svg` peer. The static entry needs no Reanimated or Worklets import.
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
const renderFallback = useMemo(
|
|
25
|
+
() => createBlobatarFallback({ seed: account.publicAvatarId, expression: 'idle' }),
|
|
26
|
+
[account.publicAvatarId],
|
|
27
|
+
);
|
|
28
|
+
// Web: <Avatar name={displayName} src={photo} renderFallback={renderFallback} />
|
|
29
|
+
// Native: <Avatar name={displayName} source={photo} accessibilityLabel={displayName}
|
|
30
|
+
// renderFallback={renderFallback} />
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Only `idle` and `happy` static expressions are currently exposed. There is no
|
|
34
|
+
`motion` option in this first implementation. Use the same public product seed on
|
|
35
|
+
both platforms; names, emails, credentials and inferred emotions are not seeds.
|
|
36
|
+
Normalization is explicitly disabled to preserve case-sensitive account identity.
|
|
37
|
+
Generation is local (Web data URI, Native SVG paths). No avatar server is called.
|
|
38
|
+
Pinned upstream versions prevent an incidental generator upgrade from changing
|
|
39
|
+
existing faces. React adapters retain upstream generation rather than approximating
|
|
40
|
+
its artwork with a second generator. MIT notices remain in the upstream packages.
|
|
41
|
+
|
|
42
|
+
`패턴/프로필 편집` in both showcases demonstrates choosing a face,
|
|
43
|
+
editing a display name, toggling notifications, applying and reverting local
|
|
44
|
+
changes. Copy is keyed in the shared showcase fixture; it is not embedded in the
|
|
45
|
+
renderer. This is a composition example, not an account API or new canonical screen.
|
|
46
|
+
The original [integration plan](../../../docs/plans/visual-and-motion-integration-2026-10-01.md)
|
|
47
|
+
tracks later animation, theme and marketing work.
|
|
48
|
+
|
|
49
|
+
## Optional motion and expressions (2026-10-01)
|
|
50
|
+
|
|
51
|
+
`/avatar-blobatar-motion` on each renderer exports `createAnimatedBlobatarFallback`.
|
|
52
|
+
It accepts a stable public `seed`, `expression` (idle, happy, sad, surprised, wink,
|
|
53
|
+
sleepy or thinking), `active` (default false), and `visible` (default true). Pass its
|
|
54
|
+
result into the existing Avatar `renderFallback`. Avatar still owns naming and image
|
|
55
|
+
fallback; the animated artwork remains decorative.
|
|
56
|
+
|
|
57
|
+
The Web entry imports Blobatar's motion stylesheet and observes intersection/document
|
|
58
|
+
visibility. Native uses the upstream optional AnimatedBlobatar entry, requiring the
|
|
59
|
+
host's compatible Reanimated/Worklets, and observes AppState. Native hosts must pass
|
|
60
|
+
route/list visibility explicitly. Native switches to the static upstream renderer when
|
|
61
|
+
inactive, hidden, reduced or backgrounded: upstream 2.7.0 keeps its frame callback
|
|
62
|
+
running with `animate=false`, as confirmed by device-host CPU sampling. Seed and
|
|
63
|
+
expression are preserved, while the idle clock restarts when re-enabled.
|
|
64
|
+
Both honor HJM reduced motion and never enable
|
|
65
|
+
idle animation without `active`. Static `/avatar-blobatar` remains available without
|
|
66
|
+
motion imports. The pinned Blobatar 2.7.0 generation and original license remain.
|
|
67
|
+
|
|
68
|
+
컴포넌트/데이터 표시/Animated Blobatar provides Default, Dark and LargeText in both
|
|
69
|
+
showcases, with explicit pose and motion controls. Native gating tests mock the
|
|
70
|
+
upstream rendering boundary; the subsequent [Native integration audit](../../../docs/evidence/native-visual-integration-2026-10-01/README.md)
|
|
71
|
+
adds installed iPhone 17 / iOS 27 simulator captures and active/stopped CPU samples
|
|
72
|
+
from the real upstream runtime. The inactive frame-loop correction is backed by
|
|
73
|
+
those samples. This does not establish physical-device GPU timing, battery use,
|
|
74
|
+
or exhaustive geometry and screen-reader behavior.
|
|
@@ -35,7 +35,7 @@ const descriptor = {
|
|
|
35
35
|
|
|
36
36
|
시각·플랫폼 선택은 별도 `BottomNavigationConfiguration`으로 전달합니다.
|
|
37
37
|
|
|
38
|
-
- `presentation`: `bar | floating`
|
|
38
|
+
- `presentation`: `bar | floating | capsule`
|
|
39
39
|
- `distribution`: `equal | center-gap`
|
|
40
40
|
- `density`: `compact | regular`
|
|
41
41
|
- `direction`: `ltr | rtl`
|
|
@@ -126,3 +126,18 @@ distribution을 선택하고 outer Dock frame에서 기존 Button/IconButton 기
|
|
|
126
126
|
합성합니다. 이 action은 tab role, selected state, badge, `selectedKey`, destination count를
|
|
127
127
|
가질 수 없습니다. Web은 button, RN은 button role과 activate action을 사용하며 제품 router나
|
|
128
128
|
modal API를 직접 호출합니다.
|
|
129
|
+
|
|
130
|
+
## Capsule presentation (2026-10-01)
|
|
131
|
+
|
|
132
|
+
`configuration={{ presentation: "capsule" }}`는 둥근 route 표면과 선택된 항목의 가로형
|
|
133
|
+
icon/label을 제공합니다. `primaryAction`은 컬렉션 밖의 별도 원형 행동으로 배치됩니다.
|
|
134
|
+
`center-gap`과 함께 지정하면 오류입니다. 생성 행동이 route로 오인되거나 중앙에서 이름을
|
|
135
|
+
가리는 것을 방지하기 위한 선택입니다.
|
|
136
|
+
|
|
137
|
+
기본 크기에서 비선택 항목의 시각 label은 접히지만 전체 접근성 이름/배지/route intent는
|
|
138
|
+
그대로 유지됩니다. 큰 글씨(1.5 이상) 또는 5–6개 목적지는 모든 이름을 세로 배치해 표시합니다.
|
|
139
|
+
기존 bar/floating 및 router 소유 selectedKey는 바뀌지 않습니다.
|
|
140
|
+
[사용자 레퍼런스 두 번째 이미지](https://www.instagram.com/p/Ddb8lXmjnV9/?img_index=2)의
|
|
141
|
+
선택 캡슐과 분리된 추가 행동을 참고했으며, 원본 소스는 복제하지 않았습니다.
|
|
142
|
+
|
|
143
|
+
Storybook: **컴포넌트 → 탐색 → 캡슐 네비게이션**, Default/Dark/LargeText.
|
package/docs/breadcrumb.md
CHANGED
|
@@ -74,7 +74,7 @@ Web에서는:
|
|
|
74
74
|
경로도 유지합니다. 필수 props는 `label`, `items`이고 `ref`는 nav 요소를 가리킵니다.
|
|
75
75
|
|
|
76
76
|
2026-09-16 사용자의 React/RN 라이브러리 확장 요청으로, 제품 채택 대기와 라이브러리 beta
|
|
77
|
-
제공을 분리했습니다.
|
|
77
|
+
제공을 분리했습니다. `갤러리/웹 탐색`은 조상 링크로 보관함을 열고 다시 기록 목록으로
|
|
78
78
|
돌아오는 작동 예제입니다. 제품 채택이나 stable 증거로 계산하지 않습니다.
|
|
79
79
|
|
|
80
80
|
[WAI Breadcrumb](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/)의 landmark·조상 링크·
|
package/docs/calendar.md
CHANGED
package/docs/cascader.md
CHANGED
|
@@ -110,7 +110,7 @@ collection + tri-state 판정 모듈)으로 확정됐고, Tree renderer가 들
|
|
|
110
110
|
않으므로 막아 둔 자리를 여는 새 축이 필요 없다.
|
|
111
111
|
|
|
112
112
|
그래서 catalog의 Cascader 행은 `prerequisite`에서 `composed`(Popover·Tree)로 옮겼고,
|
|
113
|
-
작동 예제는 Showcase
|
|
113
|
+
작동 예제는 Showcase `컴포넌트/데이터 표시/Tree`의 Cascader 화면이다. "만들지 않는다"는 판정 자체는
|
|
114
114
|
그대로다 — 바뀐 것은 흡수하는 쪽이 컴포넌트가 아니라 조합이라는 점뿐이다.
|
|
115
115
|
|
|
116
116
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Code block
|
|
2
|
+
|
|
3
|
+
Reviewed: 2026-10-01. Optional `/code-block` entries in both renderers expose
|
|
4
|
+
`CodeBlock`. This is a source preview, not an editor or executable HTML renderer.
|
|
5
|
+
The visual integration request required syntax presentation without another input
|
|
6
|
+
or clipboard engine, so source validation belongs to contracts and actions are slots.
|
|
7
|
+
|
|
8
|
+
Pass `code`, a localized `label`, optional `language`, `wrap` and `tokens`.
|
|
9
|
+
Tokens have `{text, tone?}` where tone is plain, keyword, string, comment or number.
|
|
10
|
+
Their text must concatenate to the original code exactly, including whitespace;
|
|
11
|
+
invalid output throws. Use a product-selected highlighter to generate tokens.
|
|
12
|
+
No parser, remote highlighting service, raw HTML or execution is included. The
|
|
13
|
+
semantic palette supplies readable token colors; string/plain may share a color.
|
|
14
|
+
|
|
15
|
+
Long lines scroll horizontally by default. `wrap` opts into wrapping. On Web the
|
|
16
|
+
preformatted source is keyboard-focusable and selectable; on Native it uses a
|
|
17
|
+
selectable Text inside the existing horizontal ScrollView. The Native accessible
|
|
18
|
+
name includes the original source as well as its label, so naming does not hide code.
|
|
19
|
+
|
|
20
|
+
`copyAction` accepts an existing product control. Web can pass HJM ClipboardButton
|
|
21
|
+
with `value={code}`, localized idle/copied labels and a visible `onCopyError` response.
|
|
22
|
+
Native can use system text selection directly or supply the product's clipboard
|
|
23
|
+
button. No Expo clipboard peer is pulled into the generic renderer. The Native
|
|
24
|
+
showcase demonstrates actual system selection; it does not fake a copied state.
|
|
25
|
+
|
|
26
|
+
Both showcases register `컴포넌트/데이터 표시/Code Block`. Contract tests reject altered
|
|
27
|
+
highlight text; browser tests check literal script text, focus and wrapping; Native
|
|
28
|
+
host tests check selectable content and scroll/wrap composition. The
|
|
29
|
+
[Native flow audit](../../../docs/evidence/component-flows-2026-10-01/README.md) verifies
|
|
30
|
+
200% controlled text scaling and actual iOS simulator long-press Copy, with exact
|
|
31
|
+
source/clipboard equality. Header and source use the common text-scale helper;
|
|
32
|
+
token spans inherit once. Android clipboard and physical-device verification remain separate.
|
package/docs/command-palette.md
CHANGED
|
@@ -134,4 +134,4 @@ Native는 `unsupported`다. 전역 단축키는 제품 소유다.
|
|
|
134
134
|
- **전역 단축키는 제품 소유다.** 이 renderer는 여는 키를 정하지 않는다.
|
|
135
135
|
- 로컬 검증: `test/command-palette.browser.test.tsx` 5개(이름·초점·배경 inert, 활성 행과
|
|
136
136
|
disabled 건너뜀·재필터, 실행 시 강제 종료와 사유, 종료 후 후속 명령 순서, Escape·바깥
|
|
137
|
-
pointer 종료)와
|
|
137
|
+
pointer 종료)와 `컴포넌트/탐색/Command Palette`.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Compound controls
|
|
2
|
+
|
|
3
|
+
Reviewed: 2026-10-01. Web and React Native expose identical optional entry names:
|
|
4
|
+
`/duration-field`, `/inline-confirm`, `/reaction-picker`, `/notification-bell`.
|
|
5
|
+
These are compositions of existing canonical controls, not replacements for them.
|
|
6
|
+
The 2026-10-01 visual integration request calls for reusable interactions as well as
|
|
7
|
+
page examples; keeping the existing controls preserves their disabled, focus and
|
|
8
|
+
loading behavior instead of introducing another control implementation.
|
|
9
|
+
|
|
10
|
+
## DurationField
|
|
11
|
+
|
|
12
|
+
Use for bounded elapsed time (integer seconds), not clock time or calendar dates.
|
|
13
|
+
Pass `value`, `onValueChange`, required `max`, optional `min` (default 0), and
|
|
14
|
+
`labels: {label, hours, minutes, seconds, increment(unit), decrement(unit)}`.
|
|
15
|
+
All labels are localized by the product. Three existing NumberFields edit the
|
|
16
|
+
hours/minutes/seconds representation. The shared `/duration-field` contract
|
|
17
|
+
validates safe integers and clamps the *combined* duration to the configured range.
|
|
18
|
+
Native field columns wrap according to the text scale so enlarged numeric values stay visible.
|
|
19
|
+
Hours are disabled when the maximum is below one hour. `disabled` disables all
|
|
20
|
+
inputs. Values outside the range throw rather than silently changing product state.
|
|
21
|
+
|
|
22
|
+
## InlineConfirm
|
|
23
|
+
|
|
24
|
+
Use for a local explicit confirmation when an overlay would interrupt the context.
|
|
25
|
+
Pass `label`, `prompt`, `confirmLabel`, `cancelLabel`, `pendingLabel`,
|
|
26
|
+
`successLabel`, `errorLabel`, and `onConfirm(): void | Promise<void>`.
|
|
27
|
+
The existing AlertDialog session owns async deduplication, pending and retry.
|
|
28
|
+
No action runs on the initial trigger. Pending disables both actions; rejection
|
|
29
|
+
shows the supplied safe error text and permits retry. Web initially focuses cancel,
|
|
30
|
+
Escape cancels, and cancellation restores trigger focus. Native exposes the
|
|
31
|
+
controls and live error text through its host accessibility APIs.
|
|
32
|
+
Native keeps the localized status text available to assistive technology. iOS
|
|
33
|
+
receives one explicit announcement per prompt/pending/error/success transition;
|
|
34
|
+
errors interrupt queued speech, other updates queue politely. Repeated rendering,
|
|
35
|
+
completion's internal closing phase and background updates do not repeat the prompt.
|
|
36
|
+
Android retains its live-region/alert semantics. Native bridge calls are lifecycle-tested;
|
|
37
|
+
this is not a claim that VoiceOver audio was manually heard.
|
|
38
|
+
|
|
39
|
+
Success remains visible. Remount with a new entity key to reset the interaction;
|
|
40
|
+
the session captures the action and labels when opened. The product owns operation
|
|
41
|
+
cancellation, authorization, persistence and server-side idempotency.
|
|
42
|
+
|
|
43
|
+
## ReactionPicker
|
|
44
|
+
|
|
45
|
+
Pass a nonempty list of `{id, emoji, label, count?, disabled?}`, controlled
|
|
46
|
+
`value: string | null`, `onValueChange`, and the group `label`.
|
|
47
|
+
The shared `/reactions` contract rejects duplicate IDs, invalid counts and unknown
|
|
48
|
+
selected IDs. Selecting the current reaction clears it; selecting another replaces
|
|
49
|
+
it. Existing Buttons own selection and disabled semantics. Counts are product data
|
|
50
|
+
and never increment implicitly. Include counts in localized option labels when
|
|
51
|
+
needed for screen readers; visible emoji/count artwork is decorative. Native passes
|
|
52
|
+
one composed text label to Button so emoji and count use its Text wrapper; sibling
|
|
53
|
+
raw strings bypass that wrapper and fail to render on a real device.
|
|
54
|
+
|
|
55
|
+
## NotificationBell
|
|
56
|
+
|
|
57
|
+
Pass `label`, nonnegative integer `count`, `icon`, `onPress`, and optionally
|
|
58
|
+
`disabled` or `active`. Supply the localized unread information in `label` and a
|
|
59
|
+
semantic Icon/Lucide glyph as `icon`. Existing IconButton and CounterBadge own the
|
|
60
|
+
control and count presentation. Artwork and badge are hidden from accessibility
|
|
61
|
+
so the button is announced once.
|
|
62
|
+
A count increase triggers one 400ms pulse; mounting or decreasing does not ring.
|
|
63
|
+
Reduced motion, inactive presentation and background document/AppState suppress
|
|
64
|
+
motion. Native hosts should set `active={false}` for offscreen items. Pressing does
|
|
65
|
+
not mark notifications read automatically; that operation belongs to the product.
|
|
66
|
+
|
|
67
|
+
## Evidence and examples
|
|
68
|
+
|
|
69
|
+
Both showcases register `컴포넌트/입력/Duration Field`,
|
|
70
|
+
`컴포넌트/동작/Inline Confirm`, `컴포넌트/동작/Reaction Picker` and
|
|
71
|
+
`컴포넌트/피드백/Notification Bell`, each with Default, Dark and LargeText.
|
|
72
|
+
`갤러리/복합 입력` provides the comparison examples. Web browser and Native
|
|
73
|
+
host-action tests exercise clamp, confirmation/retry/deduplication, controlled
|
|
74
|
+
reactions and motion suspension. Native host tests are not device-render evidence;
|
|
75
|
+
actual iPhone 17 / iOS 27 simulator LargeText cancel/error/retry/success/reset flows
|
|
76
|
+
are recorded in the [component flow audit](../../../docs/evidence/component-flows-2026-10-01/README.md).
|
|
77
|
+
Remaining device coverage stays tracked in the
|
|
78
|
+
[implementation ledger](../../../docs/plans/visual-integration-progress.md).
|
|
79
|
+
|
|
80
|
+
The same [Native flow audit](../../../docs/evidence/component-flows-2026-10-01/README.md)
|
|
81
|
+
also verifies LargeText duration unit increments/decrements and total seconds, reaction
|
|
82
|
+
selection/replacement/clearing, and local bell read/add state. These are actual simulator
|
|
83
|
+
actions, distinct from backend notification delivery and physical-device screen-reader QA.
|
package/docs/confirm-popover.md
CHANGED
|
@@ -99,7 +99,7 @@ Component Explorer에서 이 문서로 연결한다.
|
|
|
99
99
|
|
|
100
100
|
## 2026-09-16 작동 예제
|
|
101
101
|
|
|
102
|
-
React/RN 확장 요청에 따라
|
|
102
|
+
React/RN 확장 요청에 따라 `컴포넌트/오버레이/Popover/ReversibleConfirmation`을 제공한다.
|
|
103
103
|
`@hjmds/react/popover`의 children 함수에서 `close()`와 HJM Button을 조합한다.
|
|
104
104
|
취소 버튼을 초기 초점으로 지정하고, 보관 후 사라지는 트리거 대신 보관 취소 버튼에
|
|
105
105
|
초점을 보낸다. 보관 취소는 실제 로컬 상태를 복원한다. 외부 서버 요청이나 배포 증거는 아니다.
|
package/docs/consumer-policy.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# HJM 소비 앱 정책
|
|
2
2
|
|
|
3
3
|
상태: **Normative**
|
|
4
|
-
정책 버전: **
|
|
4
|
+
정책 버전: **2.0.0**
|
|
5
|
+
검토일: 2026-10-02 · 전체 소비 이관에 따른 deprecated API 제거
|
|
5
6
|
적용 대상: 신규 HJM Web·React Native 앱과 기존 앱의 새 화면
|
|
6
7
|
|
|
7
|
-
이
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
근거로 사용하고, 존재하지 않는 `v0.9.0` 정책 URL을 만들어 내면 안 됩니다.
|
|
8
|
+
이 원문은 `@hjmds/design-contracts/consumer-policy.md`에서 제공한다. 소비 앱은 설치한
|
|
9
|
+
패키지 버전의 정책과 HJM-APP-STANDARD release snapshot을 함께 확인한다. 이 checkout의
|
|
10
|
+
1.11 소스 갱신을 아직 설치하지 않은 앱에 자동 적용된 것으로 판단하지 않는다.
|
|
11
11
|
|
|
12
12
|
이 문서는 "HJM답게 보인다"를 특정 화면 복제로 정의하지 않습니다. 모든 제품이 공유해야
|
|
13
13
|
하는 것은 정보 위계, semantic role, 상태 피드백, 접근성 품질과 플랫폼별 행동입니다.
|
|
@@ -93,23 +93,15 @@ foundation이 모두 stable이 됐으므로, 중앙 app profile의 다음 개정
|
|
|
93
93
|
|
|
94
94
|
### 3.1 React Native legacy style compatibility boundary
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
color, typography, padding, gap, border, radius, height, opacity, transform과 interaction
|
|
106
|
-
state key를 타입에서 제외합니다. 허용된 margin 값도 HJM spacing token 또는 검토된 제품
|
|
107
|
-
adapter에서 와야 합니다(MUST).
|
|
108
|
-
- 기존 화면의 legacy prop은 migration 기간에만 유지할 수 있습니다(MAY). controlled visual
|
|
109
|
-
key가 남아 있으면 정책 항목, 소유자, 대체 semantic API와 제거 train을 ADR에 기록해야
|
|
110
|
-
하며, 신규 사용으로 복사해서는 안 됩니다(MUST NOT).
|
|
111
|
-
- 0.9 호환 train에서는 등록 style ID와 배열을 런타임에서 필터링하거나 조용히 삭제하지
|
|
112
|
-
않습니다. 그러한 즉시 변경은 기존 앱의 레이아웃을 예측 불가능하게 깨뜨리기 때문입니다.
|
|
96
|
+
2026-10-02 전체 소비 버전업 결정에 따라 deprecated 공개 스타일 통로는 1.11에서 제거합니다.
|
|
97
|
+
정확한 제거 속성과 대체 API는 [1.11 이관표](migration-native-legacy-removal.md)를 따릅니다.
|
|
98
|
+
1.x 설치본의 caller-last 호환 동작은 역사적 동작이며 현재 소스에 유지되지 않습니다.
|
|
99
|
+
|
|
100
|
+
- 배치에는 `layoutStyle`을 쓰고, 제공하지 않는 컴포넌트는 외부 composition wrapper를 씁니다.
|
|
101
|
+
- `HjmCompositionStyle` / `layoutStyle`은 margin, width, flex 계열과 `alignSelf`만 제공합니다. color,
|
|
102
|
+
typography, padding, gap, border, radius, height, opacity, transform은 recipe/semantic API 소유입니다.
|
|
103
|
+
- 내부 조합의 스타일은 비공개 renderer에 두며 앱에서 해당 내부 파일을 import하지 않습니다.
|
|
104
|
+
- 정식 플랫폼 host·제품 소유 슬롯·이미지 renderer 스타일을 deprecated 별칭과 혼동하지 않습니다.
|
|
113
105
|
|
|
114
106
|
소비 앱의 legacy prop이 실제로 무엇을 덮어쓰고 있었는지 확인한 뒤, 배치가 아닌 값은
|
|
115
107
|
semantic axis로 옮겼습니다. 아래는 그 축과 대체 대상입니다.
|
|
@@ -165,7 +157,7 @@ legacy raw style surface는 다음 조건이 모두 충족된 뒤 공지된 brea
|
|
|
165
157
|
“1.0.0 이전 제거” 기한은 실제 release/API와 어긋나므로 폐기합니다. 이미 게시한 1.x의 타입과
|
|
166
158
|
런타임을 minor에서 삭제하는 대신, 위 네 조건과 소비 앱별 이관 목록을 충족한 다음 major에서
|
|
167
159
|
제거합니다. 1.4는 semantic API와 이관 경로를 추가하는 train이며, 기존 prop을 새 화면에 쓰는
|
|
168
|
-
것은 계속 금지합니다.
|
|
160
|
+
것은 계속 금지합니다. 2026-10-02 사용자의 전체 이관 결정으로 제거 train을 1.11로 확정했습니다.
|
|
169
161
|
|
|
170
162
|
권장 구조는 다음과 같습니다. 실제 폴더명은 stack 관습에 맞춰도 역할은 유지합니다.
|
|
171
163
|
|
|
@@ -240,3 +232,18 @@ package로 승격하지 않습니다.
|
|
|
240
232
|
## Optional presentation adapters
|
|
241
233
|
|
|
242
234
|
The [optional adapter contract](optional-adapters.md) lists platform-specific entries and exact peer requirements. These extensions do not promote the canonical component or establish consumer/device compatibility. Native adapters require separately verified development clients; base imports retain their existing dependency contract.
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
## 상호작용 채택과 성능 기록
|
|
238
|
+
|
|
239
|
+
2026-10-02 사용자가 참고 인터랙션 수준의 제품 품질을 요청한 데 따른 구체 적용 기준이다.
|
|
240
|
+
기존 상태 피드백·접근성 책임을 제품의 입력 → 반응 → 확정 → 복구 흐름까지 연결한다.
|
|
241
|
+
|
|
242
|
+
- 제품은 설치된 HJM 버전의 API와 Storybook 배포/실험 상태를 확인하고 해당 범위에서 재사용한다.
|
|
243
|
+
새 동작이 필요한 경우 기존 Button·Sheet·Toast를 합성하며 같은 상태를 두 계층에서 관리하지 않는다.
|
|
244
|
+
- 성공은 서버 또는 제품의 실제 확정 뒤에 표시한다. 연속 입력·실패·역순 응답·중간 이탈에서도
|
|
245
|
+
초안과 복구 경로를 보존한다. 웹·앱 입력 방식이 달라도 같은 사용자 의도를 유지한다.
|
|
246
|
+
- 성능에 영향을 주는 제스처·전환·대량 렌더링 변경은 제품 조건의 변경 전후를 측정한다.
|
|
247
|
+
기기·OS·빌드·데이터·측정 방법과 미검증 범위를 기록하고 데모의 성공을 실기기 성능으로 쓰지 않는다.
|
|
248
|
+
- 구체 예제·목표·기록 양식은 [상호작용 적용·품질 기준](../../../docs/INTERACTION_QUALITY.md)을 따른다.
|
|
249
|
+
이 소스 문서의 변경이 아직 게시되지 않은 API를 소비 앱에 설치하거나 자동 적용하지는 않는다.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Cross-platform core normalization
|
|
2
2
|
|
|
3
|
+
검토일: 2026-10-02 · 2.0 source contract
|
|
4
|
+
|
|
3
5
|
Text, Surface, Stack, Grid, Button, IconButton, Tag, Card의 공통 의미 축은 contracts가 소유하고 Web과
|
|
4
6
|
Native renderer는 각 플랫폼 host로 번역한다. 라이브러리 비교와 채택/기각 근거는
|
|
5
7
|
[library-reference-decisions.md](./library-reference-decisions.md)를 따른다.
|
|
@@ -41,6 +43,10 @@ Native renderer는 각 플랫폼 host로 번역한다. 라이브러리 비교와
|
|
|
41
43
|
`loading`과 `disabled`는 같은 상태가 아니다. 두 renderer 모두 loading 중 activation을
|
|
42
44
|
막고 busy 상태를 보조 기술에 노출하지만, pending control의 focusability는 유지한다.
|
|
43
45
|
명시적 `disabled`만 host의 disabled 상태가 된다.
|
|
46
|
+
2026-10-02 사용자 요청에 따라 Button은 로딩 중 기존 글자·양쪽 장식을 시각적으로 숨기고
|
|
47
|
+
버튼 중앙에 스피너 하나만 표시한다. 내용은 레이아웃에 남겨 폭을 유지하며 접근성 이름과
|
|
48
|
+
busy 상태도 유지한다. 글자 옆에 스피너를 추가하는 이전 표현은 시각적 중복과 폭 변화를
|
|
49
|
+
만들어 버렸다.
|
|
44
50
|
|
|
45
51
|
IconButton은 보이는 텍스트가 없으므로 현지화된 `label`과 icon `children`을 두 renderer에서
|
|
46
52
|
필수로 받는다. `size`는 36/44/52 visual diameter를 선택하고 small은 Web pseudo hit area와
|
|
@@ -53,7 +59,8 @@ edge를 항상 그린다.
|
|
|
53
59
|
|
|
54
60
|
## 0.5 compatibility aliases
|
|
55
61
|
|
|
56
|
-
0.6
|
|
62
|
+
아래는 0.6 이관 당시의 before/canonical 비교다. 현재 지원 여부는 각 API 타입을 따른다.
|
|
63
|
+
아래 before API는 모두 [2.0 이관](./migration-native-legacy-removal.md)에서 제거했다.
|
|
57
64
|
|
|
58
65
|
```tsx
|
|
59
66
|
// before
|
|
@@ -73,30 +80,25 @@ edge를 항상 그린다.
|
|
|
73
80
|
<IconButton label="닫기" tone="ghost"><CloseIcon /></IconButton>
|
|
74
81
|
```
|
|
75
82
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- Native `Surface.sunken`, `Surface.brand`: 각각 `subtle`, `accent` deprecated alias
|
|
79
|
-
- Native `Grid.descriptor`: flat `columns`/`gap`/`minColumnWidth`를 위한 deprecated alias
|
|
80
|
-
- Native `IconButton.accessibilityLabel`, `icon`: `label`, `children` deprecated alias
|
|
81
|
-
- Native `IconButton tone="link"`: `ghost`로 번역되는 deprecated alias
|
|
82
|
-
|
|
83
|
-
호환 alias는 새 문서와 예제에서 사용하지 않는다. 제거는 major release에서만 한다.
|
|
83
|
+
Native `Surface.sunken`은 공통 recipe에 독립적으로 정의된 tone이며 deprecated alias가 아니다.
|
|
84
|
+
`brand`만 제거하고 `accent`로 이관한다. 1.x의 호환 별칭 지원 설명은 현재 2.0 소스에 적용하지 않는다.
|
|
84
85
|
|
|
85
86
|
## Collection and state vocabulary
|
|
86
87
|
|
|
87
|
-
공통 제품 코드에서 같은 역할은 같은 이름을 사용한다.
|
|
88
|
-
|
|
88
|
+
공통 제품 코드에서 같은 역할은 같은 이름을 사용한다. 1.x에서 제공했던 Native bridge를
|
|
89
|
+
2.0에서 제거했으므로 아래 canonical API만 사용한다.
|
|
89
90
|
|
|
90
|
-
| Component | Canonical Web/Native API |
|
|
91
|
-
| --- | --- |
|
|
92
|
-
| Switch | `checked`, `defaultChecked`, `onCheckedChange` |
|
|
93
|
-
| RadioGroup | `items: RadioGroupItem[]` |
|
|
94
|
-
| SegmentedControl | `items: SegmentedControlItem[]` |
|
|
95
|
-
| Tabs | `items: TabItem[]`, item key `id` |
|
|
96
|
-
| Select | `source`/`items`/`sections`, `selectedKey`, `defaultSelectedKey`, `onSelectionChange` |
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
91
|
+
| Component | Canonical Web/Native API |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
| Switch | `checked`, `defaultChecked`, `onCheckedChange` |
|
|
94
|
+
| RadioGroup | `items: RadioGroupItem[]` |
|
|
95
|
+
| SegmentedControl | `items: SegmentedControlItem[]` |
|
|
96
|
+
| Tabs | `items: TabItem[]`, item key `id` |
|
|
97
|
+
| Select | `source`/`items`/`sections`, `selectedKey`, `defaultSelectedKey`, `onSelectionChange` |
|
|
98
|
+
| Menu | 항목 key `id`, 실행 `onAction`, 선택 `selection.onSelectionChange` |
|
|
99
|
+
|
|
100
|
+
Web Menu의 선택 prop 배치는 Web Menu 타입을 따른다. 두 플랫폼 모두 실행과 선택 변경을
|
|
101
|
+
구분하며 item-local `onSelect` 또는 Native `onSelect` 호환 콜백은 사용하지 않는다.
|
|
100
102
|
|
|
101
103
|
## Reference application notes
|
|
102
104
|
|
package/docs/data-table.md
CHANGED
|
@@ -84,10 +84,13 @@ async 상태와 narrow long-copy 회귀로 확인하고, 소비 제품의 데이
|
|
|
84
84
|
`@hjmds/react/data-table`의 `DataTable`이 이 계약을 실행한다. Web renderer는 전용 keyboard·
|
|
85
85
|
selection·320px long-copy proof를 통과해 2026-09-29 stable로 승격한다. Native는 `unsupported`다.
|
|
86
86
|
|
|
87
|
-
- **기존 `Table`과
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
- **기존 `Table`과 정렬 기능은 공유한다.** 2026-10-01 중복 조사에서 Table도 정렬 버튼과
|
|
88
|
+
ascending/descending 순환을 제공하는데 표시 전용으로 설명했던 불일치를 확인했다.
|
|
89
|
+
Table은 generic row·caption·emptyState와 두 방향 정렬을 제공하고, DataTable은
|
|
90
|
+
ID 기반 row/column·선택·tri-state·async 상태 및 정렬 해제를 포함하는 세 상태 순환을 제공한다.
|
|
91
|
+
정렬 전환은 같은 계약 함수, header button은 같은 내부 renderer를 소비한다.
|
|
92
|
+
caption과 단순 generic row 표는 Table, 행 선택·loading/error와 정렬 해제가 필요한 표는
|
|
93
|
+
DataTable을 선택한다. API를 합치면 caption·emptyState·row 모델 호환성을 잃으므로 두 API를 유지한다.
|
|
91
94
|
- **정렬 버튼은 header 안에 있다.** `th` 자체를 버튼으로 만들지 않고, 방향은
|
|
92
95
|
`aria-sort`에 그대로 흘린다. 다음 상태는 `getNextDataTableSortState`가 정하고 실제 정렬은
|
|
93
96
|
제품이 한다.
|
|
@@ -103,4 +106,4 @@ selection·320px long-copy proof를 통과해 2026-09-29 stable로 승격한다.
|
|
|
103
106
|
- 로컬 검증: `test/data-table.browser.test.tsx` 5개(header 안 정렬 버튼과 aria-sort 3단계,
|
|
104
107
|
tri-state 선택과 disabled 제외, 단일 선택 radio 의미, 셀당 컨트롤 하나와 기본 tab 순서,
|
|
105
108
|
async 상태 발표와 footer 조합), `test/data-table.keyboard.browser.test.tsx` 1개(실제 Tab·Enter·Space
|
|
106
|
-
입력), 그리고
|
|
109
|
+
입력), 그리고 `컴포넌트/탐색/Command Palette`의 표 화면.
|
package/docs/dialog.md
CHANGED
|
@@ -37,3 +37,5 @@ a narrow viewport. React Native renderer tests cover modal role/name/state,
|
|
|
37
37
|
action labels and close requests, back/outside dismissal, busy guards, and long
|
|
38
38
|
title/description copy. These tests exercise renderer contracts; device and
|
|
39
39
|
screen-reader behavior remains a separate consumer validation concern.
|
|
40
|
+
|
|
41
|
+
Native accessibility follow-up (2026-10-01): at 200% text scale, the close glyph was clipped inside the fixed IconButton frame. Dialog and Sheet now render that decorative glyph at a fixed icon size, matching Toast; title/body text still scales and the named close action and touch target are preserved. `sheet-viewport.test.tsx` checks both renderers and close callbacks.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Composable decorative surfaces
|
|
2
|
+
|
|
3
|
+
2026-10-01. Optional Web/Native presentation, independent implementation inspired
|
|
4
|
+
by layered shader composition. No Shaders.com engine, presets or source is shipped.
|
|
5
|
+
|
|
6
|
+
Import `EffectSurface` from the renderer `/effect-surface` entry. The shared
|
|
7
|
+
`/effect-surface` contract accepts unique `layers` (`mesh`, `glow`, `grain`), a
|
|
8
|
+
stable `seed`, `intensity` from 0 to 1, a cycle `period` from 2 to 120 seconds,
|
|
9
|
+
`active` (false by default), and three semantic color references. Web uses local
|
|
10
|
+
SVG/WAAPI; Native requires the existing optional SVG peer and core Animated.
|
|
11
|
+
No WebGPU context, network request or new native animation runtime is required.
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
<EffectSurface descriptor={{ layers: ['mesh', 'grain'], seed: 'welcome', active: true }}>
|
|
15
|
+
<WelcomeContent />
|
|
16
|
+
</EffectSurface>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Web accepts `className`; Native accepts container `style` and host `visible`.
|
|
20
|
+
Native screen/list owners must pass `visible={false}` when hidden or outside the
|
|
21
|
+
visible list window. Web observes intersection and document visibility. Both
|
|
22
|
+
honor the HJM provider's reduced-motion setting; Native also handles AppState.
|
|
23
|
+
The static seeded geometry and the base theme background stay visible when motion
|
|
24
|
+
stops. Effects never duplicate content, take focus, intercept touches or add an
|
|
25
|
+
accessible name. The content itself stays in normal layout.
|
|
26
|
+
|
|
27
|
+
Noise uses a seeded repeating small-dot tile rather than large spots. Geometry
|
|
28
|
+
is shared, while host rasterization and transform details can differ. This is
|
|
29
|
+
atmospheric parity, not a pixel-identical renderer promise. Motion is opt-in and
|
|
30
|
+
slow by default to avoid adding continuous work to ordinary content screens.
|
|
31
|
+
Use `active` only while an effect matters; avoid many simultaneously moving rows.
|
|
32
|
+
|
|
33
|
+
The component does not automatically guarantee text contrast across arbitrary
|
|
34
|
+
brand colors/intensities. Verify the actual composition or put important text
|
|
35
|
+
and controls on an opaque HJM Surface. The fallback background is the current
|
|
36
|
+
provider background, not an independently selected palette.
|
|
37
|
+
|
|
38
|
+
`갤러리/시각 효과` demonstrates layers separately and together.
|
|
39
|
+
This optional surface is supplemental presentation; it does not add another
|
|
40
|
+
canonical Surface or replace ThinkingOrb's actual-work state semantics.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
Host failure fallback (2026-10-02): if Web animation creation is rejected, the SVG
|
|
44
|
+
stays static and no visibility event repeatedly retries it. Native SVG/Animated
|
|
45
|
+
render errors remove only the decoration until the surface remounts; product
|
|
46
|
+
children keep their state and remain interactive on the base theme background.
|
|
47
|
+
A failed Native foreground animation start keeps the static decoration and stops
|
|
48
|
+
retrying for that effect lifecycle. Descriptor validation stays outside this
|
|
49
|
+
fallback so invalid caller input is still reported. This implements integration
|
|
50
|
+
plan §5's requirement that decorative failures must not remove product content.
|
|
@@ -109,7 +109,7 @@ FAB는 collection 항목이 아니다. 스크롤 콘텐츠 **뒤**에 오는 고
|
|
|
109
109
|
|
|
110
110
|
## 검증 화면
|
|
111
111
|
|
|
112
|
-
2026-09-16: React/RN
|
|
112
|
+
2026-09-16: React/RN `패턴/빠른 메모 작성`에 스크롤 목록 → 기록 작성
|
|
113
113
|
Dialog → 새 기록 추가 흐름을 구현했다. Flutter 앱은 이번 이관 범위에서 제외한다.
|
|
114
114
|
|
|
115
115
|
## React / React Native 공개 API
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Folder preview
|
|
2
|
+
|
|
3
|
+
Reviewed: 2026-10-01. Both renderers expose FolderPreview through `/folder-preview`.
|
|
4
|
+
It is an optional Collapsible composition for collections with a decorative cover,
|
|
5
|
+
not a new navigation or overlay controller. Pass localized `label`, controlled
|
|
6
|
+
`open`, `onOpenChange`, up to three useful `previews`, actual `children`, and optional
|
|
7
|
+
`disabled`. Further preview nodes are intentionally not rendered.
|
|
8
|
+
|
|
9
|
+
Previews are decorative snapshots, not interactive controls. Their wrapper is inert
|
|
10
|
+
on Web and hides descendants from Native accessibility/touch. Use existing Asset or
|
|
11
|
+
Image components in slots when artwork is needed, and repeat meaningful item names
|
|
12
|
+
and actions in expanded children. The label should describe the collection/count.
|
|
13
|
+
The existing Collapsible owns expanded state and unmounts closed content.
|
|
14
|
+
|
|
15
|
+
The bounded 260×160 artwork uses overlapping cards that fan out when opened. Web
|
|
16
|
+
transitions transforms and respects reduced motion. Native uses the existing
|
|
17
|
+
ContentTransition around the artwork, inheriting its reduced-motion/AppState rules.
|
|
18
|
+
Labels and real content remain fluid; the illustration is not their sizing model.
|
|
19
|
+
|
|
20
|
+
Both showcases register 컴포넌트/데이터 표시/Folder Preview with Default, Dark and
|
|
21
|
+
LargeText. Tests cover controlled expansion and decorative accessibility boundaries.
|
|
22
|
+
[Native and Web LargeText flow evidence](../../../docs/evidence/component-flows-2026-10-01/README.md)
|
|
23
|
+
verifies opening/closing and readable expanded content. The examples use document line
|
|
24
|
+
artwork in decorative slots: enlarged text there previously overlapped inside the fixed
|
|
25
|
+
illustration. Actual item names remain in the fluid content below. Physical-device and
|
|
26
|
+
manually heard screen-reader verification remain separate.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Component maturity and evidence manifest
|
|
2
2
|
|
|
3
|
-
> Generated from `@hjmds/design-contracts` 1.
|
|
3
|
+
> Generated from `@hjmds/design-contracts` 1.12.0. Do not edit this file directly; run `pnpm contracts:sync`.
|
|
4
4
|
|
|
5
5
|
This document is the human-readable projection of the same catalog and Showcase manifest consumed by product CI.
|
|
6
6
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"designSystemVersion": "1.
|
|
3
|
+
"designSystemVersion": "1.12.0",
|
|
4
4
|
"source": "packages/design-contracts/docs/generated/showcase-manifest.json",
|
|
5
5
|
"surfaces": {
|
|
6
6
|
"web": {
|
|
7
7
|
"packageName": "@hjmds/react",
|
|
8
|
-
"packageVersion": "1.
|
|
8
|
+
"packageVersion": "1.12.0",
|
|
9
9
|
"activeComponents": 103,
|
|
10
10
|
"claimedComponents": 103,
|
|
11
11
|
"completeScenarioComponents": 103,
|
|
@@ -5642,7 +5642,7 @@
|
|
|
5642
5642
|
},
|
|
5643
5643
|
"native": {
|
|
5644
5644
|
"packageName": "@hjmds/react-native",
|
|
5645
|
-
"packageVersion": "1.
|
|
5645
|
+
"packageVersion": "1.12.0",
|
|
5646
5646
|
"activeComponents": 83,
|
|
5647
5647
|
"claimedComponents": 83,
|
|
5648
5648
|
"completeScenarioComponents": 83,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Renderer evidence coverage
|
|
2
2
|
|
|
3
|
-
> Generated for HJM 1.
|
|
3
|
+
> Generated for HJM 1.12.0. Do not edit directly; run `pnpm evidence:sync`.
|
|
4
4
|
|
|
5
5
|
This projection joins the canonical surface maturity manifest with first-party renderer claims. Missing scenarios are explicit beta promotion debt; stable surfaces are blocked by CI until none remain.
|
|
6
6
|
|