@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.
Files changed (128) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +284 -0
  3. package/dist/components/media-card/MediaCard.d.ts +4 -0
  4. package/dist/components/media-card/MediaCard.d.ts.map +1 -0
  5. package/dist/components/media-card/MediaCard.js +64 -0
  6. package/dist/components/media-card/MediaCard.js.map +1 -0
  7. package/dist/components/media-card/index.d.ts +3 -0
  8. package/dist/components/media-card/index.d.ts.map +1 -0
  9. package/dist/components/media-card/index.js +2 -0
  10. package/dist/components/media-card/index.js.map +1 -0
  11. package/dist/components/media-card/types.d.ts +36 -0
  12. package/dist/components/media-card/types.d.ts.map +1 -0
  13. package/dist/components/media-card/types.js +2 -0
  14. package/dist/components/media-card/types.js.map +1 -0
  15. package/dist/components/metric-card/MetricCard.d.ts +4 -0
  16. package/dist/components/metric-card/MetricCard.d.ts.map +1 -0
  17. package/dist/components/metric-card/MetricCard.js +43 -0
  18. package/dist/components/metric-card/MetricCard.js.map +1 -0
  19. package/dist/components/metric-card/index.d.ts +3 -0
  20. package/dist/components/metric-card/index.d.ts.map +1 -0
  21. package/dist/components/metric-card/index.js +2 -0
  22. package/dist/components/metric-card/index.js.map +1 -0
  23. package/dist/components/metric-card/types.d.ts +17 -0
  24. package/dist/components/metric-card/types.d.ts.map +1 -0
  25. package/dist/components/metric-card/types.js +2 -0
  26. package/dist/components/metric-card/types.js.map +1 -0
  27. package/dist/components/progress/Progress.d.ts +4 -0
  28. package/dist/components/progress/Progress.d.ts.map +1 -0
  29. package/dist/components/progress/Progress.js +28 -0
  30. package/dist/components/progress/Progress.js.map +1 -0
  31. package/dist/components/progress/index.d.ts +3 -0
  32. package/dist/components/progress/index.d.ts.map +1 -0
  33. package/dist/components/progress/index.js +2 -0
  34. package/dist/components/progress/index.js.map +1 -0
  35. package/dist/components/progress/resolveProgressFraction.d.ts +5 -0
  36. package/dist/components/progress/resolveProgressFraction.d.ts.map +1 -0
  37. package/dist/components/progress/resolveProgressFraction.js +14 -0
  38. package/dist/components/progress/resolveProgressFraction.js.map +1 -0
  39. package/dist/components/progress/types.d.ts +11 -0
  40. package/dist/components/progress/types.d.ts.map +1 -0
  41. package/dist/components/progress/types.js +16 -0
  42. package/dist/components/progress/types.js.map +1 -0
  43. package/dist/components/rating/Rating.d.ts +4 -0
  44. package/dist/components/rating/Rating.d.ts.map +1 -0
  45. package/dist/components/rating/Rating.js +23 -0
  46. package/dist/components/rating/Rating.js.map +1 -0
  47. package/dist/components/rating/index.d.ts +3 -0
  48. package/dist/components/rating/index.d.ts.map +1 -0
  49. package/dist/components/rating/index.js +2 -0
  50. package/dist/components/rating/index.js.map +1 -0
  51. package/dist/components/rating/resolveRatingSegments.d.ts +7 -0
  52. package/dist/components/rating/resolveRatingSegments.d.ts.map +1 -0
  53. package/dist/components/rating/resolveRatingSegments.js +22 -0
  54. package/dist/components/rating/resolveRatingSegments.js.map +1 -0
  55. package/dist/components/rating/types.d.ts +11 -0
  56. package/dist/components/rating/types.d.ts.map +1 -0
  57. package/dist/components/rating/types.js +16 -0
  58. package/dist/components/rating/types.js.map +1 -0
  59. package/dist/index.d.ts +12 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +6 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/patterns/list/List.d.ts +4 -0
  64. package/dist/patterns/list/List.d.ts.map +1 -0
  65. package/dist/patterns/list/List.js +35 -0
  66. package/dist/patterns/list/List.js.map +1 -0
  67. package/dist/patterns/list/ListRow.d.ts +4 -0
  68. package/dist/patterns/list/ListRow.d.ts.map +1 -0
  69. package/dist/patterns/list/ListRow.js +108 -0
  70. package/dist/patterns/list/ListRow.js.map +1 -0
  71. package/dist/patterns/list/ListSection.d.ts +4 -0
  72. package/dist/patterns/list/ListSection.d.ts.map +1 -0
  73. package/dist/patterns/list/ListSection.js +14 -0
  74. package/dist/patterns/list/ListSection.js.map +1 -0
  75. package/dist/patterns/list/index.d.ts +5 -0
  76. package/dist/patterns/list/index.d.ts.map +1 -0
  77. package/dist/patterns/list/index.js +4 -0
  78. package/dist/patterns/list/index.js.map +1 -0
  79. package/dist/patterns/list/resolveListSeparator.d.ts +5 -0
  80. package/dist/patterns/list/resolveListSeparator.d.ts.map +1 -0
  81. package/dist/patterns/list/resolveListSeparator.js +6 -0
  82. package/dist/patterns/list/resolveListSeparator.js.map +1 -0
  83. package/dist/patterns/list/types.d.ts +55 -0
  84. package/dist/patterns/list/types.d.ts.map +1 -0
  85. package/dist/patterns/list/types.js +2 -0
  86. package/dist/patterns/list/types.js.map +1 -0
  87. package/dist/patterns/timeline/Timeline.d.ts +4 -0
  88. package/dist/patterns/timeline/Timeline.d.ts.map +1 -0
  89. package/dist/patterns/timeline/Timeline.js +59 -0
  90. package/dist/patterns/timeline/Timeline.js.map +1 -0
  91. package/dist/patterns/timeline/index.d.ts +3 -0
  92. package/dist/patterns/timeline/index.d.ts.map +1 -0
  93. package/dist/patterns/timeline/index.js +2 -0
  94. package/dist/patterns/timeline/index.js.map +1 -0
  95. package/dist/patterns/timeline/types.d.ts +18 -0
  96. package/dist/patterns/timeline/types.d.ts.map +1 -0
  97. package/dist/patterns/timeline/types.js +2 -0
  98. package/dist/patterns/timeline/types.js.map +1 -0
  99. package/package.json +1 -1
  100. package/src/components/media-card/MediaCard.tsx +120 -0
  101. package/src/components/media-card/index.ts +2 -0
  102. package/src/components/media-card/types.ts +44 -0
  103. package/src/components/metric-card/MetricCard.tsx +84 -0
  104. package/src/components/metric-card/index.ts +2 -0
  105. package/src/components/metric-card/types.ts +18 -0
  106. package/src/components/progress/Progress.tsx +50 -0
  107. package/src/components/progress/index.ts +2 -0
  108. package/src/components/progress/resolveProgressFraction.test.ts +23 -0
  109. package/src/components/progress/resolveProgressFraction.ts +17 -0
  110. package/src/components/progress/types.ts +27 -0
  111. package/src/components/rating/Rating.tsx +38 -0
  112. package/src/components/rating/index.ts +2 -0
  113. package/src/components/rating/resolveRatingSegments.test.ts +60 -0
  114. package/src/components/rating/resolveRatingSegments.ts +34 -0
  115. package/src/components/rating/types.ts +27 -0
  116. package/src/index.ts +19 -0
  117. package/src/patterns/list/List.tsx +72 -0
  118. package/src/patterns/list/ListRow.tsx +193 -0
  119. package/src/patterns/list/ListSection.tsx +36 -0
  120. package/src/patterns/list/index.ts +11 -0
  121. package/src/patterns/list/resolveListSeparator.test.ts +18 -0
  122. package/src/patterns/list/resolveListSeparator.ts +8 -0
  123. package/src/patterns/list/types.ts +67 -0
  124. package/src/patterns/timeline/Timeline.tsx +104 -0
  125. package/src/patterns/timeline/index.ts +2 -0
  126. package/src/patterns/timeline/types.ts +20 -0
  127. package/src/showcaseCoverage.test.ts +8 -0
  128. 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,2 @@
1
+ export { Timeline } from './Timeline';
2
+ export type { TimelineItem, TimelineProps } from './types';
@@ -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;