@ankhorage/zora 2.7.3 → 2.8.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 +12 -0
- package/README.md +1 -1
- package/dist/components/heading/Heading.d.ts.map +1 -1
- package/dist/components/heading/Heading.js +27 -11
- package/dist/components/heading/Heading.js.map +1 -1
- package/dist/components/heading/types.d.ts +2 -1
- package/dist/components/heading/types.d.ts.map +1 -1
- package/dist/components/heading/types.js.map +1 -1
- package/dist/components/text/Text.d.ts +1 -1
- package/dist/components/text/Text.d.ts.map +1 -1
- package/dist/components/text/Text.js +16 -4
- package/dist/components/text/Text.js.map +1 -1
- package/dist/components/text/types.d.ts +2 -1
- package/dist/components/text/types.d.ts.map +1 -1
- package/dist/components/text/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/metadata/componentMeta.d.ts.map +1 -1
- package/dist/metadata/componentMeta.js +2 -0
- package/dist/metadata/componentMeta.js.map +1 -1
- package/dist/metadata/types.d.ts +2 -1
- package/dist/metadata/types.d.ts.map +1 -1
- package/dist/metadata/types.js.map +1 -1
- package/dist/patterns/disclosure-section/DisclosureSection.d.ts.map +1 -1
- package/dist/patterns/disclosure-section/DisclosureSection.js +11 -2
- package/dist/patterns/disclosure-section/DisclosureSection.js.map +1 -1
- package/dist/patterns/product-card/ProductCard.d.ts +5 -0
- package/dist/patterns/product-card/ProductCard.d.ts.map +1 -0
- package/dist/patterns/product-card/ProductCard.js +70 -0
- package/dist/patterns/product-card/ProductCard.js.map +1 -0
- package/dist/patterns/product-card/index.d.ts +3 -0
- package/dist/patterns/product-card/index.d.ts.map +1 -0
- package/dist/patterns/product-card/index.js +2 -0
- package/dist/patterns/product-card/index.js.map +1 -0
- package/dist/patterns/product-card/meta.d.ts +110 -0
- package/dist/patterns/product-card/meta.d.ts.map +1 -0
- package/dist/patterns/product-card/meta.js +110 -0
- package/dist/patterns/product-card/meta.js.map +1 -0
- package/dist/patterns/product-card/types.d.ts +22 -0
- package/dist/patterns/product-card/types.d.ts.map +1 -0
- package/dist/patterns/product-card/types.js +2 -0
- package/dist/patterns/product-card/types.js.map +1 -0
- package/dist/patterns/scanner/meta.d.ts +13 -0
- package/dist/patterns/scanner/meta.d.ts.map +1 -1
- package/dist/patterns/scanner/meta.js +7 -0
- package/dist/patterns/scanner/meta.js.map +1 -1
- package/package.json +2 -2
- package/src/components/heading/Heading.tsx +28 -10
- package/src/components/heading/types.ts +2 -1
- package/src/components/text/Text.tsx +17 -3
- package/src/components/text/types.ts +2 -1
- package/src/index.ts +2 -0
- package/src/metadata/componentMeta.test.ts +21 -0
- package/src/metadata/componentMeta.ts +2 -0
- package/src/metadata/types.ts +2 -1
- package/src/patterns/disclosure-section/DisclosureSection.tsx +13 -3
- package/src/patterns/product-card/ProductCard.test.tsx +19 -0
- package/src/patterns/product-card/ProductCard.tsx +125 -0
- package/src/patterns/product-card/index.ts +2 -0
- package/src/patterns/product-card/meta.ts +111 -0
- package/src/patterns/product-card/types.ts +21 -0
- package/src/patterns/scanner/meta.ts +7 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/metadata/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ComponentEventDtoKind } from '@ankhorage/contracts';\n\nexport type ZoraComponentCategory = 'foundation' | 'component' | 'pattern' | 'layout';\n\nexport type ZoraComponentPropType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'enum'\n | 'color'\n | 'spacing'\n | 'radius'\n | 'shadow'\n | 'typographySize'\n | 'typographyWeight'\n | 'action'\n | 'imageAsset'\n | 'array';\n\nexport type ZoraComponentPropValue =\n | string\n | number\n | boolean\n | null\n | readonly ZoraComponentPropValue[]\n | { readonly [key: string]: ZoraComponentPropValue };\n\nexport interface ZoraComponentPropArrayItemSchema {\n key: string;\n schema: ZoraComponentPropSchema;\n}\n\nexport interface ZoraComponentPropSchema {\n type: ZoraComponentPropType;\n category: string;\n label?: string;\n enum?: readonly (string | number)[];\n default?: ZoraComponentPropValue;\n itemSchema?: readonly ZoraComponentPropArrayItemSchema[];\n}\n\nexport interface ZoraComponentBlueprint {\n label: string;\n icon?: {\n name: string;\n provider?: string;\n };\n defaultProps?: Readonly<Record<string, ZoraComponentPropValue>>;\n}\n\nexport interface ZoraComponentI18nMeta {\n fields: readonly {\n keyProp: string;\n defaultTextProp: string;\n }[];\n}\n\nexport type ZoraComponentEventPayloadKind = ComponentEventDtoKind | (string & {});\n\nexport type ZoraComponentEventPayloadFieldType =\n | 'boolean'\n | 'number'\n | 'object'\n | 'record'\n | 'string'\n | 'unknown';\n\nexport interface ZoraComponentEventPayloadFieldMeta {\n readonly path: string;\n readonly type: ZoraComponentEventPayloadFieldType;\n readonly label?: string;\n readonly description?: string;\n}\n\nexport interface ZoraComponentEventMeta {\n readonly label: string;\n readonly eventType: ZoraComponentEventPayloadKind;\n readonly description?: string;\n readonly payloadFields?: readonly ZoraComponentEventPayloadFieldMeta[];\n}\n\nexport interface ZoraComponentSlotMeta {\n label?: string;\n allowedChildren?: readonly string[];\n}\n\nexport interface ZoraComponentMeta {\n name: string;\n category: ZoraComponentCategory;\n description?: string;\n directManifestNode: boolean;\n allowedChildren: readonly string[];\n blueprint?: ZoraComponentBlueprint;\n events?: Readonly<Record<string, ZoraComponentEventMeta>>;\n i18n?: ZoraComponentI18nMeta;\n slots?: Readonly<Record<string, ZoraComponentSlotMeta>>;\n note?: string;\n props: Readonly<Record<string, ZoraComponentPropSchema>>;\n}\n\nexport type ZoraComponentMetaRegistry = Readonly<Record<string, ZoraComponentMeta>>;\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/metadata/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ComponentEventDtoKind, ComponentRequirements } from '@ankhorage/contracts';\n\nexport type ZoraComponentCategory = 'foundation' | 'component' | 'pattern' | 'layout';\n\nexport type ZoraComponentPropType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'enum'\n | 'color'\n | 'spacing'\n | 'radius'\n | 'shadow'\n | 'typographySize'\n | 'typographyWeight'\n | 'action'\n | 'imageAsset'\n | 'array';\n\nexport type ZoraComponentPropValue =\n | string\n | number\n | boolean\n | null\n | readonly ZoraComponentPropValue[]\n | { readonly [key: string]: ZoraComponentPropValue };\n\nexport interface ZoraComponentPropArrayItemSchema {\n key: string;\n schema: ZoraComponentPropSchema;\n}\n\nexport interface ZoraComponentPropSchema {\n type: ZoraComponentPropType;\n category: string;\n label?: string;\n enum?: readonly (string | number)[];\n default?: ZoraComponentPropValue;\n itemSchema?: readonly ZoraComponentPropArrayItemSchema[];\n}\n\nexport interface ZoraComponentBlueprint {\n label: string;\n icon?: {\n name: string;\n provider?: string;\n };\n defaultProps?: Readonly<Record<string, ZoraComponentPropValue>>;\n}\n\nexport interface ZoraComponentI18nMeta {\n fields: readonly {\n keyProp: string;\n defaultTextProp: string;\n }[];\n}\n\nexport type ZoraComponentEventPayloadKind = ComponentEventDtoKind | (string & {});\n\nexport type ZoraComponentEventPayloadFieldType =\n | 'boolean'\n | 'number'\n | 'object'\n | 'record'\n | 'string'\n | 'unknown';\n\nexport interface ZoraComponentEventPayloadFieldMeta {\n readonly path: string;\n readonly type: ZoraComponentEventPayloadFieldType;\n readonly label?: string;\n readonly description?: string;\n}\n\nexport interface ZoraComponentEventMeta {\n readonly label: string;\n readonly eventType: ZoraComponentEventPayloadKind;\n readonly description?: string;\n readonly payloadFields?: readonly ZoraComponentEventPayloadFieldMeta[];\n}\n\nexport interface ZoraComponentSlotMeta {\n label?: string;\n allowedChildren?: readonly string[];\n}\n\nexport interface ZoraComponentMeta {\n name: string;\n category: ZoraComponentCategory;\n description?: string;\n directManifestNode: boolean;\n allowedChildren: readonly string[];\n requirements?: ComponentRequirements;\n blueprint?: ZoraComponentBlueprint;\n events?: Readonly<Record<string, ZoraComponentEventMeta>>;\n i18n?: ZoraComponentI18nMeta;\n slots?: Readonly<Record<string, ZoraComponentSlotMeta>>;\n note?: string;\n props: Readonly<Record<string, ZoraComponentPropSchema>>;\n}\n\nexport type ZoraComponentMetaRegistry = Readonly<Record<string, ZoraComponentMeta>>;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisclosureSection.d.ts","sourceRoot":"","sources":["../../../src/patterns/disclosure-section/DisclosureSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DisclosureSection.d.ts","sourceRoot":"","sources":["../../../src/patterns/disclosure-section/DisclosureSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAgHtD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,8DAA6C,CAAC"}
|
|
@@ -8,6 +8,12 @@ import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
|
|
|
8
8
|
import { Panel } from '../panel';
|
|
9
9
|
const triggerTextStyle = {
|
|
10
10
|
flex: 1,
|
|
11
|
+
flexBasis: 0,
|
|
12
|
+
minWidth: 0,
|
|
13
|
+
};
|
|
14
|
+
const triggerCopyStyle = {
|
|
15
|
+
flexShrink: 1,
|
|
16
|
+
maxWidth: '100%',
|
|
11
17
|
minWidth: 0,
|
|
12
18
|
};
|
|
13
19
|
const trailingStyle = {
|
|
@@ -16,6 +22,7 @@ const trailingStyle = {
|
|
|
16
22
|
const getTriggerStyle = (disabled) => ({
|
|
17
23
|
alignSelf: 'stretch',
|
|
18
24
|
flex: 1,
|
|
25
|
+
flexBasis: 0,
|
|
19
26
|
justifyContent: 'center',
|
|
20
27
|
minWidth: 0,
|
|
21
28
|
...(Platform.OS === 'web'
|
|
@@ -48,8 +55,10 @@ function DisclosureSectionInner({ themeId: _themeId, mode: _mode, title, descrip
|
|
|
48
55
|
<Box style={triggerTextStyle}>
|
|
49
56
|
<Stack gap="xs">
|
|
50
57
|
{icon ? <Box pb="xs">{/* Surface icon spec would go here */}</Box> : null}
|
|
51
|
-
<Heading level={4}
|
|
52
|
-
|
|
58
|
+
<Heading level={4} style={triggerCopyStyle}>
|
|
59
|
+
{title}
|
|
60
|
+
</Heading>
|
|
61
|
+
{description ? (<Text emphasis="muted" variant="bodySmall" style={triggerCopyStyle}>
|
|
53
62
|
{description}
|
|
54
63
|
</Text>) : null}
|
|
55
64
|
</Stack>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisclosureSection.js","sourceRoot":"","sources":["../../../src/patterns/disclosure-section/DisclosureSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"DisclosureSection.js","sourceRoot":"","sources":["../../../src/patterns/disclosure-section/DisclosureSection.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Platform, Pressable, type TextStyle, type ViewStyle } from 'react-native';\n\nimport { Heading } from '../../components/heading';\nimport { IconButton } from '../../components/icon-button';\nimport { Text } from '../../components/text';\nimport { Box, Stack } from '../../foundation';\nimport { withZoraThemeScope } from '../../theme/withZoraThemeScope';\nimport { Panel } from '../panel';\nimport type { DisclosureSectionProps } from './types';\n\nconst triggerTextStyle: ViewStyle = {\n flex: 1,\n flexBasis: 0,\n minWidth: 0,\n};\n\nconst triggerCopyStyle: TextStyle = {\n flexShrink: 1,\n maxWidth: '100%',\n minWidth: 0,\n};\n\nconst trailingStyle: ViewStyle = {\n flexShrink: 0,\n};\n\nconst getTriggerStyle = (disabled?: boolean): ViewStyle =>\n ({\n alignSelf: 'stretch',\n flex: 1,\n flexBasis: 0,\n justifyContent: 'center',\n minWidth: 0,\n ...(Platform.OS === 'web'\n ? {\n cursor: disabled ? 'default' : 'pointer',\n }\n : null),\n }) as ViewStyle;\n\nfunction DisclosureSectionInner({\n themeId: _themeId,\n mode: _mode,\n title,\n description,\n icon,\n defaultOpen = true,\n open: controlledOpen,\n onOpenChange,\n actions,\n children,\n disabled,\n testID,\n}: DisclosureSectionProps) {\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n const titleLabel = typeof title === 'string' || typeof title === 'number' ? `: ${title}` : '';\n const toggleLabel = `${isOpen ? 'Collapse' : 'Expand'} section${titleLabel}`;\n\n const toggleOpen = () => {\n if (disabled) return;\n\n if (isControlled) {\n onOpenChange?.(!controlledOpen);\n } else {\n setInternalOpen(!internalOpen);\n onOpenChange?.(!internalOpen);\n }\n };\n\n return (\n <Panel compact testID={testID}>\n <Stack gap=\"s\">\n <Stack direction=\"row\" gap=\"m\" align=\"center\">\n <Pressable\n accessibilityLabel={toggleLabel}\n accessibilityRole=\"button\"\n accessibilityState={{ disabled, expanded: isOpen }}\n disabled={disabled}\n onPress={toggleOpen}\n style={getTriggerStyle(disabled)}\n >\n <Box style={triggerTextStyle}>\n <Stack gap=\"xs\">\n {icon ? <Box pb=\"xs\">{/* Surface icon spec would go here */}</Box> : null}\n <Heading level={4} style={triggerCopyStyle}>\n {title}\n </Heading>\n {description ? (\n <Text emphasis=\"muted\" variant=\"bodySmall\" style={triggerCopyStyle}>\n {description}\n </Text>\n ) : null}\n </Stack>\n </Box>\n </Pressable>\n\n {actions ? <Box style={trailingStyle}>{actions}</Box> : null}\n\n <Box style={trailingStyle}>\n <IconButton\n icon={{ name: isOpen ? 'chevron-up-outline' : 'chevron-down-outline' }}\n label={isOpen ? 'Collapse' : 'Expand'}\n variant=\"ghost\"\n color=\"neutral\"\n size=\"s\"\n disabled={disabled}\n onPress={toggleOpen}\n />\n </Box>\n </Stack>\n\n {isOpen ? <Box pt=\"m\">{children}</Box> : null}\n </Stack>\n </Panel>\n );\n}\n\n/***\n * Expandable section pattern with a summary header and collapsible content.\n *\n\n */\nexport const DisclosureSection = withZoraThemeScope(DisclosureSectionInner);\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';
|
|
3
|
+
import type { ProductCardProps } from './types';
|
|
4
|
+
export declare const ProductCard: (props: ProductCardProps & ZoraBaseProps) => React.ReactElement | null;
|
|
5
|
+
//# sourceMappingURL=ProductCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductCard.d.ts","sourceRoot":"","sources":["../../../src/patterns/product-card/ProductCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAiHhD,eAAO,MAAM,WAAW,wEAAuC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Badge } from '../../components/badge';
|
|
3
|
+
import { Button } from '../../components/button';
|
|
4
|
+
import { Card } from '../../components/card';
|
|
5
|
+
import { Heading } from '../../components/heading';
|
|
6
|
+
import { Image } from '../../components/image';
|
|
7
|
+
import { Text } from '../../components/text';
|
|
8
|
+
import { Divider, Inline, Stack } from '../../foundation';
|
|
9
|
+
import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
|
|
10
|
+
function ProductCardInner({ title, subtitle, description, brand, vendor: _vendor, imageUrl, imageAlt, price, currency, badges, meta, primaryActionLabel, secondaryActionLabel, onPress, onPrimaryAction, onSecondaryAction, ...rest }) {
|
|
11
|
+
const hasHeaderInfo = !!title || !!brand || !!subtitle;
|
|
12
|
+
const hasMeta = !!meta && meta.length > 0;
|
|
13
|
+
const hasActions = !!primaryActionLabel || !!secondaryActionLabel;
|
|
14
|
+
const isInteractive = Boolean(onPress);
|
|
15
|
+
const eyebrow = brand ?? _vendor;
|
|
16
|
+
return (<Card onPress={isInteractive ? onPress : undefined} {...rest}>
|
|
17
|
+
<Stack gap="m">
|
|
18
|
+
{imageUrl ? (<Image accessibilityLabel={imageAlt ?? title} source={{ uri: imageUrl }} aspectRatio={1} radius="m"/>) : null}
|
|
19
|
+
|
|
20
|
+
<Stack gap="s">
|
|
21
|
+
{hasHeaderInfo ? (<Stack gap="xxs">
|
|
22
|
+
{eyebrow ? (<Text variant="caption" weight="semiBold" emphasis="muted">
|
|
23
|
+
{eyebrow}
|
|
24
|
+
</Text>) : null}
|
|
25
|
+
<Heading level={4}>{title}</Heading>
|
|
26
|
+
{subtitle ? (<Text variant="bodySmall" emphasis="muted">
|
|
27
|
+
{subtitle}
|
|
28
|
+
</Text>) : null}
|
|
29
|
+
</Stack>) : null}
|
|
30
|
+
|
|
31
|
+
{description ? <Text variant="bodySmall">{description}</Text> : null}
|
|
32
|
+
|
|
33
|
+
{badges && badges.length > 0 ? (<Inline gap="xs" wrap="wrap">
|
|
34
|
+
{badges.map((badge, index) => (<Badge key={`${badge}-${index}`}>{badge}</Badge>))}
|
|
35
|
+
</Inline>) : null}
|
|
36
|
+
</Stack>
|
|
37
|
+
|
|
38
|
+
{price ? (<Text variant="bodySmall" weight="bold">
|
|
39
|
+
{currency ? `${currency} ` : ''}
|
|
40
|
+
{price}
|
|
41
|
+
</Text>) : null}
|
|
42
|
+
|
|
43
|
+
{hasMeta ? (<Stack gap="xs">
|
|
44
|
+
<Divider />
|
|
45
|
+
{meta.map((item, index) => (<Inline key={`${item.label}-${index}`} justify="space-between">
|
|
46
|
+
<Text variant="bodySmall" emphasis="muted">
|
|
47
|
+
{item.label}
|
|
48
|
+
</Text>
|
|
49
|
+
<Text variant="bodySmall" weight="semiBold">
|
|
50
|
+
{item.value}
|
|
51
|
+
</Text>
|
|
52
|
+
</Inline>))}
|
|
53
|
+
</Stack>) : null}
|
|
54
|
+
|
|
55
|
+
{hasActions ? (<Stack gap="s">
|
|
56
|
+
<Divider />
|
|
57
|
+
<Inline gap="s">
|
|
58
|
+
{secondaryActionLabel ? (<Button variant="ghost" onPress={onSecondaryAction} size="s">
|
|
59
|
+
{secondaryActionLabel}
|
|
60
|
+
</Button>) : null}
|
|
61
|
+
{primaryActionLabel ? (<Button variant="solid" onPress={onPrimaryAction} size="s" flex={1}>
|
|
62
|
+
{primaryActionLabel}
|
|
63
|
+
</Button>) : null}
|
|
64
|
+
</Inline>
|
|
65
|
+
</Stack>) : null}
|
|
66
|
+
</Stack>
|
|
67
|
+
</Card>);
|
|
68
|
+
}
|
|
69
|
+
export const ProductCard = withZoraThemeScope(ProductCardInner);
|
|
70
|
+
//# sourceMappingURL=ProductCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductCard.js","sourceRoot":"","sources":["../../../src/patterns/product-card/ProductCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport { Badge } from '../../components/badge';\nimport { Button } from '../../components/button';\nimport { Card } from '../../components/card';\nimport { Heading } from '../../components/heading';\nimport { Image } from '../../components/image';\nimport { Text } from '../../components/text';\nimport { Divider, Inline, Stack } from '../../foundation';\nimport { withZoraThemeScope } from '../../theme/withZoraThemeScope';\nimport type { ZoraBaseProps } from '../../theme/ZoraBaseProps';\nimport type { ProductCardProps } from './types';\n\nfunction ProductCardInner({\n title,\n subtitle,\n description,\n brand,\n vendor: _vendor,\n imageUrl,\n imageAlt,\n price,\n currency,\n badges,\n meta,\n primaryActionLabel,\n secondaryActionLabel,\n onPress,\n onPrimaryAction,\n onSecondaryAction,\n ...rest\n}: ProductCardProps & ZoraBaseProps) {\n const hasHeaderInfo = !!title || !!brand || !!subtitle;\n const hasMeta = !!meta && meta.length > 0;\n const hasActions = !!primaryActionLabel || !!secondaryActionLabel;\n const isInteractive = Boolean(onPress);\n\n const eyebrow = brand ?? _vendor;\n\n return (\n <Card onPress={isInteractive ? onPress : undefined} {...rest}>\n <Stack gap=\"m\">\n {imageUrl ? (\n <Image\n accessibilityLabel={imageAlt ?? title}\n source={{ uri: imageUrl }}\n aspectRatio={1}\n radius=\"m\"\n />\n ) : null}\n\n <Stack gap=\"s\">\n {hasHeaderInfo ? (\n <Stack gap=\"xxs\">\n {eyebrow ? (\n <Text variant=\"caption\" weight=\"semiBold\" emphasis=\"muted\">\n {eyebrow}\n </Text>\n ) : null}\n <Heading level={4}>{title}</Heading>\n {subtitle ? (\n <Text variant=\"bodySmall\" emphasis=\"muted\">\n {subtitle}\n </Text>\n ) : null}\n </Stack>\n ) : null}\n\n {description ? <Text variant=\"bodySmall\">{description}</Text> : null}\n\n {badges && badges.length > 0 ? (\n <Inline gap=\"xs\" wrap=\"wrap\">\n {badges.map((badge, index) => (\n <Badge key={`${badge}-${index}`}>{badge}</Badge>\n ))}\n </Inline>\n ) : null}\n </Stack>\n\n {price ? (\n <Text variant=\"bodySmall\" weight=\"bold\">\n {currency ? `${currency} ` : ''}\n {price}\n </Text>\n ) : null}\n\n {hasMeta ? (\n <Stack gap=\"xs\">\n <Divider />\n {meta.map((item, index) => (\n <Inline key={`${item.label}-${index}`} justify=\"space-between\">\n <Text variant=\"bodySmall\" emphasis=\"muted\">\n {item.label}\n </Text>\n <Text variant=\"bodySmall\" weight=\"semiBold\">\n {item.value}\n </Text>\n </Inline>\n ))}\n </Stack>\n ) : null}\n\n {hasActions ? (\n <Stack gap=\"s\">\n <Divider />\n <Inline gap=\"s\">\n {secondaryActionLabel ? (\n <Button variant=\"ghost\" onPress={onSecondaryAction} size=\"s\">\n {secondaryActionLabel}\n </Button>\n ) : null}\n {primaryActionLabel ? (\n <Button variant=\"solid\" onPress={onPrimaryAction} size=\"s\" flex={1}>\n {primaryActionLabel}\n </Button>\n ) : null}\n </Inline>\n </Stack>\n ) : null}\n </Stack>\n </Card>\n );\n}\n\nexport const ProductCard = withZoraThemeScope(ProductCardInner);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/patterns/product-card/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/patterns/product-card/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC","sourcesContent":["export { ProductCard } from './ProductCard';\nexport type { ProductCardProps } from './types';\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export declare const productCardMeta: {
|
|
2
|
+
readonly name: "ProductCard";
|
|
3
|
+
readonly category: "pattern";
|
|
4
|
+
readonly description: "A generic card for displaying product or article information.";
|
|
5
|
+
readonly directManifestNode: true;
|
|
6
|
+
readonly allowedChildren: readonly [];
|
|
7
|
+
readonly events: {
|
|
8
|
+
readonly press: {
|
|
9
|
+
readonly label: "Press";
|
|
10
|
+
readonly eventType: "productCard.press";
|
|
11
|
+
readonly description: "Emitted when the product card is pressed.";
|
|
12
|
+
readonly payloadFields: readonly [];
|
|
13
|
+
};
|
|
14
|
+
readonly primaryAction: {
|
|
15
|
+
readonly label: "Primary action";
|
|
16
|
+
readonly eventType: "productCard.primaryAction";
|
|
17
|
+
readonly description: "Emitted when the primary product card action is pressed.";
|
|
18
|
+
readonly payloadFields: readonly [];
|
|
19
|
+
};
|
|
20
|
+
readonly secondaryAction: {
|
|
21
|
+
readonly label: "Secondary action";
|
|
22
|
+
readonly eventType: "productCard.secondaryAction";
|
|
23
|
+
readonly description: "Emitted when the secondary product card action is pressed.";
|
|
24
|
+
readonly payloadFields: readonly [];
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
readonly props: {
|
|
28
|
+
readonly title: {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
readonly category: "Content";
|
|
31
|
+
readonly label: "Title";
|
|
32
|
+
};
|
|
33
|
+
readonly subtitle: {
|
|
34
|
+
readonly type: "string";
|
|
35
|
+
readonly category: "Content";
|
|
36
|
+
readonly label: "Subtitle";
|
|
37
|
+
};
|
|
38
|
+
readonly description: {
|
|
39
|
+
readonly type: "string";
|
|
40
|
+
readonly category: "Content";
|
|
41
|
+
readonly label: "Description";
|
|
42
|
+
};
|
|
43
|
+
readonly brand: {
|
|
44
|
+
readonly type: "string";
|
|
45
|
+
readonly category: "Content";
|
|
46
|
+
readonly label: "Brand";
|
|
47
|
+
};
|
|
48
|
+
readonly vendor: {
|
|
49
|
+
readonly type: "string";
|
|
50
|
+
readonly category: "Content";
|
|
51
|
+
readonly label: "Vendor";
|
|
52
|
+
};
|
|
53
|
+
readonly imageUrl: {
|
|
54
|
+
readonly type: "string";
|
|
55
|
+
readonly category: "Content";
|
|
56
|
+
readonly label: "Image URL";
|
|
57
|
+
};
|
|
58
|
+
readonly imageAlt: {
|
|
59
|
+
readonly type: "string";
|
|
60
|
+
readonly category: "Content";
|
|
61
|
+
readonly label: "Image Alt Text";
|
|
62
|
+
};
|
|
63
|
+
readonly price: {
|
|
64
|
+
readonly type: "string";
|
|
65
|
+
readonly category: "Content";
|
|
66
|
+
readonly label: "Price";
|
|
67
|
+
};
|
|
68
|
+
readonly currency: {
|
|
69
|
+
readonly type: "string";
|
|
70
|
+
readonly category: "Content";
|
|
71
|
+
readonly label: "Currency";
|
|
72
|
+
};
|
|
73
|
+
readonly badges: {
|
|
74
|
+
readonly type: "array";
|
|
75
|
+
readonly category: "Content";
|
|
76
|
+
readonly label: "Badges";
|
|
77
|
+
};
|
|
78
|
+
readonly meta: {
|
|
79
|
+
readonly type: "array";
|
|
80
|
+
readonly category: "Content";
|
|
81
|
+
readonly label: "Meta";
|
|
82
|
+
};
|
|
83
|
+
readonly primaryActionLabel: {
|
|
84
|
+
readonly type: "string";
|
|
85
|
+
readonly category: "Content";
|
|
86
|
+
readonly label: "Primary Action Label";
|
|
87
|
+
};
|
|
88
|
+
readonly secondaryActionLabel: {
|
|
89
|
+
readonly type: "string";
|
|
90
|
+
readonly category: "Content";
|
|
91
|
+
readonly label: "Secondary Action Label";
|
|
92
|
+
};
|
|
93
|
+
readonly onPress: {
|
|
94
|
+
readonly type: "action";
|
|
95
|
+
readonly category: "Events";
|
|
96
|
+
readonly label: "Press action";
|
|
97
|
+
};
|
|
98
|
+
readonly onPrimaryAction: {
|
|
99
|
+
readonly type: "action";
|
|
100
|
+
readonly category: "Events";
|
|
101
|
+
readonly label: "Primary action";
|
|
102
|
+
};
|
|
103
|
+
readonly onSecondaryAction: {
|
|
104
|
+
readonly type: "action";
|
|
105
|
+
readonly category: "Events";
|
|
106
|
+
readonly label: "Secondary action";
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/patterns/product-card/meta.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4GU,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export const productCardMeta = {
|
|
2
|
+
name: 'ProductCard',
|
|
3
|
+
category: 'pattern',
|
|
4
|
+
description: 'A generic card for displaying product or article information.',
|
|
5
|
+
directManifestNode: true,
|
|
6
|
+
allowedChildren: [],
|
|
7
|
+
events: {
|
|
8
|
+
press: {
|
|
9
|
+
label: 'Press',
|
|
10
|
+
eventType: 'productCard.press',
|
|
11
|
+
description: 'Emitted when the product card is pressed.',
|
|
12
|
+
payloadFields: [],
|
|
13
|
+
},
|
|
14
|
+
primaryAction: {
|
|
15
|
+
label: 'Primary action',
|
|
16
|
+
eventType: 'productCard.primaryAction',
|
|
17
|
+
description: 'Emitted when the primary product card action is pressed.',
|
|
18
|
+
payloadFields: [],
|
|
19
|
+
},
|
|
20
|
+
secondaryAction: {
|
|
21
|
+
label: 'Secondary action',
|
|
22
|
+
eventType: 'productCard.secondaryAction',
|
|
23
|
+
description: 'Emitted when the secondary product card action is pressed.',
|
|
24
|
+
payloadFields: [],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
props: {
|
|
28
|
+
title: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
category: 'Content',
|
|
31
|
+
label: 'Title',
|
|
32
|
+
},
|
|
33
|
+
subtitle: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
category: 'Content',
|
|
36
|
+
label: 'Subtitle',
|
|
37
|
+
},
|
|
38
|
+
description: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
category: 'Content',
|
|
41
|
+
label: 'Description',
|
|
42
|
+
},
|
|
43
|
+
brand: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
category: 'Content',
|
|
46
|
+
label: 'Brand',
|
|
47
|
+
},
|
|
48
|
+
vendor: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
category: 'Content',
|
|
51
|
+
label: 'Vendor',
|
|
52
|
+
},
|
|
53
|
+
imageUrl: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
category: 'Content',
|
|
56
|
+
label: 'Image URL',
|
|
57
|
+
},
|
|
58
|
+
imageAlt: {
|
|
59
|
+
type: 'string',
|
|
60
|
+
category: 'Content',
|
|
61
|
+
label: 'Image Alt Text',
|
|
62
|
+
},
|
|
63
|
+
price: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
category: 'Content',
|
|
66
|
+
label: 'Price',
|
|
67
|
+
},
|
|
68
|
+
currency: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
category: 'Content',
|
|
71
|
+
label: 'Currency',
|
|
72
|
+
},
|
|
73
|
+
badges: {
|
|
74
|
+
type: 'array',
|
|
75
|
+
category: 'Content',
|
|
76
|
+
label: 'Badges',
|
|
77
|
+
},
|
|
78
|
+
meta: {
|
|
79
|
+
type: 'array',
|
|
80
|
+
category: 'Content',
|
|
81
|
+
label: 'Meta',
|
|
82
|
+
},
|
|
83
|
+
primaryActionLabel: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
category: 'Content',
|
|
86
|
+
label: 'Primary Action Label',
|
|
87
|
+
},
|
|
88
|
+
secondaryActionLabel: {
|
|
89
|
+
type: 'string',
|
|
90
|
+
category: 'Content',
|
|
91
|
+
label: 'Secondary Action Label',
|
|
92
|
+
},
|
|
93
|
+
onPress: {
|
|
94
|
+
type: 'action',
|
|
95
|
+
category: 'Events',
|
|
96
|
+
label: 'Press action',
|
|
97
|
+
},
|
|
98
|
+
onPrimaryAction: {
|
|
99
|
+
type: 'action',
|
|
100
|
+
category: 'Events',
|
|
101
|
+
label: 'Primary action',
|
|
102
|
+
},
|
|
103
|
+
onSecondaryAction: {
|
|
104
|
+
type: 'action',
|
|
105
|
+
category: 'Events',
|
|
106
|
+
label: 'Secondary action',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=meta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/patterns/product-card/meta.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,SAAS;IACnB,WAAW,EAAE,+DAA+D;IAC5E,kBAAkB,EAAE,IAAI;IACxB,eAAe,EAAE,EAAE;IACnB,MAAM,EAAE;QACN,KAAK,EAAE;YACL,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,mBAAmB;YAC9B,WAAW,EAAE,2CAA2C;YACxD,aAAa,EAAE,EAAE;SAClB;QACD,aAAa,EAAE;YACb,KAAK,EAAE,gBAAgB;YACvB,SAAS,EAAE,2BAA2B;YACtC,WAAW,EAAE,0DAA0D;YACvE,aAAa,EAAE,EAAE;SAClB;QACD,eAAe,EAAE;YACf,KAAK,EAAE,kBAAkB;YACzB,SAAS,EAAE,6BAA6B;YACxC,WAAW,EAAE,4DAA4D;YACzE,aAAa,EAAE,EAAE;SAClB;KACF;IACD,KAAK,EAAE;QACL,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,OAAO;SACf;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,UAAU;SAClB;QACD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,aAAa;SACrB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,OAAO;SACf;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,QAAQ;SAChB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,WAAW;SACnB;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,gBAAgB;SACxB;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,OAAO;SACf;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,UAAU;SAClB;QACD,MAAM,EAAE;YACN,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,QAAQ;SAChB;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,MAAM;SACd;QACD,kBAAkB,EAAE;YAClB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,sBAAsB;SAC9B;QACD,oBAAoB,EAAE;YACpB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,wBAAwB;SAChC;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,cAAc;SACtB;QACD,eAAe,EAAE;YACf,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,gBAAgB;SACxB;QACD,iBAAiB,EAAE;YACjB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,kBAAkB;SAC1B;KACF;CACmC,CAAC","sourcesContent":["import type { ZoraComponentMeta } from '../../metadata';\n\nexport const productCardMeta = {\n name: 'ProductCard',\n category: 'pattern',\n description: 'A generic card for displaying product or article information.',\n directManifestNode: true,\n allowedChildren: [],\n events: {\n press: {\n label: 'Press',\n eventType: 'productCard.press',\n description: 'Emitted when the product card is pressed.',\n payloadFields: [],\n },\n primaryAction: {\n label: 'Primary action',\n eventType: 'productCard.primaryAction',\n description: 'Emitted when the primary product card action is pressed.',\n payloadFields: [],\n },\n secondaryAction: {\n label: 'Secondary action',\n eventType: 'productCard.secondaryAction',\n description: 'Emitted when the secondary product card action is pressed.',\n payloadFields: [],\n },\n },\n props: {\n title: {\n type: 'string',\n category: 'Content',\n label: 'Title',\n },\n subtitle: {\n type: 'string',\n category: 'Content',\n label: 'Subtitle',\n },\n description: {\n type: 'string',\n category: 'Content',\n label: 'Description',\n },\n brand: {\n type: 'string',\n category: 'Content',\n label: 'Brand',\n },\n vendor: {\n type: 'string',\n category: 'Content',\n label: 'Vendor',\n },\n imageUrl: {\n type: 'string',\n category: 'Content',\n label: 'Image URL',\n },\n imageAlt: {\n type: 'string',\n category: 'Content',\n label: 'Image Alt Text',\n },\n price: {\n type: 'string',\n category: 'Content',\n label: 'Price',\n },\n currency: {\n type: 'string',\n category: 'Content',\n label: 'Currency',\n },\n badges: {\n type: 'array',\n category: 'Content',\n label: 'Badges',\n },\n meta: {\n type: 'array',\n category: 'Content',\n label: 'Meta',\n },\n primaryActionLabel: {\n type: 'string',\n category: 'Content',\n label: 'Primary Action Label',\n },\n secondaryActionLabel: {\n type: 'string',\n category: 'Content',\n label: 'Secondary Action Label',\n },\n onPress: {\n type: 'action',\n category: 'Events',\n label: 'Press action',\n },\n onPrimaryAction: {\n type: 'action',\n category: 'Events',\n label: 'Primary action',\n },\n onSecondaryAction: {\n type: 'action',\n category: 'Events',\n label: 'Secondary action',\n },\n },\n} as const satisfies ZoraComponentMeta;\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface ProductCardProps {
|
|
2
|
+
title: string;
|
|
3
|
+
subtitle?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
brand?: string;
|
|
6
|
+
vendor?: string;
|
|
7
|
+
imageUrl?: string;
|
|
8
|
+
imageAlt?: string;
|
|
9
|
+
price?: string;
|
|
10
|
+
currency?: string;
|
|
11
|
+
badges?: readonly string[];
|
|
12
|
+
meta?: readonly {
|
|
13
|
+
label: string;
|
|
14
|
+
value: string;
|
|
15
|
+
}[];
|
|
16
|
+
primaryActionLabel?: string;
|
|
17
|
+
secondaryActionLabel?: string;
|
|
18
|
+
onPress?: () => void;
|
|
19
|
+
onPrimaryAction?: () => void;
|
|
20
|
+
onSecondaryAction?: () => void;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/patterns/product-card/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,SAAS;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,EAAE,CAAC;IACJ,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/patterns/product-card/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ProductCardProps {\n title: string;\n subtitle?: string;\n description?: string;\n brand?: string;\n vendor?: string;\n imageUrl?: string;\n imageAlt?: string;\n price?: string;\n currency?: string;\n badges?: readonly string[];\n meta?: readonly {\n label: string;\n value: string;\n }[];\n primaryActionLabel?: string;\n secondaryActionLabel?: string;\n onPress?: () => void;\n onPrimaryAction?: () => void;\n onSecondaryAction?: () => void;\n}\n"]}
|
|
@@ -39,6 +39,11 @@ export declare const cameraPermissionViewMeta: {
|
|
|
39
39
|
readonly description: "ZORA-owned camera permission state for scanner flows.";
|
|
40
40
|
readonly directManifestNode: true;
|
|
41
41
|
readonly allowedChildren: readonly [];
|
|
42
|
+
readonly requirements: {
|
|
43
|
+
readonly permissions: readonly [{
|
|
44
|
+
readonly permission: "camera";
|
|
45
|
+
}];
|
|
46
|
+
};
|
|
42
47
|
readonly blueprint: {
|
|
43
48
|
readonly label: "Camera permission";
|
|
44
49
|
readonly defaultProps: {
|
|
@@ -101,6 +106,14 @@ export declare const barcodeScannerViewMeta: {
|
|
|
101
106
|
readonly description: "Composed scanner shell with permission, camera slot, scan overlay, and manual entry affordance.";
|
|
102
107
|
readonly directManifestNode: true;
|
|
103
108
|
readonly allowedChildren: readonly ["Box", "Stack", "Grid", "Container", "Divider", "Text", "Heading", "Button", "ButtonGroup", "Input", "Textarea", "FormField", "Card", "Panel", "Notice", "EmptyState", "SectionHeader", "SettingsRow", "PostCard", "ChatListItem", "MessageBubble"];
|
|
109
|
+
readonly requirements: {
|
|
110
|
+
readonly permissions: readonly [{
|
|
111
|
+
readonly permission: "camera";
|
|
112
|
+
}];
|
|
113
|
+
readonly capabilities: readonly [{
|
|
114
|
+
readonly capability: "barcodeScanner";
|
|
115
|
+
}];
|
|
116
|
+
};
|
|
104
117
|
readonly blueprint: {
|
|
105
118
|
readonly label: "Barcode scanner";
|
|
106
119
|
readonly defaultProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/patterns/scanner/meta.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCU,CAAC;AAEvC,eAAO,MAAM,wBAAwB
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/patterns/scanner/meta.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCU,CAAC;AAEvC,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEC,CAAC;AAEvC,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FG,CAAC"}
|
|
@@ -40,6 +40,9 @@ export const cameraPermissionViewMeta = {
|
|
|
40
40
|
description: 'ZORA-owned camera permission state for scanner flows.',
|
|
41
41
|
directManifestNode: true,
|
|
42
42
|
allowedChildren: [],
|
|
43
|
+
requirements: {
|
|
44
|
+
permissions: [{ permission: 'camera' }],
|
|
45
|
+
},
|
|
43
46
|
blueprint: {
|
|
44
47
|
label: 'Camera permission',
|
|
45
48
|
defaultProps: {
|
|
@@ -102,6 +105,10 @@ export const barcodeScannerViewMeta = {
|
|
|
102
105
|
description: 'Composed scanner shell with permission, camera slot, scan overlay, and manual entry affordance.',
|
|
103
106
|
directManifestNode: true,
|
|
104
107
|
allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],
|
|
108
|
+
requirements: {
|
|
109
|
+
permissions: [{ permission: 'camera' }],
|
|
110
|
+
capabilities: [{ capability: 'barcodeScanner' }],
|
|
111
|
+
},
|
|
105
112
|
blueprint: {
|
|
106
113
|
label: 'Barcode scanner',
|
|
107
114
|
defaultProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/patterns/scanner/meta.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ZoraComponentMeta } from '../../metadata';\nimport { CONTAINER_ALLOWED_CHILDREN } from '../../metadata/allowedChildren';\n\nexport const scanOverlayMeta = {\n name: 'ScanOverlay',\n category: 'pattern',\n description: 'Camera-agnostic scan frame overlay for barcode and QR scanning flows.',\n directManifestNode: true,\n allowedChildren: [],\n blueprint: {\n label: 'Scan overlay',\n defaultProps: {\n title: 'Align the barcode',\n description: 'Hold the barcode inside the frame. Scanning starts automatically.',\n cornerLabel: 'SCAN',\n },\n },\n props: {\n title: {\n type: 'string',\n category: 'Content',\n label: 'Title',\n default: 'Align the barcode',\n },\n description: {\n type: 'string',\n category: 'Content',\n label: 'Description',\n default: 'Hold the barcode inside the frame. Scanning starts automatically.',\n },\n cornerLabel: {\n type: 'string',\n category: 'Content',\n label: 'Corner label',\n default: 'SCAN',\n },\n },\n} as const satisfies ZoraComponentMeta;\n\nexport const cameraPermissionViewMeta = {\n name: 'CameraPermissionView',\n category: 'pattern',\n description: 'ZORA-owned camera permission state for scanner flows.',\n directManifestNode: true,\n allowedChildren: [],\n blueprint: {\n label: 'Camera permission',\n defaultProps: {\n status: 'unknown',\n requestLabel: 'Allow camera access',\n manualEntryLabel: 'Enter barcode manually',\n },\n },\n props: {\n status: {\n type: 'enum',\n category: 'State',\n label: 'Permission status',\n enum: ['unknown', 'requesting', 'denied'],\n default: 'unknown',\n },\n title: {\n type: 'string',\n category: 'Content',\n label: 'Title',\n },\n description: {\n type: 'string',\n category: 'Content',\n label: 'Description',\n },\n requestLabel: {\n type: 'string',\n category: 'Content',\n label: 'Request label',\n default: 'Allow camera access',\n },\n deniedLabel: {\n type: 'string',\n category: 'Content',\n label: 'Denied label',\n default: 'Open settings',\n },\n manualEntryLabel: {\n type: 'string',\n category: 'Content',\n label: 'Manual entry label',\n default: 'Enter barcode manually',\n },\n onRequestPermission: {\n type: 'action',\n category: 'Events',\n label: 'Request permission action',\n },\n onManualEntry: {\n type: 'action',\n category: 'Events',\n label: 'Manual entry action',\n },\n },\n} as const satisfies ZoraComponentMeta;\n\nexport const barcodeScannerViewMeta = {\n name: 'BarcodeScannerView',\n category: 'pattern',\n description:\n 'Composed scanner shell with permission, camera slot, scan overlay, and manual entry affordance.',\n directManifestNode: true,\n allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],\n blueprint: {\n label: 'Barcode scanner',\n defaultProps: {\n permissionStatus: 'unknown',\n title: 'Scan barcode',\n description: 'Point the camera at a barcode to continue.',\n },\n },\n events: {\n onBarcodeScanned: {\n label: 'Barcode scanned',\n eventType: 'scan',\n description: 'Emitted by the app camera adapter after a barcode has been scanned.',\n payloadFields: [\n { path: 'value', type: 'string', label: 'Barcode value' },\n { path: 'type', type: 'string', label: 'Barcode type' },\n ],\n },\n },\n slots: {\n camera: {\n label: 'Camera adapter',\n allowedChildren: [],\n },\n children: {\n label: 'Scanner footer',\n allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],\n },\n },\n props: {\n permissionStatus: {\n type: 'enum',\n category: 'State',\n label: 'Permission status',\n enum: ['unknown', 'requesting', 'granted', 'denied'],\n default: 'unknown',\n },\n title: {\n type: 'string',\n category: 'Content',\n label: 'Title',\n default: 'Scan barcode',\n },\n description: {\n type: 'string',\n category: 'Content',\n label: 'Description',\n default: 'Point the camera at a barcode to continue.',\n },\n overlayTitle: {\n type: 'string',\n category: 'Content',\n label: 'Overlay title',\n },\n overlayDescription: {\n type: 'string',\n category: 'Content',\n label: 'Overlay description',\n },\n requestPermissionLabel: {\n type: 'string',\n category: 'Content',\n label: 'Request permission label',\n },\n manualEntryLabel: {\n type: 'string',\n category: 'Content',\n label: 'Manual entry label',\n },\n onRequestPermission: {\n type: 'action',\n category: 'Events',\n label: 'Request permission action',\n },\n onManualEntry: {\n type: 'action',\n category: 'Events',\n label: 'Manual entry action',\n },\n },\n} as const satisfies ZoraComponentMeta;\n"]}
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/patterns/scanner/meta.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ZoraComponentMeta } from '../../metadata';\nimport { CONTAINER_ALLOWED_CHILDREN } from '../../metadata/allowedChildren';\n\nexport const scanOverlayMeta = {\n name: 'ScanOverlay',\n category: 'pattern',\n description: 'Camera-agnostic scan frame overlay for barcode and QR scanning flows.',\n directManifestNode: true,\n allowedChildren: [],\n blueprint: {\n label: 'Scan overlay',\n defaultProps: {\n title: 'Align the barcode',\n description: 'Hold the barcode inside the frame. Scanning starts automatically.',\n cornerLabel: 'SCAN',\n },\n },\n props: {\n title: {\n type: 'string',\n category: 'Content',\n label: 'Title',\n default: 'Align the barcode',\n },\n description: {\n type: 'string',\n category: 'Content',\n label: 'Description',\n default: 'Hold the barcode inside the frame. Scanning starts automatically.',\n },\n cornerLabel: {\n type: 'string',\n category: 'Content',\n label: 'Corner label',\n default: 'SCAN',\n },\n },\n} as const satisfies ZoraComponentMeta;\n\nexport const cameraPermissionViewMeta = {\n name: 'CameraPermissionView',\n category: 'pattern',\n description: 'ZORA-owned camera permission state for scanner flows.',\n directManifestNode: true,\n allowedChildren: [],\n requirements: {\n permissions: [{ permission: 'camera' }],\n },\n blueprint: {\n label: 'Camera permission',\n defaultProps: {\n status: 'unknown',\n requestLabel: 'Allow camera access',\n manualEntryLabel: 'Enter barcode manually',\n },\n },\n props: {\n status: {\n type: 'enum',\n category: 'State',\n label: 'Permission status',\n enum: ['unknown', 'requesting', 'denied'],\n default: 'unknown',\n },\n title: {\n type: 'string',\n category: 'Content',\n label: 'Title',\n },\n description: {\n type: 'string',\n category: 'Content',\n label: 'Description',\n },\n requestLabel: {\n type: 'string',\n category: 'Content',\n label: 'Request label',\n default: 'Allow camera access',\n },\n deniedLabel: {\n type: 'string',\n category: 'Content',\n label: 'Denied label',\n default: 'Open settings',\n },\n manualEntryLabel: {\n type: 'string',\n category: 'Content',\n label: 'Manual entry label',\n default: 'Enter barcode manually',\n },\n onRequestPermission: {\n type: 'action',\n category: 'Events',\n label: 'Request permission action',\n },\n onManualEntry: {\n type: 'action',\n category: 'Events',\n label: 'Manual entry action',\n },\n },\n} as const satisfies ZoraComponentMeta;\n\nexport const barcodeScannerViewMeta = {\n name: 'BarcodeScannerView',\n category: 'pattern',\n description:\n 'Composed scanner shell with permission, camera slot, scan overlay, and manual entry affordance.',\n directManifestNode: true,\n allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],\n requirements: {\n permissions: [{ permission: 'camera' }],\n capabilities: [{ capability: 'barcodeScanner' }],\n },\n blueprint: {\n label: 'Barcode scanner',\n defaultProps: {\n permissionStatus: 'unknown',\n title: 'Scan barcode',\n description: 'Point the camera at a barcode to continue.',\n },\n },\n events: {\n onBarcodeScanned: {\n label: 'Barcode scanned',\n eventType: 'scan',\n description: 'Emitted by the app camera adapter after a barcode has been scanned.',\n payloadFields: [\n { path: 'value', type: 'string', label: 'Barcode value' },\n { path: 'type', type: 'string', label: 'Barcode type' },\n ],\n },\n },\n slots: {\n camera: {\n label: 'Camera adapter',\n allowedChildren: [],\n },\n children: {\n label: 'Scanner footer',\n allowedChildren: [...CONTAINER_ALLOWED_CHILDREN],\n },\n },\n props: {\n permissionStatus: {\n type: 'enum',\n category: 'State',\n label: 'Permission status',\n enum: ['unknown', 'requesting', 'granted', 'denied'],\n default: 'unknown',\n },\n title: {\n type: 'string',\n category: 'Content',\n label: 'Title',\n default: 'Scan barcode',\n },\n description: {\n type: 'string',\n category: 'Content',\n label: 'Description',\n default: 'Point the camera at a barcode to continue.',\n },\n overlayTitle: {\n type: 'string',\n category: 'Content',\n label: 'Overlay title',\n },\n overlayDescription: {\n type: 'string',\n category: 'Content',\n label: 'Overlay description',\n },\n requestPermissionLabel: {\n type: 'string',\n category: 'Content',\n label: 'Request permission label',\n },\n manualEntryLabel: {\n type: 'string',\n category: 'Content',\n label: 'Manual entry label',\n },\n onRequestPermission: {\n type: 'action',\n category: 'Events',\n label: 'Request permission action',\n },\n onManualEntry: {\n type: 'action',\n category: 'Events',\n label: 'Manual entry action',\n },\n },\n} as const satisfies ZoraComponentMeta;\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ankhorage/zora",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.8.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": {
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"@types/bun": "^1.3.13",
|
|
104
104
|
"@types/node": "^25.6.0",
|
|
105
105
|
"@types/react": "^19.2.14",
|
|
106
|
-
"expo-linear-gradient": "^
|
|
106
|
+
"expo-linear-gradient": "^56.0.4",
|
|
107
107
|
"react": "19.1.0",
|
|
108
108
|
"react-native": "0.81.5",
|
|
109
109
|
"typescript": "^5.9.3"
|