@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.
- package/CHANGELOG.md +18 -0
- package/README.md +1 -1
- package/dist/components/card/meta.d.ts +1 -1
- package/dist/components/progress/ProgressRing.d.ts +7 -0
- package/dist/components/progress/ProgressRing.d.ts.map +1 -0
- package/dist/components/progress/ProgressRing.js +100 -0
- package/dist/components/progress/ProgressRing.js.map +1 -0
- package/dist/components/progress/index.d.ts +2 -1
- package/dist/components/progress/index.d.ts.map +1 -1
- package/dist/components/progress/index.js +1 -0
- package/dist/components/progress/index.js.map +1 -1
- package/dist/components/progress/meta.d.ts +116 -0
- package/dist/components/progress/meta.d.ts.map +1 -1
- package/dist/components/progress/meta.js +97 -0
- package/dist/components/progress/meta.js.map +1 -1
- package/dist/components/progress/resolveProgressRingGeometry.d.ts +12 -0
- package/dist/components/progress/resolveProgressRingGeometry.d.ts.map +1 -0
- package/dist/components/progress/resolveProgressRingGeometry.js +27 -0
- package/dist/components/progress/resolveProgressRingGeometry.js.map +1 -0
- package/dist/components/progress/types.d.ts +12 -0
- package/dist/components/progress/types.d.ts.map +1 -1
- package/dist/components/progress/types.js.map +1 -1
- package/dist/foundation/meta.d.ts +4 -4
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/screen/meta.d.ts +1 -1
- package/dist/layout/screen-section/meta.d.ts +1 -1
- package/dist/metadata/allowedChildren.d.ts +4 -3
- package/dist/metadata/allowedChildren.d.ts.map +1 -1
- package/dist/metadata/allowedChildren.js +13 -0
- package/dist/metadata/allowedChildren.js.map +1 -1
- package/dist/metadata/bindableComponentMeta.d.ts +2 -2
- package/dist/metadata/componentMeta.d.ts.map +1 -1
- package/dist/metadata/componentMeta.js +4 -1
- package/dist/metadata/componentMeta.js.map +1 -1
- package/dist/patterns/content-rail/ContentRail.d.ts +10 -0
- package/dist/patterns/content-rail/ContentRail.d.ts.map +1 -0
- package/dist/patterns/content-rail/ContentRail.js +175 -0
- package/dist/patterns/content-rail/ContentRail.js.map +1 -0
- package/dist/patterns/content-rail/index.d.ts +3 -0
- package/dist/patterns/content-rail/index.d.ts.map +1 -0
- package/dist/patterns/content-rail/index.js +2 -0
- package/dist/patterns/content-rail/index.js.map +1 -0
- package/dist/patterns/content-rail/meta.d.ts +143 -0
- package/dist/patterns/content-rail/meta.d.ts.map +1 -0
- package/dist/patterns/content-rail/meta.js +130 -0
- package/dist/patterns/content-rail/meta.js.map +1 -0
- package/dist/patterns/content-rail/resolveContentRailItemWidth.d.ts +10 -0
- package/dist/patterns/content-rail/resolveContentRailItemWidth.d.ts.map +1 -0
- package/dist/patterns/content-rail/resolveContentRailItemWidth.js +25 -0
- package/dist/patterns/content-rail/resolveContentRailItemWidth.js.map +1 -0
- package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.d.ts +6 -0
- package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.d.ts.map +1 -0
- package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.js +5 -0
- package/dist/patterns/content-rail/resolveContentRailPhysicalOffset.js.map +1 -0
- package/dist/patterns/content-rail/resolveContentRailState.d.ts +18 -0
- package/dist/patterns/content-rail/resolveContentRailState.d.ts.map +1 -0
- package/dist/patterns/content-rail/resolveContentRailState.js +21 -0
- package/dist/patterns/content-rail/resolveContentRailState.js.map +1 -0
- package/dist/patterns/content-rail/types.d.ts +31 -0
- package/dist/patterns/content-rail/types.d.ts.map +1 -0
- package/dist/patterns/content-rail/types.js +2 -0
- package/dist/patterns/content-rail/types.js.map +1 -0
- package/dist/patterns/content-rail/useContentRailReducedMotion.d.ts +3 -0
- package/dist/patterns/content-rail/useContentRailReducedMotion.d.ts.map +1 -0
- package/dist/patterns/content-rail/useContentRailReducedMotion.js +21 -0
- package/dist/patterns/content-rail/useContentRailReducedMotion.js.map +1 -0
- package/dist/patterns/message-bubble/meta.d.ts +1 -1
- package/dist/patterns/notice/meta.d.ts +1 -1
- package/dist/patterns/panel/meta.d.ts +1 -1
- package/dist/patterns/post-card/meta.d.ts +1 -1
- package/dist/patterns/reader/meta.d.ts +2 -2
- package/dist/patterns/scanner/meta.d.ts +2 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -1
- package/dist/registry.js.map +1 -1
- package/package.json +2 -2
- package/src/components/progress/ProgressRing.test.ts +48 -0
- package/src/components/progress/ProgressRing.tsx +151 -0
- package/src/components/progress/index.ts +2 -1
- package/src/components/progress/meta.ts +99 -0
- package/src/components/progress/resolveProgressRingGeometry.test.ts +30 -0
- package/src/components/progress/resolveProgressRingGeometry.ts +44 -0
- package/src/components/progress/types.ts +13 -0
- package/src/index.ts +12 -2
- package/src/interactionPolicy.test.ts +22 -0
- package/src/metadata/allowedChildren.ts +14 -0
- package/src/metadata/componentMeta.test.ts +51 -0
- package/src/metadata/componentMeta.ts +4 -1
- package/src/patterns/content-rail/ContentRail.test.ts +44 -0
- package/src/patterns/content-rail/ContentRail.tsx +245 -0
- package/src/patterns/content-rail/index.ts +10 -0
- package/src/patterns/content-rail/meta.ts +133 -0
- package/src/patterns/content-rail/resolveContentRailItemWidth.test.ts +77 -0
- package/src/patterns/content-rail/resolveContentRailItemWidth.ts +39 -0
- package/src/patterns/content-rail/resolveContentRailPhysicalOffset.test.ts +29 -0
- package/src/patterns/content-rail/resolveContentRailPhysicalOffset.ts +12 -0
- package/src/patterns/content-rail/resolveContentRailState.test.ts +68 -0
- package/src/patterns/content-rail/resolveContentRailState.ts +36 -0
- package/src/patterns/content-rail/types.ts +35 -0
- package/src/patterns/content-rail/useContentRailReducedMotion.ts +28 -0
- package/src/registry.ts +4 -1
- 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: {
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,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,
|
package/dist/registry.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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);
|
|
@@ -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;
|