@hjmds/react-native 1.26.1 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/THIRD_PARTY_NOTICES.md +7 -0
  2. package/assets/fonts/LICENSE.txt +94 -0
  3. package/assets/fonts/Pretendard-Bold.otf +0 -0
  4. package/assets/fonts/Pretendard-ExtraBold.otf +0 -0
  5. package/assets/fonts/Pretendard-Medium.otf +0 -0
  6. package/assets/fonts/Pretendard-Regular.otf +0 -0
  7. package/assets/fonts/Pretendard-SemiBold.otf +0 -0
  8. package/dist/actions.d.ts.map +1 -1
  9. package/dist/actions.js +10 -3
  10. package/dist/actions.js.map +1 -1
  11. package/dist/agreement.d.ts.map +1 -1
  12. package/dist/agreement.js +5 -24
  13. package/dist/agreement.js.map +1 -1
  14. package/dist/asset.js +3 -3
  15. package/dist/asset.js.map +1 -1
  16. package/dist/auth-screen.d.ts.map +1 -1
  17. package/dist/auth-screen.js +2 -1
  18. package/dist/auth-screen.js.map +1 -1
  19. package/dist/calendar.js +1 -1
  20. package/dist/calendar.js.map +1 -1
  21. package/dist/carousel-motion.d.ts.map +1 -1
  22. package/dist/carousel-motion.js +8 -6
  23. package/dist/carousel-motion.js.map +1 -1
  24. package/dist/carousel.d.ts.map +1 -1
  25. package/dist/carousel.js +11 -7
  26. package/dist/carousel.js.map +1 -1
  27. package/dist/chart.d.ts +3 -1
  28. package/dist/chart.d.ts.map +1 -1
  29. package/dist/chart.js +8 -5
  30. package/dist/chart.js.map +1 -1
  31. package/dist/collapsible.d.ts +10 -1
  32. package/dist/collapsible.d.ts.map +1 -1
  33. package/dist/collapsible.js +12 -3
  34. package/dist/collapsible.js.map +1 -1
  35. package/dist/collection-editing.d.ts.map +1 -1
  36. package/dist/collection-editing.js +19 -9
  37. package/dist/collection-editing.js.map +1 -1
  38. package/dist/collection-rail.d.ts.map +1 -1
  39. package/dist/collection-rail.js +7 -3
  40. package/dist/collection-rail.js.map +1 -1
  41. package/dist/communication.d.ts.map +1 -1
  42. package/dist/communication.js +10 -3
  43. package/dist/communication.js.map +1 -1
  44. package/dist/context-menu.d.ts +33 -0
  45. package/dist/context-menu.d.ts.map +1 -0
  46. package/dist/context-menu.js +53 -0
  47. package/dist/context-menu.js.map +1 -0
  48. package/dist/data-display.d.ts.map +1 -1
  49. package/dist/data-display.js +20 -11
  50. package/dist/data-display.js.map +1 -1
  51. package/dist/data-table.d.ts.map +1 -1
  52. package/dist/data-table.js +16 -6
  53. package/dist/data-table.js.map +1 -1
  54. package/dist/data-workflows.d.ts.map +1 -1
  55. package/dist/data-workflows.js +4 -3
  56. package/dist/data-workflows.js.map +1 -1
  57. package/dist/date-picker.d.ts.map +1 -1
  58. package/dist/date-picker.js +5 -2
  59. package/dist/date-picker.js.map +1 -1
  60. package/dist/design-profile.d.ts.map +1 -1
  61. package/dist/design-profile.js +4 -2
  62. package/dist/design-profile.js.map +1 -1
  63. package/dist/effect-surface.d.ts +9 -3
  64. package/dist/effect-surface.d.ts.map +1 -1
  65. package/dist/effect-surface.js +4 -3
  66. package/dist/effect-surface.js.map +1 -1
  67. package/dist/evidence.d.ts +16 -1
  68. package/dist/evidence.d.ts.map +1 -1
  69. package/dist/evidence.js +2 -1
  70. package/dist/evidence.js.map +1 -1
  71. package/dist/feedback.d.ts.map +1 -1
  72. package/dist/feedback.js +2 -2
  73. package/dist/feedback.js.map +1 -1
  74. package/dist/field-group.d.ts.map +1 -1
  75. package/dist/field-group.js +12 -3
  76. package/dist/field-group.js.map +1 -1
  77. package/dist/folder-preview.d.ts.map +1 -1
  78. package/dist/folder-preview.js +2 -2
  79. package/dist/folder-preview.js.map +1 -1
  80. package/dist/fonts.d.ts +18 -0
  81. package/dist/fonts.d.ts.map +1 -0
  82. package/dist/fonts.js +18 -0
  83. package/dist/fonts.js.map +1 -0
  84. package/dist/forms.d.ts.map +1 -1
  85. package/dist/forms.js +7 -3
  86. package/dist/forms.js.map +1 -1
  87. package/dist/gravity-letters.d.ts +7 -1
  88. package/dist/gravity-letters.d.ts.map +1 -1
  89. package/dist/gravity-letters.js +7 -3
  90. package/dist/gravity-letters.js.map +1 -1
  91. package/dist/heading.d.ts +3 -1
  92. package/dist/heading.d.ts.map +1 -1
  93. package/dist/heading.js +2 -2
  94. package/dist/heading.js.map +1 -1
  95. package/dist/image-choice.d.ts +29 -0
  96. package/dist/image-choice.d.ts.map +1 -0
  97. package/dist/image-choice.js +30 -0
  98. package/dist/image-choice.js.map +1 -0
  99. package/dist/image-comparison.d.ts.map +1 -1
  100. package/dist/image-comparison.js +5 -2
  101. package/dist/image-comparison.js.map +1 -1
  102. package/dist/index.d.ts +1 -1
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +1 -1
  105. package/dist/index.js.map +1 -1
  106. package/dist/inputs.d.ts +3 -2
  107. package/dist/inputs.d.ts.map +1 -1
  108. package/dist/inputs.js +48 -68
  109. package/dist/inputs.js.map +1 -1
  110. package/dist/internal/drawn-glyphs.d.ts +36 -0
  111. package/dist/internal/drawn-glyphs.d.ts.map +1 -0
  112. package/dist/internal/drawn-glyphs.js +50 -0
  113. package/dist/internal/drawn-glyphs.js.map +1 -0
  114. package/dist/internal/list-row-private.d.ts +2 -0
  115. package/dist/internal/list-row-private.d.ts.map +1 -1
  116. package/dist/internal/message-reactions.d.ts +25 -1
  117. package/dist/internal/message-reactions.d.ts.map +1 -1
  118. package/dist/internal/message-reactions.js +27 -8
  119. package/dist/internal/message-reactions.js.map +1 -1
  120. package/dist/internal/screen-exit.d.ts +11 -0
  121. package/dist/internal/screen-exit.d.ts.map +1 -0
  122. package/dist/internal/screen-exit.js +16 -0
  123. package/dist/internal/screen-exit.js.map +1 -0
  124. package/dist/internal/screen-footer.d.ts +7 -0
  125. package/dist/internal/screen-footer.d.ts.map +1 -0
  126. package/dist/internal/screen-footer.js +8 -0
  127. package/dist/internal/screen-footer.js.map +1 -0
  128. package/dist/internal/selection-mark.d.ts +17 -0
  129. package/dist/internal/selection-mark.d.ts.map +1 -0
  130. package/dist/internal/selection-mark.js +37 -0
  131. package/dist/internal/selection-mark.js.map +1 -0
  132. package/dist/internal/styles.d.ts.map +1 -1
  133. package/dist/internal/styles.js +5 -0
  134. package/dist/internal/styles.js.map +1 -1
  135. package/dist/internal/text-align.d.ts +8 -0
  136. package/dist/internal/text-align.d.ts.map +1 -0
  137. package/dist/internal/text-align.js +9 -0
  138. package/dist/internal/text-align.js.map +1 -0
  139. package/dist/keyboard.d.ts +20 -2
  140. package/dist/keyboard.d.ts.map +1 -1
  141. package/dist/keyboard.js +67 -17
  142. package/dist/keyboard.js.map +1 -1
  143. package/dist/masonry.d.ts +5 -3
  144. package/dist/masonry.d.ts.map +1 -1
  145. package/dist/masonry.js +11 -2
  146. package/dist/masonry.js.map +1 -1
  147. package/dist/navigation-bar.d.ts.map +1 -1
  148. package/dist/navigation-bar.js +1 -1
  149. package/dist/navigation-bar.js.map +1 -1
  150. package/dist/navigation.d.ts +4 -1
  151. package/dist/navigation.d.ts.map +1 -1
  152. package/dist/navigation.js +11 -1
  153. package/dist/navigation.js.map +1 -1
  154. package/dist/number-field.d.ts.map +1 -1
  155. package/dist/number-field.js +8 -5
  156. package/dist/number-field.js.map +1 -1
  157. package/dist/overlays.d.ts +4 -2
  158. package/dist/overlays.d.ts.map +1 -1
  159. package/dist/overlays.js +49 -18
  160. package/dist/overlays.js.map +1 -1
  161. package/dist/primitives.d.ts.map +1 -1
  162. package/dist/primitives.js +23 -5
  163. package/dist/primitives.js.map +1 -1
  164. package/dist/provider.d.ts +9 -1
  165. package/dist/provider.d.ts.map +1 -1
  166. package/dist/provider.js +7 -4
  167. package/dist/provider.js.map +1 -1
  168. package/dist/qr-code.js +1 -1
  169. package/dist/qr-code.js.map +1 -1
  170. package/dist/rating.js +3 -3
  171. package/dist/rating.js.map +1 -1
  172. package/dist/reaction-picker.d.ts.map +1 -1
  173. package/dist/reaction-picker.js +30 -5
  174. package/dist/reaction-picker.js.map +1 -1
  175. package/dist/saved-items.d.ts +3 -1
  176. package/dist/saved-items.d.ts.map +1 -1
  177. package/dist/saved-items.js +3 -3
  178. package/dist/saved-items.js.map +1 -1
  179. package/dist/screen-flows.d.ts +55 -8
  180. package/dist/screen-flows.d.ts.map +1 -1
  181. package/dist/screen-flows.js +50 -21
  182. package/dist/screen-flows.js.map +1 -1
  183. package/dist/screens.d.ts +68 -9
  184. package/dist/screens.d.ts.map +1 -1
  185. package/dist/screens.js +91 -29
  186. package/dist/screens.js.map +1 -1
  187. package/dist/social-compositions.d.ts.map +1 -1
  188. package/dist/social-compositions.js +3 -2
  189. package/dist/social-compositions.js.map +1 -1
  190. package/dist/sortable.d.ts.map +1 -1
  191. package/dist/sortable.js +10 -7
  192. package/dist/sortable.js.map +1 -1
  193. package/dist/steps.d.ts.map +1 -1
  194. package/dist/steps.js +7 -3
  195. package/dist/steps.js.map +1 -1
  196. package/dist/table-family.d.ts.map +1 -1
  197. package/dist/table-family.js +16 -5
  198. package/dist/table-family.js.map +1 -1
  199. package/dist/tags-input.d.ts.map +1 -1
  200. package/dist/tags-input.js +2 -0
  201. package/dist/tags-input.js.map +1 -1
  202. package/dist/task-controls.d.ts.map +1 -1
  203. package/dist/task-controls.js +16 -5
  204. package/dist/task-controls.js.map +1 -1
  205. package/dist/task-list.d.ts +1 -1
  206. package/dist/task-list.d.ts.map +1 -1
  207. package/dist/task-list.js +4 -3
  208. package/dist/task-list.js.map +1 -1
  209. package/dist/top.d.ts.map +1 -1
  210. package/dist/top.js +3 -1
  211. package/dist/top.js.map +1 -1
  212. package/dist/transfer-list.d.ts.map +1 -1
  213. package/dist/transfer-list.js +15 -9
  214. package/dist/transfer-list.js.map +1 -1
  215. package/dist/upload-item.d.ts.map +1 -1
  216. package/dist/upload-item.js +4 -3
  217. package/dist/upload-item.js.map +1 -1
  218. package/package.json +24 -4
