@ankhorage/zora 1.0.5 → 1.0.7
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 +284 -0
- package/dist/components/media-card/MediaCard.d.ts +4 -0
- package/dist/components/media-card/MediaCard.d.ts.map +1 -0
- package/dist/components/media-card/MediaCard.js +64 -0
- package/dist/components/media-card/MediaCard.js.map +1 -0
- package/dist/components/media-card/index.d.ts +3 -0
- package/dist/components/media-card/index.d.ts.map +1 -0
- package/dist/components/media-card/index.js +2 -0
- package/dist/components/media-card/index.js.map +1 -0
- package/dist/components/media-card/types.d.ts +36 -0
- package/dist/components/media-card/types.d.ts.map +1 -0
- package/dist/components/media-card/types.js +2 -0
- package/dist/components/media-card/types.js.map +1 -0
- package/dist/components/metric-card/MetricCard.d.ts +4 -0
- package/dist/components/metric-card/MetricCard.d.ts.map +1 -0
- package/dist/components/metric-card/MetricCard.js +43 -0
- package/dist/components/metric-card/MetricCard.js.map +1 -0
- package/dist/components/metric-card/index.d.ts +3 -0
- package/dist/components/metric-card/index.d.ts.map +1 -0
- package/dist/components/metric-card/index.js +2 -0
- package/dist/components/metric-card/index.js.map +1 -0
- package/dist/components/metric-card/types.d.ts +17 -0
- package/dist/components/metric-card/types.d.ts.map +1 -0
- package/dist/components/metric-card/types.js +2 -0
- package/dist/components/metric-card/types.js.map +1 -0
- package/dist/components/progress/Progress.d.ts +4 -0
- package/dist/components/progress/Progress.d.ts.map +1 -0
- package/dist/components/progress/Progress.js +28 -0
- package/dist/components/progress/Progress.js.map +1 -0
- package/dist/components/progress/index.d.ts +3 -0
- package/dist/components/progress/index.d.ts.map +1 -0
- package/dist/components/progress/index.js +2 -0
- package/dist/components/progress/index.js.map +1 -0
- package/dist/components/progress/resolveProgressFraction.d.ts +5 -0
- package/dist/components/progress/resolveProgressFraction.d.ts.map +1 -0
- package/dist/components/progress/resolveProgressFraction.js +14 -0
- package/dist/components/progress/resolveProgressFraction.js.map +1 -0
- package/dist/components/progress/types.d.ts +11 -0
- package/dist/components/progress/types.d.ts.map +1 -0
- package/dist/components/progress/types.js +16 -0
- package/dist/components/progress/types.js.map +1 -0
- package/dist/components/rating/Rating.d.ts +4 -0
- package/dist/components/rating/Rating.d.ts.map +1 -0
- package/dist/components/rating/Rating.js +23 -0
- package/dist/components/rating/Rating.js.map +1 -0
- package/dist/components/rating/index.d.ts +3 -0
- package/dist/components/rating/index.d.ts.map +1 -0
- package/dist/components/rating/index.js +2 -0
- package/dist/components/rating/index.js.map +1 -0
- package/dist/components/rating/resolveRatingSegments.d.ts +7 -0
- package/dist/components/rating/resolveRatingSegments.d.ts.map +1 -0
- package/dist/components/rating/resolveRatingSegments.js +22 -0
- package/dist/components/rating/resolveRatingSegments.js.map +1 -0
- package/dist/components/rating/types.d.ts +11 -0
- package/dist/components/rating/types.d.ts.map +1 -0
- package/dist/components/rating/types.js +16 -0
- package/dist/components/rating/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/list/List.d.ts +4 -0
- package/dist/patterns/list/List.d.ts.map +1 -0
- package/dist/patterns/list/List.js +35 -0
- package/dist/patterns/list/List.js.map +1 -0
- package/dist/patterns/list/ListRow.d.ts +4 -0
- package/dist/patterns/list/ListRow.d.ts.map +1 -0
- package/dist/patterns/list/ListRow.js +108 -0
- package/dist/patterns/list/ListRow.js.map +1 -0
- package/dist/patterns/list/ListSection.d.ts +4 -0
- package/dist/patterns/list/ListSection.d.ts.map +1 -0
- package/dist/patterns/list/ListSection.js +14 -0
- package/dist/patterns/list/ListSection.js.map +1 -0
- package/dist/patterns/list/index.d.ts +5 -0
- package/dist/patterns/list/index.d.ts.map +1 -0
- package/dist/patterns/list/index.js +4 -0
- package/dist/patterns/list/index.js.map +1 -0
- package/dist/patterns/list/resolveListSeparator.d.ts +5 -0
- package/dist/patterns/list/resolveListSeparator.d.ts.map +1 -0
- package/dist/patterns/list/resolveListSeparator.js +6 -0
- package/dist/patterns/list/resolveListSeparator.js.map +1 -0
- package/dist/patterns/list/types.d.ts +55 -0
- package/dist/patterns/list/types.d.ts.map +1 -0
- package/dist/patterns/list/types.js +2 -0
- package/dist/patterns/list/types.js.map +1 -0
- package/dist/patterns/timeline/Timeline.d.ts +4 -0
- package/dist/patterns/timeline/Timeline.d.ts.map +1 -0
- package/dist/patterns/timeline/Timeline.js +59 -0
- package/dist/patterns/timeline/Timeline.js.map +1 -0
- package/dist/patterns/timeline/index.d.ts +3 -0
- package/dist/patterns/timeline/index.d.ts.map +1 -0
- package/dist/patterns/timeline/index.js +2 -0
- package/dist/patterns/timeline/index.js.map +1 -0
- package/dist/patterns/timeline/types.d.ts +18 -0
- package/dist/patterns/timeline/types.d.ts.map +1 -0
- package/dist/patterns/timeline/types.js +2 -0
- package/dist/patterns/timeline/types.js.map +1 -0
- package/package.json +1 -1
- package/src/components/media-card/MediaCard.tsx +120 -0
- package/src/components/media-card/index.ts +2 -0
- package/src/components/media-card/types.ts +44 -0
- package/src/components/metric-card/MetricCard.tsx +84 -0
- package/src/components/metric-card/index.ts +2 -0
- package/src/components/metric-card/types.ts +18 -0
- package/src/components/progress/Progress.tsx +50 -0
- package/src/components/progress/index.ts +2 -0
- package/src/components/progress/resolveProgressFraction.test.ts +23 -0
- package/src/components/progress/resolveProgressFraction.ts +17 -0
- package/src/components/progress/types.ts +27 -0
- package/src/components/rating/Rating.tsx +38 -0
- package/src/components/rating/index.ts +2 -0
- package/src/components/rating/resolveRatingSegments.test.ts +60 -0
- package/src/components/rating/resolveRatingSegments.ts +34 -0
- package/src/components/rating/types.ts +27 -0
- package/src/index.ts +19 -0
- package/src/patterns/list/List.tsx +72 -0
- package/src/patterns/list/ListRow.tsx +193 -0
- package/src/patterns/list/ListSection.tsx +36 -0
- package/src/patterns/list/index.ts +11 -0
- package/src/patterns/list/resolveListSeparator.test.ts +18 -0
- package/src/patterns/list/resolveListSeparator.ts +8 -0
- package/src/patterns/list/types.ts +67 -0
- package/src/patterns/timeline/Timeline.tsx +104 -0
- package/src/patterns/timeline/index.ts +2 -0
- package/src/patterns/timeline/types.ts +20 -0
- package/src/showcaseCoverage.test.ts +8 -0
- package/src/theme/themeScopeStructure.test.ts +14 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { RoleSemantics, SurfaceTheme } from '@ankhorage/surface';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
|
|
4
|
+
import { Heading } from '../../components/heading';
|
|
5
|
+
import { Icon } from '../../components/icon';
|
|
6
|
+
import { Text } from '../../components/text';
|
|
7
|
+
import { Box, Inline, Stack } from '../../foundation';
|
|
8
|
+
import type { ZoraTone } from '../../internal/recipes';
|
|
9
|
+
import { resolveIconSize } from '../../internal/recipes';
|
|
10
|
+
import { useZoraTheme } from '../../theme/useZoraTheme';
|
|
11
|
+
import { withZoraThemeScope } from '../../theme/withZoraThemeScope';
|
|
12
|
+
import type { TimelineItem, TimelineProps } from './types';
|
|
13
|
+
|
|
14
|
+
function resolveRoleSemantics(theme: SurfaceTheme, tone: ZoraTone): RoleSemantics {
|
|
15
|
+
switch (tone) {
|
|
16
|
+
case 'primary':
|
|
17
|
+
return theme.semantics.action.primary;
|
|
18
|
+
case 'danger':
|
|
19
|
+
return theme.semantics.action.danger;
|
|
20
|
+
case 'success':
|
|
21
|
+
return theme.semantics.success;
|
|
22
|
+
case 'warning':
|
|
23
|
+
return theme.semantics.warning;
|
|
24
|
+
case 'neutral':
|
|
25
|
+
default:
|
|
26
|
+
return theme.semantics.action.neutral;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function TimelineInner({
|
|
31
|
+
themeId: _themeId,
|
|
32
|
+
mode: _mode,
|
|
33
|
+
testID,
|
|
34
|
+
items,
|
|
35
|
+
compact = false,
|
|
36
|
+
}: TimelineProps) {
|
|
37
|
+
const { theme } = useZoraTheme();
|
|
38
|
+
const gap = compact ? 'm' : 'l';
|
|
39
|
+
|
|
40
|
+
const renderItem = (item: TimelineItem, index: number) => {
|
|
41
|
+
const status = item.status ?? 'neutral';
|
|
42
|
+
const role = resolveRoleSemantics(theme, status);
|
|
43
|
+
const showConnector = index < items.length - 1;
|
|
44
|
+
const iconSize = Math.max(12, resolveIconSize('s'));
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<Inline key={item.id} align="flex-start" gap="m" testID={item.testID} wrap="nowrap">
|
|
48
|
+
<Stack align="center" flexShrink={0} gap="xs" style={{ width: 24 }}>
|
|
49
|
+
<Box
|
|
50
|
+
bg={status === 'neutral' ? theme.semantics.neutral.surface : role.softBg}
|
|
51
|
+
borderColor={status === 'neutral' ? theme.semantics.neutral.divider : role.base}
|
|
52
|
+
borderWidth={1}
|
|
53
|
+
height={20}
|
|
54
|
+
radius="full"
|
|
55
|
+
width={20}
|
|
56
|
+
style={{ alignItems: 'center', justifyContent: 'center' }}
|
|
57
|
+
>
|
|
58
|
+
{item.icon ? (
|
|
59
|
+
<Icon
|
|
60
|
+
color={status === 'neutral' ? theme.semantics.content.muted : role.base}
|
|
61
|
+
name={item.icon.name}
|
|
62
|
+
provider={item.icon.provider}
|
|
63
|
+
size={iconSize}
|
|
64
|
+
/>
|
|
65
|
+
) : null}
|
|
66
|
+
</Box>
|
|
67
|
+
|
|
68
|
+
{showConnector ? (
|
|
69
|
+
<Box
|
|
70
|
+
bg={theme.semantics.neutral.divider}
|
|
71
|
+
flex={1}
|
|
72
|
+
radius="full"
|
|
73
|
+
style={{ minHeight: 16, width: 2 }}
|
|
74
|
+
/>
|
|
75
|
+
) : null}
|
|
76
|
+
</Stack>
|
|
77
|
+
|
|
78
|
+
<Stack flex={1} gap="xs" testID={testID}>
|
|
79
|
+
<Inline align="flex-start" gap="s" justify="space-between" wrap="wrap">
|
|
80
|
+
<Heading level={compact ? 4 : 3}>{item.title}</Heading>
|
|
81
|
+
{item.meta ? (
|
|
82
|
+
<Text tone="muted" variant="caption">
|
|
83
|
+
{item.meta}
|
|
84
|
+
</Text>
|
|
85
|
+
) : null}
|
|
86
|
+
</Inline>
|
|
87
|
+
{item.description ? (
|
|
88
|
+
<Text tone="muted" variant="bodySmall">
|
|
89
|
+
{item.description}
|
|
90
|
+
</Text>
|
|
91
|
+
) : null}
|
|
92
|
+
</Stack>
|
|
93
|
+
</Inline>
|
|
94
|
+
);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<Stack gap={gap} testID={testID}>
|
|
99
|
+
{items.map(renderItem)}
|
|
100
|
+
</Stack>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export const Timeline = withZoraThemeScope(TimelineInner);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ButtonIconSpec } from '@ankhorage/surface';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
|
|
4
|
+
import type { ZoraTone } from '../../internal/recipes';
|
|
5
|
+
import type { ZoraBaseProps } from '../../theme/ZoraBaseProps';
|
|
6
|
+
|
|
7
|
+
export interface TimelineItem {
|
|
8
|
+
id: string;
|
|
9
|
+
title: React.ReactNode;
|
|
10
|
+
description?: React.ReactNode;
|
|
11
|
+
meta?: React.ReactNode;
|
|
12
|
+
status?: ZoraTone;
|
|
13
|
+
icon?: ButtonIconSpec;
|
|
14
|
+
testID?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface TimelineProps extends ZoraBaseProps {
|
|
18
|
+
items: readonly TimelineItem[];
|
|
19
|
+
compact?: boolean;
|
|
20
|
+
}
|
|
@@ -35,9 +35,13 @@ const REQUIRED_SHOWCASE_COVERAGE = {
|
|
|
35
35
|
'Icon',
|
|
36
36
|
'IconButton',
|
|
37
37
|
'Input',
|
|
38
|
+
'MediaCard',
|
|
39
|
+
'MetricCard',
|
|
38
40
|
'Modal',
|
|
41
|
+
'Progress',
|
|
39
42
|
'Radio',
|
|
40
43
|
'RadioGroup',
|
|
44
|
+
'Rating',
|
|
41
45
|
'SearchBar',
|
|
42
46
|
'Select',
|
|
43
47
|
'Tabs',
|
|
@@ -78,6 +82,9 @@ const REQUIRED_SHOWCASE_COVERAGE = {
|
|
|
78
82
|
'DisclosureSection',
|
|
79
83
|
'EmptyState',
|
|
80
84
|
'FilterBar',
|
|
85
|
+
'List',
|
|
86
|
+
'ListRow',
|
|
87
|
+
'ListSection',
|
|
81
88
|
'InspectorField',
|
|
82
89
|
'Notice',
|
|
83
90
|
'Panel',
|
|
@@ -85,6 +92,7 @@ const REQUIRED_SHOWCASE_COVERAGE = {
|
|
|
85
92
|
'SectionHeader',
|
|
86
93
|
'SettingsRow',
|
|
87
94
|
'SwitchField',
|
|
95
|
+
'Timeline',
|
|
88
96
|
'ThemeComposer',
|
|
89
97
|
'PaletteItem',
|
|
90
98
|
'TileGrid',
|
|
@@ -56,6 +56,8 @@ const scopedComponentFiles = [
|
|
|
56
56
|
join(srcDir, 'components', 'badge', 'Badge.tsx'),
|
|
57
57
|
join(srcDir, 'components', 'button', 'Button.tsx'),
|
|
58
58
|
join(srcDir, 'components', 'card', 'Card.tsx'),
|
|
59
|
+
join(srcDir, 'components', 'media-card', 'MediaCard.tsx'),
|
|
60
|
+
join(srcDir, 'components', 'metric-card', 'MetricCard.tsx'),
|
|
59
61
|
join(srcDir, 'components', 'checkbox', 'Checkbox.tsx'),
|
|
60
62
|
join(srcDir, 'components', 'checkbox', 'CheckboxGroup.tsx'),
|
|
61
63
|
join(srcDir, 'components', 'drawer', 'Drawer.tsx'),
|
|
@@ -68,8 +70,10 @@ const scopedComponentFiles = [
|
|
|
68
70
|
join(srcDir, 'components', 'icon-button', 'IconButton.tsx'),
|
|
69
71
|
join(srcDir, 'components', 'input', 'Input.tsx'),
|
|
70
72
|
join(srcDir, 'components', 'modal', 'Modal.tsx'),
|
|
73
|
+
join(srcDir, 'components', 'progress', 'Progress.tsx'),
|
|
71
74
|
join(srcDir, 'components', 'radio', 'Radio.tsx'),
|
|
72
75
|
join(srcDir, 'components', 'radio', 'RadioGroup.tsx'),
|
|
76
|
+
join(srcDir, 'components', 'rating', 'Rating.tsx'),
|
|
73
77
|
join(srcDir, 'components', 'select', 'Select.tsx'),
|
|
74
78
|
join(srcDir, 'components', 'tabs', 'Tabs.tsx'),
|
|
75
79
|
join(srcDir, 'components', 'text', 'Text.tsx'),
|
|
@@ -96,12 +100,16 @@ const scopedComponentFiles = [
|
|
|
96
100
|
join(srcDir, 'patterns', 'empty-state', 'EmptyState.tsx'),
|
|
97
101
|
join(srcDir, 'patterns', 'form-field', 'FormField.tsx'),
|
|
98
102
|
join(srcDir, 'patterns', 'inspector-field', 'InspectorField.tsx'),
|
|
103
|
+
join(srcDir, 'patterns', 'list', 'List.tsx'),
|
|
104
|
+
join(srcDir, 'patterns', 'list', 'ListRow.tsx'),
|
|
105
|
+
join(srcDir, 'patterns', 'list', 'ListSection.tsx'),
|
|
99
106
|
join(srcDir, 'patterns', 'notice', 'Notice.tsx'),
|
|
100
107
|
join(srcDir, 'patterns', 'panel', 'Panel.tsx'),
|
|
101
108
|
join(srcDir, 'patterns', 'responsive-panel', 'ResponsivePanel.tsx'),
|
|
102
109
|
join(srcDir, 'patterns', 'section-header', 'SectionHeader.tsx'),
|
|
103
110
|
join(srcDir, 'patterns', 'settings-row', 'SettingsRow.tsx'),
|
|
104
111
|
join(srcDir, 'patterns', 'switch-field', 'SwitchField.tsx'),
|
|
112
|
+
join(srcDir, 'patterns', 'timeline', 'Timeline.tsx'),
|
|
105
113
|
join(srcDir, 'patterns', 'tile-grid', 'PaletteItem.tsx'),
|
|
106
114
|
join(srcDir, 'patterns', 'tile-grid', 'TileGrid.tsx'),
|
|
107
115
|
join(srcDir, 'patterns', 'tree-view', 'TreeItem.tsx'),
|
|
@@ -123,6 +131,8 @@ const scopedPropTypeFiles = [
|
|
|
123
131
|
join(srcDir, 'components', 'badge', 'types.ts'),
|
|
124
132
|
join(srcDir, 'components', 'button', 'types.ts'),
|
|
125
133
|
join(srcDir, 'components', 'card', 'types.ts'),
|
|
134
|
+
join(srcDir, 'components', 'media-card', 'types.ts'),
|
|
135
|
+
join(srcDir, 'components', 'metric-card', 'types.ts'),
|
|
126
136
|
join(srcDir, 'components', 'checkbox', 'types.ts'),
|
|
127
137
|
join(srcDir, 'components', 'drawer', 'types.ts'),
|
|
128
138
|
join(srcDir, 'components', 'form', 'types.ts'),
|
|
@@ -131,7 +141,9 @@ const scopedPropTypeFiles = [
|
|
|
131
141
|
join(srcDir, 'components', 'icon-button', 'types.ts'),
|
|
132
142
|
join(srcDir, 'components', 'input', 'types.ts'),
|
|
133
143
|
join(srcDir, 'components', 'modal', 'types.ts'),
|
|
144
|
+
join(srcDir, 'components', 'progress', 'types.ts'),
|
|
134
145
|
join(srcDir, 'components', 'radio', 'types.ts'),
|
|
146
|
+
join(srcDir, 'components', 'rating', 'types.ts'),
|
|
135
147
|
join(srcDir, 'components', 'select', 'types.ts'),
|
|
136
148
|
join(srcDir, 'components', 'tabs', 'types.ts'),
|
|
137
149
|
join(srcDir, 'components', 'text', 'types.ts'),
|
|
@@ -154,12 +166,14 @@ const scopedPropTypeFiles = [
|
|
|
154
166
|
join(srcDir, 'patterns', 'empty-state', 'types.ts'),
|
|
155
167
|
join(srcDir, 'patterns', 'form-field', 'types.ts'),
|
|
156
168
|
join(srcDir, 'patterns', 'inspector-field', 'types.ts'),
|
|
169
|
+
join(srcDir, 'patterns', 'list', 'types.ts'),
|
|
157
170
|
join(srcDir, 'patterns', 'notice', 'types.ts'),
|
|
158
171
|
join(srcDir, 'patterns', 'panel', 'types.ts'),
|
|
159
172
|
join(srcDir, 'patterns', 'responsive-panel', 'types.ts'),
|
|
160
173
|
join(srcDir, 'patterns', 'section-header', 'types.ts'),
|
|
161
174
|
join(srcDir, 'patterns', 'settings-row', 'types.ts'),
|
|
162
175
|
join(srcDir, 'patterns', 'switch-field', 'types.ts'),
|
|
176
|
+
join(srcDir, 'patterns', 'timeline', 'types.ts'),
|
|
163
177
|
join(srcDir, 'patterns', 'tile-grid', 'types.ts'),
|
|
164
178
|
join(srcDir, 'patterns', 'tree-view', 'types.ts'),
|
|
165
179
|
] as const;
|