@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.
Files changed (52) hide show
  1. package/api/template/template.test.mjs +12 -13
  2. package/assets/codemods/transforms/v0.3.0/__tests__/migrate-grid-minchildwidth-to-columns.test.mjs +82 -0
  3. package/assets/codemods/transforms/v0.3.0/migrate-grid-minchildwidth-to-columns.mjs +38 -2
  4. package/assets/docs/layout.doc.dense.mjs +1 -1
  5. package/assets/templates/blocks/components/AspectRatio/AspectRatioCircleImage.tsx +1 -1
  6. package/assets/templates/blocks/components/AspectRatio/AspectRatioImageGallery.tsx +1 -1
  7. package/assets/templates/blocks/components/AspectRatio/AspectRatioShowcase.tsx +3 -3
  8. package/assets/templates/blocks/components/AspectRatio/AspectRatioSquareImage.tsx +1 -1
  9. package/assets/templates/blocks/components/AspectRatio/AspectRatioWidescreen.tsx +1 -1
  10. package/assets/templates/blocks/components/Avatar/AvatarFallbackChain.tsx +6 -6
  11. package/assets/templates/blocks/components/Avatar/AvatarGroup.tsx +5 -5
  12. package/assets/templates/blocks/components/Avatar/AvatarInteractive.tsx +2 -2
  13. package/assets/templates/blocks/components/Avatar/AvatarShowcase.tsx +4 -4
  14. package/assets/templates/blocks/components/Avatar/AvatarTooltip.tsx +4 -4
  15. package/assets/templates/blocks/components/Avatar/AvatarUserCard.tsx +3 -3
  16. package/assets/templates/blocks/components/Avatar/AvatarWithImage.tsx +4 -4
  17. package/assets/templates/blocks/components/Avatar/AvatarWithStatus.tsx +3 -3
  18. package/assets/templates/blocks/components/ChatComposerDrawer/ChatComposerDrawerAttachments.tsx +5 -5
  19. package/assets/templates/blocks/components/Lightbox/LightboxGallery.tsx +4 -4
  20. package/assets/templates/blocks/components/Lightbox/LightboxShowcase.tsx +1 -1
  21. package/assets/templates/blocks/components/Lightbox/LightboxVideo.tsx +1 -1
  22. package/assets/templates/blocks/components/Lightbox/LightboxZoom.tsx +2 -2
  23. package/assets/templates/blocks/components/MediaTheme/MediaThemeImageOverlay.tsx +1 -1
  24. package/assets/templates/blocks/components/MediaTheme/MediaThemeLightScrim.tsx +1 -1
  25. package/assets/templates/blocks/components/MediaTheme/MediaThemeShowcase.tsx +1 -1
  26. package/assets/templates/blocks/components/Overlay/OverlayBottomStrip.tsx +1 -1
  27. package/assets/templates/blocks/components/Overlay/OverlayHoverReveal.tsx +1 -1
  28. package/assets/templates/blocks/components/Overlay/OverlayShowcase.tsx +1 -1
  29. package/assets/templates/blocks/components/TopNav/TopNavMegaMenu.tsx +1 -1
  30. package/assets/templates/pages/centered-hero/page.tsx +1 -1
  31. package/assets/templates/pages/classic-gallery/page.tsx +10 -10
  32. package/assets/templates/pages/detail-page/page.tsx +5 -5
  33. package/assets/templates/pages/form-two-column/page.tsx +1 -1
  34. package/assets/templates/pages/gallery-hero/page.tsx +3 -3
  35. package/assets/templates/pages/library/page.tsx +30 -30
  36. package/assets/templates/pages/login/page.tsx +1 -2
  37. package/assets/templates/pages/login-card/page.tsx +1 -2
  38. package/assets/templates/pages/login-split/page.tsx +5 -6
  39. package/assets/templates/pages/login-sso/page.tsx +2 -3
  40. package/assets/templates/pages/mixed-gallery/page.tsx +5 -5
  41. package/assets/templates/pages/payment-form/page.tsx +3 -3
  42. package/assets/templates/pages/product-detail/page.tsx +7 -7
  43. package/assets/templates/pages/product-gallery/page.tsx +6 -6
  44. package/assets/templates/pages/shell-top-nav/page.tsx +2 -2
  45. package/assets/templates/pages/side-gallery/page.tsx +9 -9
  46. package/assets/templates/pages/table-page-chart/page.tsx +6 -6
  47. package/assets/templates/pages/theme-showcase/page.tsx +6 -6
  48. package/authoring/doctypes/base/type.ts +6 -0
  49. package/foundation/agent-docs/agent-docs.mjs +3 -4
  50. package/foundation/agent-docs/agent-docs.test.mjs +8 -0
  51. package/foundation/discovery/template-adapter.mjs +8 -4
  52. 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 lookaside astryx image URL with an inline data URI', () => {