@@ -1,12 +1,18 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
- import { ScrollView, View } from "react-native";
3
+ import { Pressable, ScrollView, View } from "react-native";
4
4
  import { spacing } from "@hjmds/design-contracts/foundations";
5
+ import { holdMenuRecipe } from "@hjmds/design-contracts/screen-patterns";
6
+ import { chipRecipe } from "@hjmds/design-contracts/recipes";
7
+ import { resolveColorReference } from "@hjmds/design-contracts/color-references";
8
+ import { FixedGlyph } from "./internal/fixed-glyph.js";
5
9
  import { nextReaction, validateReactions, resolveReactionOptions } from "@hjmds/design-contracts/reactions";
6
10
  import { Text } from "./primitives.js";
7
11
  import { Button } from "./actions.js";
12
+ import { useHjmNativeTheme } from "./provider.js";
8
13
  export function ReactionPicker({ label, options, value, onValueChange, disabled = false, layout = "wrap", more }) {
9
14
  const [expanded, setExpanded] = useState(false);
15
+ const { colors, palette, tokens } = useHjmNativeTheme();
10
16
  const all = resolveReactionOptions(options, more);
11
17
  validateReactions(all, value);
12
18
  const showingAll = expanded && !!more;
@@ -16,8 +22,27 @@ export function ReactionPicker({ label, options, value, onValueChange, disabled
16
22
  setExpanded(false);
17
23
  } };
18
24
  // One text label lets Button apply Native typography; sibling strings bypass its label wrapper.
19
- const content = _jsx(View, { accessibilityLabel: label, style: { flexDirection: "row", flexWrap: showingAll || layout === "wrap" ? "wrap" : "nowrap", gap: spacing.xs }, children: visible.map(option => _jsx(Button, { tone: "ghost", shape: "pill", selected: value === option.id, disabled: disabled || (option.disabled ?? false), accessibilityLabel: option.label, onPress: () => choose(option.id), children: layout === "strip" ? _jsxs(Text, { variant: "title", children: [option.emoji, option.count === undefined ? "" : ` ${option.count}`] }) : `${option.emoji}${option.count === undefined ? "" : ` ${option.count}`}` }, option.id)) });
20
- const choices = showingAll ? _jsx(ScrollView, { style: { maxHeight: 240 }, keyboardShouldPersistTaps: "handled", children: content }) : layout === "strip" ? _jsx(ScrollView, { horizontal: true, style: { flexShrink: 1 }, showsHorizontalScrollIndicator: false, keyboardShouldPersistTaps: "handled", children: content }) : content;
21
- return _jsxs(View, { style: { flexDirection: showingAll ? "column" : "row", alignItems: "flex-start" }, children: [choices, _jsx(View, { style: { flexShrink: 0 }, children: more ? _jsx(Button, { tone: "ghost", shape: "pill", accessibilityLabel: more.label, accessibilityState: { expanded: showingAll }, disabled: disabled, onPress: () => setExpanded(current => !current), children: _jsx(Text, { variant: "title", children: showingAll ? "−" : "+" }) }) : null })] });
25
+ // Strip items are 44pt circles spread across the row (measured hold menus fit 6 reactions + more);
26
+ // pill buttons were ~52pt and pushed the sixth reaction behind a horizontal scroll (2026-10-16 review).
27
+ const stripItem = (option) => _jsxs(Pressable, { accessibilityRole: "button", accessibilityLabel: option.label, accessibilityState: { selected: value === option.id, disabled: disabled || (option.disabled ?? false) }, disabled: disabled || (option.disabled ?? false), onPress: () => choose(option.id), style: ({ pressed }) => ({ width: holdMenuRecipe.stripItemSize, height: holdMenuRecipe.stripItemSize, borderRadius: holdMenuRecipe.stripItemSize / 2, alignItems: "center", justifyContent: "center", backgroundColor: value === option.id ? colors.surfaceAccent : pressed ? colors.surface : "transparent" }), children: [_jsx(FixedGlyph, { fontSize: holdMenuRecipe.emojiSize, lineHeight: holdMenuRecipe.emojiSize + 6, children: option.emoji }), option.count === undefined ? null : _jsx(Text, { variant: "caption", children: ` ${option.count}` })] }, option.id);
28
+ // The wrap layout sits on the page background, where a ghost Button's selected treatment (content color) cannot
29
+ // show on an emoji. Items use the chip frame instead — hairline at rest, brand border and accent fill when chosen —
30
+ // with toggle-button semantics, matching Web's wrap layout (2026-10-17 review).
31
+ const chipItem = (option) => {
32
+ const selected = value === option.id;
33
+ const off = disabled || (option.disabled ?? false);
34
+ const state = chipRecipe.states[selected ? "selected" : "idle"];
35
+ return _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: option.label, accessibilityState: { selected, disabled: off }, disabled: off, hitSlop: chipRecipe.sizes.small.hitSlop, onPress: () => choose(option.id), style: ({ pressed }) => ({ minHeight: chipRecipe.sizes.small.height, paddingHorizontal: chipRecipe.sizes.small.paddingHorizontal, borderRadius: tokens.radius[chipRecipe.radius], borderWidth: chipRecipe.borderWidth,
36
+ borderColor: resolveColorReference(state.border, palette), backgroundColor: selected ? colors.surfaceAccent : resolveColorReference(state.background, palette),
37
+ alignItems: "center", justifyContent: "center", opacity: off ? chipRecipe.states.disabledOpacity : pressed ? chipRecipe.states.pressedOpacity : 1 }), children: _jsx(Text, { variant: "body", children: `${option.emoji}${option.count === undefined ? "" : ` ${option.count}`}` }) }, option.id);
38
+ };
39
+ const strip = layout === "strip" && !showingAll;
40
+ const content = strip ? _jsx(View, { accessibilityLabel: label, style: { flexDirection: "row", flexGrow: 1, justifyContent: "space-between", gap: spacing.xxs }, children: visible.map(stripItem) }) : _jsx(View, { accessibilityLabel: label, style: { flexDirection: "row", flexWrap: showingAll || layout === "wrap" ? "wrap" : "nowrap", gap: spacing.xs }, children: visible.map(option => layout === "wrap" ? chipItem(option) : _jsx(Button, { tone: "ghost", shape: "pill", selected: value === option.id, disabled: disabled || (option.disabled ?? false), accessibilityLabel: option.label, onPress: () => choose(option.id), children: _jsxs(Text, { variant: "title", children: [option.emoji, option.count === undefined ? "" : ` ${option.count}`] }) }, option.id)) });
41
+ const choices = showingAll ? _jsx(ScrollView, { style: { maxHeight: 240 }, keyboardShouldPersistTaps: "handled", children: content }) : strip ? _jsx(ScrollView, { horizontal: true, style: { flexShrink: 1, flexGrow: 1 }, contentContainerStyle: { flexGrow: 1 }, showsHorizontalScrollIndicator: false, keyboardShouldPersistTaps: "handled", children: content }) : content;
42
+ return _jsxs(View, { style: { flexDirection: showingAll ? "column" : "row", alignItems: showingAll ? "flex-start" : "center" }, children: [choices, _jsx(View, { style: { flexShrink: 0 }, children: more ? (strip
43
+ ? _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: more.label, accessibilityState: { expanded: false, disabled }, disabled: disabled, onPress: () => setExpanded(true), style: ({ pressed }) => ({ width: holdMenuRecipe.stripItemSize, height: holdMenuRecipe.stripItemSize, borderRadius: holdMenuRecipe.stripItemSize / 2, alignItems: "center", justifyContent: "center", backgroundColor: pressed ? colors.surface : "transparent" }), children: _jsx(FixedGlyph, { fontSize: holdMenuRecipe.emojiSize, lineHeight: holdMenuRecipe.emojiSize + 6, children: "+" }) })
44
+ : layout === "wrap"
45
+ ? _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: more.label, accessibilityState: { expanded: showingAll, disabled }, disabled: disabled, hitSlop: chipRecipe.sizes.small.hitSlop, onPress: () => setExpanded(current => !current), style: ({ pressed }) => ({ minHeight: chipRecipe.sizes.small.height, paddingHorizontal: chipRecipe.sizes.small.paddingHorizontal, borderRadius: tokens.radius[chipRecipe.radius], borderWidth: chipRecipe.borderWidth, borderColor: resolveColorReference(chipRecipe.states.idle.border, palette), backgroundColor: resolveColorReference(chipRecipe.states.idle.background, palette), alignItems: "center", justifyContent: "center", opacity: disabled ? chipRecipe.states.disabledOpacity : pressed ? chipRecipe.states.pressedOpacity : 1 }), children: _jsx(Text, { variant: "body", children: showingAll ? "−" : "+" }) })
46
+ : _jsx(Button, { tone: "ghost", shape: "pill", accessibilityLabel: more.label, accessibilityState: { expanded: showingAll }, disabled: disabled, onPress: () => setExpanded(current => !current), children: _jsx(Text, { variant: "title", children: showingAll ? "−" : "+" }) })) : null })] });
22
47
  }
