@astryxdesign/cli 0.3.0-canary.d1b7d82 → 0.3.0-canary.d52d2cb
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/api/template/template.test.mjs +12 -13
- package/assets/codemods/transforms/v0.3.0/__tests__/migrate-grid-minchildwidth-to-columns.test.mjs +82 -0
- package/assets/codemods/transforms/v0.3.0/migrate-grid-minchildwidth-to-columns.mjs +38 -2
- package/assets/docs/layout.doc.dense.mjs +1 -1
- package/assets/templates/blocks/components/AspectRatio/AspectRatioCircleImage.tsx +1 -1
- package/assets/templates/blocks/components/AspectRatio/AspectRatioImageGallery.tsx +1 -1
- package/assets/templates/blocks/components/AspectRatio/AspectRatioShowcase.tsx +3 -3
- package/assets/templates/blocks/components/AspectRatio/AspectRatioSquareImage.tsx +1 -1
- package/assets/templates/blocks/components/AspectRatio/AspectRatioWidescreen.tsx +1 -1
- package/assets/templates/blocks/components/Avatar/AvatarFallbackChain.tsx +6 -6
- package/assets/templates/blocks/components/Avatar/AvatarGroup.tsx +5 -5
- package/assets/templates/blocks/components/Avatar/AvatarInteractive.tsx +2 -2
- package/assets/templates/blocks/components/Avatar/AvatarShowcase.tsx +4 -4
- package/assets/templates/blocks/components/Avatar/AvatarTooltip.tsx +4 -4
- package/assets/templates/blocks/components/Avatar/AvatarUserCard.tsx +3 -3
- package/assets/templates/blocks/components/Avatar/AvatarWithImage.tsx +4 -4
- package/assets/templates/blocks/components/Avatar/AvatarWithStatus.tsx +3 -3
- package/assets/templates/blocks/components/ChatComposerDrawer/ChatComposerDrawerAttachments.tsx +5 -5
- package/assets/templates/blocks/components/Lightbox/LightboxGallery.tsx +4 -4
- package/assets/templates/blocks/components/Lightbox/LightboxShowcase.tsx +1 -1
- package/assets/templates/blocks/components/Lightbox/LightboxVideo.tsx +1 -1
- package/assets/templates/blocks/components/Lightbox/LightboxZoom.tsx +2 -2
- package/assets/templates/blocks/components/MediaTheme/MediaThemeImageOverlay.tsx +1 -1
- package/assets/templates/blocks/components/MediaTheme/MediaThemeLightScrim.tsx +1 -1
- package/assets/templates/blocks/components/MediaTheme/MediaThemeShowcase.tsx +1 -1
- package/assets/templates/blocks/components/Overlay/OverlayBottomStrip.tsx +1 -1
- package/assets/templates/blocks/components/Overlay/OverlayHoverReveal.tsx +1 -1
- package/assets/templates/blocks/components/Overlay/OverlayShowcase.tsx +1 -1
- package/assets/templates/blocks/components/TopNav/TopNavMegaMenu.tsx +1 -1
- package/assets/templates/pages/centered-hero/page.tsx +1 -1
- package/assets/templates/pages/classic-gallery/page.tsx +10 -10
- package/assets/templates/pages/detail-page/page.tsx +5 -5
- package/assets/templates/pages/form-two-column/page.tsx +1 -1
- package/assets/templates/pages/gallery-hero/page.tsx +3 -3
- package/assets/templates/pages/library/page.tsx +30 -30
- package/assets/templates/pages/login/page.tsx +1 -2
- package/assets/templates/pages/login-card/page.tsx +1 -2
- package/assets/templates/pages/login-split/page.tsx +5 -6
- package/assets/templates/pages/login-sso/page.tsx +2 -3
- package/assets/templates/pages/mixed-gallery/page.tsx +5 -5
- package/assets/templates/pages/payment-form/page.tsx +3 -3
- package/assets/templates/pages/product-detail/page.tsx +7 -7
- package/assets/templates/pages/product-gallery/page.tsx +6 -6
- package/assets/templates/pages/shell-top-nav/page.tsx +2 -2
- package/assets/templates/pages/side-gallery/page.tsx +9 -9
- package/assets/templates/pages/table-page-chart/page.tsx +6 -6
- package/assets/templates/pages/theme-showcase/page.tsx +6 -6
- package/authoring/doctypes/base/type.ts +6 -0
- package/foundation/agent-docs/agent-docs.mjs +3 -4
- package/foundation/agent-docs/agent-docs.test.mjs +8 -0
- package/foundation/discovery/template-adapter.mjs +8 -4
- package/package.json +9 -9
|
@@ -4,36 +4,35 @@ import {describe, it, expect} from 'vitest';
|
|
|
4
4
|
import {stripTemplateAssetRefs, template} from './template.mjs';
|
|
5
5
|
|
|
6
6
|
describe('stripTemplateAssetRefs', () => {
|
|
7
|
-
it('replaces a
|
|
7
|
+
it('replaces a /template-assets image path with an inline data URI', () => {
|
|
8
8
|
const src =
|
|
9
|
-
"const hero = '
|
|
9
|
+
"const hero = '/template-assets/colorful-home-horizontal-1.png';";
|
|
10
10
|
const out = stripTemplateAssetRefs(src);
|
|
11
|
-
expect(out).not.toContain('
|
|
11
|
+
expect(out).not.toContain('/template-assets/');
|
|
12
12
|
expect(out).toContain('data:image/svg+xml,');
|
|
13
13
|
});
|
|
14
14
|
|
|
15
|
-
it('replaces a
|
|
16
|
-
const src =
|
|
17
|
-
'src="https://lookaside.facebook.com/assets/astryx/avatar-profile-05.jpg"';
|
|
15
|
+
it('replaces a /template-assets block-avatar image path', () => {
|
|
16
|
+
const src = 'src="/template-assets/avatar-profile-05.jpg"';
|
|
18
17
|
const out = stripTemplateAssetRefs(src);
|
|
19
|
-
expect(out).not.toContain('
|
|
18
|
+
expect(out).not.toContain('/template-assets/');
|
|
20
19
|
expect(out).toContain('data:image/svg+xml,');
|
|
21
20
|
});
|
|
22
21
|
|
|
23
|
-
it('replaces every
|
|
22
|
+
it('replaces every /template-assets reference, not just the first', () => {
|
|
24
23
|
const src = [
|
|
25
|
-
"'
|
|
26
|
-
"'
|
|
27
|
-
"'
|
|
24
|
+
"'/template-assets/colorful-home-horizontal-1.png'",
|
|
25
|
+
"'/template-assets/illustrative-horizontal-3.png'",
|
|
26
|
+
"'/template-assets/moody-scene-horizontal-1.png'",
|
|
28
27
|
].join('\n');
|
|
29
28
|
const out = stripTemplateAssetRefs(src);
|
|
30
|
-
expect(out).not.toContain('
|
|
29
|
+
expect(out).not.toContain('/template-assets/');
|
|
31
30
|
expect(out.match(/data:image\/svg\+xml,/g)).toHaveLength(3);
|
|
32
31
|
});
|
|
33
32
|
|
|
34
33
|
it('preserves surrounding source structure', () => {
|
|
35
34
|
const src =
|
|
36
|
-
"const data = [{src: '
|
|
35
|
+
"const data = [{src: '/template-assets/x.png', alt: 'X'}];";
|
|
37
36
|
const out = stripTemplateAssetRefs(src);
|
|
38
37
|
expect(out).toContain("alt: 'X'");
|
|
39
38
|
expect(out).toContain('const data = [{src:');
|
package/assets/codemods/transforms/v0.3.0/__tests__/migrate-grid-minchildwidth-to-columns.test.mjs
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect} from 'vitest';
|
|
4
|
+
|
|
5
|
+
async function applyTransform(source) {
|
|
6
|
+
const {default: transform} =
|
|
7
|
+
await import('../migrate-grid-minchildwidth-to-columns.mjs');
|
|
8
|
+
const jscodeshift = (await import('jscodeshift')).default;
|
|
9
|
+
const j = jscodeshift.withParser('tsx');
|
|
10
|
+
const api = {jscodeshift: j, stats: () => {}, report: () => {}};
|
|
11
|
+
const file = {source, path: 'test.tsx'};
|
|
12
|
+
const result = transform(file, api);
|
|
13
|
+
return result ?? source;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Collapse whitespace (and space padding inside braces) so formatting of
|
|
17
|
+
* pretty-printed multiline objects does not matter for assertions. */
|
|
18
|
+
function normalize(str) {
|
|
19
|
+
return str
|
|
20
|
+
.replace(/\s+/g, ' ')
|
|
21
|
+
.replace(/\{\s+/g, '{')
|
|
22
|
+
.replace(/\s+\}/g, '}')
|
|
23
|
+
.trim();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe('migrate-grid-minchildwidth-to-columns', () => {
|
|
27
|
+
it('migrates minChildWidth only to columns={{minWidth, repeat: "fit"}}', async () => {
|
|
28
|
+
const input = `import {Grid} from '@astryxdesign/core';
|
|
29
|
+
const t = <Grid minChildWidth={280}><Item /></Grid>;`;
|
|
30
|
+
const output = await applyTransform(input);
|
|
31
|
+
expect(output).not.toContain('minChildWidth');
|
|
32
|
+
expect(normalize(output)).toContain(
|
|
33
|
+
normalize("columns={{minWidth: 280, repeat: 'fit'}}"),
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('migrates columns={n} + minChildWidth to columns={{minWidth, max, repeat: "fit"}}', async () => {
|
|
38
|
+
const input = `import {Grid} from '@astryxdesign/core';
|
|
39
|
+
const t = <Grid columns={3} minChildWidth={280}><Item /></Grid>;`;
|
|
40
|
+
const output = await applyTransform(input);
|
|
41
|
+
expect(output).not.toContain('minChildWidth');
|
|
42
|
+
expect(normalize(output)).toContain(
|
|
43
|
+
normalize("columns={{minWidth: 280, max: 3, repeat: 'fit'}}"),
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('preserves other attributes (gap) when migrating the combo', async () => {
|
|
48
|
+
const input = `import {Grid} from '@astryxdesign/core';
|
|
49
|
+
const t = <Grid columns={5} gap={5} minChildWidth={140}><Item /></Grid>;`;
|
|
50
|
+
const output = await applyTransform(input);
|
|
51
|
+
expect(output).not.toContain('minChildWidth');
|
|
52
|
+
expect(normalize(output)).toContain(
|
|
53
|
+
normalize("columns={{minWidth: 140, max: 5, repeat: 'fit'}}"),
|
|
54
|
+
);
|
|
55
|
+
expect(output).toContain('gap={5}');
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('bails when columns is already an object (ambiguous)', async () => {
|
|
59
|
+
const input = `import {Grid} from '@astryxdesign/core';
|
|
60
|
+
const t = <Grid columns={{minWidth: 100}} minChildWidth={280}><Item /></Grid>;`;
|
|
61
|
+
const output = await applyTransform(input);
|
|
62
|
+
// Unchanged: object columns is ambiguous, so it is left as-is.
|
|
63
|
+
expect(output).toBe(input);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('bails when columns is a non-numeric/dynamic expression', async () => {
|
|
67
|
+
const input = `import {Grid} from '@astryxdesign/core';
|
|
68
|
+
const t = <Grid columns={cols} minChildWidth={280}><Item /></Grid>;`;
|
|
69
|
+
const output = await applyTransform(input);
|
|
70
|
+
expect(output).toBe(input);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('is alias-aware and supports the subpath import source', async () => {
|
|
74
|
+
const input = `import {Grid as G} from '@astryxdesign/core/Grid';
|
|
75
|
+
const t = <G columns={4} minChildWidth={200}><Item /></G>;`;
|
|
76
|
+
const output = await applyTransform(input);
|
|
77
|
+
expect(output).not.toContain('minChildWidth');
|
|
78
|
+
expect(normalize(output)).toContain(
|
|
79
|
+
normalize("columns={{minWidth: 200, max: 4, repeat: 'fit'}}"),
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -49,11 +49,10 @@ export default function transformer(file, api) {
|
|
|
49
49
|
a.type === 'JSXAttribute' && a.name?.name === 'minChildWidth',
|
|
50
50
|
);
|
|
51
51
|
if (!minAttr) return;
|
|
52
|
-
const
|
|
52
|
+
const columnsAttr = attrs.find(
|
|
53
53
|
(/** @type {any} */ a) =>
|
|
54
54
|
a.type === 'JSXAttribute' && a.name?.name === 'columns',
|
|
55
55
|
);
|
|
56
|
-
if (hasColumns) return;
|
|
57
56
|
|
|
58
57
|
let minWidthExpr;
|
|
59
58
|
if (
|
|
@@ -67,6 +66,43 @@ export default function transformer(file, api) {
|
|
|
67
66
|
return;
|
|
68
67
|
}
|
|
69
68
|
|
|
69
|
+
if (columnsAttr) {
|
|
70
|
+
// Both `columns` and `minChildWidth` are present. This is only safely
|
|
71
|
+
// migratable when `columns` is a numeric literal (e.g. `columns={3}`).
|
|
72
|
+
//
|
|
73
|
+
// In the old (0.2.0) Grid runtime, when both props were set and
|
|
74
|
+
// `columns` was a number, `minChildWidth` dominated and the numeric
|
|
75
|
+
// `columns` became a *max column cap* with `auto-fit`:
|
|
76
|
+
// repeat(auto-fit, minmax(minChildWidth, 1fr)) capped at `columns`.
|
|
77
|
+
// The 0.3.0 `columns` object models this exactly as
|
|
78
|
+
// {minWidth, max, repeat: 'fit'}.
|
|
79
|
+
// So the lossless rewrite is:
|
|
80
|
+
// <Grid columns={3} minChildWidth={280}>
|
|
81
|
+
// -> <Grid columns={{minWidth: 280, max: 3, repeat: 'fit'}}>
|
|
82
|
+
//
|
|
83
|
+
// If `columns` is already an object or a non-numeric/dynamic
|
|
84
|
+
// expression, the combined behavior is genuinely ambiguous, so we
|
|
85
|
+
// bail and leave it unmigrated (it surfaces separately).
|
|
86
|
+
const columnsValue = columnsAttr.value;
|
|
87
|
+
if (columnsValue?.type !== 'JSXExpressionContainer') return;
|
|
88
|
+
const columnsExpr = columnsValue.expression;
|
|
89
|
+
const isNumericLiteral =
|
|
90
|
+
(columnsExpr?.type === 'NumericLiteral' ||
|
|
91
|
+
columnsExpr?.type === 'Literal') &&
|
|
92
|
+
typeof columnsExpr.value === 'number';
|
|
93
|
+
if (!isNumericLiteral) return;
|
|
94
|
+
|
|
95
|
+
const columnsObject = j.objectExpression([
|
|
96
|
+
j.property('init', j.identifier('minWidth'), minWidthExpr),
|
|
97
|
+
j.property('init', j.identifier('max'), j.literal(columnsExpr.value)),
|
|
98
|
+
j.property('init', j.identifier('repeat'), j.literal('fit')),
|
|
99
|
+
]);
|
|
100
|
+
columnsAttr.value = j.jsxExpressionContainer(columnsObject);
|
|
101
|
+
attrs.splice(attrs.indexOf(minAttr), 1);
|
|
102
|
+
hasChanges = true;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
70
106
|
const columnsObject = j.objectExpression([
|
|
71
107
|
j.property('init', j.identifier('minWidth'), minWidthExpr),
|
|
72
108
|
j.property('init', j.identifier('repeat'), j.literal('fit')),
|
|
@@ -64,7 +64,7 @@ export const docsDense = {
|
|
|
64
64
|
'no Card-wrapped list items (card soup)',
|
|
65
65
|
'no stacked full-width Cards as page structure',
|
|
66
66
|
'no Cards in Cards',
|
|
67
|
-
'no decorative Badge
|
|
67
|
+
'no decorative Badge: counts/enums only; StatusDot/Token for status',
|
|
68
68
|
],
|
|
69
69
|
},
|
|
70
70
|
],
|
|
@@ -10,7 +10,7 @@ export default function AspectRatioCircleImage() {
|
|
|
10
10
|
<Center width={300}>
|
|
11
11
|
<AspectRatio ratio={1} shape="ellipse" fit="cover">
|
|
12
12
|
<img
|
|
13
|
-
src="
|
|
13
|
+
src="/template-assets/light-home-square-1.png"
|
|
14
14
|
alt="Circular image"
|
|
15
15
|
/>
|
|
16
16
|
</AspectRatio>
|
|
@@ -27,7 +27,7 @@ export default function AspectRatioImageGallery() {
|
|
|
27
27
|
{images.map(({id, alt}) => (
|
|
28
28
|
<AspectRatio key={id} ratio={4 / 3} fit="cover">
|
|
29
29
|
<img
|
|
30
|
-
src="
|
|
30
|
+
src="/template-assets/illustrative-horizontal-1.png"
|
|
31
31
|
alt={alt}
|
|
32
32
|
style={{borderRadius: 8}}
|
|
33
33
|
/>
|
|
@@ -10,19 +10,19 @@ const items = [
|
|
|
10
10
|
{
|
|
11
11
|
ratio: 1,
|
|
12
12
|
label: '1 : 1',
|
|
13
|
-
src: '
|
|
13
|
+
src: '/template-assets/light-home-square-1.png',
|
|
14
14
|
alt: '1:1 square',
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
ratio: 4 / 3,
|
|
18
18
|
label: '4 : 3',
|
|
19
|
-
src: '
|
|
19
|
+
src: '/template-assets/illustrative-horizontal-1.png',
|
|
20
20
|
alt: '4:3 standard',
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
ratio: 16 / 9,
|
|
24
24
|
label: '16 : 9',
|
|
25
|
-
src: '
|
|
25
|
+
src: '/template-assets/light-scene-horizontal-1.png',
|
|
26
26
|
alt: '16:9 widescreen',
|
|
27
27
|
},
|
|
28
28
|
];
|
|
@@ -10,7 +10,7 @@ export default function AspectRatioSquareImage() {
|
|
|
10
10
|
<Center width={300}>
|
|
11
11
|
<AspectRatio ratio={1} fit="cover">
|
|
12
12
|
<img
|
|
13
|
-
src="
|
|
13
|
+
src="/template-assets/light-home-square-1.png"
|
|
14
14
|
alt="1:1 square"
|
|
15
15
|
/>
|
|
16
16
|
</AspectRatio>
|
|
@@ -10,7 +10,7 @@ export default function AspectRatioWidescreen() {
|
|
|
10
10
|
<Center width={600}>
|
|
11
11
|
<AspectRatio ratio={16 / 9} fit="cover">
|
|
12
12
|
<img
|
|
13
|
-
src="
|
|
13
|
+
src="/template-assets/light-scene-horizontal-1.png"
|
|
14
14
|
alt="16:9 widescreen"
|
|
15
15
|
/>
|
|
16
16
|
</AspectRatio>
|
|
@@ -11,7 +11,7 @@ export default function AvatarFallbackChain() {
|
|
|
11
11
|
<VStack gap={4}>
|
|
12
12
|
<HStack gap={3} vAlign="center">
|
|
13
13
|
<Avatar
|
|
14
|
-
src="
|
|
14
|
+
src="/template-assets/DATA-Daniela-Gimenez.png"
|
|
15
15
|
name="Daniela Gimenez"
|
|
16
16
|
size="lg"
|
|
17
17
|
/>
|
|
@@ -19,8 +19,8 @@ export default function AvatarFallbackChain() {
|
|
|
19
19
|
</HStack>
|
|
20
20
|
<HStack gap={3} vAlign="center">
|
|
21
21
|
<Avatar
|
|
22
|
-
src="
|
|
23
|
-
fallbackSrc="
|
|
22
|
+
src="/template-assets/does-not-exist-primary.jpg"
|
|
23
|
+
fallbackSrc="/template-assets/DATA-Ami-Pena.png"
|
|
24
24
|
name="Invalid User"
|
|
25
25
|
size="lg"
|
|
26
26
|
/>
|
|
@@ -28,8 +28,8 @@ export default function AvatarFallbackChain() {
|
|
|
28
28
|
</HStack>
|
|
29
29
|
<HStack gap={3} vAlign="center">
|
|
30
30
|
<Avatar
|
|
31
|
-
src="
|
|
32
|
-
fallbackSrc="
|
|
31
|
+
src="/template-assets/does-not-exist-primary.jpg"
|
|
32
|
+
fallbackSrc="/template-assets/does-not-exist-fallback.jpg"
|
|
33
33
|
name="Test User"
|
|
34
34
|
size="lg"
|
|
35
35
|
/>
|
|
@@ -37,7 +37,7 @@ export default function AvatarFallbackChain() {
|
|
|
37
37
|
</HStack>
|
|
38
38
|
<HStack gap={3} vAlign="center">
|
|
39
39
|
<Avatar
|
|
40
|
-
src="
|
|
40
|
+
src="/template-assets/does-not-exist-primary.jpg"
|
|
41
41
|
size="lg"
|
|
42
42
|
/>
|
|
43
43
|
<Text type="supporting">All invalid, no name</Text>
|
|
@@ -10,23 +10,23 @@ import {Text} from '@astryxdesign/core/Text';
|
|
|
10
10
|
const USERS = [
|
|
11
11
|
{
|
|
12
12
|
name: 'Ami Pena',
|
|
13
|
-
src: '
|
|
13
|
+
src: '/template-assets/DATA-Ami-Pena.png',
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
name: 'Drew Young',
|
|
17
|
-
src: '
|
|
17
|
+
src: '/template-assets/DATA-Drew-Young.png',
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
name: 'Gabriela Fernandez',
|
|
21
|
-
src: '
|
|
21
|
+
src: '/template-assets/DATA-Gabriela-Fernandez.png',
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
name: 'Jihoo Song',
|
|
25
|
-
src: '
|
|
25
|
+
src: '/template-assets/DATA-Jihoo-Song.png',
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
name: 'Nam Tran',
|
|
29
|
-
src: '
|
|
29
|
+
src: '/template-assets/DATA-Nam-Tran.png',
|
|
30
30
|
},
|
|
31
31
|
];
|
|
32
32
|
|
|
@@ -11,7 +11,7 @@ export default function AvatarInteractive() {
|
|
|
11
11
|
<Stack direction="horizontal" gap={6} vAlign="start">
|
|
12
12
|
<Stack direction="vertical" gap={2} hAlign="center">
|
|
13
13
|
<Avatar
|
|
14
|
-
src="
|
|
14
|
+
src="/template-assets/DATA-Itai-Jordaan.png"
|
|
15
15
|
name="Itai Jordaan"
|
|
16
16
|
size="xl"
|
|
17
17
|
href="https://example.com/people/itai-jordaan"
|
|
@@ -22,7 +22,7 @@ export default function AvatarInteractive() {
|
|
|
22
22
|
</Stack>
|
|
23
23
|
<Stack direction="vertical" gap={2} hAlign="center">
|
|
24
24
|
<Avatar
|
|
25
|
-
src="
|
|
25
|
+
src="/template-assets/DATA-Margot-Schroder.png"
|
|
26
26
|
name="Margot Schroder"
|
|
27
27
|
size="xl"
|
|
28
28
|
onClick={() => window.alert('Opening Margot Schroder’s profile')}
|
|
@@ -9,23 +9,23 @@ export default function AvatarShowcase() {
|
|
|
9
9
|
return (
|
|
10
10
|
<Stack direction="horizontal" gap={4} vAlign="center">
|
|
11
11
|
<Avatar
|
|
12
|
-
src="
|
|
12
|
+
src="/template-assets/DATA-Ana-Thomas.png"
|
|
13
13
|
name="Ana Thomas"
|
|
14
14
|
size="xl"
|
|
15
15
|
status={<AvatarStatusDot variant="success" label="Online" />}
|
|
16
16
|
/>
|
|
17
17
|
<Avatar
|
|
18
|
-
src="
|
|
18
|
+
src="/template-assets/DATA-Drew-Young.png"
|
|
19
19
|
name="Drew Young"
|
|
20
20
|
size="xl"
|
|
21
21
|
/>
|
|
22
22
|
<Avatar
|
|
23
|
-
src="
|
|
23
|
+
src="/template-assets/DATA-Jihoo-Song.png"
|
|
24
24
|
name="Jihoo Song"
|
|
25
25
|
size="xl"
|
|
26
26
|
/>
|
|
27
27
|
<Avatar
|
|
28
|
-
src="
|
|
28
|
+
src="/template-assets/DATA-Nam-Tran.png"
|
|
29
29
|
name="Nam Tran"
|
|
30
30
|
size="xl"
|
|
31
31
|
status={<AvatarStatusDot variant="error" label="Busy" />}
|
|
@@ -15,17 +15,17 @@ export default function AvatarTooltip() {
|
|
|
15
15
|
</Text>
|
|
16
16
|
<Stack direction="horizontal" gap={4} vAlign="center">
|
|
17
17
|
<Avatar
|
|
18
|
-
src="
|
|
18
|
+
src="/template-assets/DATA-Ana-Thomas.png"
|
|
19
19
|
name="Ana Thomas"
|
|
20
20
|
size="xl"
|
|
21
21
|
/>
|
|
22
22
|
<Avatar
|
|
23
|
-
src="
|
|
23
|
+
src="/template-assets/DATA-Drew-Young.png"
|
|
24
24
|
name="Drew Young"
|
|
25
25
|
size="xl"
|
|
26
26
|
/>
|
|
27
27
|
<Avatar
|
|
28
|
-
src="
|
|
28
|
+
src="/template-assets/DATA-Jihoo-Song.png"
|
|
29
29
|
name="Jihoo Song"
|
|
30
30
|
size="xl"
|
|
31
31
|
/>
|
|
@@ -36,7 +36,7 @@ export default function AvatarTooltip() {
|
|
|
36
36
|
Custom tooltip text
|
|
37
37
|
</Text>
|
|
38
38
|
<Avatar
|
|
39
|
-
src="
|
|
39
|
+
src="/template-assets/DATA-Itai-Jordaan.png"
|
|
40
40
|
name="Itai Jordaan"
|
|
41
41
|
size="xl"
|
|
42
42
|
tooltip="Itai Jordaan · Engineering Lead"
|
|
@@ -9,19 +9,19 @@ import {Text} from '@astryxdesign/core/Text';
|
|
|
9
9
|
const USERS = [
|
|
10
10
|
{
|
|
11
11
|
name: 'Itai Jordaan',
|
|
12
|
-
src: '
|
|
12
|
+
src: '/template-assets/DATA-Itai-Jordaan.png',
|
|
13
13
|
role: 'Engineering Lead',
|
|
14
14
|
variant: 'success' as const,
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
name: 'Margot Schroder',
|
|
18
|
-
src: '
|
|
18
|
+
src: '/template-assets/DATA-Margot-Schroder.png',
|
|
19
19
|
role: 'Product Designer',
|
|
20
20
|
variant: 'neutral' as const,
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
name: 'Daniela Gimenez',
|
|
24
|
-
src: '
|
|
24
|
+
src: '/template-assets/DATA-Daniela-Gimenez.png',
|
|
25
25
|
role: 'Engineering Manager',
|
|
26
26
|
variant: 'error' as const,
|
|
27
27
|
},
|
|
@@ -9,22 +9,22 @@ export default function AvatarWithImage() {
|
|
|
9
9
|
return (
|
|
10
10
|
<Stack direction="horizontal" gap={4} vAlign="center">
|
|
11
11
|
<Avatar
|
|
12
|
-
src="
|
|
12
|
+
src="/template-assets/DATA-Ami-Pena.png"
|
|
13
13
|
name="Ami Pena"
|
|
14
14
|
size="xsm"
|
|
15
15
|
/>
|
|
16
16
|
<Avatar
|
|
17
|
-
src="
|
|
17
|
+
src="/template-assets/DATA-Ana-Thomas.png"
|
|
18
18
|
name="Ana Thomas"
|
|
19
19
|
size="md"
|
|
20
20
|
/>
|
|
21
21
|
<Avatar
|
|
22
|
-
src="
|
|
22
|
+
src="/template-assets/DATA-Daniela-Gimenez.png"
|
|
23
23
|
name="Daniela Gimenez"
|
|
24
24
|
size="lg"
|
|
25
25
|
/>
|
|
26
26
|
<Avatar
|
|
27
|
-
src="
|
|
27
|
+
src="/template-assets/DATA-Gabriela-Fernandez.png"
|
|
28
28
|
name="Gabriela Fernandez"
|
|
29
29
|
size="xl"
|
|
30
30
|
/>
|
|
@@ -9,19 +9,19 @@ export default function AvatarWithStatus() {
|
|
|
9
9
|
return (
|
|
10
10
|
<Stack direction="horizontal" gap={4} vAlign="center">
|
|
11
11
|
<Avatar
|
|
12
|
-
src="
|
|
12
|
+
src="/template-assets/DATA-Itai-Jordaan.png"
|
|
13
13
|
name="Itai Jordaan"
|
|
14
14
|
size="xl"
|
|
15
15
|
status={<AvatarStatusDot variant="success" label="Online" />}
|
|
16
16
|
/>
|
|
17
17
|
<Avatar
|
|
18
|
-
src="
|
|
18
|
+
src="/template-assets/DATA-Margot-Schroder.png"
|
|
19
19
|
name="Margot Schroder"
|
|
20
20
|
size="xl"
|
|
21
21
|
status={<AvatarStatusDot variant="neutral" label="Offline" />}
|
|
22
22
|
/>
|
|
23
23
|
<Avatar
|
|
24
|
-
src="
|
|
24
|
+
src="/template-assets/DATA-Pablo-Morales.png"
|
|
25
25
|
name="Pablo Morales"
|
|
26
26
|
size="xl"
|
|
27
27
|
status={<AvatarStatusDot variant="error" label="Busy" />}
|
package/assets/templates/blocks/components/ChatComposerDrawer/ChatComposerDrawerAttachments.tsx
CHANGED
|
@@ -11,31 +11,31 @@ import {Stack} from '@astryxdesign/core/Layout';
|
|
|
11
11
|
const IMAGE_ATTACHMENTS = [
|
|
12
12
|
{
|
|
13
13
|
id: '1',
|
|
14
|
-
src: '
|
|
14
|
+
src: '/template-assets/illustrative-vertical-1.png',
|
|
15
15
|
alt: 'River through a valley',
|
|
16
16
|
label: 'valley.jpg',
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
id: '2',
|
|
20
|
-
src: '
|
|
20
|
+
src: '/template-assets/illustrative-vertical-2.png',
|
|
21
21
|
alt: 'Foggy mountain peak',
|
|
22
22
|
label: 'mountain.jpg',
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
id: '3',
|
|
26
|
-
src: '
|
|
26
|
+
src: '/template-assets/illustrative-vertical-3.png',
|
|
27
27
|
alt: 'Golden retriever puppy',
|
|
28
28
|
label: 'puppy.jpg',
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
id: '4',
|
|
32
|
-
src: '
|
|
32
|
+
src: '/template-assets/illustrative-vertical-4.png',
|
|
33
33
|
alt: 'Bridge at sunset',
|
|
34
34
|
label: 'bridge.jpg',
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
id: '5',
|
|
38
|
-
src: '
|
|
38
|
+
src: '/template-assets/illustrative-vertical-5.png',
|
|
39
39
|
alt: 'Lakeside at dusk',
|
|
40
40
|
label: 'lakeside.jpg',
|
|
41
41
|
},
|
|
@@ -8,23 +8,23 @@ import {Thumbnail} from '@astryxdesign/core/Thumbnail';
|
|
|
8
8
|
|
|
9
9
|
const PHOTOS = [
|
|
10
10
|
{
|
|
11
|
-
src: '
|
|
11
|
+
src: '/template-assets/Neutral-Backpack.png',
|
|
12
12
|
alt: 'Backpack',
|
|
13
13
|
caption: 'A backpack displayed on a neutral background.',
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
|
-
src: '
|
|
16
|
+
src: '/template-assets/building.png',
|
|
17
17
|
alt: 'Modern building',
|
|
18
18
|
caption: 'A modern building with a contemporary architectural design.',
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
|
-
src: '
|
|
21
|
+
src: '/template-assets/light-scene-horizontal-1.png',
|
|
22
22
|
alt: 'Coastal shoreline with ocean waves',
|
|
23
23
|
caption:
|
|
24
24
|
'A scenic coastline with waves rolling onto a sandy beach beneath a clear sky.',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
src: '
|
|
27
|
+
src: '/template-assets/illustrative-vertical-1.png',
|
|
28
28
|
alt: 'Illustrated lakeside landscape at sunset',
|
|
29
29
|
caption:
|
|
30
30
|
'A stylized landscape illustration featuring pink clouds reflected over a calm lake at sunset.',
|
|
@@ -12,7 +12,7 @@ export default function LightboxShowcase() {
|
|
|
12
12
|
isOpen={isOpen}
|
|
13
13
|
onOpenChange={setIsOpen}
|
|
14
14
|
media={{
|
|
15
|
-
src: '
|
|
15
|
+
src: '/template-assets/light-scene-horizontal-1.png',
|
|
16
16
|
alt: 'Coastal shoreline with ocean waves',
|
|
17
17
|
caption:
|
|
18
18
|
'A scenic coastline with waves rolling onto a sandy beach beneath a clear sky.',
|
|
@@ -16,7 +16,7 @@ export default function LightboxVideo() {
|
|
|
16
16
|
isOpen={isOpen}
|
|
17
17
|
onOpenChange={setIsOpen}
|
|
18
18
|
media={{
|
|
19
|
-
src: '
|
|
19
|
+
src: '/template-assets/Nature-1.mp4',
|
|
20
20
|
alt: 'Flower blooming in time-lapse',
|
|
21
21
|
type: 'video',
|
|
22
22
|
caption: 'A flower blooming in time-lapse',
|
|
@@ -12,7 +12,7 @@ export default function LightboxZoom() {
|
|
|
12
12
|
return (
|
|
13
13
|
<>
|
|
14
14
|
<Thumbnail
|
|
15
|
-
src="
|
|
15
|
+
src="/template-assets/light-scene-horizontal-1.png"
|
|
16
16
|
alt="Coastal shoreline with ocean waves"
|
|
17
17
|
label="Coastal shoreline with ocean waves"
|
|
18
18
|
onClick={() => setIsOpen(true)}
|
|
@@ -21,7 +21,7 @@ export default function LightboxZoom() {
|
|
|
21
21
|
isOpen={isOpen}
|
|
22
22
|
onOpenChange={setIsOpen}
|
|
23
23
|
media={{
|
|
24
|
-
src: '
|
|
24
|
+
src: '/template-assets/light-scene-horizontal-1.png',
|
|
25
25
|
alt: 'Coastal shoreline with ocean waves',
|
|
26
26
|
caption:
|
|
27
27
|
'A scenic coastline. Double-click to zoom in and drag to pan.',
|
|
@@ -10,7 +10,7 @@ import {Stack} from '@astryxdesign/core/Layout';
|
|
|
10
10
|
import {Text} from '@astryxdesign/core/Text';
|
|
11
11
|
|
|
12
12
|
const LANDSCAPE_IMAGE_URL =
|
|
13
|
-
'
|
|
13
|
+
'/template-assets/light-scene-horizontal-1.png';
|
|
14
14
|
|
|
15
15
|
export default function MediaThemeImageOverlay() {
|
|
16
16
|
return (
|
|
@@ -10,7 +10,7 @@ import {Stack} from '@astryxdesign/core/Layout';
|
|
|
10
10
|
import {Text} from '@astryxdesign/core/Text';
|
|
11
11
|
|
|
12
12
|
const BRIGHT_ROOM_IMAGE_URL =
|
|
13
|
-
'
|
|
13
|
+
'/template-assets/light-home-square-1.png';
|
|
14
14
|
|
|
15
15
|
export default function MediaThemeLightScrim() {
|
|
16
16
|
return (
|
|
@@ -11,7 +11,7 @@ import {Badge} from '@astryxdesign/core/Badge';
|
|
|
11
11
|
import {Icon} from '@astryxdesign/core/Icon';
|
|
12
12
|
|
|
13
13
|
const SHOWCASE_IMAGE_URL =
|
|
14
|
-
'
|
|
14
|
+
'/template-assets/light-scene-horizontal-1.png';
|
|
15
15
|
|
|
16
16
|
export default function MediaThemeShowcase() {
|
|
17
17
|
return (
|
|
@@ -33,7 +33,7 @@ export default function OverlayBottomStrip() {
|
|
|
33
33
|
overflow: 'clip',
|
|
34
34
|
}}>
|
|
35
35
|
<img
|
|
36
|
-
src="
|
|
36
|
+
src="/template-assets/illustrative-horizontal-1.png"
|
|
37
37
|
alt="Product highlight preview"
|
|
38
38
|
style={{width: '100%', height: '100%', objectFit: 'cover'}}
|
|
39
39
|
/>
|