@fragments-sdk/cli 0.7.9 → 0.7.11

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 (106) hide show
  1. package/dist/bin.js +13 -13
  2. package/dist/bin.js.map +1 -1
  3. package/dist/{chunk-CWKQQR6C.js → chunk-57OW43NL.js} +3 -3
  4. package/dist/chunk-57OW43NL.js.map +1 -0
  5. package/dist/{chunk-AA6CAHCZ.js → chunk-7CRC46HV.js} +2 -2
  6. package/dist/chunk-7CRC46HV.js.map +1 -0
  7. package/dist/{chunk-3JPJTU25.js → chunk-CRTN6BIW.js} +5 -5
  8. package/dist/chunk-CRTN6BIW.js.map +1 -0
  9. package/dist/{chunk-LHIIBI6F.js → chunk-M42XIHPV.js} +2 -2
  10. package/dist/{chunk-2EFVPE5Q.js → chunk-TQOGBAOZ.js} +2 -2
  11. package/dist/chunk-TQOGBAOZ.js.map +1 -0
  12. package/dist/core/index.d.ts +1944 -0
  13. package/dist/{core-YAPWXDZW.js → core/index.js} +5 -5
  14. package/dist/defineFragment-C6PFzZyo.d.ts +656 -0
  15. package/dist/{generate-LEBVZCCH.js → generate-ZPERYZLF.js} +4 -4
  16. package/dist/index.d.ts +4 -159
  17. package/dist/index.js +9 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/{init-4VXL3Q6N.js → init-GID2DXB3.js} +69 -7
  20. package/dist/init-GID2DXB3.js.map +1 -0
  21. package/dist/mcp-bin.js +3 -3
  22. package/dist/{scan-3NYSRF6G.js → scan-BSMLGBX4.js} +5 -5
  23. package/dist/{service-HL6TMP3B.js → service-QACVPR37.js} +3 -3
  24. package/dist/{static-viewer-KLD24I4R.js → static-viewer-2RQD5QLR.js} +3 -3
  25. package/dist/{test-Y7YZOJLE.js → test-36UELXTE.js} +3 -3
  26. package/dist/{tokens-M4FCJKBK.js → tokens-A3BZIQPB.js} +4 -4
  27. package/dist/{viewer-ZWQQ74FV.js → viewer-CNLZQUFO.js} +156 -32
  28. package/dist/viewer-CNLZQUFO.js.map +1 -0
  29. package/package.json +8 -2
  30. package/src/commands/add.ts +1 -1
  31. package/src/commands/init.ts +84 -4
  32. package/src/core/defineFragment.ts +1 -1
  33. package/src/core/figma.ts +1 -1
  34. package/src/core/index.ts +2 -2
  35. package/src/core/loader.ts +3 -3
  36. package/src/core/schema.ts +1 -1
  37. package/src/index.ts +6 -0
  38. package/src/migrate/converter.ts +1 -1
  39. package/src/service/snippet-validation.test.ts +5 -5
  40. package/src/service/snippet-validation.ts +0 -1
  41. package/src/viewer/__tests__/viewer-integration.test.ts +16 -23
  42. package/src/viewer/components/AccessibilityPanel.tsx +1 -1
  43. package/src/viewer/components/ActionsPanel.tsx +1 -1
  44. package/src/viewer/components/App.tsx +563 -166
  45. package/src/viewer/components/BottomPanel.tsx +1 -1
  46. package/src/viewer/components/CodePanel.naming.test.tsx +1 -2
  47. package/src/viewer/components/CodePanel.tsx +1 -2
  48. package/src/viewer/components/CommandPalette.tsx +1 -1
  49. package/src/viewer/components/ComponentGraph.tsx +1 -1
  50. package/src/viewer/components/ComponentHeader.tsx +1 -1
  51. package/src/viewer/components/ContractPanel.tsx +1 -1
  52. package/src/viewer/components/ErrorBoundary.tsx +1 -1
  53. package/src/viewer/components/HealthDashboard.tsx +1 -1
  54. package/src/viewer/components/HmrStatusIndicator.tsx +1 -1
  55. package/src/viewer/components/InteractionsPanel.tsx +1 -1
  56. package/src/viewer/components/IsolatedRender.tsx +1 -1
  57. package/src/viewer/components/KeyboardShortcutsHelp.tsx +1 -1
  58. package/src/viewer/components/LandingPage.tsx +1 -1
  59. package/src/viewer/components/Layout.tsx +16 -13
  60. package/src/viewer/components/LeftSidebar.tsx +105 -18
  61. package/src/viewer/components/MultiViewportPreview.tsx +1 -1
  62. package/src/viewer/components/PreviewArea.tsx +22 -13
  63. package/src/viewer/components/PreviewFrameHost.tsx +0 -4
  64. package/src/viewer/components/PreviewToolbar.tsx +1 -1
  65. package/src/viewer/components/PropsEditor.tsx +1 -1
  66. package/src/viewer/components/PropsTable.tsx +1 -1
  67. package/src/viewer/components/RightSidebar.tsx +1 -1
  68. package/src/viewer/components/ScreenshotButton.tsx +1 -1
  69. package/src/viewer/components/SkeletonLoader.tsx +1 -1
  70. package/src/viewer/components/Toast.tsx +2 -2
  71. package/src/viewer/components/TokenStylePanel.tsx +1 -1
  72. package/src/viewer/components/VariantMatrix.tsx +1 -1
  73. package/src/viewer/components/VariantTabs.tsx +1 -1
  74. package/src/viewer/components/ViewportSelector.tsx +1 -1
  75. package/src/viewer/constants/ui.ts +14 -0
  76. package/src/viewer/entry.tsx +3 -4
  77. package/src/viewer/hooks/useKeyboardShortcuts.ts +65 -17
  78. package/src/viewer/hooks/useViewSettings.ts +1 -2
  79. package/src/viewer/index.ts +1 -1
  80. package/src/viewer/preview-frame.html +6 -9
  81. package/src/viewer/server.ts +106 -9
  82. package/src/viewer/styles/globals.css +12 -51
  83. package/src/viewer/vendor/shared/src/DocsHeaderBar.tsx +110 -0
  84. package/src/viewer/vendor/shared/src/DocsPageAsideHost.tsx +89 -0
  85. package/src/viewer/vendor/shared/src/DocsPageShell.tsx +119 -0
  86. package/src/viewer/vendor/shared/src/DocsSearchCommand.tsx +134 -0
  87. package/src/viewer/vendor/shared/src/DocsSidebarNav.tsx +66 -0
  88. package/src/viewer/vendor/shared/src/docs-layout.scss +28 -0
  89. package/src/viewer/vendor/shared/src/docs-layout.scss.d.ts +2 -0
  90. package/src/viewer/vendor/shared/src/index.ts +26 -0
  91. package/src/viewer/vendor/shared/src/types.ts +41 -0
  92. package/src/viewer/vite-plugin.ts +70 -9
  93. package/dist/chunk-2EFVPE5Q.js.map +0 -1
  94. package/dist/chunk-3JPJTU25.js.map +0 -1
  95. package/dist/chunk-AA6CAHCZ.js.map +0 -1
  96. package/dist/chunk-CWKQQR6C.js.map +0 -1
  97. package/dist/init-4VXL3Q6N.js.map +0 -1
  98. package/dist/viewer-ZWQQ74FV.js.map +0 -1
  99. /package/dist/{chunk-LHIIBI6F.js.map → chunk-M42XIHPV.js.map} +0 -0
  100. /package/dist/{core-YAPWXDZW.js.map → core/index.js.map} +0 -0
  101. /package/dist/{generate-LEBVZCCH.js.map → generate-ZPERYZLF.js.map} +0 -0
  102. /package/dist/{scan-3NYSRF6G.js.map → scan-BSMLGBX4.js.map} +0 -0
  103. /package/dist/{service-HL6TMP3B.js.map → service-QACVPR37.js.map} +0 -0
  104. /package/dist/{static-viewer-KLD24I4R.js.map → static-viewer-2RQD5QLR.js.map} +0 -0
  105. /package/dist/{test-Y7YZOJLE.js.map → test-36UELXTE.js.map} +0 -0
  106. /package/dist/{tokens-M4FCJKBK.js.map → tokens-A3BZIQPB.js.map} +0 -0