23
48
  //# sourceMappingURL=reaction-picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reaction-picker.js","sourceRoot":"","sources":["../src/reaction-picker.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reaction-picker.js","sourceRoot":"","sources":["../src/reaction-picker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAiD,MAAM,mCAAmC,CAAC;AAC3J,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAuB;IACnI,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IACxD,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC;IACvH,gGAAgG;IAChG,mGAAmG;IACnG,wGAAwG;IACxG,MAAM,SAAS,GAAG,CAAC,MAAsB,EAAE,EAAE,CAAC,MAAC,SAAS,IAAiB,iBAAiB,EAAC,QAAQ,EAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,QAAQ,EAAE,KAAK,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAC3O,QAAQ,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAClF,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,aAAa,GAAG,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,aAE/S,KAAC,UAAU,IAAC,QAAQ,EAAE,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,SAAS,GAAG,CAAC,YAAG,MAAM,CAAC,KAAK,GAAc,EAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,OAAO,EAAC,SAAS,YAAE,IAAI,MAAM,CAAC,KAAK,EAAE,GAAQ,KAJjJ,MAAM,CAAC,EAAE,CAK3D,CAAC;IACb,gHAAgH;IAChH,oHAAoH;IACpH,gFAAgF;IAChF,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,KAAC,SAAS,IAAiB,iBAAiB,EAAC,QAAQ,EAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC5I,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EACxF,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,iBAAiB,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnN,WAAW,EAAE,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC;gBAC9J,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YACtJ,KAAC,IAAI,IAAC,OAAO,EAAC,MAAM,YAAE,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,GAAQ,IALjF,MAAM,CAAC,EAAE,CAMpB,CAAC;IACf,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,YAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,YAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAC,MAAM,IAAiB,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAE,KAAK,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,YAAE,MAAC,IAAI,IAAC,OAAO,EAAC,OAAO,aAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,IAAQ,IAA3R,MAAM,CAAC,EAAE,CAA2R,CAAC,GAAQ,CAAC;IACvsB,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,KAAK,EAAE,EAAC,SAAS,EAAC,GAAG,EAAC,EAAE,yBAAyB,EAAC,SAAS,YAAE,OAAO,GAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,UAAU,QAAC,KAAK,EAAE,EAAC,UAAU,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,EAAE,qBAAqB,EAAE,EAAC,QAAQ,EAAC,CAAC,EAAC,EAAE,8BAA8B,EAAE,KAAK,EAAE,yBAAyB,EAAC,SAAS,YAAE,OAAO,GAAc,CAAC,CAAC,CAAC,OAAO,CAAC;IAChV,OAAO,MAAC,IAAI,IAAC,KAAK,EAAE,EAAC,aAAa,EAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAC,UAAU,EAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAC,aAAG,OAAO,EAAC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAC,UAAU,EAAC,CAAC,EAAC,YAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;oBACrK,CAAC,CAAC,KAAC,SAAS,IAAC,iBAAiB,EAAC,QAAQ,EAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAC,QAAQ,EAAC,KAAK,EAAC,QAAQ,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAC,cAAc,CAAC,aAAa,EAAC,MAAM,EAAC,cAAc,CAAC,aAAa,EAAC,YAAY,EAAC,cAAc,CAAC,aAAa,GAAG,CAAC,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,eAAe,EAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAC,CAAC,YAAE,KAAC,UAAU,IAAC,QAAQ,EAAE,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,SAAS,GAAG,CAAC,kBAAgB,GAAY;oBACthB,CAAC,CAAC,MAAM,KAAK,MAAM;wBACjB,CAAC,CAAC,KAAC,SAAS,IAAC,iBAAiB,EAAC,QAAQ,EAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EACtO,KAAK,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,SAAS,EAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAC,iBAAiB,EAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAC,YAAY,EAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,WAAW,EAAC,UAAU,CAAC,WAAW,EAAC,WAAW,EAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAC,eAAe,EAAC,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,YAAE,KAAC,IAAI,IAAC,OAAO,EAAC,MAAM,YAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,GAAY;wBAC/jB,CAAC,CAAC,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAC,QAAQ,EAAC,UAAU,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAE,KAAC,IAAI,IAAC,OAAO,EAAC,OAAO,YAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,GAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAQ,IAAO,CAAC;AAChR,CAAC"}
@@ -13,9 +13,11 @@ export type SavedItemsScreenProps<T extends SavedItem> = Omit<ListDetailScreenPr
13
13
  onOpenItem(id: string): void;
14
14
  onBack(): void;
15
15
  onCreateCollection(): void;
16
+ /** Same contract as Web: required IconButton glyph named by `labels.createCollection` (2026-10-17 icon-button usage rule). */
17
+ createCollectionIcon: ReactNode;
16
18
  renderThumbnail(item: T): ReactNode;
17
19
  renderDetail(item: T): ReactNode;
18
20
  };
19
21
  /** Same controlled collection contract as Web, composed with the native screen and grid hosts. */
20
- export declare function SavedItemsScreen<T extends SavedItem>({ items, collections, collectionId, selectedItemId, labels, onOpenCollection, onOpenItem, onBack, onCreateCollection, renderThumbnail, renderDetail, ...screen }: SavedItemsScreenProps<T>): import("react").JSX.Element;
22
+ export declare function SavedItemsScreen<T extends SavedItem>({ items, collections, collectionId, selectedItemId, labels, onOpenCollection, onOpenItem, onBack, onCreateCollection, createCollectionIcon, renderThumbnail, renderDetail, ...screen }: SavedItemsScreenProps<T>): import("react").JSX.Element;
21
23
  //# sourceMappingURL=saved-items.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"saved-items.d.ts","sourceRoot":"","sources":["../src/saved-items.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAMjF,OAAO,EAAqB,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACzI,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC5G,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,SAAS,IAAI,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG;IAC1I,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAAC,WAAW,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7D,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7D,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACxE,MAAM,IAAI,IAAI,CAAC;IAAC,kBAAkB,IAAI,IAAI,CAAC;IAC3C,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IAAC,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;CACvE,CAAC;AAEF,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,EAAE,EAAC,KAAK,EAAC,WAAW,EAAC,YAAY,EAAC,cAAc,EAAC,MAAM,EAAC,gBAAgB,EAAC,UAAU,EAAC,MAAM,EAAC,kBAAkB,EAAC,eAAe,EAAC,YAAY,EAAC,GAAG,MAAM,EAAC,EAAC,qBAAqB,CAAC,CAAC,CAAC,+BAuBjO"}