7
+ it('replaces a /template-assets image path with an inline data URI', () => {
8
8
  const src =
9
- "const hero = 'https://lookaside.facebook.com/assets/astryx/colorful-home-horizontal-1.png';";
9
+ "const hero = '/template-assets/colorful-home-horizontal-1.png';";
10
10
  const out = stripTemplateAssetRefs(src);
11
- expect(out).not.toContain('lookaside.facebook.com');
11
+ expect(out).not.toContain('/template-assets/');
12
12
  expect(out).toContain('data:image/svg+xml,');
13
13
  });
14
14
 
15
- it('replaces a lookaside block-avatar image URL', () => {
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('lookaside.facebook.com');
18
+ expect(out).not.toContain('/template-assets/');
20
19
  expect(out).toContain('data:image/svg+xml,');
21
20
  });
22
21
 
23
- it('replaces every lookaside reference, not just the first', () => {
22
+ it('replaces every /template-assets reference, not just the first', () => {
24
23
  const src = [
25
- "'https://lookaside.facebook.com/assets/astryx/colorful-home-horizontal-1.png'",
26
- "'https://lookaside.facebook.com/assets/astryx/illustrative-horizontal-3.png'",
27
- "'https://lookaside.facebook.com/assets/astryx/moody-scene-horizontal-1.png'",
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('lookaside.facebook.com');
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: 'https://lookaside.facebook.com/assets/astryx/x.png', alt: 'X'}];";
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:');
@@ -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 hasColumns = attrs.some(
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 counts/enums only; StatusDot/Token for status',
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="https://lookaside.facebook.com/assets/astryx/light-home-square-1.png"
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="https://lookaside.facebook.com/assets/astryx/illustrative-horizontal-1.png"
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: 'https://lookaside.facebook.com/assets/astryx/light-home-square-1.png',
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: 'https://lookaside.facebook.com/assets/astryx/illustrative-horizontal-1.png',
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: 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png',
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="https://lookaside.facebook.com/assets/astryx/light-home-square-1.png"
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="https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Daniela-Gimenez.png"
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="https://lookaside.facebook.com/assets/astryx/does-not-exist-primary.jpg"
23
- fallbackSrc="https://lookaside.facebook.com/assets/astryx/DATA-Ami-Pena.png"
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="https://lookaside.facebook.com/assets/astryx/does-not-exist-primary.jpg"
32
- fallbackSrc="https://lookaside.facebook.com/assets/astryx/does-not-exist-fallback.jpg"
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="https://lookaside.facebook.com/assets/astryx/does-not-exist-primary.jpg"
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: 'https://lookaside.facebook.com/assets/astryx/DATA-Ami-Pena.png',
13
+ src: '/template-assets/DATA-Ami-Pena.png',
14
14
  },
15
15
  {
16
16
  name: 'Drew Young',
17
- src: 'https://lookaside.facebook.com/assets/astryx/DATA-Drew-Young.png',
17
+ src: '/template-assets/DATA-Drew-Young.png',
18
18
  },
19
19
  {
20
20
  name: 'Gabriela Fernandez',
21
- src: 'https://lookaside.facebook.com/assets/astryx/DATA-Gabriela-Fernandez.png',
21
+ src: '/template-assets/DATA-Gabriela-Fernandez.png',
22
22
  },
23
23
  {
24
24
  name: 'Jihoo Song',
25
- src: 'https://lookaside.facebook.com/assets/astryx/DATA-Jihoo-Song.png',
25
+ src: '/template-assets/DATA-Jihoo-Song.png',
26
26
  },
27
27
  {
28
28
  name: 'Nam Tran',
29
- src: 'https://lookaside.facebook.com/assets/astryx/DATA-Nam-Tran.png',
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="https://lookaside.facebook.com/assets/astryx/DATA-Itai-Jordaan.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Margot-Schroder.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Ana-Thomas.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Drew-Young.png"
18
+ src="/template-assets/DATA-Drew-Young.png"
19
19
  name="Drew Young"
20
20
  size="xl"
21
21
  />
22
22
  <Avatar
23
- src="https://lookaside.facebook.com/assets/astryx/DATA-Jihoo-Song.png"
23
+ src="/template-assets/DATA-Jihoo-Song.png"
24
24
  name="Jihoo Song"
25
25
  size="xl"
26
26
  />
27
27
  <Avatar
28
- src="https://lookaside.facebook.com/assets/astryx/DATA-Nam-Tran.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Ana-Thomas.png"
18
+ src="/template-assets/DATA-Ana-Thomas.png"
19
19
  name="Ana Thomas"
20
20
  size="xl"
21
21
  />
22
22
  <Avatar
23
- src="https://lookaside.facebook.com/assets/astryx/DATA-Drew-Young.png"
23
+ src="/template-assets/DATA-Drew-Young.png"
24
24
  name="Drew Young"
25
25
  size="xl"
26
26
  />
27
27
  <Avatar
28
- src="https://lookaside.facebook.com/assets/astryx/DATA-Jihoo-Song.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Itai-Jordaan.png"
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: 'https://lookaside.facebook.com/assets/astryx/DATA-Itai-Jordaan.png',
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: 'https://lookaside.facebook.com/assets/astryx/DATA-Margot-Schroder.png',
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: 'https://lookaside.facebook.com/assets/astryx/DATA-Daniela-Gimenez.png',
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="https://lookaside.facebook.com/assets/astryx/DATA-Ami-Pena.png"
12
+ src="/template-assets/DATA-Ami-Pena.png"
13
13
  name="Ami Pena"
14
14
  size="xsm"
15
15
  />
16
16
  <Avatar
17
- src="https://lookaside.facebook.com/assets/astryx/DATA-Ana-Thomas.png"
17
+ src="/template-assets/DATA-Ana-Thomas.png"
18
18
  name="Ana Thomas"
19
19
  size="md"
20
20
  />
21
21
  <Avatar
22
- src="https://lookaside.facebook.com/assets/astryx/DATA-Daniela-Gimenez.png"
22
+ src="/template-assets/DATA-Daniela-Gimenez.png"
23
23
  name="Daniela Gimenez"
24
24
  size="lg"
25
25
  />
26
26
  <Avatar
27
- src="https://lookaside.facebook.com/assets/astryx/DATA-Gabriela-Fernandez.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Itai-Jordaan.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Margot-Schroder.png"
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="https://lookaside.facebook.com/assets/astryx/DATA-Pablo-Morales.png"
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" />}
@@ -11,31 +11,31 @@ import {Stack} from '@astryxdesign/core/Layout';
11
11
  const IMAGE_ATTACHMENTS = [
12
12
  {
13
13
  id: '1',
14
- src: 'https://lookaside.facebook.com/assets/astryx/illustrative-vertical-1.png',
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: 'https://lookaside.facebook.com/assets/astryx/illustrative-vertical-2.png',
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: 'https://lookaside.facebook.com/assets/astryx/illustrative-vertical-3.png',
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: 'https://lookaside.facebook.com/assets/astryx/illustrative-vertical-4.png',
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: 'https://lookaside.facebook.com/assets/astryx/illustrative-vertical-5.png',
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: 'https://lookaside.facebook.com/assets/astryx/Neutral-Backpack.png',
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: 'https://lookaside.facebook.com/assets/astryx/building.png',
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: 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png',
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: 'https://lookaside.facebook.com/assets/astryx/illustrative-vertical-1.png',
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: 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png',
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: 'https://lookaside.facebook.com/assets/?set=astryx&name=Nature-1&density=1',
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="https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png"
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: 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png',
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
- 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png';
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
- 'https://lookaside.facebook.com/assets/astryx/light-home-square-1.png';
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
- 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png';
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="https://lookaside.facebook.com/assets/astryx/illustrative-horizontal-1.png"
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
  />