@ankhorage/zora 3.1.1 → 3.3.1

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 (105) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -1
  3. package/dist/components/card/meta.d.ts +1 -1
  4. package/dist/components/progress/ProgressRing.d.ts +7 -0
  5. package/dist/components/progress/ProgressRing.d.ts.map +1 -0
  6. package/dist/components/progress/ProgressRing.js +100 -0
  7. package/dist/components/progress/ProgressRing.js.map +1 -0
  8. package/dist/components/progress/index.d.ts +2 -1
  9. package/dist/components/progress/index.d.ts.map +1 -1
  10. package/dist/components/progress/index.js +1 -0
  11. package/dist/components/progress/index.js.map +1 -1
  12. package/dist/components/progress/meta.d.ts +116 -0
  13. package/dist/components/progress/meta.d.ts.map +1 -1
  14. package/dist/components/progress/meta.js +97 -0
  15. package/dist/components/progress/meta.js.map +1 -1
  16. package/dist/components/progress/resolveProgressRingGeometry.d.ts +12 -0
  17. package/dist/components/progress/resolveProgressRingGeometry.d.ts.map +1 -0
  18. package/dist/components/progress/resolveProgressRingGeometry.js +27 -0
  19. package/dist/components/progress/resolveProgressRingGeometry.js.map +1 -0
  20. package/dist/components/progress/types.d.ts +12 -0
  21. package/dist/components/progress/types.d.ts.map +1 -1
  22. package/dist/components/progress/types.js.map +1 -1
  23. package/dist/foundation/meta.d.ts +4 -4
  24. package/dist/index.d.ts +4 -2
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +2 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/layout/screen/meta.d.ts +1 -1
  29. package/dist/layout/screen-section/meta.d.ts +1 -1
  30. package/dist/metadata/allowedChildren.d.ts +4 -3
  31. package/dist/metadata/allowedChildren.d.ts.map +1 -1
  32. package/dist/metadata/allowedChildren.js +13 -0
  33. package/dist/metadata/allowedChildren.js.map +1 -1
  34. package/dist/metadata/bindableComponentMeta.d.ts +2 -2
  35. package/dist/metadata/componentMeta.d.ts.map +1 -1
  36. package/dist/metadata/componentMeta.js +4 -1
  37. package/dist/metadata/componentMeta.js.map +1 -1
  38. package/dist/patterns/content-rail/ContentRail.d.ts +10 -0
  39. package/dist/patterns/content-rail/ContentRail.d.ts.map +1 -0
  40. package/dist/patterns/content-rail/ContentRail.js +175 -0
  41. package/dist/patterns/content-rail/ContentRail.js.map +1 -0
  42. package/dist/patterns/content-rail/index.d.ts +3 -0
  43. package/dist/patterns/content-rail/index.d.ts.map +1 -0
  44. package/dist/patterns/content-rail/index.js +2 -0
  45. package/dist/patterns/content-rail/index.js.map +1 -0
  46. package/dist/patterns/content-rail/meta.d.ts +143 -0
  47. package/dist/patterns/content-rail/meta.d.ts.map +1 -0
  48. package/dist/patterns/content-rail/meta.js +130 -0
  49. package/dist/patterns/content-rail/meta.js.map +1 -0
  50. package/dist/patterns/content-rail/resolveContentRailItemWidth.d.ts +10 -0
  51. package/dist/patterns/content-rail/resolveContentRailItemWidth.d.ts.map +1 -0
  52. package/dist/patterns/content-rail/resolveContentRailItemWidth.js +25 -0
  53. package/dist/patterns/content-rail/resolveContentRailItemWidth.js.map +1 -0
  54. package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.d.ts +6 -0
  55. package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.d.ts.map +1 -0
  56. package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.js +5 -0
  57. package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.js.map +1 -0
  58. package/dist/patterns/content-rail/resolveContentRailState.d.ts +18 -0
  59. package/dist/patterns/content-rail/resolveContentRailState.d.ts.map +1 -0
  60. package/dist/patterns/content-rail/resolveContentRailState.js +21 -0
  61. package/dist/patterns/content-rail/resolveContentRailState.js.map +1 -0
  62. package/dist/patterns/content-rail/types.d.ts +31 -0
  63. package/dist/patterns/content-rail/types.d.ts.map +1 -0
  64. package/dist/patterns/content-rail/types.js +2 -0
  65. package/dist/patterns/content-rail/types.js.map +1 -0
  66. package/dist/patterns/content-rail/useContentRailReducedMotion.d.ts +3 -0
  67. package/dist/patterns/content-rail/useContentRailReducedMotion.d.ts.map +1 -0
  68. package/dist/patterns/content-rail/useContentRailReducedMotion.js +21 -0
  69. package/dist/patterns/content-rail/useContentRailReducedMotion.js.map +1 -0
  70. package/dist/patterns/message-bubble/meta.d.ts +1 -1
  71. package/dist/patterns/notice/meta.d.ts +1 -1
  72. package/dist/patterns/panel/meta.d.ts +1 -1
  73. package/dist/patterns/post-card/meta.d.ts +1 -1
  74. package/dist/patterns/reader/meta.d.ts +2 -2
  75. package/dist/patterns/scanner/meta.d.ts +2 -2
  76. package/dist/registry.d.ts.map +1 -1
  77. package/dist/registry.js +4 -1
  78. package/dist/registry.js.map +1 -1
  79. package/package.json +2 -2
  80. package/src/components/progress/ProgressRing.test.ts +48 -0
  81. package/src/components/progress/ProgressRing.tsx +151 -0
  82. package/src/components/progress/index.ts +2 -1
  83. package/src/components/progress/meta.ts +99 -0
  84. package/src/components/progress/resolveProgressRingGeometry.test.ts +30 -0
  85. package/src/components/progress/resolveProgressRingGeometry.ts +44 -0
  86. package/src/components/progress/types.ts +13 -0
  87. package/src/index.ts +12 -2
  88. package/src/interactionPolicy.test.ts +22 -0
  89. package/src/metadata/allowedChildren.ts +14 -0
  90. package/src/metadata/componentMeta.test.ts +51 -0
  91. package/src/metadata/componentMeta.ts +4 -1
  92. package/src/patterns/content-rail/ContentRail.test.ts +44 -0
  93. package/src/patterns/content-rail/ContentRail.tsx +245 -0
  94. package/src/patterns/content-rail/index.ts +10 -0
  95. package/src/patterns/content-rail/meta.ts +133 -0
  96. package/src/patterns/content-rail/resolveContentRailItemWidth.test.ts +77 -0
  97. package/src/patterns/content-rail/resolveContentRailItemWidth.ts +39 -0
  98. package/src/patterns/content-rail/resolveContentRailPhysicalOffset.test.ts +29 -0
  99. package/src/patterns/content-rail/resolveContentRailPhysicalOffset.ts +12 -0
  100. package/src/patterns/content-rail/resolveContentRailState.test.ts +68 -0
  101. package/src/patterns/content-rail/resolveContentRailState.ts +36 -0
  102. package/src/patterns/content-rail/types.ts +35 -0
  103. package/src/patterns/content-rail/useContentRailReducedMotion.ts +28 -0
  104. package/src/registry.ts +4 -1
  105. package/src/showcaseCoverage.test.ts +1 -0