1
+ {"version":3,"file":"saved-items.d.ts","sourceRoot":"","sources":["../src/saved-items.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAMjF,OAAO,EAAqB,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AACzI,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC5G,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,SAAS,IAAI,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC,GAAG;IAC1I,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAAC,WAAW,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7D,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7D,MAAM,EAAE,gBAAgB,CAAC;IACzB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACxE,MAAM,IAAI,IAAI,CAAC;IAAC,kBAAkB,IAAI,IAAI,CAAC;IAC3C,8HAA8H;IAC9H,oBAAoB,EAAE,SAAS,CAAC;IAChC,eAAe,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IAAC,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;CACvE,CAAC;AAEF,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,EAAE,EAAC,KAAK,EAAC,WAAW,EAAC,YAAY,EAAC,cAAc,EAAC,MAAM,EAAC,gBAAgB,EAAC,UAAU,EAAC,MAAM,EAAC,kBAAkB,EAAC,oBAAoB,EAAC,eAAe,EAAC,YAAY,EAAC,GAAG,MAAM,EAAC,EAAC,qBAAqB,CAAC,CAAC,CAAC,+BAuBtP"}
@@ -2,12 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { Pressable, View } from "react-native";
3
3
  import { ListDetailScreen } from "./screen-flows.js";
4
4
  import { Stack, Text, Grid } from "./primitives.js";
5
- import { Button } from "./actions.js";
5
+ import { IconButton } from "./actions.js";
6
6
  import { useHjmNativeTheme } from "./provider.js";
7
7
  import { spacing } from "@hjmds/design-contracts/foundations";
8
8
  import { resolveSavedItems } from "@hjmds/design-contracts/screen-patterns";
9
9
  /** Same controlled collection contract as Web, composed with the native screen and grid hosts. */
10
- export function SavedItemsScreen({ items, collections, collectionId, selectedItemId, labels, onOpenCollection, onOpenItem, onBack, onCreateCollection, renderThumbnail, renderDetail, ...screen }) {
10
+ export function SavedItemsScreen({ items, collections, collectionId, selectedItemId, labels, onOpenCollection, onOpenItem, onBack, onCreateCollection, createCollectionIcon, renderThumbnail, renderDetail, ...screen }) {
11
11
  const { colors, tokens } = useHjmNativeTheme();
12
12
  const { home, collection, visible, selected } = resolveSavedItems(items, collections, collectionId, selectedItemId);
13
13
  const groups = [{ id: null, title: labels.allItems, itemIds: items.map(item => item.id) }, ...collections];
@@ -16,6 +16,6 @@ export function SavedItemsScreen({ items, collections, collectionId, selectedIte
16
16
  ? { kind: "empty", title: labels.empty } : screen.state ?? { kind: "ready" };
17
17
  // Resolve each cover once; four thumbnails must not each rescan membership.
18
18
  const covers = new Map(groups.map(group => { const ids = new Set(group.itemIds); return [group.id, items.filter(item => ids.has(item.id)).slice(0, 4)]; }));
19
- return _jsx(ListDetailScreen, { ...screen, state: state, title: home ? screen.title : collection?.title ?? labels.allItems, leading: home ? screen.leading : _jsx(Button, { tone: "ghost", onPress: onBack, children: labels.back }), actions: home ? _jsx(Button, { tone: "ghost", onPress: onCreateCollection, children: labels.createCollection }) : screen.actions, back: { label: labels.back, onAction: onBack }, ...(selected ? { detail: { title: selected.title, content: renderDetail(selected) } } : {}), list: _jsx(Stack, { gap: "md", children: home ? _jsxs(_Fragment, { children: [_jsx(Text, { variant: "caption", tone: "muted", children: labels.privateNotice }), _jsx(Grid, { columns: { compact: 2 }, gap: { compact: "md" }, minColumnWidth: { compact: 80 }, children: groups.map(group => _jsxs(Pressable, { accessibilityRole: "button", accessibilityLabel: group.title, onPress: () => onOpenCollection(group.id), style: { gap: spacing.sm }, children: [_jsx(View, { accessible: false, accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: { aspectRatio: 1, borderRadius: tokens.radius.md, overflow: "hidden", backgroundColor: colors.surfaceAlt, flexDirection: "row", flexWrap: "wrap" }, children: Array.from({ length: 4 }, (_, index) => { const item = covers.get(group.id)?.[index]; return _jsx(View, { style: { width: "50%", height: "50%", padding: spacing.xxs / 2 }, children: item ? renderThumbnail(item) : null }, index); }) }), _jsx(Text, { emphasis: "strong", children: group.title })] }, group.id === null ? "all" : `collection:${group.id}`)) })] }) : visible.length ? _jsx(Grid, { columns: { compact: 3 }, gap: { compact: "xxs" }, minColumnWidth: { compact: 44 }, children: visible.map(item => _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: item.title, onPress: () => onOpenItem(item.id), style: { aspectRatio: 1, overflow: "hidden", backgroundColor: colors.surfaceAlt }, children: renderThumbnail(item) }, item.id)) }) : null }) });
19
+ return _jsx(ListDetailScreen, { ...screen, state: state, title: home ? screen.title : collection?.title ?? labels.allItems, ...(home ? (screen.exit ? { exit: screen.exit } : {}) : { exit: { kind: "back", label: labels.back, onPress: onBack } }), actions: home ? _jsx(IconButton, { label: labels.createCollection, tone: "ghost", onPress: onCreateCollection, children: createCollectionIcon }) : screen.actions, back: { label: labels.back, onAction: onBack }, ...(selected ? { detail: { title: selected.title, content: renderDetail(selected) } } : {}), list: _jsx(Stack, { gap: "md", children: home ? _jsxs(_Fragment, { children: [_jsx(Text, { variant: "caption", tone: "muted", children: labels.privateNotice }), _jsx(Grid, { columns: { compact: 2 }, gap: { compact: "md" }, minColumnWidth: { compact: 80 }, children: groups.map(group => _jsxs(Pressable, { accessibilityRole: "button", accessibilityLabel: group.title, onPress: () => onOpenCollection(group.id), style: { gap: spacing.sm }, children: [_jsx(View, { accessible: false, accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: { aspectRatio: 1, borderRadius: tokens.radius.md, overflow: "hidden", backgroundColor: colors.surfaceAlt, flexDirection: "row", flexWrap: "wrap" }, children: Array.from({ length: 4 }, (_, index) => { const item = covers.get(group.id)?.[index]; return _jsx(View, { style: { width: "50%", height: "50%", padding: spacing.xxs / 2 }, children: item ? renderThumbnail(item) : null }, index); }) }), _jsx(Text, { emphasis: "strong", children: group.title })] }, group.id === null ? "all" : `collection:${group.id}`)) })] }) : visible.length ? _jsx(Grid, { columns: { compact: 3 }, gap: { compact: "xxs" }, minColumnWidth: { compact: 44 }, children: visible.map(item => _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: item.title, onPress: () => onOpenItem(item.id), style: { aspectRatio: 1, overflow: "hidden", backgroundColor: colors.surfaceAlt }, children: renderThumbnail(item) }, item.id)) }) : null }) });
20
20
  }
21
21
  //# sourceMappingURL=saved-items.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"saved-items.js","sourceRoot":"","sources":["../src/saved-items.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"saved-items.js","sourceRoot":"","sources":["../src/saved-items.tsx"],"names":[],"mappings":"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"}
@@ -3,29 +3,37 @@ import { type ScreenLayoutProps } from "./screens.js";
3
3
  import { type SheetProps } from "./overlays.js";
4
4
  import { type UploadItemDescriptor, type UploadItemLabels } from "@hjmds/design-contracts/components/upload-item";
5
5
  import { type AlertDialogRequest } from "@hjmds/design-contracts/components/alert-dialog";
6
- import { type PermissionScreenStatus, type PhotoSource, type PhotoSourceLabels } from "@hjmds/design-contracts/screen-patterns";
6
+ import { type CommentMenuItemDescriptor, type PermissionScreenStatus, type PhotoSource, type PhotoSourceLabels } from "@hjmds/design-contracts/screen-patterns";
7
7
  import { type ContainerGutter } from "@hjmds/design-contracts/components/container";
8
+ import { type MessageMenuAction } from "./internal/message-reactions.js";
9
+ import type { ReactionPickerProps } from "./reaction-picker.js";
8
10
  /** Copy, pending state and mutations are controlled by the consuming product. */
11
+ /** `icon` renders an icon-only button named by `label`; header actions (top-right) use it so a centered title keeps its width (2026-10-17). */
9
12
  export type ScreenFlowAction = Readonly<{
10
13
  label: string;
11
14
  onAction(): void;
12
15
  disabled?: boolean;
13
16
  pending?: boolean;
17
+ icon?: ReactNode;
18
+ }>;
19
+ /** Header tool action (refresh, add): icon-only so it never pushes the centered title. A required text `add` made
20
+ * products route exits ("취소") through it as a header text button (2026-10-17 screen review); exits use `exit`. */
21
+ export type ScreenFlowIconAction = ScreenFlowAction & Readonly<{
22
+ icon: ReactNode;
14
23
  }>;
15
24
  type Base = Omit<ScreenLayoutProps, "children" | "footer">;
16
25
  export type ListDetailScreenProps = Base & {
17
26
  list: ReactNode;
18
27
  detail?: Pick<ScreenLayoutProps, "title" | "state" | "stateAction" | "notice" | "titleVisibility" | "headerAlignment"> & {
19
- content: ReactNode; /** Product back control (icon button) replacing the text action; `back` still names it. */
20
- leading?: ReactNode;
28
+ content: ReactNode;
21
29
  };
22
30
  back: ScreenFlowAction;
23
- refresh?: ScreenFlowAction;
31
+ refresh?: ScreenFlowIconAction;
24
32
  loadMore?: ScreenFlowAction;
25
33
  };
26
34
  /** Keep the list mounted so input and scroll survive a detail visit. Routers may instead restore host scroll state. */
27
35
  export declare function ListDetailScreen({ list, detail, back, refresh, loadMore, layoutStyle, ...screen }: ListDetailScreenProps): import("react").JSX.Element;