package/src/core/figma.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @example
8
8
  * ```tsx
9
- * import { defineFragment, figma } from '@fragments/core';
9
+ * import { defineFragment, figma } from '@fragments-sdk/cli/core';
10
10
  *
11
11
  * export default defineFragment({
12
12
  * component: Button,
package/src/core/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Browser-safe exports for @fragments/core
3
- * For Node.js-only APIs (config, discovery, loader), use '@fragments/core/node'
2
+ * Browser-safe exports for @fragments-sdk/cli/core
3
+ * For Node.js-only APIs (config, discovery, loader), import from '@fragments-sdk/cli' directly.
4
4
  */
5
5
 
6
6
  // Brand and default constants
@@ -27,8 +27,8 @@ function createFragmentsCoreShimPlugin(): Plugin {
27
27
  return {
28
28
  name: BRAND.vitePluginNamespace,
29
29
  setup(build) {
30
- // Intercept @fragments/core imports
31
- build.onResolve({ filter: /^@fragments\/core$/ }, (args) => {
30
+ // Intercept @fragments-sdk/cli/core imports
31
+ build.onResolve({ filter: /^@fragments-sdk\/cli\/core$/ }, (args) => {
32
32
  return {
33
33
  path: args.path,
34
34
  namespace: BRAND.vitePluginNamespace,
@@ -71,7 +71,7 @@ export async function loadFragmentFile(
71
71
 
72
72
  try {
73
73
  // Use esbuild to bundle the fragment file
74
- // We inject a shim for @fragments/core so it doesn't need to be installed
74
+ // We inject a shim for @fragments-sdk/cli/core so it doesn't need to be installed
75
75
  // Using CommonJS format to avoid ESM/CJS interop issues with node_modules
76
76
  await build({
77
77
  entryPoints: [absolutePath],
@@ -149,7 +149,7 @@ export const fragmentGeneratedSchema = z.object({
149
149
  * Schema for AI-specific metadata for playground context generation
150
150
  */
151
151
  export const aiMetadataSchema = z.object({
152
- compositionPattern: z.enum(['compound', 'simple', 'controlled']).optional(),
152
+ compositionPattern: z.enum(['compound', 'simple', 'controlled', 'wrapper']).optional(),
153
153
  subComponents: z.array(z.string()).optional(),
154
154
  requiredChildren: z.array(z.string()).optional(),
155
155
  commonPatterns: z.array(z.string()).optional(),
package/src/index.ts CHANGED
@@ -43,6 +43,12 @@ export type { AnalyzeOptions, AnalyzeResult } from "./analyze.js";
43
43
  // Static Viewer
44
44
  export { generateStaticViewer, generateViewerFromJson } from "./static-viewer.js";
45
45
 
46
+ // Config type (used by generated fragments.config.ts)
47
+ export type { FragmentsConfig } from "./core/types.js";
48
+
49
+ // Fragment definition API (used by generated .fragment.tsx files)
50
+ export { defineFragment, defineBlock } from "./core/defineFragment.js";
51
+
46
52
  // CLI Command metadata (for docs)
47
53
  export { CLI_COMMANDS, CLI_COMMAND_CATEGORIES } from "./cli-commands.js";
48
54
  export type { CliCommandDef, CliOptionDef, CliCommandCategory, CliCategoryInfo } from "./cli-commands.js";
@@ -550,7 +550,7 @@ ${generated.skippedVariants.map(sv => ` { name: "${escapeString(sv.name)}",
550
550
  }
