@ankhorage/zora 14.0.0 → 15.0.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 (249) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +176 -6
  3. package/dist/features/app-bar/adapters/inbound/AppBar.d.ts +5 -0
  4. package/dist/features/app-bar/adapters/inbound/AppBar.d.ts.map +1 -0
  5. package/dist/features/app-bar/adapters/inbound/AppBar.js +92 -0
  6. package/dist/features/app-bar/adapters/inbound/AppBar.js.map +1 -0
  7. package/dist/{components/app-bar/meta.d.ts → features/app-bar/appBarMeta.d.ts} +1 -1
  8. package/dist/features/app-bar/appBarMeta.d.ts.map +1 -0
  9. package/dist/{components/app-bar/meta.js → features/app-bar/appBarMeta.js} +1 -1
  10. package/dist/features/app-bar/appBarMeta.js.map +1 -0
  11. package/dist/features/app-bar/public.d.ts +3 -0
  12. package/dist/features/app-bar/public.d.ts.map +1 -0
  13. package/dist/features/app-bar/public.js +2 -0
  14. package/dist/features/app-bar/public.js.map +1 -0
  15. package/dist/features/bottom-sheet/public.d.ts +2 -2
  16. package/dist/features/bottom-sheet/public.d.ts.map +1 -1
  17. package/dist/features/bottom-sheet/public.js +1 -1
  18. package/dist/features/bottom-sheet/public.js.map +1 -1
  19. package/dist/features/breadcrumbs/adapters/inbound/Breadcrumbs.d.ts +5 -0
  20. package/dist/features/breadcrumbs/adapters/inbound/Breadcrumbs.d.ts.map +1 -0
  21. package/dist/features/breadcrumbs/adapters/inbound/Breadcrumbs.js +81 -0
  22. package/dist/features/breadcrumbs/adapters/inbound/Breadcrumbs.js.map +1 -0
  23. package/dist/features/breadcrumbs/breadcrumbsMeta.d.ts +119 -0
  24. package/dist/features/breadcrumbs/breadcrumbsMeta.d.ts.map +1 -0
  25. package/dist/features/breadcrumbs/breadcrumbsMeta.js +94 -0
  26. package/dist/features/breadcrumbs/breadcrumbsMeta.js.map +1 -0
  27. package/dist/features/breadcrumbs/public.d.ts +3 -0
  28. package/dist/features/breadcrumbs/public.d.ts.map +1 -0
  29. package/dist/features/breadcrumbs/public.js +2 -0
  30. package/dist/features/breadcrumbs/public.js.map +1 -0
  31. package/dist/features/button/utils/resolveButtonThemeRecipe.d.ts +1 -1
  32. package/dist/features/data-table/adapters/inbound/DataTable.d.ts.map +1 -1
  33. package/dist/features/data-table/adapters/inbound/DataTable.js +4 -2
  34. package/dist/features/data-table/adapters/inbound/DataTable.js.map +1 -1
  35. package/dist/features/form/formFieldMeta.d.ts +1 -1
  36. package/dist/features/form/formFieldMeta.js +1 -1
  37. package/dist/features/form/formFieldMeta.js.map +1 -1
  38. package/dist/features/form/radio/utils/resolveRadioGroupThemeRecipe.d.ts +1 -1
  39. package/dist/features/form/select/adapters/inbound/Select.d.ts +2 -0
  40. package/dist/features/form/select/adapters/inbound/Select.d.ts.map +1 -0
  41. package/dist/features/form/select/adapters/inbound/Select.js +2 -0
  42. package/dist/features/form/select/adapters/inbound/Select.js.map +1 -0
  43. package/dist/features/form/select/adapters/inbound/Select.native.d.ts +5 -0
  44. package/dist/features/form/select/adapters/inbound/Select.native.d.ts.map +1 -0
  45. package/dist/features/form/select/adapters/inbound/Select.native.js +42 -0
  46. package/dist/features/form/select/adapters/inbound/Select.native.js.map +1 -0
  47. package/dist/features/form/select/adapters/inbound/Select.web.d.ts +5 -0
  48. package/dist/features/form/select/adapters/inbound/Select.web.d.ts.map +1 -0
  49. package/dist/features/form/select/adapters/inbound/Select.web.js +31 -0
  50. package/dist/features/form/select/adapters/inbound/Select.web.js.map +1 -0
  51. package/dist/features/form/select/composition/SelectField.d.ts +10 -0
  52. package/dist/features/form/select/composition/SelectField.d.ts.map +1 -0
  53. package/dist/features/form/select/composition/SelectField.js +8 -0
  54. package/dist/features/form/select/composition/SelectField.js.map +1 -0
  55. package/dist/features/form/select/composition/SelectOptionRow.d.ts +12 -0
  56. package/dist/features/form/select/composition/SelectOptionRow.d.ts.map +1 -0
  57. package/dist/features/form/select/composition/SelectOptionRow.js +9 -0
  58. package/dist/features/form/select/composition/SelectOptionRow.js.map +1 -0
  59. package/dist/features/form/select/composition/SelectTrigger.d.ts +10 -0
  60. package/dist/features/form/select/composition/SelectTrigger.d.ts.map +1 -0
  61. package/dist/features/form/select/composition/SelectTrigger.js +9 -0
  62. package/dist/features/form/select/composition/SelectTrigger.js.map +1 -0
  63. package/dist/features/form/select/composition/useSelectController.d.ts +8 -0
  64. package/dist/features/form/select/composition/useSelectController.d.ts.map +1 -0
  65. package/dist/features/form/select/composition/useSelectController.js +15 -0
  66. package/dist/features/form/select/composition/useSelectController.js.map +1 -0
  67. package/dist/features/form/select/public.d.ts +3 -0
  68. package/dist/features/form/select/public.d.ts.map +1 -0
  69. package/dist/features/form/select/public.js +2 -0
  70. package/dist/features/form/select/public.js.map +1 -0
  71. package/dist/features/form/select/selectMeta.d.ts +195 -0
  72. package/dist/features/form/select/selectMeta.d.ts.map +1 -0
  73. package/dist/features/form/select/selectMeta.js +152 -0
  74. package/dist/features/form/select/selectMeta.js.map +1 -0
  75. package/dist/features/popover-menu/adapters/inbound/PopoverMenu.d.ts +5 -0
  76. package/dist/features/popover-menu/adapters/inbound/PopoverMenu.d.ts.map +1 -0
  77. package/dist/features/popover-menu/adapters/inbound/PopoverMenu.js +43 -0
  78. package/dist/features/popover-menu/adapters/inbound/PopoverMenu.js.map +1 -0
  79. package/dist/features/popover-menu/popoverMenuMeta.d.ts +9 -0
  80. package/dist/features/popover-menu/popoverMenuMeta.d.ts.map +1 -0
  81. package/dist/features/popover-menu/popoverMenuMeta.js +9 -0
  82. package/dist/features/popover-menu/popoverMenuMeta.js.map +1 -0
  83. package/dist/features/popover-menu/public.d.ts +3 -0
  84. package/dist/features/popover-menu/public.d.ts.map +1 -0
  85. package/dist/features/popover-menu/public.js +2 -0
  86. package/dist/features/popover-menu/public.js.map +1 -0
  87. package/dist/features/typography/utils/resolveHeadingThemeRecipe.d.ts +1 -1
  88. package/dist/features/typography/utils/resolveTextThemeRecipe.d.ts +1 -1
  89. package/dist/index.d.ts +5 -8
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +4 -4
  92. package/dist/index.js.map +1 -1
  93. package/dist/layout/settings-layout/SettingsLayout.d.ts +0 -2
  94. package/dist/layout/settings-layout/SettingsLayout.d.ts.map +1 -1
  95. package/dist/layout/settings-layout/SettingsLayout.js +1 -3
  96. package/dist/layout/settings-layout/SettingsLayout.js.map +1 -1
  97. package/dist/metadata/bindableComponentMeta.d.ts +1 -2
  98. package/dist/metadata/bindableComponentMeta.d.ts.map +1 -1
  99. package/dist/metadata/bindableComponentMeta.js +1 -2
  100. package/dist/metadata/bindableComponentMeta.js.map +1 -1
  101. package/dist/metadata/componentMeta.d.ts.map +1 -1
  102. package/dist/metadata/componentMeta.js +5 -6
  103. package/dist/metadata/componentMeta.js.map +1 -1
  104. package/dist/patterns/reader/ReaderSurface.js +1 -1
  105. package/dist/patterns/reader/ReaderSurface.js.map +1 -1
  106. package/dist/patterns/theme-composer/ThemeComposer.js +1 -1
  107. package/dist/patterns/theme-composer/ThemeComposer.js.map +1 -1
  108. package/dist/registry.d.ts.map +1 -1
  109. package/dist/registry.js +5 -6
  110. package/dist/registry.js.map +1 -1
  111. package/dist/{components/app-bar/types.d.ts → types/app-bar.d.ts} +8 -5
  112. package/dist/types/app-bar.d.ts.map +1 -0
  113. package/dist/types/app-bar.js +2 -0
  114. package/dist/types/app-bar.js.map +1 -0
  115. package/dist/{components/breadcrumbs/types.d.ts → types/breadcrumbs.d.ts} +8 -6
  116. package/dist/types/breadcrumbs.d.ts.map +1 -0
  117. package/dist/types/breadcrumbs.js +2 -0
  118. package/dist/types/breadcrumbs.js.map +1 -0
  119. package/dist/types/data-table.d.ts +2 -2
  120. package/dist/types/data-table.d.ts.map +1 -1
  121. package/dist/types/data-table.js.map +1 -1
  122. package/dist/types/popover-menu.d.ts +24 -0
  123. package/dist/types/popover-menu.d.ts.map +1 -0
  124. package/dist/types/popover-menu.js +2 -0
  125. package/dist/types/popover-menu.js.map +1 -0
  126. package/dist/types/select.d.ts +22 -0
  127. package/dist/types/select.d.ts.map +1 -0
  128. package/dist/types/select.js +2 -0
  129. package/dist/types/select.js.map +1 -0
  130. package/package.json +2 -4
  131. package/src/features/app-bar/adapters/inbound/AppBar.tsx +184 -0
  132. package/src/features/app-bar/public.ts +2 -0
  133. package/src/features/bottom-sheet/public.test.ts +10 -1
  134. package/src/features/bottom-sheet/public.ts +9 -1
  135. package/src/features/breadcrumbs/adapters/inbound/Breadcrumbs.tsx +179 -0
  136. package/src/features/breadcrumbs/breadcrumbsMeta.ts +95 -0
  137. package/src/features/breadcrumbs/public.test.ts +22 -0
  138. package/src/features/breadcrumbs/public.ts +6 -0
  139. package/src/features/data-table/adapters/inbound/DataTable.tsx +9 -5
  140. package/src/features/form/formFieldMeta.ts +1 -1
  141. package/src/features/form/select/adapters/inbound/Select.native.tsx +78 -0
  142. package/src/features/form/select/adapters/inbound/Select.tsx +1 -0
  143. package/src/features/form/select/adapters/inbound/Select.web.tsx +63 -0
  144. package/src/features/form/select/composition/SelectField.tsx +27 -0
  145. package/src/features/form/select/composition/SelectOptionRow.tsx +36 -0
  146. package/src/features/form/select/composition/SelectTrigger.tsx +32 -0
  147. package/src/features/form/select/composition/useSelectController.ts +21 -0
  148. package/src/features/form/select/public.test.ts +25 -0
  149. package/src/features/form/select/public.ts +2 -0
  150. package/src/features/form/select/selectMeta.ts +154 -0
  151. package/src/features/popover-menu/adapters/inbound/PopoverMenu.tsx +60 -0
  152. package/src/{components/breadcrumbs/meta.ts → features/popover-menu/popoverMenuMeta.ts} +3 -3
  153. package/src/features/popover-menu/public.test.ts +11 -0
  154. package/src/features/popover-menu/public.ts +6 -0
  155. package/src/index.ts +15 -8
  156. package/src/interactionPolicy.test.ts +24 -22
  157. package/src/layout/settings-layout/SettingsLayout.tsx +1 -3
  158. package/src/metadata/bindableComponentMeta.test.ts +8 -0
  159. package/src/metadata/bindableComponentMeta.ts +1 -2
  160. package/src/metadata/componentMeta.test.ts +3 -0
  161. package/src/metadata/componentMeta.ts +5 -6
  162. package/src/nativePeerContract.test.ts +5 -19
  163. package/src/patterns/reader/ReaderSurface.tsx +1 -1
  164. package/src/patterns/theme-composer/ThemeComposer.tsx +1 -1
  165. package/src/platformAcceptance.test.ts +1 -1
  166. package/src/registry.ts +5 -6
  167. package/src/theme/themeScopeStructure.test.ts +10 -5
  168. package/src/{components/app-bar/types.ts → types/app-bar.ts} +7 -4
  169. package/src/{components/breadcrumbs/types.ts → types/breadcrumbs.ts} +8 -5
  170. package/src/types/data-table.ts +2 -2
  171. package/src/types/popover-menu.ts +31 -0
  172. package/src/{components/select/types.ts → types/select.ts} +11 -3
  173. package/dist/components/app-bar/AppBar.d.ts +0 -7
  174. package/dist/components/app-bar/AppBar.d.ts.map +0 -1
  175. package/dist/components/app-bar/AppBar.js +0 -67
  176. package/dist/components/app-bar/AppBar.js.map +0 -1
  177. package/dist/components/app-bar/index.d.ts +0 -3
  178. package/dist/components/app-bar/index.d.ts.map +0 -1
  179. package/dist/components/app-bar/index.js +0 -3
  180. package/dist/components/app-bar/index.js.map +0 -1
  181. package/dist/components/app-bar/meta.d.ts.map +0 -1
  182. package/dist/components/app-bar/meta.js.map +0 -1
  183. package/dist/components/app-bar/types.d.ts.map +0 -1
  184. package/dist/components/app-bar/types.js +0 -2
  185. package/dist/components/app-bar/types.js.map +0 -1
  186. package/dist/components/breadcrumbs/Breadcrumbs.d.ts +0 -7
  187. package/dist/components/breadcrumbs/Breadcrumbs.d.ts.map +0 -1
  188. package/dist/components/breadcrumbs/Breadcrumbs.js +0 -80
  189. package/dist/components/breadcrumbs/Breadcrumbs.js.map +0 -1
  190. package/dist/components/breadcrumbs/index.d.ts +0 -3
  191. package/dist/components/breadcrumbs/index.d.ts.map +0 -1
  192. package/dist/components/breadcrumbs/index.js +0 -2
  193. package/dist/components/breadcrumbs/index.js.map +0 -1
  194. package/dist/components/breadcrumbs/meta.d.ts +0 -9
  195. package/dist/components/breadcrumbs/meta.d.ts.map +0 -1
  196. package/dist/components/breadcrumbs/meta.js +0 -9
  197. package/dist/components/breadcrumbs/meta.js.map +0 -1
  198. package/dist/components/breadcrumbs/types.d.ts.map +0 -1
  199. package/dist/components/breadcrumbs/types.js +0 -2
  200. package/dist/components/breadcrumbs/types.js.map +0 -1
  201. package/dist/components/menu/DropdownMenu.d.ts +0 -7
  202. package/dist/components/menu/DropdownMenu.d.ts.map +0 -1
  203. package/dist/components/menu/DropdownMenu.js +0 -9
  204. package/dist/components/menu/DropdownMenu.js.map +0 -1
  205. package/dist/components/menu/Menu.d.ts +0 -7
  206. package/dist/components/menu/Menu.d.ts.map +0 -1
  207. package/dist/components/menu/Menu.js +0 -46
  208. package/dist/components/menu/Menu.js.map +0 -1
  209. package/dist/components/menu/index.d.ts +0 -4
  210. package/dist/components/menu/index.d.ts.map +0 -1
  211. package/dist/components/menu/index.js +0 -3
  212. package/dist/components/menu/index.js.map +0 -1
  213. package/dist/components/menu/meta.d.ts +0 -17
  214. package/dist/components/menu/meta.d.ts.map +0 -1
  215. package/dist/components/menu/meta.js +0 -17
  216. package/dist/components/menu/meta.js.map +0 -1
  217. package/dist/components/menu/types.d.ts +0 -22
  218. package/dist/components/menu/types.d.ts.map +0 -1
  219. package/dist/components/menu/types.js +0 -2
  220. package/dist/components/menu/types.js.map +0 -1
  221. package/dist/components/select/Select.d.ts +0 -7
  222. package/dist/components/select/Select.d.ts.map +0 -1
  223. package/dist/components/select/Select.js +0 -32
  224. package/dist/components/select/Select.js.map +0 -1
  225. package/dist/components/select/index.d.ts +0 -3
  226. package/dist/components/select/index.d.ts.map +0 -1
  227. package/dist/components/select/index.js +0 -3
  228. package/dist/components/select/index.js.map +0 -1
  229. package/dist/components/select/meta.d.ts +0 -9
  230. package/dist/components/select/meta.d.ts.map +0 -1
  231. package/dist/components/select/meta.js +0 -9
  232. package/dist/components/select/meta.js.map +0 -1
  233. package/dist/components/select/types.d.ts +0 -14
  234. package/dist/components/select/types.d.ts.map +0 -1
  235. package/dist/components/select/types.js +0 -2
  236. package/dist/components/select/types.js.map +0 -1
  237. package/src/components/app-bar/AppBar.tsx +0 -140
  238. package/src/components/app-bar/index.ts +0 -2
  239. package/src/components/breadcrumbs/Breadcrumbs.tsx +0 -147
  240. package/src/components/breadcrumbs/index.ts +0 -2
  241. package/src/components/menu/DropdownMenu.tsx +0 -11
  242. package/src/components/menu/Menu.tsx +0 -59
  243. package/src/components/menu/index.ts +0 -3
  244. package/src/components/menu/meta.ts +0 -19
  245. package/src/components/menu/types.ts +0 -31
  246. package/src/components/select/Select.tsx +0 -67
  247. package/src/components/select/index.ts +0 -2
  248. package/src/components/select/meta.ts +0 -10
  249. /package/src/{components/app-bar/meta.ts → features/app-bar/appBarMeta.ts} +0 -0