28
- export type EditorScreenProps = Base & {
36
+ export type EditorScreenProps = Omit<Base, "leading" | "exit"> & {
29
37
  children: ReactNode;
30
38
  submitPlacement?: "header" | "footer";
31
39
  dirty: boolean;
@@ -83,7 +91,7 @@ export type MediaSelectionScreenProps = Base & {
83
91
  library?: ReactNode;
84
92
  selectionSummary?: ReactNode;
85
93
  items: readonly MediaSelectionItem[];
86
- add: ScreenFlowAction;
94
+ add?: ScreenFlowIconAction;
87
95
  done: ScreenFlowAction;
88
96
  labels: UploadItemLabels;
89
97
  actionLabels: {
@@ -288,6 +296,43 @@ export type CommentThreadItem = Readonly<{
288
296
  actions?: ReactNode;
289
297
  canReply?: boolean;
290
298
  replyDisabled?: boolean;
299
+ /** Long-press the comment (author and body) to react; the product owns the stored value and summary. */
300
+ reactions?: CommentReactions;
301
+ reactionSummary?: ReactNode;
302
+ /** Optional photo or sticker under the body; HJM bounds its width and corners, the product sizes the image. */
303
+ media?: ReactNode;
304
+ }>;
305
+ export type CommentReactions = ReactionPickerProps & Readonly<{
306
+ closeLabel: string;
307
+ menuAction?: Readonly<{
308
+ label: string;
309
+ onPress(): void;
310
+ disabled?: boolean;
311
+ }>;
312
+ menuActions?: readonly MessageMenuAction[];
313
+ reportAction?: Readonly<{
314
+ label: string;
315
+ onPress(): void;
316
+ disabled?: boolean;
317
+ icon?: ReactNode;
318
+ }>;
319
+ interactiveContent?: boolean; /** Icon for the automatic "reply" row of the hold menu. */
320
+ replyIcon?: ReactNode;
321
+ }>;
322
+ /**
323
+ * HJM-owned "more" menu per comment (2026-10-17: common comment structure belongs to HJM, review S4#7). HJM draws the
324
+ * vertical-dots button at the row's trailing edge and opens the shared Menu sheet with danger items last; the product
325
+ * supplies only the localized names, the items allowed for that comment and the action callback.
326
+ */
327
+ export type CommentMenu = Readonly<{
328
+ /** Localized accessible name of the button and menu title, e.g. "seoyeon 댓글 더 보기". */
329
+ label(item: CommentThreadItem): string;
330
+ /** Localized name of the Menu sheet's dismiss action (Native Menu requires one). */
331
+ dismissLabel: string;
332
+ /** Items allowed for this comment (permission is product-owned). An empty list omits the button for that row. */
333
+ items(item: CommentThreadItem): readonly CommentMenuItemDescriptor[];
334
+ /** Runs after the sheet closes, so a confirmation dialog does not stack on the closing modal. */
335
+ onAction(item: CommentThreadItem, id: string): void;
291
336
  }>;
292
337
  export type CommentThreadScreenProps = Base & {
293
338
  items: readonly CommentThreadItem[];
@@ -300,6 +345,7 @@ export type CommentThreadScreenProps = Base & {
300
345
  composer?: ReactNode;
301
346
  threadHeader?: ReactNode;
302
347
  threadFooter?: ReactNode;
348
+ commentMenu?: CommentMenu;
303
349
  };
304
350
  export type CommentThreadRowProps = Readonly<{
305
351
  layoutStyle?: ScreenLayoutProps["layoutStyle"];
@@ -307,11 +353,12 @@ export type CommentThreadRowProps = Readonly<{
307
353
  onLike(id: string): void;
308
354
  onReply(id: string): void;
309
355
  replyLabel: string;
356
+ commentMenu?: CommentMenu;
310
357
  }>;
311
358
  /** Virtualized hosts reuse the same row as CommentThreadScreen; product slots add content, not a second layout. */
312
- export declare function CommentThreadRow({ item, onLike, onReply, replyLabel, layoutStyle }: CommentThreadRowProps): import("react").JSX.Element;
359
+ export declare function CommentThreadRow({ item, onLike, onReply, replyLabel, layoutStyle, commentMenu }: CommentThreadRowProps): import("react").JSX.Element;
313
360
  /** Controlled thread: server ordering, permission checks and receipt-based draft clearing belong to the product. */
314
- export declare function CommentThreadScreen({ items, expandedIds, onExpandedChange, onLike, onReply, replyLabel, repliesLabel, composer, threadHeader, threadFooter, ...screen }: CommentThreadScreenProps): import("react").JSX.Element;
361
+ export declare function CommentThreadScreen({ items, expandedIds, onExpandedChange, onLike, onReply, replyLabel, repliesLabel, composer, threadHeader, threadFooter, commentMenu, ...screen }: CommentThreadScreenProps): import("react").JSX.Element;
315
362
  export type ProfileSummaryProps = Readonly<{
316
363
  name: string;
317
364
  headingLevel?: 1 | 2 | 3 | 4 | 5 | 6;
@@ -1 +1 @@
1
- {"version":3,"file":"screen-flows.d.ts","sourceRoot":"","sources":["../src/screen-flows.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screen-flows.d.ts","sourceRoot":"","sources":["../src/screen-flows.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useEffect, useRef, useState } from "react";
3
3
  import { CompositionLayout, ScreenLayout } from "./screens.js";
4
+ import { ScreenExitButton } from "./internal/screen-exit.js";
4
5
  import { Button, IconButton } from "./actions.js";
5
6
  import { Stack, Text, Grid } from "./primitives.js";
6
7
  import { SearchField } from "./inputs.js";
@@ -9,20 +10,26 @@ import { AlertDialog, Sheet } from "./overlays.js";
9
10
  import { UploadItem } from "./upload-item.js";
10
11
  import {} from "@hjmds/design-contracts/components/upload-item";
11
12
  import {} from "@hjmds/design-contracts/components/alert-dialog";
12
- import { validateCommentThread, resolvePermissionAction, resolveOnboardingStep, resolveSearchCommit, resolveSearchDebounceMs, resolveSearchEmptyCause, resolveSearchScreenPhase, screenPatternRecipe, profileSummaryRecipe, searchScreenRecipe } from "@hjmds/design-contracts/screen-patterns";
13
- import { AccessibilityInfo, Keyboard, ScrollView, View } from "react-native";
13
+ import { validateCommentThread, resolvePermissionAction, resolveOnboardingStep, resolveSearchCommit, resolveSearchDebounceMs, resolveSearchEmptyCause, resolveSearchScreenPhase, screenPatternRecipe, commentThreadRecipe, profileSummaryRecipe, searchScreenRecipe, resolveCommentMenuItems } from "@hjmds/design-contracts/screen-patterns";
14
+ import { resolveIconButtonPresentation } from "@hjmds/design-contracts/recipes";
15
+ import { DrawnMoreVertical } from "./internal/drawn-glyphs.js";
16
+ import { useHjmNativeTheme } from "./provider.js";
17
+ import { AccessibilityInfo, Keyboard, Pressable, ScrollView, View } from "react-native";
14
18
  import { containerRecipe } from "@hjmds/design-contracts/components/container";
15
19
  import { ListRow } from "./data-display.js";
16
20
  import { FixedGlyph } from "./internal/fixed-glyph.js";
21
+ import { MessageReactions } from "./internal/message-reactions.js";
17
22
  import { Heading } from "./heading.js";
18
23
  import { Menu } from "./navigation.js";
19
24
  import { EmptyState, Skeleton } from "./feedback.js";
20
25
  function Pane({ hidden = false, children }) { return _jsx(View, { style: { flex: 1, display: hidden ? "none" : "flex" }, children: children }); }
21
- function Action({ action, secondary = false }) { return _jsx(Button, { tone: secondary ? "ghost" : "primary", disabled: !!(action.disabled || action.pending), loading: action.pending ?? false, onPress: action.onAction, children: action.label }); }
26
+ function Action({ action, secondary = false }) { if (action.icon)
27
+ return _jsx(IconButton, { label: action.label, tone: "ghost", disabled: !!(action.disabled || action.pending), onPress: action.onAction, children: action.icon }); return _jsx(Button, { tone: secondary ? "ghost" : "primary", disabled: !!(action.disabled || action.pending), loading: action.pending ?? false, onPress: action.onAction, children: action.label }); }
22
28
  /** Keep the list mounted so input and scroll survive a detail visit. Routers may instead restore host scroll state. */
23
29
  // layoutStyle places the outer host that owns both panes, as on Web, so the screen keeps the same
24
30
  // placement while list and detail swap. Passing it to the list ScreenLayout dropped it on detail.
25
- export function ListDetailScreen({ list, detail, back, refresh, loadMore, layoutStyle, ...screen }) { return _jsxs(View, { style: [{ flex: 1 }, layoutStyle], children: [_jsx(Pane, { hidden: !!detail, children: _jsx(ScreenLayout, { ...screen, actions: refresh ? _jsx(Action, { action: refresh, secondary: true }) : screen.actions, footer: loadMore ? _jsx(Action, { action: loadMore, secondary: true }) : null, children: list }) }), detail ? _jsx(Pane, { children: _jsx(ScreenLayout, { title: detail.title, ...(detail.titleVisibility === undefined ? {} : { titleVisibility: detail.titleVisibility }), ...(detail.headerAlignment === undefined ? {} : { headerAlignment: detail.headerAlignment }), ...(detail.state === undefined ? {} : { state: detail.state }), stateAction: detail.stateAction, notice: detail.notice, leading: detail.leading ?? _jsx(Action, { action: back, secondary: true }), children: detail.content }) }) : null] }); }
31
+ // "더 보기" ends the list inside the scroll body, centered like LoadMore; the fixed footer is the bottom CTA slot (2026-10-17 review).
32
+ export function ListDetailScreen({ list, detail, back, refresh, loadMore, layoutStyle, ...screen }) { return _jsxs(View, { style: [{ flex: 1 }, layoutStyle], children: [_jsx(Pane, { hidden: !!detail, children: _jsx(ScreenLayout, { ...screen, ...(refresh || screen.actions ? { actions: _jsxs(Stack, { axis: "inline", gap: "xs", align: "center", children: [screen.actions, refresh ? _jsx(Action, { action: refresh, secondary: true }) : null] }) } : {}), children: loadMore ? _jsxs(View, { style: { flexGrow: 1, flexShrink: 1, minHeight: 0, gap: screenPatternRecipe.itemGap }, children: [list, _jsx(View, { style: { alignItems: "center" }, children: _jsx(Action, { action: loadMore, secondary: true }) })] }) : list }) }), detail ? _jsx(Pane, { children: _jsx(ScreenLayout, { title: detail.title, ...(detail.titleVisibility === undefined ? {} : { titleVisibility: detail.titleVisibility }), ...(detail.headerAlignment === undefined ? {} : { headerAlignment: detail.headerAlignment }), ...(detail.state === undefined ? {} : { state: detail.state }), stateAction: detail.stateAction, notice: detail.notice, exit: { kind: "back", label: back.label, onPress: back.onAction, disabled: !!(back.disabled || back.pending) }, children: detail.content }) }) : null] }); }
26
33
  export function EditorScreen({ children, dirty, submitPlacement = "footer", submit, cancel, discard, draftStatus, ...screen }) {
27
34
  const [confirm, setConfirm] = useState(false);
28
35
  const cancelLocked = !!(cancel.disabled || cancel.pending || submit.pending);
@@ -34,11 +41,11 @@ export function EditorScreen({ children, dirty, submitPlacement = "footer", subm
34
41
  // Preserve an async host result so AlertDialog can retain failure and retry.
35
42
  const leave = () => { if (!cancelLocked)
36
43
  return cancel.onAction(); };
37
- return _jsxs(_Fragment, { children: [_jsx(ScreenLayout, { ...screen, leading: _jsx(Action, { action: { ...cancel, disabled: cancelLocked, onAction: () => { if (cancelLocked)
38
- return; if (dirty)
39
- setConfirm(true);
40
- else
41
- leave(); } }, secondary: true }), actions: submitPlacement === "header" ? _jsx(Action, { action: submitAction }) : screen.actions, footer: submitPlacement === "header" ? draftStatus : _jsxs(Stack, { gap: "sm", children: [draftStatus, _jsx(Action, { action: submitAction })] }), children: children }), _jsx(AlertDialog, { open: confirm && !cancelLocked, onOpenChange: setConfirm, request: { ...discard, mode: "confirm", onConfirm: leave } })] });
44
+ return _jsxs(_Fragment, { children: [_jsx(ScreenLayout, { ...screen, exit: { kind: "close", label: cancel.label, disabled: cancelLocked, onPress: () => { if (cancelLocked)
45
+ return; if (dirty)
46
+ setConfirm(true);
47
+ else
48
+ leave(); } }, actions: submitPlacement === "header" ? _jsx(Action, { action: submitAction }) : screen.actions, footer: submitPlacement === "header" ? draftStatus : _jsxs(Stack, { gap: "sm", children: [draftStatus, _jsx(Action, { action: submitAction })] }), children: children }), _jsx(AlertDialog, { open: confirm && !cancelLocked, onOpenChange: setConfirm, request: { ...discard, mode: "confirm", onConfirm: leave } })] });
42
49
  }
43
50
  export function ProfileScreen({ summary, edit, children, accountActions, ...screen }) { return _jsx(ScreenLayout, { ...screen, children: _jsxs(Stack, { gap: "xl", children: [_jsx(CompositionLayout, { footer: _jsx(Action, { action: edit, secondary: true }), children: summary }), children, accountActions] }) }); }
44
51
  export function ModerationScreen({ reasonPicker, reasons, reason, onReasonChange, reasonLabel, children, submit, block, ...screen }) {
@@ -48,7 +55,7 @@ export function ModerationScreen({ reasonPicker, reasons, reason, onReasonChange
48
55
  // a new explicit press even if the screen itself stays mounted.
49
56
  useEffect(() => { if (!hasBlock)
50
57
  setConfirm(false); }, [hasBlock]);
51
- return _jsxs(_Fragment, { children: [_jsx(ScreenLayout, { ...screen, footer: _jsxs(Stack, { gap: "sm", children: [_jsx(Action, { action: { ...submit, disabled: submit.disabled || !!screen.state && screen.state.kind !== "ready" || !reasons.some(item => item.value === reason) } }), block ? _jsx(Action, { action: { ...block.action, onAction: () => setConfirm(true) }, secondary: true }) : null] }), children: _jsxs(Stack, { gap: "lg", children: [reasonPicker ?? (reasons.length ? _jsx(RadioGroup, { accessibilityLabel: reasonLabel, orientation: "vertical", items: reasons, value: reason, onValueChange: value => { if (value)
58
+ return _jsxs(_Fragment, { children: [_jsx(ScreenLayout, { ...screen, footer: _jsxs(Stack, { gap: "xs", children: [_jsx(Action, { action: { ...submit, disabled: submit.disabled || !!screen.state && screen.state.kind !== "ready" || !reasons.some(item => item.value === reason) } }), block ? _jsx(Action, { action: { ...block.action, onAction: () => setConfirm(true) }, secondary: true }) : null] }), children: _jsxs(Stack, { gap: "lg", children: [reasonPicker ?? (reasons.length ? _jsx(RadioGroup, { accessibilityLabel: reasonLabel, orientation: "vertical", items: reasons, value: reason, onValueChange: value => { if (value)
52
59
  onReasonChange(value); } }) : null), children] }) }), block ? _jsx(AlertDialog, { open: confirm, onOpenChange: setConfirm, request: block.confirmation }) : null] });
53
60
  }
54
61
  export function PhotoSourceSheet({ open, onOpenChange, onSelect, labels, disabled = false, cameraAvailable = true }) {
@@ -64,10 +71,10 @@ export function PhotoSourceSheet({ open, onOpenChange, onSelect, labels, disable
64
71
  // deferred closing after source selection. Do not launch that abandoned picker.
65
72
  const dismiss = (next) => { if (!next)
66
73
  queued.current = null; onOpenChange(next); };
67
- return _jsx(Sheet, { open: open, onOpenChange: dismiss, title: labels.title, closeLabel: labels.cancel, onDismissComplete: complete, children: _jsxs(Stack, { gap: "sm", children: [_jsx(Button, { tone: "secondary", disabled: disabled, onPress: () => select("library"), children: labels.library }), cameraAvailable ? _jsx(Button, { tone: "secondary", disabled: disabled, onPress: () => select("camera"), children: labels.camera }) : null] }) });
74
+ return _jsx(Sheet, { open: open, onOpenChange: dismiss, title: labels.title, closeLabel: labels.cancel, onDismissComplete: complete, children: _jsxs(Stack, { gap: "xs", children: [_jsx(Button, { tone: "secondary", disabled: disabled, onPress: () => select("library"), children: labels.library }), cameraAvailable ? _jsx(Button, { tone: "secondary", disabled: disabled, onPress: () => select("camera"), children: labels.camera }) : null] }) });
68
75
  }
69
76
  /** A photo is the primary content; upload status stays below it instead of replacing the thumbnail. */
70
- export function MediaSelectionScreen({ library, selectionSummary, items, add, done, labels, actionLabels, removeLabel, moveUpLabel, moveDownLabel, onRemove, onMove, onRetry, onCancel, ...screen }) { return _jsx(ScreenLayout, { ...screen, actions: _jsx(Action, { action: add, secondary: true }), footer: _jsxs(Stack, { gap: "sm", children: [selectionSummary, _jsx(Action, { action: done })] }), children: library ?? _jsx(Grid, { columns: { compact: 2, expanded: 3 }, gap: { compact: "md" }, children: items.map((item, index) => _jsxs(Stack, { gap: "xs", children: [item.preview, _jsx(UploadItem, { descriptor: item.descriptor, labels: labels, onRetry: onRetry, onCancel: onCancel }), _jsxs(Stack, { axis: "inline", gap: "xxs", layoutStyle: { flexWrap: "wrap" }, children: [_jsx(Button, { accessibilityLabel: moveUpLabel(item), size: "small", tone: "ghost", disabled: index === 0, onPress: () => onMove(item.descriptor.id, -1), children: actionLabels.moveUp }), _jsx(Button, { accessibilityLabel: moveDownLabel(item), size: "small", tone: "ghost", disabled: index === items.length - 1, onPress: () => onMove(item.descriptor.id, 1), children: actionLabels.moveDown }), _jsx(Button, { accessibilityLabel: removeLabel(item), size: "small", tone: "ghost", onPress: () => onRemove(item.descriptor.id), children: actionLabels.remove })] })] }, item.descriptor.id)) }) }); }
77
+ export function MediaSelectionScreen({ library, selectionSummary, items, add, done, labels, actionLabels, removeLabel, moveUpLabel, moveDownLabel, onRemove, onMove, onRetry, onCancel, ...screen }) { return _jsx(ScreenLayout, { ...screen, ...(add || screen.actions ? { actions: _jsxs(Stack, { axis: "inline", gap: "xs", align: "center", children: [screen.actions, add ? _jsx(Action, { action: add }) : null] }) } : {}), footer: _jsxs(Stack, { gap: "sm", children: [selectionSummary, _jsx(Action, { action: done })] }), children: library ?? _jsx(Grid, { columns: { compact: 2, expanded: 3 }, gap: { compact: "md" }, children: items.map((item, index) => _jsxs(Stack, { gap: "xs", children: [item.preview, _jsx(UploadItem, { descriptor: item.descriptor, labels: labels, onRetry: onRetry, onCancel: onCancel }), _jsxs(Stack, { axis: "inline", gap: "xxs", layoutStyle: { flexWrap: "wrap" }, children: [_jsx(Button, { accessibilityLabel: moveUpLabel(item), size: "small", tone: "ghost", disabled: index === 0, onPress: () => onMove(item.descriptor.id, -1), children: actionLabels.moveUp }), _jsx(Button, { accessibilityLabel: moveDownLabel(item), size: "small", tone: "ghost", disabled: index === items.length - 1, onPress: () => onMove(item.descriptor.id, 1), children: actionLabels.moveDown }), _jsx(Button, { accessibilityLabel: removeLabel(item), size: "small", tone: "ghost", onPress: () => onRemove(item.descriptor.id), children: actionLabels.remove })] })] }, item.descriptor.id)) }) }); }
71
78
  /** Announce only when the text changes; iOS queues it behind the current utterance instead of cutting it off. */
72
79
  function useSearchAnnouncement(text) {
73
80
  useEffect(() => {
@@ -127,7 +134,7 @@ function SearchFilterSheetView({ sheet }) {
127
134
  const setDraft = (next) => setSession(current => current ? { draft: next } : current);
128
135
  const count = sheet.count(draft);
129
136
  // Native sheet footers stack full-width buttons with the primary action first (sheet.md).
130
- const footer = _jsxs(Stack, { gap: "sm", children: [_jsx(Button, { fullWidth: true, disabled: count === 0, onPress: () => { sheet.onApply(draft); sheet.onOpenChange(false); }, children: sheet.labels.apply(count) }), _jsx(Button, { fullWidth: true, tone: "secondary", disabled: sheet.isDefault(draft), onPress: () => setDraft(sheet.reset(draft)), children: sheet.labels.reset })] });
137
+ const footer = _jsxs(Stack, { gap: "xs", children: [_jsx(Button, { fullWidth: true, disabled: count === 0, onPress: () => { sheet.onApply(draft); sheet.onOpenChange(false); }, children: sheet.labels.apply(count) }), _jsx(Button, { fullWidth: true, tone: "secondary", disabled: sheet.isDefault(draft), onPress: () => setDraft(sheet.reset(draft)), children: sheet.labels.reset })] });
131
138
  return _jsx(Sheet, { open: sheet.open, onOpenChange: open => sheet.onOpenChange(open), title: sheet.title, closeLabel: sheet.labels.close, size: sheet.size ?? "large", scrollable: true, footer: footer, children: sheet.renderContent(draft, setDraft) });
132
139
  }
133
140
  /** Abort is supplied to the host request; the host must ignore aborted responses before committing results. */
@@ -183,9 +190,14 @@ export function SearchScreen({ query, queryLabel, queryField, queryClearLabel, o
183
190
  const body = phase === "idle" ? _jsxs(_Fragment, { children: [idle, committedQuery === undefined ? children : null] })
184
191
  : phase === "typing" ? (suggestions ? _jsx(SearchSuggestionList, { query: query, suggestions: suggestions, onCommit: commit }) : null)
185
192
  : _jsxs(_Fragment, { children: [_jsx(SearchResultsHeader, { summary: resultSummary, applied: appliedFilters, cause: cause, onSortChange: changeSort }), _jsx(SearchResultsBody, { summary: resultSummary, applied: appliedFilters, suggested: suggestedQueries, cause: cause, onCommit: commit, children: children })] });
186
- return _jsxs(_Fragment, { children: [_jsx(ScreenLayout, { ...screen, scrollRef: scrollRef, notice: _jsxs(Stack, { gap: "sm", children: [queryField ?? _jsx(SearchField, { ...labelProps, clearLabel: queryClearLabel, value: query, onValueChange: onQueryChange, busy: searching ?? false, busyLabel: searchingLabel ?? queryLabel, ...submitProps }), filterSlot, screen.notice] }), children: _jsx(Stack, { gap: "lg", children: body }) }), filterSheet ? _jsx(SearchFilterSheetView, { sheet: filterSheet }) : null] });
193
+ // Search-first routes have no visible heading: navigation and input share one row.
194
+ // Keep explicit host headers and described/titled screens in their existing layout.
195
+ const inlineNavigation = screen.titleVisibility === "hidden" && screen.header == null && !screen.description;
196
+ const input = queryField ?? _jsx(SearchField, { ...labelProps, clearLabel: queryClearLabel, value: query, onValueChange: onQueryChange, busy: searching ?? false, busyLabel: searchingLabel ?? queryLabel, ...submitProps });
197
+ const queryRow = inlineNavigation ? _jsxs(Stack, { axis: "inline", align: "center", gap: "sm", children: [screen.exit ? _jsx(ScreenExitButton, { ...screen.exit }) : null, _jsx(View, { style: { flex: 1, minWidth: 0 }, children: input }), screen.actions] }) : input;
198
+ return _jsxs(_Fragment, { children: [_jsx(ScreenLayout, { ...screen, ...(inlineNavigation ? { header: _jsx(_Fragment, {}) } : {}), scrollRef: scrollRef, notice: _jsxs(Stack, { gap: "sm", children: [queryRow, filterSlot, screen.notice] }), children: _jsx(Stack, { gap: "lg", children: body }) }), filterSheet ? _jsx(SearchFilterSheetView, { sheet: filterSheet }) : null] });
187
199
  }
188
- export function PermissionScreen({ status, illustration, explanation, request, settings, continueAction, skip, ...screen }) { const kind = resolvePermissionAction(status); const primary = kind === "request" ? request : kind === "settings" ? settings : kind === "continue" ? continueAction : null; return _jsx(ScreenLayout, { ...screen, footer: _jsxs(Stack, { gap: "sm", children: [primary ? _jsx(Action, { action: primary }) : null, skip ? _jsx(Action, { action: skip, secondary: true }) : null] }), children: _jsxs(Stack, { gap: "xl", align: "center", children: [illustration, explanation] }) }); }
200
+ export function PermissionScreen({ status, illustration, explanation, request, settings, continueAction, skip, ...screen }) { const kind = resolvePermissionAction(status); const primary = kind === "request" ? request : kind === "settings" ? settings : kind === "continue" ? continueAction : null; return _jsx(ScreenLayout, { ...screen, footer: _jsxs(Stack, { gap: "xs", children: [primary ? _jsx(Action, { action: primary }) : null, skip ? _jsx(Action, { action: skip, secondary: true }) : null] }), children: _jsxs(Stack, { gap: "xl", align: "center", children: [illustration, explanation] }) }); }
189
201
  // Large headings and a software keyboard can consume the entire fixed header
190
202
  // area. Keep step guidance in the existing scroll body, with completion actions fixed.
191
203
  export function OnboardingScreen({ steps, index, onIndexChange, nextLabel, backLabel, complete, skip, progressLabel, layoutStyle }) {
@@ -196,14 +208,31 @@ export function OnboardingScreen({ steps, index, onIndexChange, nextLabel, backL
196
208
  // A new step starts at its guidance even when the previous story was scrolled.
197
209
  useEffect(() => { scrollRef.current?.scrollTo({ y: 0, animated: false }); }, [index]);
198
210
  const pending = !!(complete.pending || skip?.pending);
199
- return _jsx(ScreenLayout, { scrollRef: scrollRef, ...(layoutStyle === undefined ? {} : { layoutStyle }), title: step.title, header: _jsx(_Fragment, {}), footer: _jsxs(Stack, { gap: "sm", children: [_jsx(Action, { action: position.last ? { ...complete, disabled: !!(complete.disabled || pending) } : { label: nextLabel, disabled: pending, onAction: () => onIndexChange(index + 1) } }), !position.first ? _jsx(Action, { action: { label: backLabel, disabled: pending, onAction: () => onIndexChange(index - 1) }, secondary: true }) : null] }), children: _jsxs(Stack, { gap: "md", children: [_jsx(Text, { variant: "titleLarge", accessibilityRole: "header", children: step.title }), _jsx(Text, { tone: "muted", children: step.description }), _jsx(Text, { variant: "caption", tone: "muted", children: progressLabel(index + 1, steps.length) }), skip ? _jsx(Action, { action: { ...skip, disabled: !!(skip.disabled || pending) }, secondary: true }) : null, step.content] }) });
211
+ return _jsx(ScreenLayout, { scrollRef: scrollRef, ...(layoutStyle === undefined ? {} : { layoutStyle }), title: step.title, header: _jsx(_Fragment, {}), footer: _jsxs(Stack, { gap: "xs", children: [_jsx(Action, { action: position.last ? { ...complete, disabled: !!(complete.disabled || pending) } : { label: nextLabel, disabled: pending, onAction: () => onIndexChange(index + 1) } }), !position.first ? _jsx(Action, { action: { label: backLabel, disabled: pending, onAction: () => onIndexChange(index - 1) }, secondary: true }) : null] }), children: _jsxs(Stack, { gap: "md", children: [_jsx(Text, { variant: "titleLarge", accessibilityRole: "header", children: step.title }), _jsx(Text, { tone: "muted", children: step.description }), _jsx(Text, { variant: "caption", tone: "muted", children: progressLabel(index + 1, steps.length) }), skip ? _jsx(Action, { action: { ...skip, disabled: !!(skip.disabled || pending) }, secondary: true }) : null, step.content] }) });
212
+ }
213
+ /** Quiet secondary actions (reply, expand) read as muted copy beside the body, not as filled buttons. */
214
+ function CommentTextAction({ label, onPress, disabled = false, expanded }) {
215
+ return _jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: label, accessibilityState: { disabled, ...(expanded === undefined ? {} : { expanded }) }, disabled: disabled, hitSlop: commentThreadRecipe.avatarGap, onPress: onPress, style: { alignSelf: "flex-start", opacity: disabled ? 0.5 : 1 }, children: _jsx(Text, { variant: "caption", tone: "muted", emphasis: "strong", children: label }) });
216
+ }
217
+ function CommentMenuButton({ item, menu }) {
218
+ const { palette } = useHjmNativeTheme();
219
+ const items = resolveCommentMenuItems(menu.items(item));
220
+ if (!items.length)
221
+ return null;
222
+ const label = menu.label(item);
223
+ return _jsx(Menu, { triggerLabel: label, title: label, dismissLabel: menu.dismissLabel, items: items.map(entry => ({ id: entry.id, label: entry.label, ...(entry.tone === undefined ? {} : { tone: entry.tone }), ...(entry.disabled === undefined ? {} : { disabled: entry.disabled }) })), onActionAfterDismiss: id => menu.onAction(item, id), renderTrigger: trigger => _jsx(IconButton, { label: label, tone: "ghost", onPress: trigger.onPress, children: _jsx(DrawnMoreVertical, { size: commentThreadRecipe.menuGlyphSize, color: resolveIconButtonPresentation("ghost", palette).content }) }) });
200
224
  }
201
225
  /** Virtualized hosts reuse the same row as CommentThreadScreen; product slots add content, not a second layout. */
202
- export function CommentThreadRow({ item, onLike, onReply, replyLabel, layoutStyle }) {
203
- return _jsxs(Stack, { axis: "inline", align: "start", gap: "sm", ...(layoutStyle === undefined ? {} : { layoutStyle }), children: [item.avatar, _jsxs(Stack, { gap: "xxs", layoutStyle: { flex: 1, minWidth: 0 }, children: [item.bodyText !== undefined ? _jsxs(Text, { children: [_jsx(Text, { emphasis: "strong", children: item.author }), " ", item.bodyText] }) : (item.author || item.timeLabel) ? _jsxs(Stack, { axis: "inline", gap: "sm", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [item.author ? _jsx(Text, { emphasis: "strong", children: item.author }) : null, item.timeLabel ? _jsx(Text, { variant: "caption", tone: "muted", children: item.timeLabel }) : null] }) : null, item.body, _jsxs(Stack, { axis: "inline", gap: "sm", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [item.bodyText !== undefined && item.timeLabel ? _jsx(Text, { variant: "caption", tone: "muted", children: item.timeLabel }) : null, item.likeCountLabel ? _jsx(Text, { variant: "caption", tone: "muted", children: item.likeCountLabel }) : null, (item.canReply ?? item.parentId === null) ? _jsx(Button, { size: "small", tone: "ghost", disabled: item.replyDisabled ?? false, onPress: () => onReply(item.id), children: replyLabel }) : null] })] }), _jsxs(Stack, { axis: "inline", gap: "xxs", align: "center", layoutStyle: { flexShrink: 0 }, children: [item.likeAction !== undefined ? item.likeAction : _jsx(IconButton, { label: item.likeLabel, tone: "ghost", onPress: () => onLike(item.id), children: item.likeIcon }), item.actions] })] }, item.id);
226
+ export function CommentThreadRow({ item, onLike, onReply, replyLabel, layoutStyle, commentMenu }) {
227
+ const avatarSize = item.parentId === null ? commentThreadRecipe.avatarSize : commentThreadRecipe.replyAvatarSize;
228
+ // The like count sits under the heart so the text column carries only identity, body and reply.
229
+ return _jsxs(Stack, { axis: "inline", align: "start", gap: "xs", ...(layoutStyle === undefined ? {} : { layoutStyle }), children: [item.avatar ? _jsx(View, { style: { width: avatarSize, alignItems: "center" }, children: item.avatar }) : null, _jsxs(View, { style: { flex: 1, minWidth: 0, gap: commentThreadRecipe.lineGap }, children: [(() => {
230
+ const identity = _jsxs(_Fragment, { children: [item.bodyText !== undefined ? _jsxs(Text, { children: [_jsx(Text, { emphasis: "strong", children: item.author }), " ", item.bodyText] }) : (item.author || item.timeLabel) ? _jsxs(Stack, { axis: "inline", gap: "xxs", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [item.author ? _jsx(Text, { variant: "caption", emphasis: "strong", children: item.author }) : null, item.timeLabel ? _jsx(Text, { variant: "caption", tone: "muted", children: item.timeLabel }) : null] }) : null, item.body, item.media ? _jsx(View, { style: { maxWidth: commentThreadRecipe.mediaMaxWidth, borderRadius: commentThreadRecipe.mediaRadius, overflow: "hidden", marginTop: commentThreadRecipe.avatarGap / 2, alignSelf: "flex-start" }, children: item.media }) : null] });
231
+ return item.reactions ? _jsx(MessageReactions, { previewSurface: true, ...item.reactions, ...((item.canReply ?? item.parentId === null) && !item.replyDisabled ? { replyAction: { label: replyLabel, onPress: () => onReply(item.id), ...(item.reactions.replyIcon === undefined ? {} : { icon: item.reactions.replyIcon }) } } : {}), children: _jsx(View, { style: { gap: commentThreadRecipe.lineGap }, children: identity }) }) : identity;
232
+ })(), (item.bodyText !== undefined && item.timeLabel) || (item.canReply ?? item.parentId === null) || item.reactionSummary ? _jsxs(Stack, { axis: "inline", gap: "sm", align: "center", layoutStyle: { flexWrap: "wrap" }, children: [item.bodyText !== undefined && item.timeLabel ? _jsx(Text, { variant: "caption", tone: "muted", children: item.timeLabel }) : null, item.reactionSummary, (item.canReply ?? item.parentId === null) ? _jsx(CommentTextAction, { label: replyLabel, disabled: item.replyDisabled ?? false, onPress: () => onReply(item.id) }) : null] }) : null] }), _jsxs(View, { style: { flexShrink: 0 }, children: [_jsxs(Stack, { axis: "inline", gap: "xxs", align: "center", layoutStyle: { flexShrink: 0 }, children: [item.likeAction !== undefined ? item.likeAction : _jsx(IconButton, { label: item.likeLabel, tone: "ghost", onPress: () => onLike(item.id), children: item.likeIcon }), item.actions, commentMenu ? _jsx(CommentMenuButton, { item: item, menu: commentMenu }) : null] }), item.likeCountLabel ? _jsx(View, { style: { width: commentThreadRecipe.likeColumnWidth }, children: _jsx(Text, { variant: "caption", tone: "muted", align: "center", children: item.likeCountLabel }) }) : null] })] }, item.id);
204
233
  }
205
234
  /** Controlled thread: server ordering, permission checks and receipt-based draft clearing belong to the product. */
206
- export function CommentThreadScreen({ items, expandedIds, onExpandedChange, onLike, onReply, replyLabel, repliesLabel, composer, threadHeader, threadFooter, ...screen }) {
235
+ export function CommentThreadScreen({ items, expandedIds, onExpandedChange, onLike, onReply, replyLabel, repliesLabel, composer, threadHeader, threadFooter, commentMenu, ...screen }) {
207
236
  validateCommentThread(items);
208
237
  // Index replies once; rescanning every item for each root makes long threads quadratic.
209
238
  const roots = [], repliesByParent = new Map();
@@ -219,10 +248,10 @@ export function CommentThreadScreen({ items, expandedIds, onExpandedChange, onLi
219
248
  repliesByParent.set(item.parentId, [item]);
220
249
  }
221
250
  }
222
- const row = (item) => _jsx(CommentThreadRow, { item: item, onLike: onLike, onReply: onReply, replyLabel: replyLabel }, item.id);
251
+ const row = (item) => _jsx(CommentThreadRow, { item: item, onLike: onLike, onReply: onReply, replyLabel: replyLabel, ...(commentMenu === undefined ? {} : { commentMenu }) }, item.id);
223
252
  // Product context belongs in the same scroll body as comments. Putting a tall
224
253
  // overview in the fixed header forced a second scroll region in Spint (2026-10-08).
225
- return _jsx(ScreenLayout, { ...screen, footer: !screen.state || screen.state.kind === "ready" || screen.state.kind === "empty" ? composer : null, children: _jsxs(Stack, { gap: "lg", children: [threadHeader, roots.map(item => { const replies = repliesByParent.get(item.id) ?? []; return _jsxs(Stack, { gap: "xs", children: [row(item), replies.length ? _jsxs(Stack, { gap: "md", layoutStyle: { marginStart: screenPatternRecipe.sectionGap }, children: [_jsx(Button, { layoutStyle: { alignSelf: "flex-start" }, tone: "ghost", size: "small", accessibilityState: { expanded: expanded.has(item.id) }, onPress: () => onExpandedChange(item.id), children: repliesLabel(replies.length, expanded.has(item.id)) }), expanded.has(item.id) ? replies.map(row) : null] }) : null] }, item.id); }), threadFooter] }) });
254
+ return _jsx(ScreenLayout, { ...screen, footer: !screen.state || screen.state.kind === "ready" || screen.state.kind === "empty" ? composer : null, children: _jsxs(Stack, { gap: "lg", children: [threadHeader, _jsx(View, { style: { gap: commentThreadRecipe.rowGap }, children: roots.map(item => { const replies = repliesByParent.get(item.id) ?? []; return _jsxs(View, { style: { gap: commentThreadRecipe.rowGap }, children: [row(item), replies.length ? _jsxs(View, { style: { gap: commentThreadRecipe.rowGap, marginStart: commentThreadRecipe.replyIndent }, children: [_jsx(CommentTextAction, { label: repliesLabel(replies.length, expanded.has(item.id)), expanded: expanded.has(item.id), onPress: () => onExpandedChange(item.id) }), expanded.has(item.id) ? replies.map(row) : null] }) : null] }, item.id); }) }), threadFooter] }) });
226
255
  }
227
256
  /** Profile identity and counts are common; routing and mutations stay controlled by the product. */
228
257
  export function ProfileSummary({ name, headingLevel = 2, avatar, badge, nameActions, stats = [], actions, children }) {