@hjmds/design-contracts 1.8.0 → 1.10.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/affix.d.ts +8 -0
- package/dist/affix.d.ts.map +1 -0
- package/dist/affix.js +7 -0
- package/dist/affix.js.map +1 -0
- package/dist/catalog.d.ts +66 -94
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +11 -11
- package/dist/catalog.js.map +1 -1
- package/dist/color-picker.d.ts +11 -0
- package/dist/color-picker.d.ts.map +1 -0
- package/dist/color-picker.js +20 -0
- package/dist/color-picker.js.map +1 -0
- package/dist/component-definitions.d.ts +0 -5
- package/dist/component-definitions.d.ts.map +1 -1
- package/dist/component-definitions.js +0 -5
- package/dist/component-definitions.js.map +1 -1
- package/dist/component-recipes.d.ts +38 -4
- package/dist/component-recipes.d.ts.map +1 -1
- package/dist/component-recipes.js +21 -5
- package/dist/component-recipes.js.map +1 -1
- package/dist/component-references.d.ts +10 -10
- package/dist/component-references.js +5 -5
- package/dist/component-references.js.map +1 -1
- package/dist/interaction-adapters.d.ts +53 -0
- package/dist/interaction-adapters.d.ts.map +1 -0
- package/dist/interaction-adapters.js +45 -0
- package/dist/interaction-adapters.js.map +1 -0
- package/dist/showcase.d.ts.map +1 -1
- package/dist/showcase.js +3 -0
- package/dist/showcase.js.map +1 -1
- package/dist/toast-liquid.d.ts +1 -1
- package/dist/toast-liquid.d.ts.map +1 -1
- package/dist/toast-liquid.js +4 -1
- package/dist/toast-liquid.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/watermark.d.ts +15 -0
- package/dist/watermark.d.ts.map +1 -0
- package/dist/watermark.js +11 -0
- package/dist/watermark.js.map +1 -0
- package/docs/affix.md +27 -63
- package/docs/ant-design-coverage.md +8 -12
- package/docs/cascader.md +5 -0
- package/docs/catalog-decision-status.md +5 -0
- package/docs/color-picker.md +30 -72
- package/docs/confirm-popover.md +5 -0
- package/docs/generated/component-maturity.md +7 -12
- package/docs/generated/renderer-evidence.json +165 -6
- package/docs/generated/renderer-evidence.md +5 -2
- package/docs/generated/showcase-manifest.json +44 -127
- package/docs/optional-adapters.md +20 -0
- package/docs/rating.md +5 -0
- package/docs/stable-core.md +21 -1
- package/docs/time-picker.md +5 -0
- package/docs/toast.md +20 -2
- package/docs/tree-select.md +5 -0
- package/docs/watermark.md +26 -58
- package/package.json +25 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Renderer evidence coverage
|
|
2
2
|
|
|
3
|
-
> Generated for HJM 1.
|
|
3
|
+
> Generated for HJM 1.10.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
|
|
|
7
|
-
- web:
|
|
7
|
+
- web: 103/103 active implementations; 103/103 required scenario sets
|
|
8
8
|
- native: 83/83 active implementations; 83/83 required scenario sets
|
|
9
9
|
|
|
10
10
|
| Component | Surface | Maturity | Renderer package | Export | Claimed scenarios | Missing required scenarios | Executable proofs |
|
|
@@ -51,6 +51,7 @@ This projection joins the canonical surface maturity manifest with first-party r
|
|
|
51
51
|
| Combobox | web | stable | @hjmds/react | ./forms | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#combobox, test/scenario-matrix.browser.test.tsx#combobox, test/stable-core.browser.test.tsx#combobox |
|
|
52
52
|
| DatePicker | web | stable | @hjmds/react | ./date-picker | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#date-picker, test/scenario-matrix.browser.test.tsx#date-picker, test/stable-core.browser.test.tsx#date-picker |
|
|
53
53
|
| DateRangePicker | web | stable | @hjmds/react | ./date-range | default, accessibility, dark, large-text, rtl, reduced-motion, keyboard | none | test/default-render.ssr.test.tsx#date-range-picker, test/scenario-matrix.browser.test.tsx#date-range-picker, test/date-range.keyboard.browser.test.tsx#date-range-picker |
|
|
54
|
+
| ColorPicker | web | stable | @hjmds/react | ./color-picker | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#color-picker, test/scenario-matrix.browser.test.tsx#color-picker, test/web-additions.browser.test.tsx#color-picker |
|
|
54
55
|
| FilePicker | web | stable | @hjmds/react | ./file-picker | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#file-picker, test/scenario-matrix.browser.test.tsx#file-picker, test/file-picker.keyboard.browser.test.tsx#file-picker |
|
|
55
56
|
| Form | web | stable | @hjmds/react | ./forms | default, accessibility, dark, large-text, rtl, reduced-motion, keyboard | none | test/default-render.ssr.test.tsx#form, test/scenario-matrix.browser.test.tsx#form, test/form.keyboard.browser.test.tsx#form |
|
|
56
57
|
| Agreement | web | stable | @hjmds/react | ./agreement | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#agreement, test/scenario-matrix.browser.test.tsx#agreement, test/agreement.keyboard.browser.test.tsx#agreement |
|
|
@@ -99,6 +100,7 @@ This projection joins the canonical surface maturity manifest with first-party r
|
|
|
99
100
|
| Result | web | stable | @hjmds/react | ./feedback | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy | none | test/default-render.ssr.test.tsx#result, test/scenario-matrix.browser.test.tsx#result |
|
|
100
101
|
| BottomInfo | web | stable | @hjmds/react | ./bottom-info | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy | none | test/default-render.ssr.test.tsx#bottom-info, test/scenario-matrix.browser.test.tsx#bottom-info |
|
|
101
102
|
| Toast | web | stable | @hjmds/react | ./toast | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#toast, test/scenario-matrix.browser.test.tsx#toast, test/stable-core.browser.test.tsx#toast, test/toast-layout.browser.test.tsx#toast |
|
|
103
|
+
| Watermark | web | stable | @hjmds/react | ./watermark | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy | none | test/default-render.ssr.test.tsx#watermark, test/scenario-matrix.browser.test.tsx#watermark |
|
|
102
104
|
| Dialog | web | stable | @hjmds/react | ./overlays | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#dialog, test/scenario-matrix.browser.test.tsx#dialog, test/advanced.browser.test.tsx#dialog |
|
|
103
105
|
| AlertDialog | web | stable | @hjmds/react | ./overlays | default, accessibility, dark, large-text, rtl, reduced-motion, keyboard, long-copy | none | test/default-render.ssr.test.tsx#alert-dialog, test/scenario-matrix.browser.test.tsx#alert-dialog, test/alert-dialog.keyboard.browser.test.tsx#alert-dialog |
|
|
104
106
|
| Sheet | web | stable | @hjmds/react | ./overlays | default, accessibility, dark, large-text, rtl, reduced-motion, keyboard, long-copy | none | test/default-render.ssr.test.tsx#sheet, test/scenario-matrix.browser.test.tsx#sheet, test/sheet-layout.browser.test.tsx#sheet |
|
|
@@ -106,6 +108,7 @@ This projection joins the canonical surface maturity manifest with first-party r
|
|
|
106
108
|
| Popover | web | stable | @hjmds/react | ./popover | default, accessibility, dark, large-text, rtl, reduced-motion, keyboard, long-copy | none | test/default-render.ssr.test.tsx#popover, test/scenario-matrix.browser.test.tsx#popover, test/popover.browser.test.tsx#popover |
|
|
107
109
|
| Tooltip | web | stable | @hjmds/react | ./overlays | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy, keyboard | none | test/default-render.ssr.test.tsx#tooltip, test/scenario-matrix.browser.test.tsx#tooltip, test/tooltip.browser.test.tsx#tooltip |
|
|
108
110
|
| CommandPalette | web | stable | @hjmds/react | ./command-palette | default, accessibility, dark, large-text, rtl, reduced-motion, keyboard, long-copy | none | test/default-render.ssr.test.tsx#command-palette, test/scenario-matrix.browser.test.tsx#command-palette, test/command-palette.browser.test.tsx#command-palette |
|
|
111
|
+
| Affix | web | stable | @hjmds/react | ./affix | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy | none | test/default-render.ssr.test.tsx#affix, test/scenario-matrix.browser.test.tsx#affix |
|
|
109
112
|
| DesignSystemProvider | web | stable | @hjmds/react | ./provider | default, accessibility, dark, large-text, rtl, reduced-motion, long-copy | none | test/default-render.ssr.test.tsx#design-system-provider, test/scenario-matrix.browser.test.tsx#design-system-provider |
|
|
110
113
|
| SkipNav | web | stable | @hjmds/react | ./skip-nav | default, accessibility, dark, large-text, rtl, reduced-motion, keyboard, long-copy | none | test/default-render.ssr.test.tsx#skip-nav, test/scenario-matrix.browser.test.tsx#skip-nav, test/skip-nav.browser.test.tsx#skip-nav |
|
|
111
114
|
| VisuallyHidden | web | stable | @hjmds/react | ./layout | default, accessibility, dark, large-text, rtl, reduced-motion | none | test/default-render.ssr.test.tsx#visually-hidden, test/scenario-matrix.browser.test.tsx#visually-hidden |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"designSystemVersion": "1.
|
|
3
|
+
"designSystemVersion": "1.10.0",
|
|
4
4
|
"packageName": "@hjmds/design-contracts",
|
|
5
5
|
"components": [
|
|
6
6
|
{
|
|
@@ -2031,39 +2031,15 @@
|
|
|
2031
2031
|
"authored": null
|
|
2032
2032
|
}
|
|
2033
2033
|
},
|
|
2034
|
-
{
|
|
2035
|
-
"id": "time-picker",
|
|
2036
|
-
"storyId": "input/time-picker",
|
|
2037
|
-
"name": "TimePicker",
|
|
2038
|
-
"category": "input",
|
|
2039
|
-
"platform": "adaptive",
|
|
2040
|
-
"contractStatus": "planned",
|
|
2041
|
-
"surfaces": {
|
|
2042
|
-
"web": "planned",
|
|
2043
|
-
"native": "planned"
|
|
2044
|
-
},
|
|
2045
|
-
"requirements": [
|
|
2046
|
-
{
|
|
2047
|
-
"surface": "contract",
|
|
2048
|
-
"scenarios": [
|
|
2049
|
-
"contract"
|
|
2050
|
-
]
|
|
2051
|
-
}
|
|
2052
|
-
],
|
|
2053
|
-
"documentation": {
|
|
2054
|
-
"generated": "docs/generated/component-maturity.md",
|
|
2055
|
-
"authored": "docs/time-picker.md"
|
|
2056
|
-
}
|
|
2057
|
-
},
|
|
2058
2034
|
{
|
|
2059
2035
|
"id": "color-picker",
|
|
2060
2036
|
"storyId": "input/color-picker",
|
|
2061
2037
|
"name": "ColorPicker",
|
|
2062
2038
|
"category": "input",
|
|
2063
2039
|
"platform": "web",
|
|
2064
|
-
"contractStatus": "
|
|
2040
|
+
"contractStatus": "stable",
|
|
2065
2041
|
"surfaces": {
|
|
2066
|
-
"web": "
|
|
2042
|
+
"web": "stable",
|
|
2067
2043
|
"native": "unsupported"
|
|
2068
2044
|
},
|
|
2069
2045
|
"requirements": [
|
|
@@ -2072,6 +2048,19 @@
|
|
|
2072
2048
|
"scenarios": [
|
|
2073
2049
|
"contract"
|
|
2074
2050
|
]
|
|
2051
|
+
},
|
|
2052
|
+
{
|
|
2053
|
+
"surface": "web",
|
|
2054
|
+
"scenarios": [
|
|
2055
|
+
"default",
|
|
2056
|
+
"dark",
|
|
2057
|
+
"long-copy",
|
|
2058
|
+
"large-text",
|
|
2059
|
+
"rtl",
|
|
2060
|
+
"reduced-motion",
|
|
2061
|
+
"accessibility",
|
|
2062
|
+
"keyboard"
|
|
2063
|
+
]
|
|
2075
2064
|
}
|
|
2076
2065
|
],
|
|
2077
2066
|
"documentation": {
|
|
@@ -2129,30 +2118,6 @@
|
|
|
2129
2118
|
"authored": "docs/file-picker.md"
|
|
2130
2119
|
}
|
|
2131
2120
|
},
|
|
2132
|
-
{
|
|
2133
|
-
"id": "cascader",
|
|
2134
|
-
"storyId": "input/cascader",
|
|
2135
|
-
"name": "Cascader",
|
|
2136
|
-
"category": "input",
|
|
2137
|
-
"platform": "adaptive",
|
|
2138
|
-
"contractStatus": "planned",
|
|
2139
|
-
"surfaces": {
|
|
2140
|
-
"web": "planned",
|
|
2141
|
-
"native": "planned"
|
|
2142
|
-
},
|
|
2143
|
-
"requirements": [
|
|
2144
|
-
{
|
|
2145
|
-
"surface": "contract",
|
|
2146
|
-
"scenarios": [
|
|
2147
|
-
"contract"
|
|
2148
|
-
]
|
|
2149
|
-
}
|
|
2150
|
-
],
|
|
2151
|
-
"documentation": {
|
|
2152
|
-
"generated": "docs/generated/component-maturity.md",
|
|
2153
|
-
"authored": "docs/cascader.md"
|
|
2154
|
-
}
|
|
2155
|
-
},
|
|
2156
2121
|
{
|
|
2157
2122
|
"id": "form",
|
|
2158
2123
|
"storyId": "input/form",
|
|
@@ -2301,30 +2266,6 @@
|
|
|
2301
2266
|
"authored": "docs/mentions.md"
|
|
2302
2267
|
}
|
|
2303
2268
|
},
|
|
2304
|
-
{
|
|
2305
|
-
"id": "rating",
|
|
2306
|
-
"storyId": "input/rating",
|
|
2307
|
-
"name": "Rating",
|
|
2308
|
-
"category": "input",
|
|
2309
|
-
"platform": "shared",
|
|
2310
|
-
"contractStatus": "planned",
|
|
2311
|
-
"surfaces": {
|
|
2312
|
-
"web": "planned",
|
|
2313
|
-
"native": "planned"
|
|
2314
|
-
},
|
|
2315
|
-
"requirements": [
|
|
2316
|
-
{
|
|
2317
|
-
"surface": "contract",
|
|
2318
|
-
"scenarios": [
|
|
2319
|
-
"contract"
|
|
2320
|
-
]
|
|
2321
|
-
}
|
|
2322
|
-
],
|
|
2323
|
-
"documentation": {
|
|
2324
|
-
"generated": "docs/generated/component-maturity.md",
|
|
2325
|
-
"authored": "docs/rating.md"
|
|
2326
|
-
}
|
|
2327
|
-
},
|
|
2328
2269
|
{
|
|
2329
2270
|
"id": "transfer-list",
|
|
2330
2271
|
"storyId": "input/transfer-list",
|
|
@@ -2375,30 +2316,6 @@
|
|
|
2375
2316
|
"authored": "docs/transfer-list.md"
|
|
2376
2317
|
}
|
|
2377
2318
|
},
|
|
2378
|
-
{
|
|
2379
|
-
"id": "tree-select",
|
|
2380
|
-
"storyId": "input/tree-select",
|
|
2381
|
-
"name": "TreeSelect",
|
|
2382
|
-
"category": "input",
|
|
2383
|
-
"platform": "web",
|
|
2384
|
-
"contractStatus": "planned",
|
|
2385
|
-
"surfaces": {
|
|
2386
|
-
"web": "planned",
|
|
2387
|
-
"native": "unsupported"
|
|
2388
|
-
},
|
|
2389
|
-
"requirements": [
|
|
2390
|
-
{
|
|
2391
|
-
"surface": "contract",
|
|
2392
|
-
"scenarios": [
|
|
2393
|
-
"contract"
|
|
2394
|
-
]
|
|
2395
|
-
}
|
|
2396
|
-
],
|
|
2397
|
-
"documentation": {
|
|
2398
|
-
"generated": "docs/generated/component-maturity.md",
|
|
2399
|
-
"authored": "docs/tree-select.md"
|
|
2400
|
-
}
|
|
2401
|
-
},
|
|
2402
2319
|
{
|
|
2403
2320
|
"id": "upload-item",
|
|
2404
2321
|
"storyId": "data-display/upload-item",
|
|
@@ -4375,9 +4292,9 @@
|
|
|
4375
4292
|
"name": "Watermark",
|
|
4376
4293
|
"category": "feedback",
|
|
4377
4294
|
"platform": "web",
|
|
4378
|
-
"contractStatus": "
|
|
4295
|
+
"contractStatus": "stable",
|
|
4379
4296
|
"surfaces": {
|
|
4380
|
-
"web": "
|
|
4297
|
+
"web": "stable",
|
|
4381
4298
|
"native": "unsupported"
|
|
4382
4299
|
},
|
|
4383
4300
|
"requirements": [
|
|
@@ -4386,6 +4303,18 @@
|
|
|
4386
4303
|
"scenarios": [
|
|
4387
4304
|
"contract"
|
|
4388
4305
|
]
|
|
4306
|
+
},
|
|
4307
|
+
{
|
|
4308
|
+
"surface": "web",
|
|
4309
|
+
"scenarios": [
|
|
4310
|
+
"default",
|
|
4311
|
+
"dark",
|
|
4312
|
+
"long-copy",
|
|
4313
|
+
"large-text",
|
|
4314
|
+
"rtl",
|
|
4315
|
+
"reduced-motion",
|
|
4316
|
+
"accessibility"
|
|
4317
|
+
]
|
|
4389
4318
|
}
|
|
4390
4319
|
],
|
|
4391
4320
|
"documentation": {
|
|
@@ -4617,30 +4546,6 @@
|
|
|
4617
4546
|
"authored": "docs/popover.md"
|
|
4618
4547
|
}
|
|
4619
4548
|
},
|
|
4620
|
-
{
|
|
4621
|
-
"id": "confirm-popover",
|
|
4622
|
-
"storyId": "overlay/confirm-popover",
|
|
4623
|
-
"name": "ConfirmPopover",
|
|
4624
|
-
"category": "overlay",
|
|
4625
|
-
"platform": "web",
|
|
4626
|
-
"contractStatus": "planned",
|
|
4627
|
-
"surfaces": {
|
|
4628
|
-
"web": "planned",
|
|
4629
|
-
"native": "unsupported"
|
|
4630
|
-
},
|
|
4631
|
-
"requirements": [
|
|
4632
|
-
{
|
|
4633
|
-
"surface": "contract",
|
|
4634
|
-
"scenarios": [
|
|
4635
|
-
"contract"
|
|
4636
|
-
]
|
|
4637
|
-
}
|
|
4638
|
-
],
|
|
4639
|
-
"documentation": {
|
|
4640
|
-
"generated": "docs/generated/component-maturity.md",
|
|
4641
|
-
"authored": "docs/confirm-popover.md"
|
|
4642
|
-
}
|
|
4643
|
-
},
|
|
4644
4549
|
{
|
|
4645
4550
|
"id": "tooltip",
|
|
4646
4551
|
"storyId": "overlay/tooltip",
|
|
@@ -4721,9 +4626,9 @@
|
|
|
4721
4626
|
"name": "Affix",
|
|
4722
4627
|
"category": "utility",
|
|
4723
4628
|
"platform": "web",
|
|
4724
|
-
"contractStatus": "
|
|
4629
|
+
"contractStatus": "stable",
|
|
4725
4630
|
"surfaces": {
|
|
4726
|
-
"web": "
|
|
4631
|
+
"web": "stable",
|
|
4727
4632
|
"native": "unsupported"
|
|
4728
4633
|
},
|
|
4729
4634
|
"requirements": [
|
|
@@ -4732,6 +4637,18 @@
|
|
|
4732
4637
|
"scenarios": [
|
|
4733
4638
|
"contract"
|
|
4734
4639
|
]
|
|
4640
|
+
},
|
|
4641
|
+
{
|
|
4642
|
+
"surface": "web",
|
|
4643
|
+
"scenarios": [
|
|
4644
|
+
"default",
|
|
4645
|
+
"dark",
|
|
4646
|
+
"long-copy",
|
|
4647
|
+
"large-text",
|
|
4648
|
+
"rtl",
|
|
4649
|
+
"reduced-motion",
|
|
4650
|
+
"accessibility"
|
|
4651
|
+
]
|
|
4735
4652
|
}
|
|
4736
4653
|
],
|
|
4737
4654
|
"documentation": {
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Optional presentation adapters
|
|
2
2
|
|
|
3
|
+
## Current evidence — 2026-09-30
|
|
4
|
+
|
|
5
|
+
The six opt-in entries are implemented. The earlier checkout verification below is a historical
|
|
6
|
+
snapshot, not the current publication or consumer-adoption state. The subsequent
|
|
7
|
+
[Web audit](../../../docs/evidence/full-audit-2026-09-29/WEB.md),
|
|
8
|
+
[iOS audit](../../../docs/evidence/full-audit-2026-09-29/IOS-AUDIT.md) and
|
|
9
|
+
[Android evidence](../../../docs/evidence/full-audit-2026-09-29/android.json)
|
|
10
|
+
record browser and installed simulator/emulator checks, including optional adapter flows.
|
|
11
|
+
These results do not establish physical-device or screen-reader testing and do not promote
|
|
12
|
+
optional adapters by changing canonical component counts. This catalog cleanup does not publish
|
|
13
|
+
packages or migrate consumer applications.
|
|
14
|
+
|
|
15
|
+
## Original adoption record — 2026-09-29
|
|
16
|
+
|
|
3
17
|
2026-09-29: the user requested all six shortlisted libraries, explicitly allowing platform-specific
|
|
4
18
|
adoption. These are opt-in extensions, not six new canonical components or a stable promotion.
|
|
5
19
|
The canonical Statistic/Menu/Sheet/KeyboardAvoiding APIs remain available without additional peers.
|
|
@@ -67,6 +81,12 @@ Expo Go cannot verify these linked native modules.
|
|
|
67
81
|
the host can still close programmatically. GestureSheetInput wires sheet keyboard tracking.
|
|
68
82
|
Android back, backdrop and pan dismissal converge on onOpenChange(false). Consumers remain
|
|
69
83
|
responsible for focus restoration to the opener and avoiding simultaneous modal sheets.
|
|
84
|
+
Inside an RN `Modal`, Android back goes to the Modal's `onRequestClose` and never reaches
|
|
85
|
+
BackHandler, so the 2026-09-30 audit saw back close the whole host. Such hosts call
|
|
86
|
+
`dismissTopGestureSheet()` first and close themselves only when it returns false. The same
|
|
87
|
+
applies to a navigation container inside a Modal (shared screen transition Detail): the host
|
|
88
|
+
must route `onRequestClose` to `navigation.goBack()` while it can go back. Insets default to the
|
|
89
|
+
HjmNativeProvider `safeAreaInsets`; the library's English handle/background labels are replaced.
|
|
70
90
|
- NativeContextMenu delegates long-press behavior and menu appearance to the OS. Supply an
|
|
71
91
|
accessible native child; item IDs are unique, labels localized, danger maps to OS destructive
|
|
72
92
|
intent and disabled actions are guarded. Arbitrary custom native menu colors are unsupported.
|
package/docs/rating.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Rating — 계약을 만들지 않는다
|
|
2
2
|
|
|
3
|
+
> 2026-09-30 정리: 구현된 조합을 미구현으로 집계하지 않도록 독립 Planned 행과 catalog ID를 제거했다.
|
|
4
|
+
> 기존 조합 예제와 공개 helper는 유지하며, 참조표는 실제 구성 컴포넌트로 연결한다.
|
|
5
|
+
> 아래 날짜별 설계 기록의 행 유지 지시는 당시 판단이며 이 결정으로 대체한다.
|
|
6
|
+
|
|
7
|
+
|
|
3
8
|
## 먼저 판정: 필요한가
|
|
4
9
|
|
|
5
10
|
야잘알(KBO 정보)과 BurnTok 어디에도 별점(리뷰 점수, 만족도 별표) 화면이 없다. 야잘알의
|
package/docs/stable-core.md
CHANGED
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
# Stable Core
|
|
2
2
|
|
|
3
|
+
## 2026-09-30 선택형 상호작용 어댑터·Liquid Toast 승격
|
|
4
|
+
|
|
5
|
+
`sortable`·`swipe-actions`·`content-transition`·`carousel-motion`·`celebration`(Web·Native)과 Native Liquid Toast를
|
|
6
|
+
stable로 올린다. 선택형 확장이라 canonical 개수는 바뀌지 않는다. 근거는 Web Chromium, 설치된 iOS 27 시뮬레이터, 이번에
|
|
7
|
+
추가한 Android 16 에뮬레이터 확인이다([어댑터 기록](../../../docs/evidence/interaction-adapters-2026-09-30.md),
|
|
8
|
+
[Liquid Toast 기록](../../../docs/evidence/liquid-toast-2026-09-30/README.md)). 검토에서 고친 것: Celebration 입자 색(옅은
|
|
9
|
+
surfaceAccent → primary + 상태 강조색), Liquid Toast 그림자·캡슐·색 전환. Native `screen-transition`은 experimental로 남긴다 —
|
|
10
|
+
React Navigation 7.4.1 전용이고, 포트폴리오 Expo 앱은 모두 expo-router 57이라 쓸 수 있는 소비자가 없다. Sortable은
|
|
11
|
+
한 줄 목록 범위만 지원한다(그리드 미지원). 실기기·음성 보조기기 QA는 소비 앱 릴리스 몫이다.
|
|
12
|
+
|
|
13
|
+
## 2026-09-30 Web 기능 추가
|
|
14
|
+
|
|
15
|
+
ColorPicker·Watermark·Affix를 Web에서 구현했다. 세 항목은 React Native unsupported이며,
|
|
16
|
+
현재 계약/Web은 Stable 103개·Beta 0개·Planned 0개, Native는 Stable 83개다.
|
|
17
|
+
공개 API·기본값은 각 컴포넌트 문서가 소유하며, HEX/alpha·키보드 입력 복구,
|
|
18
|
+
워터마크의 비간섭·텍스트 이스케이프, Affix의 중첩 스크롤·부모 경계·초점 보존·크기 초과
|
|
19
|
+
해제를 Chromium으로 검증한다. dark/RTL/200%/reduced-motion/접근성/긴 문구 증거도 연결했다.
|
|
20
|
+
[검증 기록](../../../docs/evidence/web-additions-2026-09-30/README.md)에 실행 결과와 범위를 남긴다.
|
|
21
|
+
사용자의 배포 제외 지시에 따라 버전 게시나 소비 앱 변경은 하지 않는다.
|
|
22
|
+
|
|
3
23
|
## 2026-09-29 컴포넌트 승격 (다음 minor)
|
|
4
24
|
|
|
5
25
|
`Divider`, `Section`, `ListRow`, `Statistic`, `DescriptionList`, `EmptyState`, `Result`, `Layout`, `Splitter`, `Accordion`, `Agreement`, `FilePicker`, `Tabs`, `BottomNavigation`, `LoadMore`, `Mentions`,
|
|
6
26
|
`Heading`, `Top`, `BottomCTA`, `AspectRatio`, `Grid`, `Steps`, `TopBar`, `AuthScreenLayout`, `Radio`,
|
|
7
27
|
`Avatar`, `Asset`, `CounterBadge`, `Image`, `VisuallyHidden`, `List`, `Timeline`, `BottomInfo`, `Link`, `AuthProviderButton`, `PasswordField`, `CheckboxGroup`, `RadioGroup`, `Chip`, `SegmentedControl`, `SearchField`, `NumberField`, `Toast`, `FloatingActionButton`, `Checkbox`, `Switch`, `ToggleGroup`, `Slider`, `OtpField`, `TagsInput`, `DatePicker`, `DateRangePicker`, `Breadcrumb`, `Pagination`, `Menubar`, `Form`, `Sidebar(Web)`, `TransferList`, `UploadItem`, `ContextMenu(Web)`, `Menu`, `Anchor(Web)`, `Collapsible`, `DataTable(Web)`, `Tree(Web)`, `Calendar`, `Carousel`, `Tour(Web)`, `ThinkingOrb`, `Dialog`, `AlertDialog`, `Sheet`, `SidePanel(Web)`, `Popover(Web)`, `Tooltip(Web)`, `CommandPalette(Web)`, `SkipNav(Web)`을 각 지원 surface에서 stable로 승격합니다.
|
|
8
|
-
TextFormat, Splitter, Breadcrumb, Pagination, Menubar, Sidebar와 Web 전용 overlay/navigation 컴포넌트는 Web-only stable입니다. DateRangePicker, Accordion, Agreement, FilePicker, Tabs, BottomNavigation, LoadMore, Mentions, Form, TransferList, UploadItem, Menu, Collapsible, Calendar, Carousel, Dialog, AlertDialog, Sheet는 Web·Native stable입니다. ThinkingOrb도 Web·Native stable입니다.
|
|
28
|
+
TextFormat, Splitter, Breadcrumb, Pagination, Menubar, Sidebar와 Web 전용 overlay/navigation 컴포넌트는 Web-only stable입니다. DateRangePicker, Accordion, Agreement, FilePicker, Tabs, BottomNavigation, LoadMore, Mentions, Form, TransferList, UploadItem, Menu, Collapsible, Calendar, Carousel, Dialog, AlertDialog, Sheet는 Web·Native stable입니다. ThinkingOrb도 Web·Native stable입니다. 당시 계약 stable은 100개, Web stable은 100개, Native stable은 83개입니다.
|
|
9
29
|
|
|
10
30
|
## 2026-09-29 Beta → Stable 확인
|
|
11
31
|
|
package/docs/time-picker.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# TimePicker — 새 컴포넌트를 만들지 않는다
|
|
2
2
|
|
|
3
|
+
> 2026-09-30 정리: 구현된 조합을 미구현으로 집계하지 않도록 독립 Planned 행과 catalog ID를 제거했다.
|
|
4
|
+
> 기존 조합 예제와 공개 helper는 유지하며, 참조표는 실제 구성 컴포넌트로 연결한다.
|
|
5
|
+
> 아래 날짜별 설계 기록의 행 유지 지시는 당시 판단이며 이 결정으로 대체한다.
|
|
6
|
+
|
|
7
|
+
|
|
3
8
|
## 문제로 제기된 것
|
|
4
9
|
|
|
5
10
|
Ant Design `TimePicker`는 필드 트리거를 누르면 시·분(·초) 열이 나란히 있는 팝업이 뜨고,
|
package/docs/toast.md
CHANGED
|
@@ -117,6 +117,23 @@ Storybook `Patterns/Toast layout`. The fixture covers long Korean/English copy,
|
|
|
117
117
|
doubled text, dark theme and RTL. Automated browser checks are separate from
|
|
118
118
|
real assistive-technology and consumer-release evidence; Toast remains beta.
|
|
119
119
|
|
|
120
|
+
### Visual refresh — 2026-09-30 (1.10.0)
|
|
121
|
+
|
|
122
|
+
BurnTok 사용자 피드백("알림 ui 구려")을 실제 화면으로 확인했더니 세 가지가 원인이었습니다. neutral
|
|
123
|
+
Toast의 `●` 글리프가 뜻 없는 회색 점으로 보였고, 글자 글리프(`i`·`!`)는 폰트 metric에 따라 오타처럼
|
|
124
|
+
보였고, action이 밑줄 없는 텍스트라 컨트롤로 읽히지 않았습니다. 1.10.0은 다음으로 바꿉니다.
|
|
125
|
+
|
|
126
|
+
- tone은 32-unit 원형 tinted badge 안의 stroke SVG 아이콘이 전달합니다(neutral = 종). 2px 가장자리
|
|
127
|
+
띠(`toneMark`)는 badge와 역할이 겹쳐 너비 0으로 은퇴했습니다 — slot은 가산 계약을 위해 남깁니다.
|
|
128
|
+
- action은 끝 정렬 tinted pill(`action.background` = `surface.brand`, 44-unit target)입니다. 라벨과
|
|
129
|
+
fill 대비 4.5:1을 contract test가 지킵니다.
|
|
130
|
+
- 카드 radius md → lg, description은 secondary 색으로 제목과 위계를 나눕니다. 테두리는
|
|
131
|
+
`border.strong`을 유지합니다 — subtle hairline은 3:1 경계 대비(WCAG 1.4.11) test를 통과하지 못했습니다.
|
|
132
|
+
- 여러 줄·큰 글자에서도 badge는 제목 옆 위쪽에 붙고, 한국어는 `word-break: keep-all`로 단어 중간에서
|
|
133
|
+
끊지 않습니다(Web).
|
|
134
|
+
|
|
135
|
+
Review fixture: Storybook `Patterns/Toast layout` → `Tone gallery`(light/dark).
|
|
136
|
+
|
|
120
137
|
Web renderer:
|
|
121
138
|
|
|
122
139
|
- viewport를 문서 root 근처에 하나만 두고 recipe placement와 logical start/end를 사용합니다.
|
|
@@ -140,8 +157,9 @@ Native renderer:
|
|
|
140
157
|
- swipe capability가 없는 플랫폼에서는 gesture를 노출하지 않습니다.
|
|
141
158
|
- app background/foreground와 accessibility focus를 `window`/`focus` pause reason에 연결합니다.
|
|
142
159
|
|
|
143
|
-
두 renderer 모두 tone icon
|
|
144
|
-
|
|
160
|
+
두 renderer 모두 tone icon을 tinted badge(`toastRecipe.icon.badgeDiameter`, `tones.*.badge`) 안에
|
|
161
|
+
렌더링해 색 없이 neutral/info/success/warning/danger를 구분하고(1.10.0부터 `toneMark` 가장자리 띠는
|
|
162
|
+
너비 0으로 은퇴), action·close는 44-unit target과 visible focus를 유지합니다. 실제 제품 fixture에서는
|
|
145
163
|
normal/high announcement, keyboard/screen reader, 200% zoom, Reduce Motion, 앱 background 복귀,
|
|
146
164
|
overflow와 update를 검증합니다.
|
|
147
165
|
|
package/docs/tree-select.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# TreeSelect — 판정 검증과 빠진 한 조각
|
|
2
2
|
|
|
3
|
+
> 2026-09-30 정리: 구현된 조합을 미구현으로 집계하지 않도록 독립 Planned 행과 catalog ID를 제거했다.
|
|
4
|
+
> 기존 조합 예제와 공개 helper는 유지하며, 참조표는 실제 구성 컴포넌트로 연결한다.
|
|
5
|
+
> 아래 날짜별 설계 기록의 행 유지 지시는 당시 판단이며 이 결정으로 대체한다.
|
|
6
|
+
|
|
7
|
+
|
|
3
8
|
## 문제
|
|
4
9
|
|
|
5
10
|
계층 데이터에서 하나 또는 여럿을 골라 Select처럼 트리거+값으로 커밋한다. antd
|
package/docs/watermark.md
CHANGED
|
@@ -1,58 +1,26 @@
|
|
|
1
|
-
# Watermark —
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
`player_detail_info.dart`의 등번호 배경 워터마크, `contrast.dart`의
|
|
28
|
-
`watermarkAlphaFor`(배경 명도에 따라 0.08/0.16 알파를 고르는 대비 계산)까지 갖췄습니다.
|
|
29
|
-
이는 "워터마크"라는 제품 개념이 회사 안에 이미 존재한다는 증거이지, **이 패키지가
|
|
30
|
-
계약하는 React/RN 스택**(`docs/architecture.md`: "React, React Native, DOM, Expo import는
|
|
31
|
-
코어에 들어오지 않는다")에서 검증된 vertical slice라는 증거는 아닙니다. Flutter 구현은
|
|
32
|
-
같은 렌더러 경계를 공유하지 않으므로 이 판정의 근거로 세지 않았습니다.
|
|
33
|
-
|
|
34
|
-
### 3. 유일하게 유효한 계약은 이미 있는 원칙의 적용일 뿐, 새 상태 축이 아니다
|
|
35
|
-
|
|
36
|
-
`Icon`(`src/icon.ts`)과 `Image`(`src/image.ts`)가 이미 decorative/informative
|
|
37
|
-
discriminated union으로 "장식용 콘텐츠는 접근성 트리에서 빠지고 상호작용을 가로채지
|
|
38
|
-
않는다"는 원칙을 확립해 두었습니다. 반복 마크가 본문 낭독·조작을 방해하면 안 된다는
|
|
39
|
-
관찰은 이 원칙을 "화면 전체를 덮는 장식 레이어"에 적용한 것일 뿐, Watermark만의 새
|
|
40
|
-
상태 축이나 접근성 개념이 아닙니다. 타일 밀도, 회전 각도, 캔버스/SVG 렌더링 방식은
|
|
41
|
-
"이 패키지의 층에 속하는가" 질문에서 렌더러의 몫입니다 — 플랫폼 중립 계약이 검증할 수
|
|
42
|
-
있는 입력이 없습니다.
|
|
43
|
-
|
|
44
|
-
## 만들지 않은 것
|
|
45
|
-
|
|
46
|
-
`src/watermark.ts`, `test/watermark.test.ts`는 없습니다.
|
|
47
|
-
`componentCatalog`의 `{ name: "Watermark", category: "feedback", platform: "web",
|
|
48
|
-
status: "planned" }` 행과 crosswalk의 `Watermark → Watermark` direct 관계
|
|
49
|
-
(`src/component-references.ts:123`)는 건드리지 않습니다.
|
|
50
|
-
|
|
51
|
-
## 뒤집힐 조건
|
|
52
|
-
|
|
53
|
-
1. BurnTok 또는 Yajalal RN에 실제 이미지 워터마크 요구(스크린샷 유출 방지, 공유 이미지에
|
|
54
|
-
앱 마크 삽입 등)가 나타나는 vertical slice가 측정된다.
|
|
55
|
-
2. 그 슬라이스에서 "decorative overlay는 낭독·조작을 가로채지 않는다"는 기존 원칙 이상의
|
|
56
|
-
새 규칙(예: 워터마크 밀도가 본문 대비 요건과 충돌해 별도 최소 명도 대비 계산이
|
|
57
|
-
필요한 경우 — Flutter의 `watermarkAlphaFor`가 이미 이런 계산의 선례이니 이식 여부를
|
|
58
|
-
먼저 검토)이 필요해진다.
|
|
1
|
+
# Watermark — Web 반복 텍스트
|
|
2
|
+
|
|
3
|
+
2026-09-30: 사용자의 구현 요청으로 기존 수요 대기 결정을 대체한다. 외부 이미지·canvas 의존성을
|
|
4
|
+
추가하지 않고 inline SVG pattern으로 텍스트 타일을 반복한다. 문자열을 HTML이나 SVG 소스로
|
|
5
|
+
삽입하는 대신 React text node를 사용하여 임의 마크업이 실행되지 않게 한다.
|
|
6
|
+
|
|
7
|
+
`@hjmds/react/watermark`의 `Watermark`는 `text`(문자열 또는 1–3줄 배열)와 `children`을 받는다.
|
|
8
|
+
각 줄은 1–120글자다. `tileWidth`(기본 240, 최소 80), `tileHeight`(160, 최소 60),
|
|
9
|
+
`rotate`(-22°, -90~90), `opacity`(0.12, 0~1)를 조절할 수 있다. 기본 기하는 계약 recipe가 소유한다.
|
|
10
|
+
긴 표식은 큰 타일을 지정한다. 텍스트 색상은 HJM textSub 토큰을 따른다.
|
|
11
|
+
|
|
12
|
+
오버레이는 접근성 트리에서 제외하고 포인터·텍스트 선택을 가로채지 않는다. 중요한 출처/보안
|
|
13
|
+
고지는 읽을 수 있는 본문으로도 제공한다. 여러 인스턴스는 고유 pattern ID를 사용한다.
|
|
14
|
+
SVG는 인쇄에도 포함되는 DOM 콘텐츠다. 인쇄 설정별 결과는 소비 환경에서 확인한다.
|
|
15
|
+
이는 장식용 출처 표시이며 스크린샷 방지·삭제 방지·정보 유출 방지 기능이 아니다.
|
|
16
|
+
이미지 워터마크와 다운로드 파일에 삽입하는 인코딩 기능은 제공하지 않는다.
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
<Watermark text={[t('document.draft'), projectName]}>
|
|
20
|
+
<DocumentPreview />
|
|
21
|
+
</Watermark>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
계약: [watermark.ts](../src/watermark.ts). UI: [renderer](../../react/src/watermark.tsx).
|
|
25
|
+
사용 예제: [Web additions](../../../showcase/web/src/patterns/WebAdditions.stories.tsx).
|
|
26
|
+
검증: [계약 회귀](../test/web-additions.test.ts), [브라우저 동작](../../react/test/web-additions.browser.test.tsx).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hjmds/design-contracts",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.0",
|
|
4
4
|
"description": "Renderer-neutral design contracts, tokens, recipes, and behaviors shared by HJM products.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -546,6 +546,30 @@
|
|
|
546
546
|
"react-native": "./dist/qr-code.js",
|
|
547
547
|
"import": "./dist/qr-code.js",
|
|
548
548
|
"default": "./dist/qr-code.js"
|
|
549
|
+
},
|
|
550
|
+
"./components/color-picker": {
|
|
551
|
+
"types": "./dist/color-picker.d.ts",
|
|
552
|
+
"react-native": "./dist/color-picker.js",
|
|
553
|
+
"import": "./dist/color-picker.js",
|
|
554
|
+
"default": "./dist/color-picker.js"
|
|
555
|
+
},
|
|
556
|
+
"./components/watermark": {
|
|
557
|
+
"types": "./dist/watermark.d.ts",
|
|
558
|
+
"react-native": "./dist/watermark.js",
|
|
559
|
+
"import": "./dist/watermark.js",
|
|
560
|
+
"default": "./dist/watermark.js"
|
|
561
|
+
},
|
|
562
|
+
"./components/affix": {
|
|
563
|
+
"types": "./dist/affix.d.ts",
|
|
564
|
+
"react-native": "./dist/affix.js",
|
|
565
|
+
"import": "./dist/affix.js",
|
|
566
|
+
"default": "./dist/affix.js"
|
|
567
|
+
},
|
|
568
|
+
"./components/interaction-adapters": {
|
|
569
|
+
"types": "./dist/interaction-adapters.d.ts",
|
|
570
|
+
"react-native": "./dist/interaction-adapters.js",
|
|
571
|
+
"import": "./dist/interaction-adapters.js",
|
|
572
|
+
"default": "./dist/interaction-adapters.js"
|
|
549
573
|
}
|
|
550
574
|
},
|
|
551
575
|
"files": [
|