@@ -1,9 +0,0 @@
1
- export const selectMeta = {
2
- name: 'Select',
3
- category: 'component',
4
- directManifestNode: false,
5
- allowedChildren: [],
6
- note: 'Form control component; not represented as a manifest node in v1.',
7
- props: {},
8
- };
9
- //# sourceMappingURL=meta.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/components/select/meta.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,WAAW;IACrB,kBAAkB,EAAE,KAAK;IACzB,eAAe,EAAE,EAAE;IACnB,IAAI,EAAE,mEAAmE;IACzE,KAAK,EAAE,EAAE;CAC2B,CAAC","sourcesContent":["import type { ZoraComponentMeta } from '../../metadata';\n\nexport const selectMeta = {\n name: 'Select',\n category: 'component',\n directManifestNode: false,\n allowedChildren: [],\n note: 'Form control component; not represented as a manifest node in v1.',\n props: {},\n} as const satisfies ZoraComponentMeta;\n"]}
@@ -1,14 +0,0 @@
1
- import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';
2
- export interface SelectOption<TValue extends string = string> {
3
- value: TValue;
4
- label: string;
5
- disabled?: boolean;
6
- }
7
- export interface SelectProps<TValue extends string = string> extends ZoraBaseProps {
8
- value: TValue;
9
- options: readonly SelectOption<TValue>[];
10
- onValueChange: (value: TValue) => void;
11
- disabled?: boolean;
12
- invalid?: boolean;
13
- }
14
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/select/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,YAAY,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;IACzC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/select/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';\n\nexport interface SelectOption<TValue extends string = string> {\n value: TValue;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps<TValue extends string = string> extends ZoraBaseProps {\n value: TValue;\n options: readonly SelectOption<TValue>[];\n onValueChange: (value: TValue) => void;\n disabled?: boolean;\n invalid?: boolean;\n}\n"]}
@@ -1,140 +0,0 @@
1
- import { AppBar as SurfaceAppBar, type ButtonIconSpec } from '@ankhorage/surface';
2
- import React from 'react';
3
-
4
- import { IconButton } from '../../features/button/public';
5
- import { Box, Stack } from '../../features/layout/public';
6
- import { Heading } from '../../features/typography/public';
7
- import { Text } from '../../features/typography/public';
8
- import { Inline } from '../../foundation';
9
- import { useZoraTheme } from '../../theme/useZoraTheme';
10
- import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
11
- import type { AppBarMode, AppBarOverflowAction, AppBarProps } from './types';
12
-
13
- const DEFAULT_CANCEL_ICON = { name: 'close-outline' } satisfies ButtonIconSpec;
14
- const DEFAULT_OVERFLOW_ICON = { name: 'ellipsis-vertical' } satisfies ButtonIconSpec;
15
-
16
- function resolveMode(mode: AppBarMode | undefined): AppBarMode {
17
- return mode ?? { type: 'default' };
18
- }
19
-
20
- function resolveSelectionLabel({ count, label }: { count?: number; label: string }): string {
21
- if (count === undefined) {
22
- return label;
23
- }
24
-
25
- return `${label} (${count})`;
26
- }
27
-
28
- function resolveOverflowLabel(overflow: AppBarOverflowAction): string {
29
- return overflow.label ?? 'More options';
30
- }
31
-
32
- function resolveCancelLabel(mode: Extract<AppBarMode, { type: 'selection' }>): string {
33
- return mode.cancelLabel ?? 'Cancel selection';
34
- }
35
-
36
- function AppBarInner({
37
- themeId: _themeId,
38
- mode: _mode,
39
- title,
40
- subtitle,
41
- leading,
42
- actions,
43
- overflow,
44
- appMode,
45
- children,
46
- safeAreaTop = true,
47
- divider = true,
48
- testID,
49
- interactionPolicy,
50
- }: AppBarProps) {
51
- const { theme } = useZoraTheme();
52
- const resolvedMode = resolveMode(appMode);
53
- const isSelectionMode = resolvedMode.type === 'selection';
54
-
55
- const resolvedLeading =
56
- leading ??
57
- (isSelectionMode ? (
58
- <IconButton
59
- icon={resolvedMode.cancelIcon ?? DEFAULT_CANCEL_ICON}
60
- interactionPolicy={interactionPolicy}
61
- label={resolveCancelLabel(resolvedMode)}
62
- variant="ghost"
63
- size="m"
64
- color="neutral"
65
- onPress={resolvedMode.onCancel}
66
- />
67
- ) : undefined);
68
-
69
- const overflowButton = overflow?.onPress ? (
70
- <IconButton
71
- disabled={overflow.disabled}
72
- icon={overflow.icon ?? DEFAULT_OVERFLOW_ICON}
73
- interactionPolicy={interactionPolicy}
74
- label={resolveOverflowLabel(overflow)}
75
- variant="ghost"
76
- size="m"
77
- color="neutral"
78
- onPress={overflow.onPress}
79
- />
80
- ) : null;
81
-
82
- const resolvedTrailing =
83
- actions || overflowButton ? (
84
- <Inline align="center" gap="s" wrap="nowrap">
85
- {actions}
86
- {overflowButton}
87
- </Inline>
88
- ) : undefined;
89
-
90
- const resolvedCenter = (() => {
91
- if (children !== undefined) {
92
- return children;
93
- }
94
-
95
- if (isSelectionMode) {
96
- return (
97
- <Text numberOfLines={1} emphasis="default" variant="label" weight="semiBold">
98
- {resolveSelectionLabel(resolvedMode)}
99
- </Text>
100
- );
101
- }
102
-
103
- if (title == null && subtitle == null) {
104
- return null;
105
- }
106
-
107
- return (
108
- <Stack gap="xs">
109
- {title != null ? (
110
- <Heading ellipsizeMode="tail" level={3} numberOfLines={1} size="h5">
111
- {title}
112
- </Heading>
113
- ) : null}
114
- {subtitle != null ? (
115
- <Text ellipsizeMode="tail" numberOfLines={1} emphasis="muted" variant="bodySmall">
116
- {subtitle}
117
- </Text>
118
- ) : null}
119
- </Stack>
120
- );
121
- })();
122
-
123
- return (
124
- <SurfaceAppBar
125
- bg={isSelectionMode ? theme.semantics.action.primary.softBg : undefined}
126
- divider={divider}
127
- leading={resolvedLeading}
128
- safeAreaTop={safeAreaTop}
129
- testID={testID}
130
- trailing={resolvedTrailing}
131
- >
132
- {resolvedCenter ? <Box style={{ minWidth: 0 }}>{resolvedCenter}</Box> : null}
133
- </SurfaceAppBar>
134
- );
135
- }
136
-
137
- /***
138
- * Renders a top app bar with title/subtitle and optional leading/trailing actions.
139
- */
140
- export const AppBar = withZoraThemeScope(AppBarInner);
@@ -1,2 +0,0 @@
1
- export * from './AppBar';
2
- export * from './types';
@@ -1,147 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Button } from '../../features/button/public';
4
- import { Icon } from '../../features/icon/public';
5
- import { Text } from '../../features/typography/public';
6
- import { Inline } from '../../foundation';
7
- import { resolveIconSize } from '../../internal/recipes';
8
- import { useZoraTheme } from '../../theme/useZoraTheme';
9
- import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
10
- import type { BreadcrumbItem, BreadcrumbsProps } from './types';
11
-
12
- type BreadcrumbRenderItem =
13
- | {
14
- item: BreadcrumbItem;
15
- type: 'item';
16
- }
17
- | {
18
- type: 'ellipsis';
19
- };
20
-
21
- function normalizeMaxItems(value: number | undefined): number | undefined {
22
- if (value === undefined || !Number.isFinite(value)) {
23
- return undefined;
24
- }
25
-
26
- return Math.max(0, Math.trunc(value));
27
- }
28
-
29
- function createRenderItems(
30
- items: readonly BreadcrumbItem[],
31
- maxItems: number | undefined,
32
- ): readonly BreadcrumbRenderItem[] {
33
- if (maxItems === undefined || maxItems === 0 || items.length <= maxItems || maxItems < 3) {
34
- return items.map((item) => ({ item, type: 'item' }));
35
- }
36
-
37
- const [firstItem] = items;
38
- if (firstItem === undefined) {
39
- return [];
40
- }
41
-
42
- const trailingCount = maxItems - 2;
43
- const trailingItems = items.slice(items.length - trailingCount);
44
-
45
- return [
46
- { item: firstItem, type: 'item' },
47
- { type: 'ellipsis' },
48
- ...trailingItems.map((item) => ({ item, type: 'item' }) satisfies BreadcrumbRenderItem),
49
- ];
50
- }
51
-
52
- function renderSeparator(separator: React.ReactNode) {
53
- return (
54
- <Text emphasis="muted" variant="bodySmall">
55
- {separator}
56
- </Text>
57
- );
58
- }
59
-
60
- function BreadcrumbLabel({ item, compact }: { item: BreadcrumbItem; compact: boolean }) {
61
- const { theme } = useZoraTheme();
62
-
63
- return (
64
- <Inline align="center" gap="xs" wrap="nowrap">
65
- {item.icon ? (
66
- <Icon
67
- {...item.icon}
68
- color={theme.semantics.content.muted}
69
- size={resolveIconSize(compact ? 's' : 'm')}
70
- />
71
- ) : null}
72
- <Text emphasis="muted" variant={compact ? 'caption' : 'bodySmall'}>
73
- {item.label}
74
- </Text>
75
- </Inline>
76
- );
77
- }
78
-
79
- function BreadcrumbsInner({
80
- themeId: _themeId,
81
- mode: _mode,
82
- interactionPolicy,
83
- items,
84
- separator = '/',
85
- maxItems,
86
- compact = false,
87
- disabled = false,
88
- testID,
89
- }: BreadcrumbsProps) {
90
- const normalizedMaxItems = normalizeMaxItems(maxItems);
91
- const renderItems = createRenderItems(items, normalizedMaxItems);
92
- const currentItemId = items.at(-1)?.id;
93
-
94
- if (items.length === 0) {
95
- return null;
96
- }
97
-
98
- return (
99
- <Inline align="center" gap={compact ? 'xs' : 's'} testID={testID} wrap="wrap">
100
- {renderItems.map((renderItem, index) => {
101
- const isLastRenderedItem = index === renderItems.length - 1;
102
- const showSeparator = !isLastRenderedItem;
103
-
104
- if (renderItem.type === 'ellipsis') {
105
- return (
106
- <React.Fragment key="ellipsis">
107
- <Text emphasis="muted" variant={compact ? 'caption' : 'bodySmall'}>
108
- …
109
- </Text>
110
- {showSeparator ? renderSeparator(separator) : null}
111
- </React.Fragment>
112
- );
113
- }
114
-
115
- const { item } = renderItem;
116
- const current = item.id === currentItemId;
117
- const interactive = !current && !disabled && !item.disabled && Boolean(item.onPress);
118
-
119
- return (
120
- <React.Fragment key={item.id}>
121
- {interactive ? (
122
- <Button
123
- color="neutral"
124
- interactionPolicy={interactionPolicy}
125
- leadingIcon={item.icon}
126
- onPress={item.onPress}
127
- size={compact ? 's' : 'm'}
128
- testID={testID ? `${testID}-item-${item.id}` : undefined}
129
- variant="ghost"
130
- >
131
- {item.label}
132
- </Button>
133
- ) : (
134
- <BreadcrumbLabel item={item} compact={compact} />
135
- )}
136
- {showSeparator ? renderSeparator(separator) : null}
137
- </React.Fragment>
138
- );
139
- })}
140
- </Inline>
141
- );
142
- }
143
-
144
- /***
145
- * Renders a breadcrumb trail for hierarchical navigation.
146
- */
147
- export const Breadcrumbs = withZoraThemeScope(BreadcrumbsInner);
@@ -1,2 +0,0 @@
1
- export { Breadcrumbs } from './Breadcrumbs';
2
- export type { BreadcrumbItem, BreadcrumbsProps } from './types';
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Menu } from './Menu';
4
- import type { DropdownMenuProps } from './types';
5
-
6
- /***
7
- * Convenience wrapper for rendering a `Menu` as a dropdown.
8
- */
9
- export function DropdownMenu(props: DropdownMenuProps) {
10
- return <Menu {...props} />;
11
- }
@@ -1,59 +0,0 @@
1
- import { Menu as SurfaceMenu, type MenuAction as SurfaceMenuAction } from '@ankhorage/surface';
2
- import React, { useMemo } from 'react';
3
-
4
- import { Icon } from '../../features/icon/public';
5
- import { Box } from '../../features/layout/public';
6
- import { resolveIconSize } from '../../internal/recipes';
7
- import { useZoraTheme } from '../../theme/useZoraTheme';
8
- import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
9
- import type { MenuAction, MenuProps } from './types';
10
-
11
- function renderActionLeading(action: MenuAction, iconColor: string) {
12
- if (action.leading) {
13
- return action.leading;
14
- }
15
-
16
- if (!action.icon) {
17
- return undefined;
18
- }
19
-
20
- return <Icon {...action.icon} color={iconColor} size={resolveIconSize('s')} />;
21
- }
22
-
23
- function renderActionTrailing(action: MenuAction) {
24
- if (!action.trailing) {
25
- return undefined;
26
- }
27
-
28
- return <Box>{action.trailing}</Box>;
29
- }
30
-
31
- function toSurfaceAction(action: MenuAction, iconColor: string): SurfaceMenuAction {
32
- return {
33
- activate: action.onPress,
34
- description: action.description,
35
- disabled: action.disabled,
36
- id: action.id,
37
- intent: action.intent,
38
- leading: renderActionLeading(action, iconColor),
39
- selected: action.selected,
40
- title: action.title,
41
- trailing: renderActionTrailing(action),
42
- };
43
- }
44
-
45
- function MenuInner({ themeId: _themeId, mode: _mode, actions, onDismiss, ...props }: MenuProps) {
46
- const { theme } = useZoraTheme();
47
- const iconColor = theme.semantics.content.muted;
48
- const surfaceActions = useMemo(
49
- () => actions.map((action) => toSurfaceAction(action, iconColor)),
50
- [actions, iconColor],
51
- );
52
-
53
- return <SurfaceMenu {...props} actions={surfaceActions} dismiss={onDismiss} />;
54
- }
55
-
56
- /***
57
- * Presents a list of actions as a menu with optional icons and intent styling.
58
- */
59
- export const Menu = withZoraThemeScope(MenuInner);
@@ -1,3 +0,0 @@
1
- export { DropdownMenu } from './DropdownMenu';
2
- export { Menu } from './Menu';
3
- export type { DropdownMenuProps, MenuAction, MenuActionIntent, MenuProps } from './types';
@@ -1,19 +0,0 @@
1
- import type { ZoraComponentMeta } from '../../metadata';
2
-
3
- export const menuMeta = {
4
- name: 'Menu',
5
- category: 'component',
6
- directManifestNode: false,
7
- allowedChildren: [],
8
- note: 'Surface-backed action menu; not represented as a manifest node in v1.',
9
- props: {},
10
- } as const satisfies ZoraComponentMeta;
11
-
12
- export const dropdownMenuMeta = {
13
- name: 'DropdownMenu',
14
- category: 'component',
15
- directManifestNode: false,
16
- allowedChildren: [],
17
- note: 'Product-facing alias for Menu trigger/action composition; not represented as a manifest node in v1.',
18
- props: {},
19
- } as const satisfies ZoraComponentMeta;
@@ -1,31 +0,0 @@
1
- import type {
2
- ButtonIconSpec,
3
- MenuActionIntent as SurfaceMenuActionIntent,
4
- MenuProps as SurfaceMenuProps,
5
- } from '@ankhorage/surface';
6
- import type React from 'react';
7
-
8
- import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';
9
-
10
- export type MenuActionIntent = SurfaceMenuActionIntent;
11
-
12
- export interface MenuAction {
13
- id: string;
14
- title: React.ReactNode;
15
- description?: React.ReactNode;
16
- icon?: ButtonIconSpec;
17
- leading?: React.ReactNode;
18
- trailing?: React.ReactNode;
19
- intent?: MenuActionIntent;
20
- disabled?: boolean;
21
- selected?: boolean;
22
- onPress?: () => void;
23
- }
24
-
25
- export interface MenuProps
26
- extends ZoraBaseProps, Omit<SurfaceMenuProps, 'actions' | 'dismiss' | 'mode' | 'themeId'> {
27
- actions: readonly MenuAction[];
28
- onDismiss?: () => void;
29
- }
30
-
31
- export type DropdownMenuProps = MenuProps;
@@ -1,67 +0,0 @@
1
- import { Picker } from '@react-native-picker/picker';
2
- import React from 'react';
3
- import { View } from 'react-native';
4
-
5
- import { Box } from '../../features/layout/public';
6
- import { useZoraTheme } from '../../theme/useZoraTheme';
7
- import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
8
- import type { SelectProps } from './types';
9
-
10
- function SelectInner<TValue extends string = string>({
11
- themeId: _themeId,
12
- mode: _mode,
13
- value,
14
- options,
15
- onValueChange,
16
- disabled,
17
- invalid,
18
- testID,
19
- interactionPolicy,
20
- }: SelectProps<TValue>) {
21
- const { theme } = useZoraTheme();
22
- const passive = interactionPolicy === 'passive';
23
-
24
- return (
25
- <Box
26
- bg="surface"
27
- borderColor={invalid ? theme.colors.error : theme.colors.border}
28
- borderWidth={1}
29
- opacity={disabled ? 0.5 : 1}
30
- radius="m"
31
- testID={testID}
32
- >
33
- <View style={{ pointerEvents: passive ? 'none' : 'auto' }}>
34
- <Picker
35
- enabled={!disabled}
36
- onValueChange={(itemValue) => {
37
- if (!passive) {
38
- onValueChange(itemValue);
39
- }
40
- }}
41
- selectedValue={value}
42
- style={{
43
- height: 44,
44
- width: '100%',
45
- backgroundColor: 'transparent',
46
- color: theme.colors.text,
47
- borderWidth: 0,
48
- }}
49
- >
50
- {options.map((option) => (
51
- <Picker.Item
52
- key={option.value}
53
- enabled={!option.disabled}
54
- label={option.label}
55
- value={option.value}
56
- />
57
- ))}
58
- </Picker>
59
- </View>
60
- </Box>
61
- );
62
- }
63
-
64
- /***
65
- * Select control for choosing a value from a list of options.
66
- */
67
- export const Select = withZoraThemeScope(SelectInner);
@@ -1,2 +0,0 @@
1
- export * from './Select';
2
- export * from './types';
@@ -1,10 +0,0 @@
1
- import type { ZoraComponentMeta } from '../../metadata';
2
-
3
- export const selectMeta = {
4
- name: 'Select',
5
- category: 'component',
6
- directManifestNode: false,
7
- allowedChildren: [],
8
- note: 'Form control component; not represented as a manifest node in v1.',
9
- props: {},
10
- } as const satisfies ZoraComponentMeta;