551
551
 
552
552
  // Import the actual component - this makes the fragment immediately usable
553
- return `import { defineFragment } from "@fragments/core";
553
+ return `import { defineFragment } from "@fragments-sdk/cli/core";
554
554
  import { ${componentName} } from "${componentImport}";
555
555
 
556
556
  export default defineFragment({
@@ -45,7 +45,7 @@ describe('validateSnippetPolicy', () => {
45
45
  projectDir,
46
46
  'Button',
47
47
  `import React from 'react';
48
- import { defineFragment } from '@fragments/core';
48
+ import { defineFragment } from '@fragments-sdk/cli/core';
49
49
  import { Button } from '.';
50
50
 
51
51
  export default defineFragment({
@@ -86,7 +86,7 @@ export default defineFragment({
86
86
  projectDir,
87
87
  'Icon',
88
88
  `import React from 'react';
89
- import { defineFragment } from '@fragments/core';
89
+ import { defineFragment } from '@fragments-sdk/cli/core';
90
90
  import { Icon } from '.';
91
91
 
92
92
  export default defineFragment({
@@ -124,7 +124,7 @@ import { House } from '@phosphor-icons/react';
124
124
  projectDir,
125
125
  'Header',
126
126
  `import React from 'react';
127
- import { defineFragment } from '@fragments/core';
127
+ import { defineFragment } from '@fragments-sdk/cli/core';
128
128
  import { Header } from '.';
129
129
 
130
130
  export default defineFragment({
@@ -166,7 +166,7 @@ export default defineFragment({
166
166
  projectDir,
167
167
  'Alpha',
168
168
  `import React from 'react';
169
- import { defineFragment } from '@fragments/core';
169
+ import { defineFragment } from '@fragments-sdk/cli/core';
170
170
  import { Alpha } from '.';
171
171
 
172
172
  export default defineFragment({
@@ -183,7 +183,7 @@ export default defineFragment({
183
183
  projectDir,
184
184
  'Beta',
185
185
  `import React from 'react';
186
- import { defineFragment } from '@fragments/core';
186
+ import { defineFragment } from '@fragments-sdk/cli/core';
187
187
  import { Beta } from '.';
188
188
 
189
189
  export default defineFragment({
@@ -118,7 +118,6 @@ function normalizePolicy(
118
118
  function isFragmentsModule(modulePath: string): boolean {
119
119
  return (
120
120
  modulePath === '@fragments-sdk/ui'
121
- || modulePath === '@fragments/ui'
122
121
  || modulePath === '.'
123
122
  || modulePath === '..'
124
123
  || modulePath.startsWith('@/components/')
@@ -12,7 +12,7 @@ import { discoverInstalledFragments } from "../../core/discovery.js";
12
12
  * After packages were merged into @fragments-sdk/cli, the viewer's
13
13
  * path resolution changed. These tests verify that:
14
14
  * - Viewer assets (HTML, TSX entry points) are found at the correct paths
15
- * - The @fragments/core alias resolves to the consolidated core source
15
+ * - The @fragments-sdk/cli/core alias resolves to the consolidated core source
16
16
  * - The virtual module generates valid import statements
17
17
  * - The Vite config references correct file system locations
18
18
  */
@@ -61,9 +61,9 @@ describe("viewer path resolution", () => {
61
61
  });
62
62
  });
63
63
 
64
- describe("@fragments/core alias resolution", () => {
64
+ describe("@fragments-sdk/cli/core alias resolution", () => {
65
65
  it("core/index.ts exists at the expected path", () => {
66
- // server.ts: "@fragments/core": resolve(cliPackageRoot, "src/core/index.ts")
66
+ // server.ts: "@fragments-sdk/cli/core": resolve(cliPackageRoot, "src/core/index.ts")
67
67
  const corePath = resolve(cliPackageRoot, "src/core/index.ts");
68
68
  expect(existsSync(corePath)).toBe(true);
69
69
  });
@@ -82,32 +82,25 @@ describe("@fragments/core alias resolution", () => {
82
82
  });
83
83
  });
84
84
 
85
- describe("virtual module @fragments/core import", () => {
86
- it("vite-plugin generates import from @fragments/core (resolved via alias)", async () => {
87
- // The virtual module template in vite-plugin.ts must import from @fragments/core
85
+ describe("virtual module @fragments-sdk/cli/core import", () => {
86
+ it("vite-plugin generates import from @fragments-sdk/cli/core (resolved via alias)", async () => {
87
+ // The virtual module template in vite-plugin.ts must import from @fragments-sdk/cli/core
88
88
  // which is resolved by the Vite alias to the consolidated core source
89
89
  const pluginPath = resolve(viewerDir, "vite-plugin.ts");
90
90
  const content = await readFile(pluginPath, "utf-8");
91
91
 
92
- // The generated virtual module string should reference @fragments/core
92
+ // The generated virtual module string should reference @fragments-sdk/cli/core
93
93
  expect(content).toContain(
94
- 'import { storyModuleToFragment, setPreviewConfig } from "@fragments/core"'
94
+ 'import { storyModuleToFragment, setPreviewConfig } from "@fragments-sdk/cli/core"'
95
95
  );
96
96
  });
97
97
 
98
- it("server.ts sets up @fragments/core alias to src/core/index.ts", async () => {
98
+ it("server.ts sets up @fragments-sdk/cli/core alias to src/core/index.ts", async () => {
99
99
  const serverPath = resolve(viewerDir, "server.ts");
100
100
  const content = await readFile(serverPath, "utf-8");
101
101
 
102
- // The alias must resolve @fragments/core to the consolidated core
103
- expect(content).toContain('"@fragments/core": resolve(cliPackageRoot, "src/core/index.ts")');
104
- });
105
-
106
- it("server.ts sets up @fragments/viewer alias", async () => {
107
- const serverPath = resolve(viewerDir, "server.ts");
108
- const content = await readFile(serverPath, "utf-8");
109
-
110
- expect(content).toContain('"@fragments/viewer": viewerRoot');
102
+ // The alias must resolve @fragments-sdk/cli/core to the CLI's core source
103
+ expect(content).toContain('"@fragments-sdk/cli/core": resolve(cliPackageRoot, "src/core/index.ts")');
111
104
  });
112
105
 
113
106
  it("vite-plugin merges authored variant code from metadata fragments", async () => {
@@ -228,20 +221,20 @@ describe("no stale @fragments/* package references", () => {
228
221
  const serverPath = resolve(viewerDir, "server.ts");
229
222
  const content = await readFile(serverPath, "utf-8");
230
223
 
231
- // Should NOT try to resolve @fragments/core from node_modules
224
+ // Should NOT try to resolve @fragments-sdk/cli/core from node_modules
232
225
  expect(content).not.toContain('resolveFragmentsPackage("core"');
233
226
  });
234
227
 
235
- it("no source files import from @fragments/core as a runtime dependency", async () => {
228
+ it("no source files import from @fragments-sdk/cli/core as a runtime dependency", async () => {
236
229
  // All source-level imports should use relative paths (../core/).
237
- // Only the generated virtual module string uses @fragments/core (resolved via alias).
230
+ // Only the generated virtual module string uses @fragments-sdk/cli/core (resolved via alias).
238
231
  const serverPath = resolve(viewerDir, "server.ts");
239
232
  const content = await readFile(serverPath, "utf-8");
240
233
 
241
- // server.ts should import from relative paths, not @fragments/core
234
+ // server.ts should import from relative paths, not @fragments-sdk/cli/core
242
235
  const lines = content.split("\n");
243
236
  const importLines = lines.filter(
244
- (l) => l.startsWith("import") && l.includes("@fragments/core")
237
+ (l) => l.startsWith("import") && l.includes("@fragments-sdk/cli/core")
245
238
  );
246
239
  expect(importLines).toHaveLength(0);
247
240
  });
@@ -11,7 +11,7 @@
11
11
 
12
12
  import { useState, useEffect, useCallback, useMemo, useRef } from "react";
13
13
  import type { Result, NodeResult, ImpactValue, RunOptions } from "axe-core";
14
- import { Badge, Tabs, Dialog, Card, Alert, Text, Stack, Box, Button, Chip, EmptyState } from "@fragments/ui";
14
+ import { Badge, Tabs, Dialog, Card, Alert, Text, Stack, Box, Button, Chip, EmptyState } from "@fragments-sdk/ui";
15
15
  import { BRAND } from "../../core/index.js";
16
16
  import {
17
17
  updateComponentA11yResult,
@@ -8,7 +8,7 @@
8
8
  import { useState, useMemo } from "react";
9
9
  import type { ActionLog } from "../hooks/useActions.js";
10
10
  import { formatActionArg } from "../hooks/useActions.js";
11
- import { Button, Stack, Text, Badge, Input, Menu, Separator } from "@fragments/ui";
11
+ import { Button, Stack, Text, Badge, Input, Menu, Separator } from "@fragments-sdk/ui";
12
12
  import {
13
13
  TrashIcon,
14
14
  ChevronDownIcon,