@@ -125,11 +125,11 @@ export declare const readerSurfaceMeta: {
125
125
  };
126
126
  readonly headerActions: {
127
127
  readonly label: "Header actions";
128
- readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ReaderSurface"];
128
+ readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail"];
129
129
  };
130
130
  readonly footerActions: {
131
131
  readonly label: "Footer actions";
132
- readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ReaderSurface"];
132
+ readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail"];
133
133
  };
134
134
  };
135
135
  readonly props: {
@@ -105,7 +105,7 @@ export declare const barcodeScannerViewMeta: {
105
105
  readonly category: "pattern";
106
106
  readonly description: "Composed scanner shell with permission, camera slot, scan overlay, and manual entry affordance.";
107
107
  readonly directManifestNode: true;
108
- readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ReaderSurface"];
108
+ readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail"];
109
109
  readonly requirements: {
110
110
  readonly permissions: readonly [{
111
111
  readonly permission: "camera";
@@ -145,7 +145,7 @@ export declare const barcodeScannerViewMeta: {
145
145
  };
146
146
  readonly children: {
147
147
  readonly label: "Scanner footer";
148
- readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ReaderSurface"];
148
+ readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "ThemeModeToggle", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail"];
149
149
  };
150
150
  };
151
151
  readonly props: {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqG/B,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;AA2IhF,eAAO,MAAM,uBAAuB,EAAE,qBAAgD,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsG/B,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;AA6IhF,eAAO,MAAM,uBAAuB,EAAE,qBAAgD,CAAC"}
package/dist/registry.js CHANGED
@@ -27,7 +27,7 @@ import { Modal } from './components/modal';
27
27
  import { NavigationItem } from './components/navigation-item';
28
28
  import { NavigationList } from './components/navigation-list';
29
29
  import { Pagination } from './components/pagination';
30
- import { Progress } from './components/progress';
30
+ import { Progress, ProgressRing } from './components/progress';
31
31
  import { Radio, RadioGroup } from './components/radio';
32
32
  import { Rating } from './components/rating';
33
33
  import { SearchBar } from './components/search-bar';
@@ -51,6 +51,7 @@ import { ForgotPasswordForm, OAuthProviderButton, OAuthProviderList, OtpForm, Si
51
51
  import { ChatListItem } from './patterns/chat-list-item';
52
52
  import { CollectionEditor } from './patterns/collection-editor';
53
53
  import { ConfirmDialog } from './patterns/confirm-dialog';
54
+ import { ContentRail } from './patterns/content-rail';
54
55
  import { DisclosureSection } from './patterns/disclosure-section';
55
56
  import { EmptyState } from './patterns/empty-state';
56
57
  import { FilterBar } from './patterns/filter-bar';
@@ -115,6 +116,7 @@ const _ZORA_COMPONENT_REGISTRY = {
115
116
  NavigationList,
116
117
  Pagination,
117
118
  Progress,
119
+ ProgressRing,
118
120
  Radio,
119
121
  RadioGroup,
120
122
  Rating,
@@ -158,6 +160,7 @@ const _ZORA_COMPONENT_REGISTRY = {
158
160
  ChatListItem,
159
161
  CollectionEditor,
160
162
  ConfirmDialog,
163
+ ContentRail,
161
164
  DisclosureSection,
162
165
  EmptyState,
163
166
  FilterBar,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InteractionPolicyProps } from '@ankhorage/surface';\nimport type React from 'react';\n\nimport { ActionSheet, ActionSheetItem } from './components/action-sheet';\nimport { AppBar } from './components/app-bar';\nimport { Avatar } from './components/avatar';\nimport { AvatarGroup } from './components/avatar-group';\nimport { Badge } from './components/badge';\nimport { Breadcrumbs } from './components/breadcrumbs';\nimport { Button } from './components/button';\nimport { ButtonGroup } from './components/button-group';\nimport { Card } from './components/card';\nimport { Checkbox, CheckboxGroup } from './components/checkbox';\nimport { Chip } from './components/chip';\nimport { ChipGroup } from './components/chip-group';\nimport { DataTable } from './components/data-table';\nimport { DatePicker } from './components/date-picker';\nimport { Drawer } from './components/drawer';\nimport { Form, FormActions, FormError, FormField } from './components/form';\nimport { Gradient } from './components/gradient';\nimport { Heading } from './components/heading';\nimport { Icon } from './components/icon';\nimport { IconButton } from './components/icon-button';\nimport { Image } from './components/image';\nimport { Input } from './components/input';\nimport { MediaCard } from './components/media-card';\nimport { DropdownMenu, Menu } from './components/menu';\nimport { MetricCard } from './components/metric-card';\nimport { Modal } from './components/modal';\nimport { NavigationItem } from './components/navigation-item';\nimport { NavigationList } from './components/navigation-list';\nimport { Pagination } from './components/pagination';\nimport { Progress } from './components/progress';\nimport { Radio, RadioGroup } from './components/radio';\nimport { Rating } from './components/rating';\nimport { SearchBar } from './components/search-bar';\nimport { Select } from './components/select';\nimport { Skeleton, SkeletonCard, SkeletonList, SkeletonText } from './components/skeleton';\nimport { SplashScreen } from './components/splash-screen';\nimport { Tabs } from './components/tabs';\nimport { Text } from './components/text';\nimport { Textarea } from './components/textarea';\nimport { TimePicker } from './components/time-picker';\nimport { Toast } from './components/toast';\nimport { Toolbar, ToolbarAction } from './components/toolbar';\nimport {\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n} from './foundation';\nimport { AppShell } from './layout/app-shell';\nimport { Screen } from './layout/screen';\nimport { ScreenSection } from './layout/screen-section';\nimport { SettingsLayout } from './layout/settings-layout';\nimport { SidebarLayout } from './layout/sidebar-layout';\nimport { TopbarLayout } from './layout/topbar-layout';\nimport {\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n} from './patterns/auth';\nimport { ChatListItem } from './patterns/chat-list-item';\nimport { CollectionEditor } from './patterns/collection-editor';\nimport { ConfirmDialog } from './patterns/confirm-dialog';\nimport { DisclosureSection } from './patterns/disclosure-section';\nimport { EmptyState } from './patterns/empty-state';\nimport { FilterBar } from './patterns/filter-bar';\nimport { Hero } from './patterns/hero';\nimport { ImagePreview } from './patterns/image-preview';\nimport { ImageUploadField } from './patterns/image-upload-field';\nimport { InspectorField } from './patterns/inspector-field';\nimport { List, ListRow, ListSection } from './patterns/list';\nimport { MessageBubble } from './patterns/message-bubble';\nimport { Notice } from './patterns/notice';\nimport { Panel } from './patterns/panel';\nimport { PostCard } from './patterns/post-card';\nimport { ProductCard } from './patterns/product-card';\nimport { ReaderSurface } from './patterns/reader';\nimport { ResponsivePanel } from './patterns/responsive-panel';\nimport { BarcodeScannerView, CameraPermissionView, ScanOverlay } from './patterns/scanner';\nimport { SectionHeader } from './patterns/section-header';\nimport { SelectableItem } from './patterns/selection';\nimport { SettingsRow } from './patterns/settings-row';\nimport { SwitchField } from './patterns/switch-field';\nimport { ThemeComposer } from './patterns/theme-composer';\nimport { PaletteItem, TileGrid } from './patterns/tile-grid';\nimport { Timeline } from './patterns/timeline';\nimport { TreeItem, TreeView } from './patterns/tree-view';\nimport { ZoraDrawerContent } from './patterns/zora-drawer-content';\nimport { ZoraTabBar } from './patterns/zora-tab-bar';\nimport { ThemeModeToggle } from './theme/ThemeModeToggle';\n\nexport type ZoraComponentRegistry = Readonly<Record<string, React.ElementType>>;\n\ntype ComponentPropsFor<K extends keyof typeof _ZORA_COMPONENT_REGISTRY> = React.ComponentProps<\n (typeof _ZORA_COMPONENT_REGISTRY)[K]\n>;\n\ntype AcceptsSurfaceInteractionPolicyProps<P> = 'interactionPolicy' extends keyof P\n ? InteractionPolicyProps extends Pick<P, 'interactionPolicy'>\n ? Pick<P, 'interactionPolicy'> extends InteractionPolicyProps\n ? true\n : false\n : false\n : false;\n\ntype RegistryInteractionPolicyContract = {\n [K in keyof typeof _ZORA_COMPONENT_REGISTRY]: AcceptsSurfaceInteractionPolicyProps<\n ComponentPropsFor<K>\n >;\n};\n\ntype _AssertTrue<T extends true> = T;\ntype _RegistryInteractionPolicyCheck = _AssertTrue<\n RegistryInteractionPolicyContract[keyof typeof _ZORA_COMPONENT_REGISTRY]\n>;\n\nconst _ZORA_COMPONENT_REGISTRY = {\n ActionSheet,\n ActionSheetItem,\n AppBar,\n Avatar,\n AvatarGroup,\n Badge,\n Breadcrumbs,\n Button,\n ButtonGroup,\n Card,\n Checkbox,\n CheckboxGroup,\n Chip,\n ChipGroup,\n DataTable,\n DatePicker,\n Drawer,\n DropdownMenu,\n Form,\n FormActions,\n FormError,\n FormField,\n Gradient,\n Heading,\n Icon,\n IconButton,\n Image,\n Input,\n MediaCard,\n Menu,\n MetricCard,\n Modal,\n NavigationItem,\n NavigationList,\n Pagination,\n Progress,\n Radio,\n RadioGroup,\n Rating,\n SearchBar,\n Select,\n Skeleton,\n SkeletonCard,\n SkeletonList,\n SkeletonText,\n SplashScreen,\n Tabs,\n Text,\n Textarea,\n TimePicker,\n Toast,\n Toolbar,\n ToolbarAction,\n ThemeModeToggle,\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n AppShell,\n Screen,\n ScreenSection,\n SettingsLayout,\n SidebarLayout,\n TopbarLayout,\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n ChatListItem,\n CollectionEditor,\n ConfirmDialog,\n DisclosureSection,\n EmptyState,\n FilterBar,\n Hero,\n ImagePreview,\n ImageUploadField,\n InspectorField,\n List,\n ListRow,\n ListSection,\n MessageBubble,\n Notice,\n Panel,\n PostCard,\n ProductCard,\n ResponsivePanel,\n ReaderSurface,\n BarcodeScannerView,\n CameraPermissionView,\n ScanOverlay,\n SectionHeader,\n SelectableItem,\n SettingsRow,\n SwitchField,\n ThemeComposer,\n PaletteItem,\n TileGrid,\n Timeline,\n TreeItem,\n TreeView,\n ZoraDrawerContent,\n ZoraTabBar,\n} as const satisfies ZoraComponentRegistry;\n\nexport const ZORA_COMPONENT_REGISTRY: ZoraComponentRegistry = _ZORA_COMPONENT_REGISTRY;\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InteractionPolicyProps } from '@ankhorage/surface';\nimport type React from 'react';\n\nimport { ActionSheet, ActionSheetItem } from './components/action-sheet';\nimport { AppBar } from './components/app-bar';\nimport { Avatar } from './components/avatar';\nimport { AvatarGroup } from './components/avatar-group';\nimport { Badge } from './components/badge';\nimport { Breadcrumbs } from './components/breadcrumbs';\nimport { Button } from './components/button';\nimport { ButtonGroup } from './components/button-group';\nimport { Card } from './components/card';\nimport { Checkbox, CheckboxGroup } from './components/checkbox';\nimport { Chip } from './components/chip';\nimport { ChipGroup } from './components/chip-group';\nimport { DataTable } from './components/data-table';\nimport { DatePicker } from './components/date-picker';\nimport { Drawer } from './components/drawer';\nimport { Form, FormActions, FormError, FormField } from './components/form';\nimport { Gradient } from './components/gradient';\nimport { Heading } from './components/heading';\nimport { Icon } from './components/icon';\nimport { IconButton } from './components/icon-button';\nimport { Image } from './components/image';\nimport { Input } from './components/input';\nimport { MediaCard } from './components/media-card';\nimport { DropdownMenu, Menu } from './components/menu';\nimport { MetricCard } from './components/metric-card';\nimport { Modal } from './components/modal';\nimport { NavigationItem } from './components/navigation-item';\nimport { NavigationList } from './components/navigation-list';\nimport { Pagination } from './components/pagination';\nimport { Progress, ProgressRing } from './components/progress';\nimport { Radio, RadioGroup } from './components/radio';\nimport { Rating } from './components/rating';\nimport { SearchBar } from './components/search-bar';\nimport { Select } from './components/select';\nimport { Skeleton, SkeletonCard, SkeletonList, SkeletonText } from './components/skeleton';\nimport { SplashScreen } from './components/splash-screen';\nimport { Tabs } from './components/tabs';\nimport { Text } from './components/text';\nimport { Textarea } from './components/textarea';\nimport { TimePicker } from './components/time-picker';\nimport { Toast } from './components/toast';\nimport { Toolbar, ToolbarAction } from './components/toolbar';\nimport {\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n} from './foundation';\nimport { AppShell } from './layout/app-shell';\nimport { Screen } from './layout/screen';\nimport { ScreenSection } from './layout/screen-section';\nimport { SettingsLayout } from './layout/settings-layout';\nimport { SidebarLayout } from './layout/sidebar-layout';\nimport { TopbarLayout } from './layout/topbar-layout';\nimport {\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n} from './patterns/auth';\nimport { ChatListItem } from './patterns/chat-list-item';\nimport { CollectionEditor } from './patterns/collection-editor';\nimport { ConfirmDialog } from './patterns/confirm-dialog';\nimport { ContentRail } from './patterns/content-rail';\nimport { DisclosureSection } from './patterns/disclosure-section';\nimport { EmptyState } from './patterns/empty-state';\nimport { FilterBar } from './patterns/filter-bar';\nimport { Hero } from './patterns/hero';\nimport { ImagePreview } from './patterns/image-preview';\nimport { ImageUploadField } from './patterns/image-upload-field';\nimport { InspectorField } from './patterns/inspector-field';\nimport { List, ListRow, ListSection } from './patterns/list';\nimport { MessageBubble } from './patterns/message-bubble';\nimport { Notice } from './patterns/notice';\nimport { Panel } from './patterns/panel';\nimport { PostCard } from './patterns/post-card';\nimport { ProductCard } from './patterns/product-card';\nimport { ReaderSurface } from './patterns/reader';\nimport { ResponsivePanel } from './patterns/responsive-panel';\nimport { BarcodeScannerView, CameraPermissionView, ScanOverlay } from './patterns/scanner';\nimport { SectionHeader } from './patterns/section-header';\nimport { SelectableItem } from './patterns/selection';\nimport { SettingsRow } from './patterns/settings-row';\nimport { SwitchField } from './patterns/switch-field';\nimport { ThemeComposer } from './patterns/theme-composer';\nimport { PaletteItem, TileGrid } from './patterns/tile-grid';\nimport { Timeline } from './patterns/timeline';\nimport { TreeItem, TreeView } from './patterns/tree-view';\nimport { ZoraDrawerContent } from './patterns/zora-drawer-content';\nimport { ZoraTabBar } from './patterns/zora-tab-bar';\nimport { ThemeModeToggle } from './theme/ThemeModeToggle';\n\nexport type ZoraComponentRegistry = Readonly<Record<string, React.ElementType>>;\n\ntype ComponentPropsFor<K extends keyof typeof _ZORA_COMPONENT_REGISTRY> = React.ComponentProps<\n (typeof _ZORA_COMPONENT_REGISTRY)[K]\n>;\n\ntype AcceptsSurfaceInteractionPolicyProps<P> = 'interactionPolicy' extends keyof P\n ? InteractionPolicyProps extends Pick<P, 'interactionPolicy'>\n ? Pick<P, 'interactionPolicy'> extends InteractionPolicyProps\n ? true\n : false\n : false\n : false;\n\ntype RegistryInteractionPolicyContract = {\n [K in keyof typeof _ZORA_COMPONENT_REGISTRY]: AcceptsSurfaceInteractionPolicyProps<\n ComponentPropsFor<K>\n >;\n};\n\ntype _AssertTrue<T extends true> = T;\ntype _RegistryInteractionPolicyCheck = _AssertTrue<\n RegistryInteractionPolicyContract[keyof typeof _ZORA_COMPONENT_REGISTRY]\n>;\n\nconst _ZORA_COMPONENT_REGISTRY = {\n ActionSheet,\n ActionSheetItem,\n AppBar,\n Avatar,\n AvatarGroup,\n Badge,\n Breadcrumbs,\n Button,\n ButtonGroup,\n Card,\n Checkbox,\n CheckboxGroup,\n Chip,\n ChipGroup,\n DataTable,\n DatePicker,\n Drawer,\n DropdownMenu,\n Form,\n FormActions,\n FormError,\n FormField,\n Gradient,\n Heading,\n Icon,\n IconButton,\n Image,\n Input,\n MediaCard,\n Menu,\n MetricCard,\n Modal,\n NavigationItem,\n NavigationList,\n Pagination,\n Progress,\n ProgressRing,\n Radio,\n RadioGroup,\n Rating,\n SearchBar,\n Select,\n Skeleton,\n SkeletonCard,\n SkeletonList,\n SkeletonText,\n SplashScreen,\n Tabs,\n Text,\n Textarea,\n TimePicker,\n Toast,\n Toolbar,\n ToolbarAction,\n ThemeModeToggle,\n Box,\n Center,\n Container,\n Divider,\n Grid,\n Inline,\n Show,\n Spacer,\n Stack,\n Surface,\n AppShell,\n Screen,\n ScreenSection,\n SettingsLayout,\n SidebarLayout,\n TopbarLayout,\n ForgotPasswordForm,\n OAuthProviderButton,\n OAuthProviderList,\n OtpForm,\n SignInForm,\n SignUpForm,\n ChatListItem,\n CollectionEditor,\n ConfirmDialog,\n ContentRail,\n DisclosureSection,\n EmptyState,\n FilterBar,\n Hero,\n ImagePreview,\n ImageUploadField,\n InspectorField,\n List,\n ListRow,\n ListSection,\n MessageBubble,\n Notice,\n Panel,\n PostCard,\n ProductCard,\n ResponsivePanel,\n ReaderSurface,\n BarcodeScannerView,\n CameraPermissionView,\n ScanOverlay,\n SectionHeader,\n SelectableItem,\n SettingsRow,\n SwitchField,\n ThemeComposer,\n PaletteItem,\n TileGrid,\n Timeline,\n TreeItem,\n TreeView,\n ZoraDrawerContent,\n ZoraTabBar,\n} as const satisfies ZoraComponentRegistry;\n\nexport const ZORA_COMPONENT_REGISTRY: ZoraComponentRegistry = _ZORA_COMPONENT_REGISTRY;\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ankhorage/zora",
3
3
  "type": "module",
4
- "version": "3.1.1",
4
+ "version": "3.3.1",
5
5
  "description": "Opinionated React Native and React Native Web UI kit built on @ankhorage/surface.",
6
6
  "homepage": "https://github.com/ankhorage/zora#readme",
7
7
  "bugs": {
@@ -38,7 +38,7 @@
38
38
  "dependencies": {
39
39
  "@ankhorage/color-theory": "^0.0.8",
40
40
  "@ankhorage/contracts": "^8.0.1",
41
- "@ankhorage/surface": "^3.1.0"
41
+ "@ankhorage/surface": "^3.1.1"
42
42
  },
43
43
  "files": [
44
44
  "dist",
@@ -0,0 +1,48 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+
3
+ import { progressRingMeta } from './meta';
4
+
5
+ describe('ProgressRing public contract', () => {
6
+ test('is exported from the component and package entrypoints', async () => {
7
+ const [componentIndex, rootIndex] = await Promise.all([
8
+ Bun.file('src/components/progress/index.ts').text(),
9
+ Bun.file('src/index.ts').text(),
10
+ ]);
11
+
12
+ expect(componentIndex).toContain("export { ProgressRing } from './ProgressRing';");
13
+ expect(componentIndex).toContain('ProgressRingProps');
14
+ expect(rootIndex).toContain("export { Progress, ProgressRing } from './components/progress';");
15
+ expect(rootIndex).toContain('ProgressProps, ProgressRingProps');
16
+ });
17
+
18
+ test('exposes native progress semantics and uses canonical normalization and colors', async () => {
19
+ const source = await Bun.file('src/components/progress/ProgressRing.tsx').text();
20
+
21
+ expect(source).toContain('accessibilityRole="progressbar"');
22
+ expect(source).toContain('accessibilityValue={{');
23
+ expect(source).toContain('resolveProgressFraction({ max, value })');
24
+ expect(source).toContain('resolveProgressRole(theme, color)');
25
+ expect(source).not.toMatch(/#[0-9A-Fa-f]{3,8}|rgba?\(|hsla?\(/);
26
+ });
27
+
28
+ test('declares a complete serializable manifest blueprint', () => {
29
+ expect(progressRingMeta.directManifestNode).toBe(true);
30
+ expect(progressRingMeta.allowedChildren).toEqual([]);
31
+ expect(progressRingMeta.blueprint.defaultProps).toEqual({
32
+ value: 68,
33
+ max: 100,
34
+ color: 'primary',
35
+ trackColor: 'neutral',
36
+ size: 120,
37
+ thickness: 10,
38
+ centerValue: '68%',
39
+ centerLabel: 'Complete',
40
+ accessibilityLabel: 'Progress',
41
+ accessibilityValueText: '68% complete',
42
+ });
43
+ expect(Object.keys(progressRingMeta.props).sort()).toEqual(
44
+ Object.keys(progressRingMeta.blueprint.defaultProps).sort(),
45
+ );
46
+ expect(JSON.parse(JSON.stringify(progressRingMeta))).toEqual(progressRingMeta);
47
+ });
48
+ });
@@ -0,0 +1,151 @@
1
+ import React from 'react';
2
+ import { StyleSheet, View } from 'react-native';
3
+
4
+ import { Stack } from '../../foundation';
5
+ import { useZoraTheme } from '../../theme/useZoraTheme';
6
+ import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
7
+ import { Text } from '../text';
8
+ import { resolveProgressFraction } from './resolveProgressFraction';
9
+ import { resolveProgressRingGeometry } from './resolveProgressRingGeometry';
10
+ import { type ProgressRingProps, resolveProgressRole } from './types';
11
+
12
+ function ProgressRingInner({
13
+ themeId: _themeId,
14
+ mode: _mode,
15
+ interactionPolicy: _interactionPolicy,
16
+ accessibilityLabel = 'Progress',
17
+ accessibilityValueText,
18
+ centerLabel,
19
+ centerValue,
20
+ color = 'primary',
21
+ max = 100,
22
+ size = 120,
23
+ testID,
24
+ thickness = 10,
25
+ trackColor = 'neutral',
26
+ value,
27
+ }: ProgressRingProps) {
28
+ const { theme } = useZoraTheme();
29
+ const fraction = resolveProgressFraction({ max, value });
30
+ const geometry = resolveProgressRingGeometry({ fraction, size, thickness });
31
+ const progressRole = resolveProgressRole(theme, color);
32
+ const trackRole = resolveProgressRole(theme, trackColor);
33
+ const accessibilityMaximum = Number.isFinite(max) && max > 0 ? max : 1;
34
+ const accessibilityValue = fraction * accessibilityMaximum;
35
+ const valueText = accessibilityValueText ?? `${Math.round(fraction * 100)}%`;
36
+ const segments = Array.from({ length: geometry.filledSegmentCount });
37
+
38
+ return (
39
+ <View
40
+ accessibilityLabel={accessibilityLabel}
41
+ accessibilityRole="progressbar"
42
+ accessibilityValue={{
43
+ max: accessibilityMaximum,
44
+ min: 0,
45
+ now: accessibilityValue,
46
+ text: valueText,
47
+ }}
48
+ accessible
49
+ style={{ height: geometry.diameter, width: geometry.diameter }}
50
+ testID={testID}
51
+ >
52
+ <View
53
+ importantForAccessibility="no-hide-descendants"
54
+ pointerEvents="none"
55
+ style={styles.visual}
56
+ >
57
+ <View
58
+ style={[
59
+ styles.track,
60
+ {
61
+ borderColor: trackRole.softBg,
62
+ borderRadius: geometry.diameter / 2,
63
+ borderWidth: geometry.strokeWidth,
64
+ },
65
+ ]}
66
+ />
67
+
68
+ {segments.map((_, index) => (
69
+ <View
70
+ key={index}
71
+ style={[
72
+ styles.segmentLayer,
73
+ { transform: [{ rotate: `${index * (360 / geometry.segmentCount)}deg` }] },
74
+ ]}
75
+ >
76
+ <View
77
+ style={{
78
+ backgroundColor: progressRole.base,
79
+ borderRadius: geometry.strokeWidth / 2,
80
+ height: geometry.strokeWidth,
81
+ left: (geometry.diameter - geometry.segmentWidth) / 2,
82
+ position: 'absolute',
83
+ top: 0,
84
+ width: geometry.segmentWidth,
85
+ }}
86
+ />
87
+ </View>
88
+ ))}
89
+ </View>
90
+
91
+ {centerValue !== undefined || centerLabel !== undefined ? (
92
+ <View
93
+ importantForAccessibility="no-hide-descendants"
94
+ pointerEvents="none"
95
+ style={styles.center}
96
+ >
97
+ <Stack align="center" gap="xxs" px="s">
98
+ {centerValue !== undefined ? (
99
+ <Text align="center" variant="lead" weight="bold">
100
+ {centerValue}
101
+ </Text>
102
+ ) : null}
103
+ {centerLabel !== undefined ? (
104
+ <Text align="center" emphasis="muted" numberOfLines={2} variant="caption">
105
+ {centerLabel}
106
+ </Text>
107
+ ) : null}
108
+ </Stack>
109
+ </View>
110
+ ) : null}
111
+ </View>
112
+ );
113
+ }
114
+
115
+ const styles = StyleSheet.create({
116
+ center: {
117
+ alignItems: 'center',
118
+ bottom: 0,
119
+ justifyContent: 'center',
120
+ left: 0,
121
+ position: 'absolute',
122
+ right: 0,
123
+ top: 0,
124
+ },
125
+ segmentLayer: {
126
+ bottom: 0,
127
+ left: 0,
128
+ position: 'absolute',
129
+ right: 0,
130
+ top: 0,
131
+ },
132
+ track: {
133
+ bottom: 0,
134
+ left: 0,
135
+ position: 'absolute',
136
+ right: 0,
137
+ top: 0,
138
+ },
139
+ visual: {
140
+ bottom: 0,
141
+ left: 0,
142
+ position: 'absolute',
143
+ right: 0,
144
+ top: 0,
145
+ },
146
+ });
147
+
148
+ /***
149
+ * Circular determinate progress with optional serializable center value and label content.
150
+ */
151
+ export const ProgressRing = withZoraThemeScope(ProgressRingInner);
@@ -1,2 +1,3 @@
1
1
  export { Progress } from './Progress';
2
- export type { ProgressProps } from './types';
2
+ export { ProgressRing } from './ProgressRing';
3
+ export type { ProgressProps, ProgressRingProps } from './types';
@@ -44,3 +44,102 @@ export const progressMeta = {
44
44
  },
45
45
  },
46
46
  } as const satisfies ZoraComponentMeta;
47
+
48
+ const instanceAuthoring = { authority: 'instance' } as const;
49
+
50
+ export const progressRingMeta = {
51
+ name: 'ProgressRing',
52
+ category: 'component',
53
+ description: 'Displays circular determinate progress with optional center value and label text.',
54
+ directManifestNode: true,
55
+ allowedChildren: [],
56
+ blueprint: {
57
+ label: 'Progress ring',
58
+ defaultProps: {
59
+ value: 68,
60
+ max: 100,
61
+ color: 'primary',
62
+ trackColor: 'neutral',
63
+ size: 120,
64
+ thickness: 10,
65
+ centerValue: '68%',
66
+ centerLabel: 'Complete',
67
+ accessibilityLabel: 'Progress',
68
+ accessibilityValueText: '68% complete',
69
+ },
70
+ },
71
+ props: {
72
+ value: {
73
+ type: 'number',
74
+ category: 'State',
75
+ label: 'Value',
76
+ default: 68,
77
+ authoring: instanceAuthoring,
78
+ },
79
+ max: {
80
+ type: 'number',
81
+ category: 'State',
82
+ label: 'Maximum',
83
+ default: 100,
84
+ authoring: instanceAuthoring,
85
+ },
86
+ centerValue: {
87
+ type: 'string',
88
+ category: 'Content',
89
+ label: 'Center value',
90
+ default: '68%',
91
+ authoring: instanceAuthoring,
92
+ },
93
+ centerLabel: {
94
+ type: 'string',
95
+ category: 'Content',
96
+ label: 'Center label',
97
+ default: 'Complete',
98
+ authoring: instanceAuthoring,
99
+ },
100
+ accessibilityLabel: {
101
+ type: 'string',
102
+ category: 'Accessibility',
103
+ label: 'Accessibility label',
104
+ default: 'Progress',
105
+ authoring: instanceAuthoring,
106
+ },
107
+ accessibilityValueText: {
108
+ type: 'string',
109
+ category: 'Accessibility',
110
+ label: 'Accessibility value text',
111
+ default: '68% complete',
112
+ authoring: instanceAuthoring,
113
+ },
114
+ color: {
115
+ type: 'enum',
116
+ category: 'Style',
117
+ label: 'Progress color',
118
+ enum: [...ZORA_COLORS],
119
+ default: 'primary',
120
+ authoring: instanceAuthoring,
121
+ },
122
+ trackColor: {
123
+ type: 'enum',
124
+ category: 'Style',
125
+ label: 'Track color',
126
+ enum: [...ZORA_COLORS],
127
+ default: 'neutral',
128
+ authoring: instanceAuthoring,
129
+ },
130
+ size: {
131
+ type: 'number',
132
+ category: 'Layout',
133
+ label: 'Diameter',
134
+ default: 120,
135
+ authoring: instanceAuthoring,
136
+ },
137
+ thickness: {
138
+ type: 'number',
139
+ category: 'Style',
140
+ label: 'Thickness',
141
+ default: 10,
142
+ authoring: instanceAuthoring,
143
+ },
144
+ },
145
+ } as const satisfies ZoraComponentMeta;
@@ -0,0 +1,30 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+
3
+ import { resolveProgressRingGeometry } from './resolveProgressRingGeometry';
4
+
5
+ describe('resolveProgressRingGeometry', () => {
6
+ test('normalizes invalid dimensions and fractions deterministically', () => {
7
+ expect(
8
+ resolveProgressRingGeometry({ fraction: Number.NaN, size: Number.NaN, thickness: -1 }),
9
+ ).toMatchObject({
10
+ diameter: 120,
11
+ filledSegmentCount: 0,
12
+ strokeWidth: 10,
13
+ });
14
+ });
15
+
16
+ test('clamps size, thickness, and progress to renderable bounds', () => {
17
+ const empty = resolveProgressRingGeometry({ fraction: -1, size: 4, thickness: 30 });
18
+ const complete = resolveProgressRingGeometry({ fraction: 2, size: 80, thickness: 8 });
19
+
20
+ expect(empty).toMatchObject({ diameter: 24, filledSegmentCount: 0, strokeWidth: 12 });
21
+ expect(complete.filledSegmentCount).toBe(complete.segmentCount);
22
+ });
23
+
24
+ test('maps determinate progress to the ring segments', () => {
25
+ const geometry = resolveProgressRingGeometry({ fraction: 0.68, size: 120, thickness: 10 });
26
+
27
+ expect(geometry.filledSegmentCount).toBe(Math.round(geometry.segmentCount * 0.68));
28
+ expect(geometry.segmentWidth).toBeGreaterThan(0);
29
+ });
30
+ });
@@ -0,0 +1,44 @@
1
+ export function resolveProgressRingGeometry({
2
+ fraction,
3
+ size,
4
+ thickness,
5
+ }: {
6
+ fraction: number;
7
+ size: number;
8
+ thickness: number;
9
+ }) {
10
+ const diameter = normalizePositiveNumber(size, DEFAULT_SIZE, MINIMUM_SIZE);
11
+ const strokeWidth = Math.min(
12
+ normalizePositiveNumber(thickness, DEFAULT_THICKNESS, MINIMUM_THICKNESS),
13
+ diameter / 2,
14
+ );
15
+ const centerlineRadius = (diameter - strokeWidth) / 2;
16
+ const segmentCount = Math.max(
17
+ MINIMUM_SEGMENT_COUNT,
18
+ Math.min(MAXIMUM_SEGMENT_COUNT, Math.round(Math.PI * centerlineRadius)),
19
+ );
20
+ const normalizedFraction = Math.min(Math.max(Number.isFinite(fraction) ? fraction : 0, 0), 1);
21
+
22
+ return {
23
+ diameter,
24
+ filledSegmentCount: Math.round(normalizedFraction * segmentCount),
25
+ segmentCount,
26
+ segmentWidth: Math.max(1, (2 * Math.PI * centerlineRadius) / segmentCount + 0.5),
27
+ strokeWidth,
28
+ };
29
+ }
30
+
31
+ const DEFAULT_SIZE = 120;
32
+ const DEFAULT_THICKNESS = 10;
33
+ const MAXIMUM_SEGMENT_COUNT = 120;
34
+ const MINIMUM_SEGMENT_COUNT = 32;
35
+ const MINIMUM_SIZE = 24;
36
+ const MINIMUM_THICKNESS = 1;
37
+
38
+ function normalizePositiveNumber(value: number, fallback: number, minimum: number): number {
39
+ if (!Number.isFinite(value) || value <= 0) {
40
+ return fallback;
41
+ }
42
+
43
+ return Math.max(value, minimum);
44
+ }
@@ -10,6 +10,19 @@ export interface ProgressProps extends ZoraBaseProps {
10
10
  size?: ZoraControlSize;
11
11
  }
12
12
 
13
+ export interface ProgressRingProps extends ZoraBaseProps {
14
+ value: number;
15
+ max?: number;
16
+ color?: ZoraColor;
17
+ trackColor?: ZoraColor;
18
+ size?: number;
19
+ thickness?: number;
20
+ centerValue?: string;
21
+ centerLabel?: string;
22
+ accessibilityLabel?: string;
23
+ accessibilityValueText?: string;
24
+ }
25
+
13
26
  export function resolveProgressRole(theme: SurfaceTheme, color: ZoraColor): RoleSemantics {
14
27
  switch (color) {
15
28
  case 'secondary':
package/src/index.ts CHANGED
@@ -115,8 +115,8 @@ export type { NavigationListProps, ZoraNavigationRouteMap } from './components/n
115
115
  export { NavigationList } from './components/navigation-list';
116
116
  export type { PaginationProps } from './components/pagination';
117
117
  export { Pagination } from './components/pagination';
118
- export type { ProgressProps } from './components/progress';
119
- export { Progress } from './components/progress';
118
+ export type { ProgressProps, ProgressRingProps } from './components/progress';
119
+ export { Progress, ProgressRing } from './components/progress';
120
120
  export type { RadioGroupOption, RadioGroupProps, RadioProps } from './components/radio';
121
121
  export { Radio, RadioGroup } from './components/radio';
122
122
  export type { RatingProps } from './components/rating';
@@ -275,6 +275,16 @@ export type {
275
275
  export { CollectionEditor } from './patterns/collection-editor';
276
276
  export type { ConfirmDialogProps } from './patterns/confirm-dialog';
277
277
  export { ConfirmDialog } from './patterns/confirm-dialog';
278
+ export type {
279
+ ContentRailControlPressEvent,
280
+ ContentRailDirection,
281
+ ContentRailItemSize,
282
+ ContentRailMotion,
283
+ ContentRailProps,
284
+ ContentRailSpacing,
285
+ ContentRailVisibleRangeChangeEvent,
286
+ } from './patterns/content-rail';
287
+ export { ContentRail } from './patterns/content-rail';
278
288
  export type { DisclosureSectionProps } from './patterns/disclosure-section';
279
289
  export { DisclosureSection } from './patterns/disclosure-section';
280
290
  export type { EmptyStateAction, EmptyStateProps } from './patterns/empty-state';
@@ -186,6 +186,28 @@ describe('ReaderSurface', () => {
186
186
  });
187
187
  });
188
188
 
189
+ describe('ContentRail', () => {
190
+ test('types extend ZoraBaseProps instead of duplicating InteractionPolicy', () => {
191
+ const source = readPattern('content-rail', 'types.ts');
192
+
193
+ expect(source).toMatch(/export interface ContentRailProps extends ZoraBaseProps/);
194
+ expect(source).not.toMatch(/interactionPolicy\?: InteractionPolicy;/);
195
+ });
196
+
197
+ test('suppresses scrolling and forwards interactionPolicy to owned controls', () => {
198
+ const source = readPattern('content-rail', 'ContentRail.tsx');
199
+
200
+ expect(source).not.toMatch(/interactionPolicy:\s*_interactionPolicy/);
201
+ expect(source).toContain('scrollEnabled={!passive}');
202
+ expect(source).toMatch(
203
+ /<IconButton[\s\S]*?interactionPolicy=\{interactionPolicy\}[\s\S]*?label=\{previousLabel\}/,
204
+ );
205
+ expect(source).toMatch(
206
+ /<IconButton[\s\S]*?interactionPolicy=\{interactionPolicy\}[\s\S]*?label=\{nextLabel\}/,
207
+ );
208
+ });
209
+ });
210
+
189
211
  describe('CameraPermissionView', () => {
190
212
  test('forwards interactionPolicy to internal Buttons after prop spreads', () => {
191
213
  const source = readPattern('scanner', 'CameraPermissionView.tsx');
@@ -21,7 +21,21 @@ export const CONTAINER_ALLOWED_CHILDREN = [
21
21
  'PostCard',
22
22
  'ChatListItem',
23
23
  'MessageBubble',
24
+ 'ProgressRing',
24
25
  'ReaderSurface',
26
+ 'ContentRail',
27
+ ] as const;
28
+
29
+ export const CONTENT_RAIL_ALLOWED_CHILDREN = [
30
+ 'Box',
31
+ 'Stack',
32
+ 'Card',
33
+ 'Panel',
34
+ 'Image',
35
+ 'ProductCard',
36
+ 'PostCard',
37
+ 'ChatListItem',
38
+ 'MessageBubble',
25
39
  ] as const;
26
40
 
27
41
  export const SCREEN_SECTION_ALLOWED_CHILDREN = [...CONTAINER_ALLOWED_CHILDREN] as const;