@ankhorage/zora 12.1.0 → 14.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.
- package/CHANGELOG.md +16 -0
- package/README.md +11 -5
- package/dist/features/accordion/accordionItemMeta.d.ts +53 -0
- package/dist/features/accordion/accordionItemMeta.d.ts.map +1 -0
- package/dist/features/accordion/accordionItemMeta.js +45 -0
- package/dist/features/accordion/accordionItemMeta.js.map +1 -0
- package/dist/features/accordion/accordionMeta.d.ts +36 -0
- package/dist/features/accordion/accordionMeta.d.ts.map +1 -0
- package/dist/features/accordion/accordionMeta.js +33 -0
- package/dist/features/accordion/accordionMeta.js.map +1 -0
- package/dist/features/accordion/adapters/inbound/Accordion.d.ts +5 -0
- package/dist/features/accordion/adapters/inbound/Accordion.d.ts.map +1 -0
- package/dist/features/accordion/adapters/inbound/Accordion.js +41 -0
- package/dist/features/accordion/adapters/inbound/Accordion.js.map +1 -0
- package/dist/features/accordion/adapters/inbound/AccordionItem.d.ts +5 -0
- package/dist/features/accordion/adapters/inbound/AccordionItem.d.ts.map +1 -0
- package/dist/features/accordion/adapters/inbound/AccordionItem.js +52 -0
- package/dist/features/accordion/adapters/inbound/AccordionItem.js.map +1 -0
- package/dist/features/accordion/composition/AccordionPresentationContext.d.ts +4 -0
- package/dist/features/accordion/composition/AccordionPresentationContext.d.ts.map +1 -0
- package/dist/features/accordion/composition/AccordionPresentationContext.js +3 -0
- package/dist/features/accordion/composition/AccordionPresentationContext.js.map +1 -0
- package/dist/features/accordion/public.d.ts +4 -0
- package/dist/features/accordion/public.d.ts.map +1 -0
- package/dist/features/accordion/public.js +3 -0
- package/dist/features/accordion/public.js.map +1 -0
- package/dist/features/bottom-sheet/bottomSheetMeta.d.ts +1 -1
- package/dist/features/card/cardMeta.d.ts +1 -1
- package/dist/features/card/mediaCardMeta.d.ts +1 -1
- package/dist/features/card/postCardMeta.d.ts +1 -1
- package/dist/features/date-picker/adapters/inbound/DatePicker.d.ts +1 -6
- package/dist/features/date-picker/adapters/inbound/DatePicker.d.ts.map +1 -1
- package/dist/features/date-picker/adapters/inbound/DatePicker.js +1 -175
- package/dist/features/date-picker/adapters/inbound/DatePicker.js.map +1 -1
- package/dist/features/date-picker/adapters/inbound/DatePicker.native.d.ts +5 -0
- package/dist/features/date-picker/adapters/inbound/DatePicker.native.d.ts.map +1 -0
- package/dist/features/date-picker/adapters/inbound/DatePicker.native.js +27 -0
- package/dist/features/date-picker/adapters/inbound/DatePicker.native.js.map +1 -0
- package/dist/features/date-picker/adapters/inbound/DatePicker.web.d.ts +5 -0
- package/dist/features/date-picker/adapters/inbound/DatePicker.web.d.ts.map +1 -0
- package/dist/features/date-picker/adapters/inbound/DatePicker.web.js +25 -0
- package/dist/features/date-picker/adapters/inbound/DatePicker.web.js.map +1 -0
- package/dist/features/date-picker/composition/DatePickerContent.d.ts +10 -0
- package/dist/features/date-picker/composition/DatePickerContent.d.ts.map +1 -0
- package/dist/features/date-picker/composition/DatePickerContent.js +129 -0
- package/dist/features/date-picker/composition/DatePickerContent.js.map +1 -0
- package/dist/features/date-picker/composition/DatePickerField.d.ts +9 -0
- package/dist/features/date-picker/composition/DatePickerField.d.ts.map +1 -0
- package/dist/features/date-picker/composition/DatePickerField.js +21 -0
- package/dist/features/date-picker/composition/DatePickerField.js.map +1 -0
- package/dist/features/date-picker/composition/DatePickerTrigger.d.ts +9 -0
- package/dist/features/date-picker/composition/DatePickerTrigger.d.ts.map +1 -0
- package/dist/features/date-picker/composition/DatePickerTrigger.js +18 -0
- package/dist/features/date-picker/composition/DatePickerTrigger.js.map +1 -0
- package/dist/features/gradient/gradientMeta.d.ts +1 -1
- package/dist/features/keyboard-avoiding-view/keyboardAvoidingViewMeta.d.ts +1 -1
- package/dist/features/layout/boxMeta.d.ts +1 -1
- package/dist/features/layout/containerMeta.d.ts +1 -1
- package/dist/features/layout/gridMeta.d.ts +1 -1
- package/dist/features/layout/stackMeta.d.ts +1 -1
- package/dist/features/list/flatListMeta.d.ts +1 -1
- package/dist/features/list/sectionListMeta.d.ts +1 -1
- package/dist/features/surface/surfaceMeta.d.ts +1 -1
- package/dist/features/time-picker/adapters/inbound/TimePicker.d.ts +1 -6
- package/dist/features/time-picker/adapters/inbound/TimePicker.d.ts.map +1 -1
- package/dist/features/time-picker/adapters/inbound/TimePicker.js +1 -116
- package/dist/features/time-picker/adapters/inbound/TimePicker.js.map +1 -1
- package/dist/features/time-picker/adapters/inbound/TimePicker.native.d.ts +5 -0
- package/dist/features/time-picker/adapters/inbound/TimePicker.native.d.ts.map +1 -0
- package/dist/features/time-picker/adapters/inbound/TimePicker.native.js +26 -0
- package/dist/features/time-picker/adapters/inbound/TimePicker.native.js.map +1 -0
- package/dist/features/time-picker/adapters/inbound/TimePicker.web.d.ts +5 -0
- package/dist/features/time-picker/adapters/inbound/TimePicker.web.d.ts.map +1 -0
- package/dist/features/time-picker/adapters/inbound/TimePicker.web.js +24 -0
- package/dist/features/time-picker/adapters/inbound/TimePicker.web.js.map +1 -0
- package/dist/features/time-picker/composition/TimePickerContent.d.ts +10 -0
- package/dist/features/time-picker/composition/TimePickerContent.d.ts.map +1 -0
- package/dist/features/time-picker/composition/TimePickerContent.js +78 -0
- package/dist/features/time-picker/composition/TimePickerContent.js.map +1 -0
- package/dist/features/time-picker/composition/TimePickerField.d.ts +9 -0
- package/dist/features/time-picker/composition/TimePickerField.d.ts.map +1 -0
- package/dist/features/time-picker/composition/TimePickerField.js +21 -0
- package/dist/features/time-picker/composition/TimePickerField.js.map +1 -0
- package/dist/features/time-picker/composition/TimePickerTrigger.d.ts +8 -0
- package/dist/features/time-picker/composition/TimePickerTrigger.d.ts.map +1 -0
- package/dist/features/time-picker/composition/TimePickerTrigger.js +9 -0
- package/dist/features/time-picker/composition/TimePickerTrigger.js.map +1 -0
- package/dist/features/toast/adapters/inbound/Toast.d.ts +5 -0
- package/dist/features/toast/adapters/inbound/Toast.d.ts.map +1 -0
- package/dist/features/toast/adapters/inbound/Toast.js +10 -0
- package/dist/features/toast/adapters/inbound/Toast.js.map +1 -0
- package/dist/features/toast/adapters/inbound/ToastProvider.d.ts +5 -0
- package/dist/features/toast/adapters/inbound/ToastProvider.d.ts.map +1 -0
- package/dist/features/toast/adapters/inbound/ToastProvider.js +7 -0
- package/dist/features/toast/adapters/inbound/ToastProvider.js.map +1 -0
- package/dist/features/toast/public.d.ts +5 -0
- package/dist/features/toast/public.d.ts.map +1 -0
- package/dist/features/toast/public.js +4 -0
- package/dist/features/toast/public.js.map +1 -0
- package/dist/features/toast/toastMeta.d.ts +9 -0
- package/dist/features/toast/toastMeta.d.ts.map +1 -0
- package/dist/features/toast/toastMeta.js +9 -0
- package/dist/features/toast/toastMeta.js.map +1 -0
- package/dist/features/toast/toastProviderMeta.d.ts +9 -0
- package/dist/features/toast/toastProviderMeta.d.ts.map +1 -0
- package/dist/features/toast/toastProviderMeta.js +9 -0
- package/dist/features/toast/toastProviderMeta.js.map +1 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- 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 +3 -3
- package/dist/metadata/allowedChildren.d.ts.map +1 -1
- package/dist/metadata/allowedChildren.js +1 -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 +6 -3
- package/dist/metadata/componentMeta.js.map +1 -1
- 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/reader/meta.d.ts +2 -2
- package/dist/patterns/scanner/meta.d.ts +2 -2
- package/dist/patterns/selection/SelectionProvider.d.ts +0 -4
- package/dist/patterns/selection/SelectionProvider.d.ts.map +1 -1
- package/dist/patterns/selection/SelectionProvider.js +4 -6
- package/dist/patterns/selection/SelectionProvider.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -3
- package/dist/registry.js.map +1 -1
- package/dist/theme/ZoraProvider.d.ts +4 -10
- package/dist/theme/ZoraProvider.d.ts.map +1 -1
- package/dist/theme/ZoraProvider.js +8 -6
- package/dist/theme/ZoraProvider.js.map +1 -1
- package/dist/theme/ZoraRuntimeCapabilities.d.ts +2 -0
- package/dist/theme/ZoraRuntimeCapabilities.d.ts.map +1 -0
- package/dist/theme/ZoraRuntimeCapabilities.js +2 -0
- package/dist/theme/ZoraRuntimeCapabilities.js.map +1 -0
- package/dist/theme/ZoraRuntimeCapabilities.native.d.ts +4 -0
- package/dist/theme/ZoraRuntimeCapabilities.native.d.ts.map +1 -0
- package/dist/theme/ZoraRuntimeCapabilities.native.js +8 -0
- package/dist/theme/ZoraRuntimeCapabilities.native.js.map +1 -0
- package/dist/theme/ZoraRuntimeCapabilities.web.d.ts +4 -0
- package/dist/theme/ZoraRuntimeCapabilities.web.d.ts.map +1 -0
- package/dist/theme/ZoraRuntimeCapabilities.web.js +8 -0
- package/dist/theme/ZoraRuntimeCapabilities.web.js.map +1 -0
- package/dist/theme/ZoraThemeRuntimeContext.d.ts +1 -0
- package/dist/theme/ZoraThemeRuntimeContext.d.ts.map +1 -1
- package/dist/theme/ZoraThemeRuntimeContext.js +3 -2
- package/dist/theme/ZoraThemeRuntimeContext.js.map +1 -1
- package/dist/theme/ZoraThemeScope.d.ts +1 -0
- package/dist/theme/ZoraThemeScope.d.ts.map +1 -1
- package/dist/theme/ZoraThemeScope.js +12 -10
- package/dist/theme/ZoraThemeScope.js.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/types/accordion.d.ts +23 -0
- package/dist/types/accordion.d.ts.map +1 -0
- package/dist/types/accordion.js +2 -0
- package/dist/types/accordion.js.map +1 -0
- package/dist/types/provider.d.ts +19 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +2 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/toast.d.ts +9 -0
- package/dist/types/toast.d.ts.map +1 -0
- package/dist/types/toast.js +2 -0
- package/dist/types/toast.js.map +1 -0
- package/package.json +2 -2
- package/src/features/accordion/accordionItemMeta.ts +46 -0
- package/src/features/accordion/accordionMeta.ts +34 -0
- package/src/features/accordion/adapters/inbound/Accordion.tsx +94 -0
- package/src/features/accordion/adapters/inbound/AccordionItem.tsx +86 -0
- package/src/features/accordion/composition/AccordionPresentationContext.ts +6 -0
- package/src/features/accordion/public.ts +9 -0
- package/src/features/bottom-sheet/public.test.ts +15 -12
- package/src/features/date-picker/adapters/inbound/DatePicker.native.tsx +46 -0
- package/src/features/date-picker/adapters/inbound/DatePicker.tsx +1 -356
- package/src/features/date-picker/adapters/inbound/DatePicker.web.tsx +48 -0
- package/src/features/date-picker/composition/DatePickerContent.tsx +256 -0
- package/src/features/date-picker/composition/DatePickerField.tsx +53 -0
- package/src/features/date-picker/composition/DatePickerTrigger.tsx +47 -0
- package/src/features/date-picker/public.test.ts +14 -4
- package/src/features/time-picker/adapters/inbound/TimePicker.native.tsx +47 -0
- package/src/features/time-picker/adapters/inbound/TimePicker.tsx +1 -258
- package/src/features/time-picker/adapters/inbound/TimePicker.web.tsx +49 -0
- package/src/features/time-picker/composition/TimePickerContent.tsx +164 -0
- package/src/features/time-picker/composition/TimePickerField.tsx +53 -0
- package/src/features/time-picker/composition/TimePickerTrigger.tsx +35 -0
- package/src/features/time-picker/public.test.ts +14 -3
- package/src/features/toast/adapters/inbound/Toast.tsx +13 -0
- package/src/features/toast/adapters/inbound/ToastProvider.tsx +9 -0
- package/src/features/toast/public.test.ts +19 -0
- package/src/features/toast/public.ts +10 -0
- package/src/features/toast/toastMeta.ts +10 -0
- package/src/features/toast/toastProviderMeta.ts +10 -0
- package/src/index.ts +17 -4
- package/src/metadata/allowedChildren.ts +1 -0
- package/src/metadata/componentMeta.test.ts +9 -0
- package/src/metadata/componentMeta.ts +6 -3
- package/src/patterns/selection/SelectionProvider.tsx +4 -6
- package/src/registry.ts +4 -3
- package/src/showcaseCoverage.test.ts +2 -1
- package/src/theme/ZoraProvider.tsx +11 -13
- package/src/theme/ZoraRuntimeCapabilities.native.tsx +19 -0
- package/src/theme/ZoraRuntimeCapabilities.tsx +1 -0
- package/src/theme/ZoraRuntimeCapabilities.web.tsx +10 -0
- package/src/theme/ZoraThemeRuntimeContext.tsx +3 -2
- package/src/theme/ZoraThemeScope.tsx +14 -12
- package/src/theme/index.ts +1 -1
- package/src/theme/themeConfigScope.test.ts +4 -1
- package/src/theme/themeScopeStructure.test.ts +27 -18
- package/src/types/accordion.ts +38 -0
- package/src/types/provider.ts +22 -0
- package/src/{components/toast/types.ts → types/toast.ts} +5 -7
- package/dist/components/toast/Toast.d.ts +0 -9
- package/dist/components/toast/Toast.d.ts.map +0 -1
- package/dist/components/toast/Toast.js +0 -13
- package/dist/components/toast/Toast.js.map +0 -1
- package/dist/components/toast/ToastProvider.d.ts +0 -9
- package/dist/components/toast/ToastProvider.d.ts.map +0 -1
- package/dist/components/toast/ToastProvider.js +0 -14
- package/dist/components/toast/ToastProvider.js.map +0 -1
- package/dist/components/toast/index.d.ts +0 -5
- package/dist/components/toast/index.d.ts.map +0 -1
- package/dist/components/toast/index.js +0 -4
- package/dist/components/toast/index.js.map +0 -1
- package/dist/components/toast/meta.d.ts +0 -17
- package/dist/components/toast/meta.d.ts.map +0 -1
- package/dist/components/toast/meta.js +0 -17
- package/dist/components/toast/meta.js.map +0 -1
- package/dist/components/toast/types.d.ts +0 -12
- package/dist/components/toast/types.d.ts.map +0 -1
- package/dist/components/toast/types.js +0 -2
- package/dist/components/toast/types.js.map +0 -1
- package/dist/patterns/disclosure-section/DisclosureSection.d.ts +0 -9
- package/dist/patterns/disclosure-section/DisclosureSection.d.ts.map +0 -1
- package/dist/patterns/disclosure-section/DisclosureSection.js +0 -86
- package/dist/patterns/disclosure-section/DisclosureSection.js.map +0 -1
- package/dist/patterns/disclosure-section/index.d.ts +0 -3
- package/dist/patterns/disclosure-section/index.d.ts.map +0 -1
- package/dist/patterns/disclosure-section/index.js +0 -3
- package/dist/patterns/disclosure-section/index.js.map +0 -1
- package/dist/patterns/disclosure-section/meta.d.ts +0 -9
- package/dist/patterns/disclosure-section/meta.d.ts.map +0 -1
- package/dist/patterns/disclosure-section/meta.js +0 -9
- package/dist/patterns/disclosure-section/meta.js.map +0 -1
- package/dist/patterns/disclosure-section/types.d.ts +0 -15
- package/dist/patterns/disclosure-section/types.d.ts.map +0 -1
- package/dist/patterns/disclosure-section/types.js +0 -2
- package/dist/patterns/disclosure-section/types.js.map +0 -1
- package/src/components/toast/Toast.tsx +0 -16
- package/src/components/toast/ToastProvider.tsx +0 -17
- package/src/components/toast/index.ts +0 -4
- package/src/components/toast/meta.ts +0 -19
- package/src/patterns/disclosure-section/DisclosureSection.tsx +0 -130
- package/src/patterns/disclosure-section/index.ts +0 -2
- package/src/patterns/disclosure-section/meta.ts +0 -10
- package/src/patterns/disclosure-section/types.ts +0 -16
|
@@ -3,7 +3,7 @@ export declare const gradientMeta: {
|
|
|
3
3
|
readonly category: "component";
|
|
4
4
|
readonly description: "Renders a host-backed gradient container for nested manifest content.";
|
|
5
5
|
readonly directManifestNode: true;
|
|
6
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
6
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
7
7
|
readonly blueprint: {
|
|
8
8
|
readonly label: "Gradient";
|
|
9
9
|
};
|
|
@@ -2,7 +2,7 @@ export declare const keyboardAvoidingViewMeta: {
|
|
|
2
2
|
readonly name: "KeyboardAvoidingView";
|
|
3
3
|
readonly category: "layout";
|
|
4
4
|
readonly directManifestNode: true;
|
|
5
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
5
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
6
6
|
readonly blueprint: {
|
|
7
7
|
readonly label: "Keyboard avoiding view";
|
|
8
8
|
readonly defaultProps: {
|
|
@@ -2,7 +2,7 @@ export declare const boxMeta: {
|
|
|
2
2
|
readonly name: "Box";
|
|
3
3
|
readonly category: "foundation";
|
|
4
4
|
readonly directManifestNode: true;
|
|
5
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
5
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
6
6
|
readonly props: {
|
|
7
7
|
readonly bg: {
|
|
8
8
|
readonly type: "color";
|
|
@@ -2,7 +2,7 @@ export declare const containerMeta: {
|
|
|
2
2
|
readonly name: "Container";
|
|
3
3
|
readonly category: "foundation";
|
|
4
4
|
readonly directManifestNode: true;
|
|
5
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
5
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
6
6
|
readonly props: {
|
|
7
7
|
[k: string]: {
|
|
8
8
|
readonly type: "spacing";
|
|
@@ -2,7 +2,7 @@ export declare const gridMeta: {
|
|
|
2
2
|
readonly name: "Grid";
|
|
3
3
|
readonly category: "foundation";
|
|
4
4
|
readonly directManifestNode: true;
|
|
5
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
5
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
6
6
|
readonly props: {
|
|
7
7
|
readonly cols: {
|
|
8
8
|
readonly type: "number";
|
|
@@ -2,7 +2,7 @@ export declare const stackMeta: {
|
|
|
2
2
|
readonly name: "Stack";
|
|
3
3
|
readonly category: "foundation";
|
|
4
4
|
readonly directManifestNode: true;
|
|
5
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
5
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
6
6
|
readonly props: {
|
|
7
7
|
readonly direction: {
|
|
8
8
|
readonly type: "enum";
|
|
@@ -5,7 +5,7 @@ export declare const flatListMeta: {
|
|
|
5
5
|
readonly blueprint: {
|
|
6
6
|
readonly label: "Flat list";
|
|
7
7
|
};
|
|
8
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
8
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
9
9
|
readonly description: "Virtualized children. Put node.repeat on this list for keyed data and item bindings; bind selection on the child Button/Card press event. Bound the list viewport and avoid nesting in a same-direction ScrollView.";
|
|
10
10
|
readonly events: {
|
|
11
11
|
readonly visibleItemsChange: {
|
|
@@ -109,6 +109,6 @@ export declare const sectionListMeta: {
|
|
|
109
109
|
};
|
|
110
110
|
readonly category: "layout";
|
|
111
111
|
readonly directManifestNode: true;
|
|
112
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
112
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
113
113
|
};
|
|
114
114
|
//# sourceMappingURL=sectionListMeta.d.ts.map
|
|
@@ -2,7 +2,7 @@ export declare const surfaceMeta: {
|
|
|
2
2
|
readonly name: "Surface";
|
|
3
3
|
readonly category: "foundation";
|
|
4
4
|
readonly directManifestNode: true;
|
|
5
|
-
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
5
|
+
readonly allowedChildren: readonly ["ActivityIndicator", "ForgotPasswordForm", "OAuthProviderButton", "OAuthProviderList", "OtpForm", "SignInForm", "SignUpForm", "Accordion", "Surface", "Avatar", "AvatarGroup", "Badge", "MediaCard", "MetricCard", "Chip", "ChipGroup", "DataTable", "DatePicker", "Skeleton", "SkeletonCard", "SkeletonList", "SkeletonText", "IconButton", "Uploader", "FlatList", "SectionList", "BottomSheet", "ProductCard", "Box", "Stack", "Grid", "Gradient", "Container", "Divider", "Text", "Heading", "Icon", "Image", "Hero", "KeyboardAvoidingView", "Button", "ButtonGroup", "RadioGroup", "ThemeModeToggle", "TextInput", "TimePicker", "Form", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble", "ProgressRing", "ReaderSurface", "ContentRail", "MissingElement"];
|
|
6
6
|
readonly props: {
|
|
7
7
|
readonly variant: {
|
|
8
8
|
readonly type: "enum";
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import type { TimePickerProps } from '../../../../types/time-picker';
|
|
3
|
-
/***
|
|
4
|
-
* Time input control with bottom-sheet selection and formatted display value.
|
|
5
|
-
*/
|
|
6
|
-
export declare const TimePicker: (props: TimePickerProps) => React.ReactElement | null;
|
|
1
|
+
export { TimePicker } from './TimePicker.web';
|
|
7
2
|
//# sourceMappingURL=TimePicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimePicker.d.ts","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TimePicker.d.ts","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,117 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { ScrollView, StyleSheet } from 'react-native';
|
|
4
|
-
import { withZoraThemeScope } from '../../../../theme/withZoraThemeScope';
|
|
5
|
-
import { useBottomSheet } from '../../../bottom-sheet/public';
|
|
6
|
-
import { Button } from '../../../button/public';
|
|
7
|
-
import { Stack } from '../../../layout/public';
|
|
8
|
-
import { Text } from '../../../typography/public';
|
|
9
|
-
const MINUTES_PER_DAY = 24 * 60;
|
|
10
|
-
const DEFAULT_STEP_MINUTES = 30;
|
|
11
|
-
/*** Render the field label and optional supporting description. */
|
|
12
|
-
function renderLabel(label, description) {
|
|
13
|
-
return (<Stack gap="xs">
|
|
14
|
-
<Text variant="label" weight="semiBold">
|
|
15
|
-
{label}
|
|
16
|
-
</Text>
|
|
17
|
-
{description ? (<Text emphasis="muted" variant="bodySmall">
|
|
18
|
-
{description}
|
|
19
|
-
</Text>) : null}
|
|
20
|
-
</Stack>);
|
|
21
|
-
}
|
|
22
|
-
/*** Parse one HH:mm value to minutes since midnight. */
|
|
23
|
-
function parseTimeToMinutes(value) {
|
|
24
|
-
if (!value)
|
|
25
|
-
return undefined;
|
|
26
|
-
const match = /^(\d{2}):(\d{2})$/.exec(value);
|
|
27
|
-
if (!match)
|
|
28
|
-
return undefined;
|
|
29
|
-
const hours = Number(match[1]);
|
|
30
|
-
const minutes = Number(match[2]);
|
|
31
|
-
if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59)
|
|
32
|
-
return undefined;
|
|
33
|
-
return hours * 60 + minutes;
|
|
34
|
-
}
|
|
35
|
-
/*** Format minutes since midnight as HH:mm. */
|
|
36
|
-
function formatMinutes(value) {
|
|
37
|
-
const hours = Math.floor(value / 60);
|
|
38
|
-
const minutes = value % 60;
|
|
39
|
-
return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;
|
|
40
|
-
}
|
|
41
|
-
/*** Normalize the configured time step to a positive whole minute. */
|
|
42
|
-
function resolveStepMinutes(stepMinutes) {
|
|
43
|
-
if (stepMinutes === undefined || !Number.isFinite(stepMinutes) || stepMinutes <= 0) {
|
|
44
|
-
return DEFAULT_STEP_MINUTES;
|
|
45
|
-
}
|
|
46
|
-
return Math.max(1, Math.floor(stepMinutes));
|
|
47
|
-
}
|
|
48
|
-
/*** Generate selectable HH:mm values within the configured range. */
|
|
49
|
-
function generateTimeOptions({ minTime, maxTime, stepMinutes, }) {
|
|
50
|
-
const step = resolveStepMinutes(stepMinutes);
|
|
51
|
-
const min = parseTimeToMinutes(minTime) ?? 0;
|
|
52
|
-
const max = parseTimeToMinutes(maxTime) ?? MINUTES_PER_DAY - 1;
|
|
53
|
-
return Array.from({ length: Math.ceil(MINUTES_PER_DAY / step) }, (_, index) => index * step)
|
|
54
|
-
.filter((minute) => minute >= min && minute <= max)
|
|
55
|
-
.map(formatMinutes);
|
|
56
|
-
}
|
|
57
|
-
function TimePickerInner({ themeId: _themeId, mode: _mode, value, onValueChange, label, description, error, placeholder = 'Choose time', minTime, maxTime, stepMinutes, disabled = false, required = false, formatTime, testID, interactionPolicy, }) {
|
|
58
|
-
const { dismiss, present } = useBottomSheet();
|
|
59
|
-
const passive = interactionPolicy === 'passive';
|
|
60
|
-
const displayValue = value ? (formatTime ? formatTime(value) : value) : placeholder;
|
|
61
|
-
/*** Present the time options through the shared BottomSheet controller. */
|
|
62
|
-
function openPicker() {
|
|
63
|
-
if (passive)
|
|
64
|
-
return;
|
|
65
|
-
present({
|
|
66
|
-
content: (<TimePickerSheet description={description} formatTime={formatTime} interactionPolicy={interactionPolicy} label={label} maxTime={maxTime} minTime={minTime} onDismiss={dismiss} onSelect={(time) => {
|
|
67
|
-
onValueChange?.(time);
|
|
68
|
-
dismiss();
|
|
69
|
-
}} stepMinutes={stepMinutes} testID={testID} value={value}/>),
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return (<Field disabled={disabled} errorText={error} invalid={Boolean(error)} label={label ? renderLabel(label, description) : undefined} required={required} testID={testID}>
|
|
73
|
-
<Button disabled={disabled} interactionPolicy={interactionPolicy} onPress={openPicker} testID={testID ? `${testID}-trigger` : undefined} trailingIcon={{ name: 'chevron-down-outline' }} variant="outline">
|
|
74
|
-
{displayValue}
|
|
75
|
-
</Button>
|
|
76
|
-
</Field>);
|
|
77
|
-
}
|
|
78
|
-
/*** Render time selection content inside the shared BottomSheet host. */
|
|
79
|
-
function TimePickerSheet({ description, formatTime, interactionPolicy, label, maxTime, minTime, onDismiss, onSelect, stepMinutes, testID, value, }) {
|
|
80
|
-
const options = React.useMemo(() => generateTimeOptions({ maxTime, minTime, stepMinutes }), [maxTime, minTime, stepMinutes]);
|
|
81
|
-
return (<Stack gap="m" p="m" testID={testID ? `${testID}-sheet` : undefined}>
|
|
82
|
-
<PickerSheetHeader description={description} title={label ?? 'Choose time'}/>
|
|
83
|
-
<ScrollView style={styles.options}>
|
|
84
|
-
<Stack gap="xxs">
|
|
85
|
-
{options.map((option) => (<TimePickerOption formatTime={formatTime} interactionPolicy={interactionPolicy} key={option} onSelect={onSelect} option={option} selected={option === value} testID={testID}/>))}
|
|
86
|
-
</Stack>
|
|
87
|
-
</ScrollView>
|
|
88
|
-
<Button fullWidth interactionPolicy={interactionPolicy} onPress={onDismiss} variant="ghost">
|
|
89
|
-
Cancel
|
|
90
|
-
</Button>
|
|
91
|
-
</Stack>);
|
|
92
|
-
}
|
|
93
|
-
/*** Render the shared title block used by the time sheet. */
|
|
94
|
-
function PickerSheetHeader({ description, title, }) {
|
|
95
|
-
return (<Stack gap="xxs">
|
|
96
|
-
<Text align="center" variant="label" weight="semiBold">
|
|
97
|
-
{title}
|
|
98
|
-
</Text>
|
|
99
|
-
{description ? (<Text align="center" emphasis="muted" variant="bodySmall">
|
|
100
|
-
{description}
|
|
101
|
-
</Text>) : null}
|
|
102
|
-
</Stack>);
|
|
103
|
-
}
|
|
104
|
-
/*** Render one accessible selectable time option. */
|
|
105
|
-
function TimePickerOption({ formatTime, interactionPolicy, onSelect, option, selected, testID, }) {
|
|
106
|
-
return (<Button accessibilityState={{ selected }} fullWidth interactionPolicy={interactionPolicy} onPress={() => onSelect(option)} testID={testID ? `${testID}-option-${option}` : undefined} variant={selected ? 'soft' : 'ghost'}>
|
|
107
|
-
{formatTime ? formatTime(option) : option}
|
|
108
|
-
</Button>);
|
|
109
|
-
}
|
|
110
|
-
const styles = StyleSheet.create({
|
|
111
|
-
options: { maxHeight: 360 },
|
|
112
|
-
});
|
|
113
|
-
/***
|
|
114
|
-
* Time input control with bottom-sheet selection and formatted display value.
|
|
115
|
-
*/
|
|
116
|
-
export const TimePicker = withZoraThemeScope(TimePickerInner);
|
|
1
|
+
export { TimePicker } from './TimePicker.web';
|
|
117
2
|
//# sourceMappingURL=TimePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimePicker.js","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Field } from '@ankhorage/surface';\nimport React from 'react';\nimport { ScrollView, StyleSheet } from 'react-native';\n\nimport { withZoraThemeScope } from '../../../../theme/withZoraThemeScope';\nimport type { TimePickerProps } from '../../../../types/time-picker';\nimport { useBottomSheet } from '../../../bottom-sheet/public';\nimport { Button } from '../../../button/public';\nimport { Stack } from '../../../layout/public';\nimport { Text } from '../../../typography/public';\n\nconst MINUTES_PER_DAY = 24 * 60;\nconst DEFAULT_STEP_MINUTES = 30;\n\n/*** Render the field label and optional supporting description. */\nfunction renderLabel(label: React.ReactNode, description: React.ReactNode | undefined) {\n return (\n <Stack gap=\"xs\">\n <Text variant=\"label\" weight=\"semiBold\">\n {label}\n </Text>\n {description ? (\n <Text emphasis=\"muted\" variant=\"bodySmall\">\n {description}\n </Text>\n ) : null}\n </Stack>\n );\n}\n\n/*** Parse one HH:mm value to minutes since midnight. */\nfunction parseTimeToMinutes(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const match = /^(\\d{2}):(\\d{2})$/.exec(value);\n if (!match) return undefined;\n\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return undefined;\n return hours * 60 + minutes;\n}\n\n/*** Format minutes since midnight as HH:mm. */\nfunction formatMinutes(value: number): string {\n const hours = Math.floor(value / 60);\n const minutes = value % 60;\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n\n/*** Normalize the configured time step to a positive whole minute. */\nfunction resolveStepMinutes(stepMinutes: number | undefined): number {\n if (stepMinutes === undefined || !Number.isFinite(stepMinutes) || stepMinutes <= 0) {\n return DEFAULT_STEP_MINUTES;\n }\n return Math.max(1, Math.floor(stepMinutes));\n}\n\n/*** Generate selectable HH:mm values within the configured range. */\nfunction generateTimeOptions({\n minTime,\n maxTime,\n stepMinutes,\n}: Pick<TimePickerProps, 'maxTime' | 'minTime' | 'stepMinutes'>): string[] {\n const step = resolveStepMinutes(stepMinutes);\n const min = parseTimeToMinutes(minTime) ?? 0;\n const max = parseTimeToMinutes(maxTime) ?? MINUTES_PER_DAY - 1;\n return Array.from({ length: Math.ceil(MINUTES_PER_DAY / step) }, (_, index) => index * step)\n .filter((minute) => minute >= min && minute <= max)\n .map(formatMinutes);\n}\n\nfunction TimePickerInner({\n themeId: _themeId,\n mode: _mode,\n value,\n onValueChange,\n label,\n description,\n error,\n placeholder = 'Choose time',\n minTime,\n maxTime,\n stepMinutes,\n disabled = false,\n required = false,\n formatTime,\n testID,\n interactionPolicy,\n}: TimePickerProps) {\n const { dismiss, present } = useBottomSheet();\n const passive = interactionPolicy === 'passive';\n const displayValue = value ? (formatTime ? formatTime(value) : value) : placeholder;\n\n /*** Present the time options through the shared BottomSheet controller. */\n function openPicker() {\n if (passive) return;\n present({\n content: (\n <TimePickerSheet\n description={description}\n formatTime={formatTime}\n interactionPolicy={interactionPolicy}\n label={label}\n maxTime={maxTime}\n minTime={minTime}\n onDismiss={dismiss}\n onSelect={(time) => {\n onValueChange?.(time);\n dismiss();\n }}\n stepMinutes={stepMinutes}\n testID={testID}\n value={value}\n />\n ),\n });\n }\n\n return (\n <Field\n disabled={disabled}\n errorText={error}\n invalid={Boolean(error)}\n label={label ? renderLabel(label, description) : undefined}\n required={required}\n testID={testID}\n >\n <Button\n disabled={disabled}\n interactionPolicy={interactionPolicy}\n onPress={openPicker}\n testID={testID ? `${testID}-trigger` : undefined}\n trailingIcon={{ name: 'chevron-down-outline' }}\n variant=\"outline\"\n >\n {displayValue}\n </Button>\n </Field>\n );\n}\n\ninterface TimePickerSheetProps extends Pick<\n TimePickerProps,\n | 'description'\n | 'formatTime'\n | 'interactionPolicy'\n | 'label'\n | 'maxTime'\n | 'minTime'\n | 'stepMinutes'\n | 'testID'\n | 'value'\n> {\n onDismiss: () => void;\n onSelect: (value: string) => void;\n}\n\n/*** Render time selection content inside the shared BottomSheet host. */\nfunction TimePickerSheet({\n description,\n formatTime,\n interactionPolicy,\n label,\n maxTime,\n minTime,\n onDismiss,\n onSelect,\n stepMinutes,\n testID,\n value,\n}: TimePickerSheetProps) {\n const options = React.useMemo(\n () => generateTimeOptions({ maxTime, minTime, stepMinutes }),\n [maxTime, minTime, stepMinutes],\n );\n\n return (\n <Stack gap=\"m\" p=\"m\" testID={testID ? `${testID}-sheet` : undefined}>\n <PickerSheetHeader description={description} title={label ?? 'Choose time'} />\n <ScrollView style={styles.options}>\n <Stack gap=\"xxs\">\n {options.map((option) => (\n <TimePickerOption\n formatTime={formatTime}\n interactionPolicy={interactionPolicy}\n key={option}\n onSelect={onSelect}\n option={option}\n selected={option === value}\n testID={testID}\n />\n ))}\n </Stack>\n </ScrollView>\n <Button fullWidth interactionPolicy={interactionPolicy} onPress={onDismiss} variant=\"ghost\">\n Cancel\n </Button>\n </Stack>\n );\n}\n\n/*** Render the shared title block used by the time sheet. */\nfunction PickerSheetHeader({\n description,\n title,\n}: {\n description: React.ReactNode | undefined;\n title: React.ReactNode;\n}) {\n return (\n <Stack gap=\"xxs\">\n <Text align=\"center\" variant=\"label\" weight=\"semiBold\">\n {title}\n </Text>\n {description ? (\n <Text align=\"center\" emphasis=\"muted\" variant=\"bodySmall\">\n {description}\n </Text>\n ) : null}\n </Stack>\n );\n}\n\n/*** Render one accessible selectable time option. */\nfunction TimePickerOption({\n formatTime,\n interactionPolicy,\n onSelect,\n option,\n selected,\n testID,\n}: Pick<TimePickerSheetProps, 'formatTime' | 'interactionPolicy' | 'testID'> & {\n onSelect: (value: string) => void;\n option: string;\n selected: boolean;\n}) {\n return (\n <Button\n accessibilityState={{ selected }}\n fullWidth\n interactionPolicy={interactionPolicy}\n onPress={() => onSelect(option)}\n testID={testID ? `${testID}-option-${option}` : undefined}\n variant={selected ? 'soft' : 'ghost'}\n >\n {formatTime ? formatTime(option) : option}\n </Button>\n );\n}\n\nconst styles = StyleSheet.create({\n options: { maxHeight: 360 },\n});\n\n/***\n * Time input control with bottom-sheet selection and formatted display value.\n */\nexport const TimePicker = withZoraThemeScope(TimePickerInner);\n"]}
|
|
1
|
+
{"version":3,"file":"TimePicker.js","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { TimePicker } from './TimePicker.web';\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { TimePickerProps } from '../../../../types/time-picker';
|
|
3
|
+
/*** Renders TimePicker with native BottomSheet presentation. */
|
|
4
|
+
export declare const TimePicker: (props: TimePickerProps) => React.ReactElement | null;
|
|
5
|
+
//# sourceMappingURL=TimePicker.native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.native.d.ts","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,gEAAgE;AAChE,eAAO,MAAM,UAAU,uDAAsC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { withZoraThemeScope } from '../../../../theme/withZoraThemeScope';
|
|
3
|
+
import { useBottomSheet } from '../../../bottom-sheet/public';
|
|
4
|
+
import { TimePickerContent } from '../../composition/TimePickerContent';
|
|
5
|
+
import { TimePickerField } from '../../composition/TimePickerField';
|
|
6
|
+
import { TimePickerTrigger } from '../../composition/TimePickerTrigger';
|
|
7
|
+
/*** Renders TimePicker with native BottomSheet presentation. */
|
|
8
|
+
export const TimePicker = withZoraThemeScope(TimePickerInner);
|
|
9
|
+
/*** Connects the shared TimePicker field and content to the native BottomSheet host. */
|
|
10
|
+
function TimePickerInner({ themeId: _themeId, mode: _mode, ...props }) {
|
|
11
|
+
const { dismiss, present } = useBottomSheet();
|
|
12
|
+
const openPicker = React.useCallback(() => {
|
|
13
|
+
if (props.interactionPolicy === 'passive')
|
|
14
|
+
return;
|
|
15
|
+
present({
|
|
16
|
+
content: (<TimePickerContent description={props.description} formatTime={props.formatTime} interactionPolicy={props.interactionPolicy} label={props.label} maxTime={props.maxTime} minTime={props.minTime} onDismiss={dismiss} onSelect={(time) => {
|
|
17
|
+
props.onValueChange?.(time);
|
|
18
|
+
dismiss();
|
|
19
|
+
}} stepMinutes={props.stepMinutes} testID={props.testID} value={props.value}/>),
|
|
20
|
+
});
|
|
21
|
+
}, [dismiss, present, props]);
|
|
22
|
+
return (<TimePickerField {...props}>
|
|
23
|
+
<TimePickerTrigger {...props} onPress={openPicker}/>
|
|
24
|
+
</TimePickerField>);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=TimePicker.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.native.js","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.native.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAExE,gEAAgE;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAE9D,wFAAwF;AACxF,SAAS,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,EAAmB;IACpF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAE9C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACxC,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS;YAAE,OAAO;QAElD,OAAO,CAAC;YACN,OAAO,EAAE,CACP,CAAC,iBAAiB,CAChB,WAAW,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAC/B,UAAU,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAC7B,iBAAiB,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAC3C,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CACnB,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CACvB,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CACvB,SAAS,CAAC,CAAC,OAAO,CAAC,CACnB,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;oBACjB,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CACF,WAAW,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAC/B,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CACrB,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EACnB,CACH;SACF,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAE9B,OAAO,CACL,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,CACzB;MAAA,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,EACpD;IAAA,EAAE,eAAe,CAAC,CACnB,CAAC;AACJ,CAAC","sourcesContent":["import React from 'react';\n\nimport { withZoraThemeScope } from '../../../../theme/withZoraThemeScope';\nimport type { TimePickerProps } from '../../../../types/time-picker';\nimport { useBottomSheet } from '../../../bottom-sheet/public';\nimport { TimePickerContent } from '../../composition/TimePickerContent';\nimport { TimePickerField } from '../../composition/TimePickerField';\nimport { TimePickerTrigger } from '../../composition/TimePickerTrigger';\n\n/*** Renders TimePicker with native BottomSheet presentation. */\nexport const TimePicker = withZoraThemeScope(TimePickerInner);\n\n/*** Connects the shared TimePicker field and content to the native BottomSheet host. */\nfunction TimePickerInner({ themeId: _themeId, mode: _mode, ...props }: TimePickerProps) {\n const { dismiss, present } = useBottomSheet();\n\n const openPicker = React.useCallback(() => {\n if (props.interactionPolicy === 'passive') return;\n\n present({\n content: (\n <TimePickerContent\n description={props.description}\n formatTime={props.formatTime}\n interactionPolicy={props.interactionPolicy}\n label={props.label}\n maxTime={props.maxTime}\n minTime={props.minTime}\n onDismiss={dismiss}\n onSelect={(time) => {\n props.onValueChange?.(time);\n dismiss();\n }}\n stepMinutes={props.stepMinutes}\n testID={props.testID}\n value={props.value}\n />\n ),\n });\n }, [dismiss, present, props]);\n\n return (\n <TimePickerField {...props}>\n <TimePickerTrigger {...props} onPress={openPicker} />\n </TimePickerField>\n );\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { TimePickerProps } from '../../../../types/time-picker';
|
|
3
|
+
/*** Renders TimePicker with anchored web Popover presentation. */
|
|
4
|
+
export declare const TimePicker: (props: TimePickerProps) => React.ReactElement | null;
|
|
5
|
+
//# sourceMappingURL=TimePicker.web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.web.d.ts","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.web.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,kEAAkE;AAClE,eAAO,MAAM,UAAU,uDAAsC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Popover } from '@ankhorage/surface';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { withZoraThemeScope } from '../../../../theme/withZoraThemeScope';
|
|
4
|
+
import { Surface } from '../../../surface/public';
|
|
5
|
+
import { TimePickerContent } from '../../composition/TimePickerContent';
|
|
6
|
+
import { TimePickerField } from '../../composition/TimePickerField';
|
|
7
|
+
import { TimePickerTrigger } from '../../composition/TimePickerTrigger';
|
|
8
|
+
/*** Renders TimePicker with anchored web Popover presentation. */
|
|
9
|
+
export const TimePicker = withZoraThemeScope(TimePickerInner);
|
|
10
|
+
/*** Connects the shared TimePicker field and content to the web Popover host. */
|
|
11
|
+
function TimePickerInner({ themeId: _themeId, mode: _mode, ...props }) {
|
|
12
|
+
const [open, setOpen] = React.useState(false);
|
|
13
|
+
return (<TimePickerField {...props}>
|
|
14
|
+
<Popover anchor={({ toggle }) => <TimePickerTrigger {...props} onPress={toggle}/>} interactionPolicy={props.interactionPolicy} onOpenChange={setOpen} open={open} placement="bottom-start" testID={props.testID ? `${props.testID}-popover` : undefined}>
|
|
15
|
+
<Surface variant="raised">
|
|
16
|
+
<TimePickerContent description={props.description} formatTime={props.formatTime} interactionPolicy={props.interactionPolicy} label={props.label} maxTime={props.maxTime} minTime={props.minTime} onDismiss={() => setOpen(false)} onSelect={(time) => {
|
|
17
|
+
props.onValueChange?.(time);
|
|
18
|
+
setOpen(false);
|
|
19
|
+
}} stepMinutes={props.stepMinutes} testID={props.testID} value={props.value}/>
|
|
20
|
+
</Surface>
|
|
21
|
+
</Popover>
|
|
22
|
+
</TimePickerField>);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=TimePicker.web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePicker.web.js","sourceRoot":"","sources":["../../../../../src/features/time-picker/adapters/inbound/TimePicker.web.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAExE,kEAAkE;AAClE,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAE9D,iFAAiF;AACjF,SAAS,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,EAAmB;IACpF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,OAAO,CACL,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,CACzB;MAAA,CAAC,OAAO,CACN,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAG,CAAC,CAC1E,iBAAiB,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAC3C,YAAY,CAAC,CAAC,OAAO,CAAC,CACtB,IAAI,CAAC,CAAC,IAAI,CAAC,CACX,SAAS,CAAC,cAAc,CACxB,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAE7D;QAAA,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CACvB;UAAA,CAAC,iBAAiB,CAChB,WAAW,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAC/B,UAAU,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAC7B,iBAAiB,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAC3C,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CACnB,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CACvB,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CACvB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAChC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;YACjB,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CACF,WAAW,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAC/B,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CACrB,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAEvB;QAAA,EAAE,OAAO,CACX;MAAA,EAAE,OAAO,CACX;IAAA,EAAE,eAAe,CAAC,CACnB,CAAC;AACJ,CAAC","sourcesContent":["import { Popover } from '@ankhorage/surface';\nimport React from 'react';\n\nimport { withZoraThemeScope } from '../../../../theme/withZoraThemeScope';\nimport type { TimePickerProps } from '../../../../types/time-picker';\nimport { Surface } from '../../../surface/public';\nimport { TimePickerContent } from '../../composition/TimePickerContent';\nimport { TimePickerField } from '../../composition/TimePickerField';\nimport { TimePickerTrigger } from '../../composition/TimePickerTrigger';\n\n/*** Renders TimePicker with anchored web Popover presentation. */\nexport const TimePicker = withZoraThemeScope(TimePickerInner);\n\n/*** Connects the shared TimePicker field and content to the web Popover host. */\nfunction TimePickerInner({ themeId: _themeId, mode: _mode, ...props }: TimePickerProps) {\n const [open, setOpen] = React.useState(false);\n\n return (\n <TimePickerField {...props}>\n <Popover\n anchor={({ toggle }) => <TimePickerTrigger {...props} onPress={toggle} />}\n interactionPolicy={props.interactionPolicy}\n onOpenChange={setOpen}\n open={open}\n placement=\"bottom-start\"\n testID={props.testID ? `${props.testID}-popover` : undefined}\n >\n <Surface variant=\"raised\">\n <TimePickerContent\n description={props.description}\n formatTime={props.formatTime}\n interactionPolicy={props.interactionPolicy}\n label={props.label}\n maxTime={props.maxTime}\n minTime={props.minTime}\n onDismiss={() => setOpen(false)}\n onSelect={(time) => {\n props.onValueChange?.(time);\n setOpen(false);\n }}\n stepMinutes={props.stepMinutes}\n testID={props.testID}\n value={props.value}\n />\n </Surface>\n </Popover>\n </TimePickerField>\n );\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { TimePickerProps } from '../../../types/time-picker';
|
|
3
|
+
/*** Renders shared time options for native BottomSheet and web Popover hosts. */
|
|
4
|
+
export declare function TimePickerContent({ description, formatTime, interactionPolicy, label, maxTime, minTime, onDismiss, onSelect, stepMinutes, testID, value, }: TimePickerContentProps): React.JSX.Element;
|
|
5
|
+
interface TimePickerContentProps extends Pick<TimePickerProps, 'description' | 'formatTime' | 'interactionPolicy' | 'label' | 'maxTime' | 'minTime' | 'stepMinutes' | 'testID' | 'value'> {
|
|
6
|
+
onDismiss: () => void;
|
|
7
|
+
onSelect: (value: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=TimePickerContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerContent.d.ts","sourceRoot":"","sources":["../../../../src/features/time-picker/composition/TimePickerContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAQlE,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,KAAK,EACL,OAAO,EACP,OAAO,EACP,SAAS,EACT,QAAQ,EACR,WAAW,EACX,MAAM,EACN,KAAK,GACN,EAAE,sBAAsB,qBA6BxB;AAED,UAAU,sBAAuB,SAAQ,IAAI,CAC3C,eAAe,EACb,aAAa,GACb,YAAY,GACZ,mBAAmB,GACnB,OAAO,GACP,SAAS,GACT,SAAS,GACT,aAAa,GACb,QAAQ,GACR,OAAO,CACV;IACC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ScrollView, StyleSheet } from 'react-native';
|
|
3
|
+
import { Button } from '../../button/public';
|
|
4
|
+
import { Stack } from '../../layout/public';
|
|
5
|
+
import { Text } from '../../typography/public';
|
|
6
|
+
const MINUTES_PER_DAY = 24 * 60;
|
|
7
|
+
const DEFAULT_STEP_MINUTES = 30;
|
|
8
|
+
/*** Renders shared time options for native BottomSheet and web Popover hosts. */
|
|
9
|
+
export function TimePickerContent({ description, formatTime, interactionPolicy, label, maxTime, minTime, onDismiss, onSelect, stepMinutes, testID, value, }) {
|
|
10
|
+
const options = React.useMemo(() => generateTimeOptions({ maxTime, minTime, stepMinutes }), [maxTime, minTime, stepMinutes]);
|
|
11
|
+
return (<Stack gap="m" p="m" testID={testID ? `${testID}-content` : undefined}>
|
|
12
|
+
<PickerHeader description={description} title={label ?? 'Choose time'}/>
|
|
13
|
+
<ScrollView style={styles.options}>
|
|
14
|
+
<Stack gap="xxs">
|
|
15
|
+
{options.map((option) => (<TimePickerOption formatTime={formatTime} interactionPolicy={interactionPolicy} key={option} onSelect={onSelect} option={option} selected={option === value} testID={testID}/>))}
|
|
16
|
+
</Stack>
|
|
17
|
+
</ScrollView>
|
|
18
|
+
<Button fullWidth interactionPolicy={interactionPolicy} onPress={onDismiss} variant="ghost">
|
|
19
|
+
Cancel
|
|
20
|
+
</Button>
|
|
21
|
+
</Stack>);
|
|
22
|
+
}
|
|
23
|
+
/*** Renders the shared title block used by picker overlays. */
|
|
24
|
+
function PickerHeader({ description, title, }) {
|
|
25
|
+
return (<Stack gap="xxs">
|
|
26
|
+
<Text align="center" variant="label" weight="semiBold">
|
|
27
|
+
{title}
|
|
28
|
+
</Text>
|
|
29
|
+
{description ? (<Text align="center" emphasis="muted" variant="bodySmall">
|
|
30
|
+
{description}
|
|
31
|
+
</Text>) : null}
|
|
32
|
+
</Stack>);
|
|
33
|
+
}
|
|
34
|
+
/*** Renders one accessible selectable time option. */
|
|
35
|
+
function TimePickerOption({ formatTime, interactionPolicy, onSelect, option, selected, testID, }) {
|
|
36
|
+
return (<Button accessibilityState={{ selected }} fullWidth interactionPolicy={interactionPolicy} onPress={() => onSelect(option)} testID={testID ? `${testID}-option-${option}` : undefined} variant={selected ? 'soft' : 'ghost'}>
|
|
37
|
+
{formatTime ? formatTime(option) : option}
|
|
38
|
+
</Button>);
|
|
39
|
+
}
|
|
40
|
+
/*** Parses one HH:mm value to minutes since midnight. */
|
|
41
|
+
function parseTimeToMinutes(value) {
|
|
42
|
+
if (!value)
|
|
43
|
+
return undefined;
|
|
44
|
+
const match = /^(\d{2}):(\d{2})$/.exec(value);
|
|
45
|
+
if (!match)
|
|
46
|
+
return undefined;
|
|
47
|
+
const hours = Number(match[1]);
|
|
48
|
+
const minutes = Number(match[2]);
|
|
49
|
+
if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59)
|
|
50
|
+
return undefined;
|
|
51
|
+
return hours * 60 + minutes;
|
|
52
|
+
}
|
|
53
|
+
/*** Formats minutes since midnight as HH:mm. */
|
|
54
|
+
function formatMinutes(value) {
|
|
55
|
+
const hours = Math.floor(value / 60);
|
|
56
|
+
const minutes = value % 60;
|
|
57
|
+
return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;
|
|
58
|
+
}
|
|
59
|
+
/*** Normalizes the configured time step to a positive whole minute. */
|
|
60
|
+
function resolveStepMinutes(stepMinutes) {
|
|
61
|
+
if (stepMinutes === undefined || !Number.isFinite(stepMinutes) || stepMinutes <= 0) {
|
|
62
|
+
return DEFAULT_STEP_MINUTES;
|
|
63
|
+
}
|
|
64
|
+
return Math.max(1, Math.floor(stepMinutes));
|
|
65
|
+
}
|
|
66
|
+
/*** Generates selectable HH:mm values within the configured range. */
|
|
67
|
+
function generateTimeOptions({ minTime, maxTime, stepMinutes, }) {
|
|
68
|
+
const step = resolveStepMinutes(stepMinutes);
|
|
69
|
+
const min = parseTimeToMinutes(minTime) ?? 0;
|
|
70
|
+
const max = parseTimeToMinutes(maxTime) ?? MINUTES_PER_DAY - 1;
|
|
71
|
+
return Array.from({ length: Math.ceil(MINUTES_PER_DAY / step) }, (_, index) => index * step)
|
|
72
|
+
.filter((minute) => minute >= min && minute <= max)
|
|
73
|
+
.map(formatMinutes);
|
|
74
|
+
}
|
|
75
|
+
const styles = StyleSheet.create({
|
|
76
|
+
options: { maxHeight: 360 },
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=TimePickerContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerContent.js","sourceRoot":"","sources":["../../../../src/features/time-picker/composition/TimePickerContent.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { ScrollView, StyleSheet } from 'react-native';\n\nimport type { TimePickerProps } from '../../../types/time-picker';\nimport { Button } from '../../button/public';\nimport { Stack } from '../../layout/public';\nimport { Text } from '../../typography/public';\n\nconst MINUTES_PER_DAY = 24 * 60;\nconst DEFAULT_STEP_MINUTES = 30;\n\n/*** Renders shared time options for native BottomSheet and web Popover hosts. */\nexport function TimePickerContent({\n description,\n formatTime,\n interactionPolicy,\n label,\n maxTime,\n minTime,\n onDismiss,\n onSelect,\n stepMinutes,\n testID,\n value,\n}: TimePickerContentProps) {\n const options = React.useMemo(\n () => generateTimeOptions({ maxTime, minTime, stepMinutes }),\n [maxTime, minTime, stepMinutes],\n );\n\n return (\n <Stack gap=\"m\" p=\"m\" testID={testID ? `${testID}-content` : undefined}>\n <PickerHeader description={description} title={label ?? 'Choose time'} />\n <ScrollView style={styles.options}>\n <Stack gap=\"xxs\">\n {options.map((option) => (\n <TimePickerOption\n formatTime={formatTime}\n interactionPolicy={interactionPolicy}\n key={option}\n onSelect={onSelect}\n option={option}\n selected={option === value}\n testID={testID}\n />\n ))}\n </Stack>\n </ScrollView>\n <Button fullWidth interactionPolicy={interactionPolicy} onPress={onDismiss} variant=\"ghost\">\n Cancel\n </Button>\n </Stack>\n );\n}\n\ninterface TimePickerContentProps extends Pick<\n TimePickerProps,\n | 'description'\n | 'formatTime'\n | 'interactionPolicy'\n | 'label'\n | 'maxTime'\n | 'minTime'\n | 'stepMinutes'\n | 'testID'\n | 'value'\n> {\n onDismiss: () => void;\n onSelect: (value: string) => void;\n}\n\n/*** Renders the shared title block used by picker overlays. */\nfunction PickerHeader({\n description,\n title,\n}: {\n description: React.ReactNode | undefined;\n title: React.ReactNode;\n}) {\n return (\n <Stack gap=\"xxs\">\n <Text align=\"center\" variant=\"label\" weight=\"semiBold\">\n {title}\n </Text>\n {description ? (\n <Text align=\"center\" emphasis=\"muted\" variant=\"bodySmall\">\n {description}\n </Text>\n ) : null}\n </Stack>\n );\n}\n\n/*** Renders one accessible selectable time option. */\nfunction TimePickerOption({\n formatTime,\n interactionPolicy,\n onSelect,\n option,\n selected,\n testID,\n}: Pick<TimePickerContentProps, 'formatTime' | 'interactionPolicy' | 'testID'> & {\n onSelect: (value: string) => void;\n option: string;\n selected: boolean;\n}) {\n return (\n <Button\n accessibilityState={{ selected }}\n fullWidth\n interactionPolicy={interactionPolicy}\n onPress={() => onSelect(option)}\n testID={testID ? `${testID}-option-${option}` : undefined}\n variant={selected ? 'soft' : 'ghost'}\n >\n {formatTime ? formatTime(option) : option}\n </Button>\n );\n}\n\n/*** Parses one HH:mm value to minutes since midnight. */\nfunction parseTimeToMinutes(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const match = /^(\\d{2}):(\\d{2})$/.exec(value);\n if (!match) return undefined;\n\n const hours = Number(match[1]);\n const minutes = Number(match[2]);\n if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return undefined;\n return hours * 60 + minutes;\n}\n\n/*** Formats minutes since midnight as HH:mm. */\nfunction formatMinutes(value: number): string {\n const hours = Math.floor(value / 60);\n const minutes = value % 60;\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n\n/*** Normalizes the configured time step to a positive whole minute. */\nfunction resolveStepMinutes(stepMinutes: number | undefined): number {\n if (stepMinutes === undefined || !Number.isFinite(stepMinutes) || stepMinutes <= 0) {\n return DEFAULT_STEP_MINUTES;\n }\n return Math.max(1, Math.floor(stepMinutes));\n}\n\n/*** Generates selectable HH:mm values within the configured range. */\nfunction generateTimeOptions({\n minTime,\n maxTime,\n stepMinutes,\n}: Pick<TimePickerProps, 'maxTime' | 'minTime' | 'stepMinutes'>): string[] {\n const step = resolveStepMinutes(stepMinutes);\n const min = parseTimeToMinutes(minTime) ?? 0;\n const max = parseTimeToMinutes(maxTime) ?? MINUTES_PER_DAY - 1;\n return Array.from({ length: Math.ceil(MINUTES_PER_DAY / step) }, (_, index) => index * step)\n .filter((minute) => minute >= min && minute <= max)\n .map(formatMinutes);\n}\n\nconst styles = StyleSheet.create({\n options: { maxHeight: 360 },\n});\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import type { TimePickerProps } from '../../../types/time-picker';
|
|
3
|
+
/*** Renders the shared TimePicker field frame around a platform-specific trigger. */
|
|
4
|
+
export declare function TimePickerField({ children, description, disabled, error, label, required, testID, }: TimePickerFieldProps): React.JSX.Element;
|
|
5
|
+
interface TimePickerFieldProps extends Pick<TimePickerProps, 'description' | 'disabled' | 'error' | 'label' | 'required' | 'testID'> {
|
|
6
|
+
children: React.ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=TimePickerField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerField.d.ts","sourceRoot":"","sources":["../../../../src/features/time-picker/composition/TimePickerField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlE,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,GACP,EAAE,oBAAoB,qBAatB;AAED,UAAU,oBAAqB,SAAQ,IAAI,CACzC,eAAe,EACf,aAAa,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CACvE;IACC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Field } from '@ankhorage/surface';
|
|
2
|
+
import { Stack } from '../../layout/public';
|
|
3
|
+
import { Text } from '../../typography/public';
|
|
4
|
+
/*** Renders the shared TimePicker field frame around a platform-specific trigger. */
|
|
5
|
+
export function TimePickerField({ children, description, disabled, error, label, required, testID, }) {
|
|
6
|
+
return (<Field disabled={disabled} errorText={error} invalid={Boolean(error)} label={label ? renderLabel(label, description) : undefined} required={required} testID={testID}>
|
|
7
|
+
{children}
|
|
8
|
+
</Field>);
|
|
9
|
+
}
|
|
10
|
+
/*** Renders the picker label and optional supporting description. */
|
|
11
|
+
function renderLabel(label, description) {
|
|
12
|
+
return (<Stack gap="xs">
|
|
13
|
+
<Text variant="label" weight="semiBold">
|
|
14
|
+
{label}
|
|
15
|
+
</Text>
|
|
16
|
+
{description ? (<Text emphasis="muted" variant="bodySmall">
|
|
17
|
+
{description}
|
|
18
|
+
</Text>) : null}
|
|
19
|
+
</Stack>);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=TimePickerField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerField.js","sourceRoot":"","sources":["../../../../src/features/time-picker/composition/TimePickerField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAI3C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,KAAK,EACL,KAAK,EACL,QAAQ,EACR,MAAM,GACe;IACrB,OAAO,CACL,CAAC,KAAK,CACJ,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,SAAS,CAAC,CAAC,KAAK,CAAC,CACjB,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CACxB,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAC3D,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,MAAM,CAAC,CAAC,MAAM,CAAC,CAEf;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,KAAK,CAAC,CACT,CAAC;AACJ,CAAC;AASD,qEAAqE;AACrE,SAAS,WAAW,CAAC,KAAsB,EAAE,WAAwC;IACnF,OAAO,CACL,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CACb;MAAA,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CACrC;QAAA,CAAC,KAAK,CACR;MAAA,EAAE,IAAI,CACN;MAAA,CAAC,WAAW,CAAC,CAAC,CAAC,CACb,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CACxC;UAAA,CAAC,WAAW,CACd;QAAA,EAAE,IAAI,CAAC,CACR,CAAC,CAAC,CAAC,IAAI,CACV;IAAA,EAAE,KAAK,CAAC,CACT,CAAC;AACJ,CAAC","sourcesContent":["import { Field } from '@ankhorage/surface';\nimport type React from 'react';\n\nimport type { TimePickerProps } from '../../../types/time-picker';\nimport { Stack } from '../../layout/public';\nimport { Text } from '../../typography/public';\n\n/*** Renders the shared TimePicker field frame around a platform-specific trigger. */\nexport function TimePickerField({\n children,\n description,\n disabled,\n error,\n label,\n required,\n testID,\n}: TimePickerFieldProps) {\n return (\n <Field\n disabled={disabled}\n errorText={error}\n invalid={Boolean(error)}\n label={label ? renderLabel(label, description) : undefined}\n required={required}\n testID={testID}\n >\n {children}\n </Field>\n );\n}\n\ninterface TimePickerFieldProps extends Pick<\n TimePickerProps,\n 'description' | 'disabled' | 'error' | 'label' | 'required' | 'testID'\n> {\n children: React.ReactNode;\n}\n\n/*** Renders the picker label and optional supporting description. */\nfunction renderLabel(label: React.ReactNode, description: React.ReactNode | undefined) {\n return (\n <Stack gap=\"xs\">\n <Text variant=\"label\" weight=\"semiBold\">\n {label}\n </Text>\n {description ? (\n <Text emphasis=\"muted\" variant=\"bodySmall\">\n {description}\n </Text>\n ) : null}\n </Stack>\n );\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TimePickerProps } from '../../../types/time-picker';
|
|
2
|
+
/*** Renders the shared TimePicker trigger button for native and web hosts. */
|
|
3
|
+
export declare function TimePickerTrigger({ disabled, formatTime, interactionPolicy, onPress, placeholder, testID, value, }: TimePickerTriggerProps): import("react").JSX.Element;
|
|
4
|
+
interface TimePickerTriggerProps extends Pick<TimePickerProps, 'disabled' | 'formatTime' | 'interactionPolicy' | 'placeholder' | 'testID' | 'value'> {
|
|
5
|
+
onPress: () => void;
|
|
6
|
+
}
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=TimePickerTrigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimePickerTrigger.d.ts","sourceRoot":"","sources":["../../../../src/features/time-picker/composition/TimePickerTrigger.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,OAAO,EACP,WAA2B,EAC3B,MAAM,EACN,KAAK,GACN,EAAE,sBAAsB,+BAexB;AAED,UAAU,sBAAuB,SAAQ,IAAI,CAC3C,eAAe,EACf,UAAU,GAAG,YAAY,GAAG,mBAAmB,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CACrF;IACC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Button } from '../../button/public';
|
|
2
|
+
/*** Renders the shared TimePicker trigger button for native and web hosts. */
|
|
3
|
+
export function TimePickerTrigger({ disabled, formatTime, interactionPolicy, onPress, placeholder = 'Choose time', testID, value, }) {
|
|
4
|
+
const displayValue = value ? (formatTime ? formatTime(value) : value) : placeholder;
|
|
5
|
+
return (<Button disabled={disabled} interactionPolicy={interactionPolicy} onPress={onPress} testID={testID ? `${testID}-trigger` : undefined} trailingIcon={{ name: 'chevron-down-outline' }} variant="outline">
|
|
6
|
+
{displayValue}
|
|
7
|
+
</Button>);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=TimePickerTrigger.js.map
|