@ankhorage/zora 2.9.1 → 2.9.3
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/button/meta.d.ts +15 -0
- package/dist/components/button/meta.d.ts.map +1 -1
- package/dist/components/button/meta.js +4 -0
- package/dist/components/button/meta.js.map +1 -1
- package/dist/components/button/themeRecipeMeta.d.ts +33 -0
- package/dist/components/button/themeRecipeMeta.d.ts.map +1 -0
- package/dist/components/button/themeRecipeMeta.js +33 -0
- package/dist/components/button/themeRecipeMeta.js.map +1 -0
- package/dist/components/card/meta.d.ts +17 -0
- package/dist/components/card/meta.d.ts.map +1 -1
- package/dist/components/card/meta.js +5 -0
- package/dist/components/card/meta.js.map +1 -1
- package/dist/components/card/themeRecipeMeta.d.ts +31 -0
- package/dist/components/card/themeRecipeMeta.d.ts.map +1 -0
- package/dist/components/card/themeRecipeMeta.js +31 -0
- package/dist/components/card/themeRecipeMeta.js.map +1 -0
- package/dist/components/heading/meta.d.ts +42 -0
- package/dist/components/heading/meta.d.ts.map +1 -1
- package/dist/components/heading/meta.js +16 -0
- package/dist/components/heading/meta.js.map +1 -1
- package/dist/components/text/meta.d.ts +33 -0
- package/dist/components/text/meta.d.ts.map +1 -1
- package/dist/components/text/meta.js +9 -0
- package/dist/components/text/meta.js.map +1 -1
- package/dist/components/text/themeRecipeMeta.d.ts +32 -0
- package/dist/components/text/themeRecipeMeta.d.ts.map +1 -0
- package/dist/components/text/themeRecipeMeta.js +32 -0
- package/dist/components/text/themeRecipeMeta.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata/index.d.ts +4 -1
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/index.js +2 -0
- package/dist/metadata/index.js.map +1 -1
- package/dist/metadata/themeRecipeMeta.d.ts +3 -0
- package/dist/metadata/themeRecipeMeta.d.ts.map +1 -0
- package/dist/metadata/themeRecipeMeta.js +11 -0
- package/dist/metadata/themeRecipeMeta.js.map +1 -0
- package/dist/metadata/themeRecipeTypes.d.ts +31 -0
- package/dist/metadata/themeRecipeTypes.d.ts.map +1 -0
- package/dist/metadata/themeRecipeTypes.js +8 -0
- package/dist/metadata/themeRecipeTypes.js.map +1 -0
- package/dist/metadata/types.d.ts +7 -0
- package/dist/metadata/types.d.ts.map +1 -1
- package/dist/metadata/types.js.map +1 -1
- package/dist/patterns/panel/meta.d.ts +17 -0
- package/dist/patterns/panel/meta.d.ts.map +1 -1
- package/dist/patterns/panel/meta.js +5 -0
- package/dist/patterns/panel/meta.js.map +1 -1
- package/dist/patterns/panel/themeRecipeMeta.d.ts +31 -0
- package/dist/patterns/panel/themeRecipeMeta.d.ts.map +1 -0
- package/dist/patterns/panel/themeRecipeMeta.js +31 -0
- package/dist/patterns/panel/themeRecipeMeta.js.map +1 -0
- package/package.json +1 -1
- package/src/components/button/meta.ts +4 -0
- package/src/components/button/themeRecipeMeta.ts +34 -0
- package/src/components/card/meta.ts +5 -0
- package/src/components/card/themeRecipeMeta.ts +32 -0
- package/src/components/heading/meta.ts +16 -0
- package/src/components/text/meta.ts +9 -0
- package/src/components/text/themeRecipeMeta.ts +33 -0
- package/src/index.ts +15 -1
- package/src/metadata/authoringMeta.test.ts +72 -0
- package/src/metadata/index.ts +13 -0
- package/src/metadata/themeRecipeMeta.test.ts +70 -0
- package/src/metadata/themeRecipeMeta.ts +12 -0
- package/src/metadata/themeRecipeTypes.ts +47 -0
- package/src/metadata/types.ts +8 -0
- package/src/patterns/panel/meta.ts +5 -0
- package/src/patterns/panel/themeRecipeMeta.ts +32 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
|
|
3
|
+
import { ZORA_COMPONENT_META, ZORA_THEME_RECIPE_META, ZORA_THEME_TOKEN_FAMILIES } from './index';
|
|
4
|
+
|
|
5
|
+
const tokenFamilies = new Set<string>(ZORA_THEME_TOKEN_FAMILIES);
|
|
6
|
+
const expectedKinds = new Map<string, 'component' | 'pattern'>([
|
|
7
|
+
['Button', 'component'],
|
|
8
|
+
['Card', 'component'],
|
|
9
|
+
['Text', 'component'],
|
|
10
|
+
['Panel', 'pattern'],
|
|
11
|
+
]);
|
|
12
|
+
|
|
13
|
+
describe('ZORA_THEME_RECIPE_META', () => {
|
|
14
|
+
test('exports representative component and pattern recipes', () => {
|
|
15
|
+
expect(Object.keys(ZORA_THEME_RECIPE_META)).toEqual(['Button', 'Card', 'Text', 'Panel']);
|
|
16
|
+
expect(ZORA_THEME_RECIPE_META.Button?.kind).toBe('component');
|
|
17
|
+
expect(ZORA_THEME_RECIPE_META.Panel?.kind).toBe('pattern');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('keeps registry names unique and aligned with component metadata', () => {
|
|
21
|
+
const names = Object.values(ZORA_THEME_RECIPE_META).map((meta) => meta.name);
|
|
22
|
+
expect(new Set(names).size).toBe(names.length);
|
|
23
|
+
|
|
24
|
+
for (const [key, meta] of Object.entries(ZORA_THEME_RECIPE_META)) {
|
|
25
|
+
expect(meta.name).toBe(key);
|
|
26
|
+
expect(meta.kind).toBe(expectedKinds.get(key));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
expect(ZORA_COMPONENT_META.Button.category).toBe('component');
|
|
30
|
+
expect(ZORA_COMPONENT_META.Card.category).toBe('component');
|
|
31
|
+
expect(ZORA_COMPONENT_META.Text.category).toBe('component');
|
|
32
|
+
expect(ZORA_COMPONENT_META.Panel.category).toBe('pattern');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('references only canonical token families and valid choice defaults', () => {
|
|
36
|
+
for (const meta of Object.values(ZORA_THEME_RECIPE_META)) {
|
|
37
|
+
for (const field of Object.values(meta.fields)) {
|
|
38
|
+
if (field.type === 'token') {
|
|
39
|
+
expect(tokenFamilies.has(field.tokenFamily), `${meta.name}.${field.label}`).toBe(true);
|
|
40
|
+
}
|
|
41
|
+
if (field.type === 'choice') {
|
|
42
|
+
expect(field.options).toContain(field.default);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('describes component-specific semantic scales instead of universal geometry', () => {
|
|
49
|
+
expect(ZORA_THEME_RECIPE_META.Button?.fields.size).toMatchObject({
|
|
50
|
+
type: 'choice',
|
|
51
|
+
options: ['s', 'm', 'l'],
|
|
52
|
+
default: 'm',
|
|
53
|
+
});
|
|
54
|
+
expect(ZORA_THEME_RECIPE_META.Card?.fields.padding).toMatchObject({
|
|
55
|
+
type: 'token',
|
|
56
|
+
tokenFamily: 'spacing',
|
|
57
|
+
default: 'l',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('stays distinct from component metadata', () => {
|
|
62
|
+
expect(ZORA_THEME_RECIPE_META).not.toBe(ZORA_COMPONENT_META);
|
|
63
|
+
expect(ZORA_COMPONENT_META.Button.props.size?.type).toBe('enum');
|
|
64
|
+
expect(ZORA_THEME_RECIPE_META.Button?.fields.size?.type).toBe('choice');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('is serializable for downstream authoring consumers', () => {
|
|
68
|
+
expect(() => JSON.stringify(ZORA_THEME_RECIPE_META)).not.toThrow();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { buttonThemeRecipeMeta } from '../components/button/themeRecipeMeta';
|
|
2
|
+
import { cardThemeRecipeMeta } from '../components/card/themeRecipeMeta';
|
|
3
|
+
import { textThemeRecipeMeta } from '../components/text/themeRecipeMeta';
|
|
4
|
+
import { panelThemeRecipeMeta } from '../patterns/panel/themeRecipeMeta';
|
|
5
|
+
import type { ZoraThemeRecipeMetaRegistry } from './themeRecipeTypes';
|
|
6
|
+
|
|
7
|
+
export const ZORA_THEME_RECIPE_META: ZoraThemeRecipeMetaRegistry = {
|
|
8
|
+
Button: buttonThemeRecipeMeta,
|
|
9
|
+
Card: cardThemeRecipeMeta,
|
|
10
|
+
Text: textThemeRecipeMeta,
|
|
11
|
+
Panel: panelThemeRecipeMeta,
|
|
12
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export const ZORA_THEME_TOKEN_FAMILIES = [
|
|
2
|
+
'colors',
|
|
3
|
+
'spacing',
|
|
4
|
+
'radii',
|
|
5
|
+
'typography',
|
|
6
|
+
'shadows',
|
|
7
|
+
] as const;
|
|
8
|
+
|
|
9
|
+
export type ZoraThemeTokenFamily = (typeof ZORA_THEME_TOKEN_FAMILIES)[number];
|
|
10
|
+
|
|
11
|
+
export type ZoraThemeRecipeKind = 'component' | 'pattern';
|
|
12
|
+
|
|
13
|
+
interface ZoraThemeRecipeFieldBase {
|
|
14
|
+
readonly label: string;
|
|
15
|
+
readonly description?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ZoraThemeRecipeTokenFieldMeta extends ZoraThemeRecipeFieldBase {
|
|
19
|
+
readonly type: 'token';
|
|
20
|
+
readonly tokenFamily: ZoraThemeTokenFamily;
|
|
21
|
+
readonly default: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface ZoraThemeRecipeChoiceFieldMeta extends ZoraThemeRecipeFieldBase {
|
|
25
|
+
readonly type: 'choice';
|
|
26
|
+
readonly options: readonly string[];
|
|
27
|
+
readonly default: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ZoraThemeRecipeBooleanFieldMeta extends ZoraThemeRecipeFieldBase {
|
|
31
|
+
readonly type: 'boolean';
|
|
32
|
+
readonly default: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type ZoraThemeRecipeFieldMeta =
|
|
36
|
+
| ZoraThemeRecipeTokenFieldMeta
|
|
37
|
+
| ZoraThemeRecipeChoiceFieldMeta
|
|
38
|
+
| ZoraThemeRecipeBooleanFieldMeta;
|
|
39
|
+
|
|
40
|
+
export interface ZoraThemeRecipeMeta {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly kind: ZoraThemeRecipeKind;
|
|
43
|
+
readonly description?: string;
|
|
44
|
+
readonly fields: Readonly<Record<string, ZoraThemeRecipeFieldMeta>>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type ZoraThemeRecipeMetaRegistry = Readonly<Record<string, ZoraThemeRecipeMeta>>;
|
package/src/metadata/types.ts
CHANGED
|
@@ -25,6 +25,13 @@ export type ZoraComponentPropValue =
|
|
|
25
25
|
| readonly ZoraComponentPropValue[]
|
|
26
26
|
| { readonly [key: string]: ZoraComponentPropValue };
|
|
27
27
|
|
|
28
|
+
export type ZoraComponentPropAuthoring =
|
|
29
|
+
| { readonly authority: 'instance' }
|
|
30
|
+
| {
|
|
31
|
+
readonly authority: 'theme';
|
|
32
|
+
readonly scope: 'global' | 'component' | 'pattern';
|
|
33
|
+
};
|
|
34
|
+
|
|
28
35
|
export interface ZoraComponentPropArrayItemSchema {
|
|
29
36
|
key: string;
|
|
30
37
|
schema: ZoraComponentPropSchema;
|
|
@@ -37,6 +44,7 @@ export interface ZoraComponentPropSchema {
|
|
|
37
44
|
enum?: readonly (string | number)[];
|
|
38
45
|
default?: ZoraComponentPropValue;
|
|
39
46
|
itemSchema?: readonly ZoraComponentPropArrayItemSchema[];
|
|
47
|
+
authoring?: ZoraComponentPropAuthoring;
|
|
40
48
|
}
|
|
41
49
|
|
|
42
50
|
export interface ZoraComponentBlueprint {
|
|
@@ -18,16 +18,19 @@ export const panelMeta = {
|
|
|
18
18
|
type: 'string',
|
|
19
19
|
category: 'Content',
|
|
20
20
|
label: 'Title',
|
|
21
|
+
authoring: { authority: 'instance' },
|
|
21
22
|
},
|
|
22
23
|
description: {
|
|
23
24
|
type: 'string',
|
|
24
25
|
category: 'Content',
|
|
25
26
|
label: 'Description',
|
|
27
|
+
authoring: { authority: 'instance' },
|
|
26
28
|
},
|
|
27
29
|
eyebrow: {
|
|
28
30
|
type: 'string',
|
|
29
31
|
category: 'Content',
|
|
30
32
|
label: 'Eyebrow',
|
|
33
|
+
authoring: { authority: 'instance' },
|
|
31
34
|
},
|
|
32
35
|
tone: {
|
|
33
36
|
type: 'enum',
|
|
@@ -35,12 +38,14 @@ export const panelMeta = {
|
|
|
35
38
|
label: 'Tone',
|
|
36
39
|
enum: ['default', 'subtle', 'outline'],
|
|
37
40
|
default: 'default',
|
|
41
|
+
authoring: { authority: 'theme', scope: 'pattern' },
|
|
38
42
|
},
|
|
39
43
|
compact: {
|
|
40
44
|
type: 'boolean',
|
|
41
45
|
category: 'Layout',
|
|
42
46
|
label: 'Compact',
|
|
43
47
|
default: false,
|
|
48
|
+
authoring: { authority: 'theme', scope: 'pattern' },
|
|
44
49
|
},
|
|
45
50
|
},
|
|
46
51
|
} as const satisfies ZoraComponentMeta;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ZoraThemeRecipeMeta } from '../../metadata/themeRecipeTypes';
|
|
2
|
+
|
|
3
|
+
export const panelThemeRecipeMeta = {
|
|
4
|
+
name: 'Panel',
|
|
5
|
+
kind: 'pattern',
|
|
6
|
+
description: 'Maps global rhythm and surface tokens into Panel presentation.',
|
|
7
|
+
fields: {
|
|
8
|
+
tone: {
|
|
9
|
+
type: 'choice',
|
|
10
|
+
label: 'Tone',
|
|
11
|
+
options: ['default', 'subtle', 'outline'],
|
|
12
|
+
default: 'default',
|
|
13
|
+
},
|
|
14
|
+
padding: {
|
|
15
|
+
type: 'token',
|
|
16
|
+
tokenFamily: 'spacing',
|
|
17
|
+
label: 'Padding',
|
|
18
|
+
default: 'l',
|
|
19
|
+
},
|
|
20
|
+
radius: {
|
|
21
|
+
type: 'token',
|
|
22
|
+
tokenFamily: 'radii',
|
|
23
|
+
label: 'Corner radius',
|
|
24
|
+
default: 'l',
|
|
25
|
+
},
|
|
26
|
+
compact: {
|
|
27
|
+
type: 'boolean',
|
|
28
|
+
label: 'Compact',
|
|
29
|
+
default: false,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
} as const satisfies ZoraThemeRecipeMeta;
|