@vscode/component-explorer 0.1.1-0

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/dist/components/Explorer.d.ts +6 -0
  2. package/dist/components/Explorer.d.ts.map +1 -0
  3. package/dist/components/ExplorerModel.d.ts +50 -0
  4. package/dist/components/ExplorerModel.d.ts.map +1 -0
  5. package/dist/components/FixturePreviewItem.d.ts +8 -0
  6. package/dist/components/FixturePreviewItem.d.ts.map +1 -0
  7. package/dist/components/LeftSidebar.d.ts +5 -0
  8. package/dist/components/LeftSidebar.d.ts.map +1 -0
  9. package/dist/components/PreviewArea.d.ts +6 -0
  10. package/dist/components/PreviewArea.d.ts.map +1 -0
  11. package/dist/components/RightSidebar.d.ts +6 -0
  12. package/dist/components/RightSidebar.d.ts.map +1 -0
  13. package/dist/components/TitleBar.d.ts +5 -0
  14. package/dist/components/TitleBar.d.ts.map +1 -0
  15. package/dist/components/TitleBarButton.d.ts +9 -0
  16. package/dist/components/TitleBarButton.d.ts.map +1 -0
  17. package/dist/components/TreeView.d.ts +14 -0
  18. package/dist/components/TreeView.d.ts.map +1 -0
  19. package/dist/components/icons.d.ts +18 -0
  20. package/dist/components/icons.d.ts.map +1 -0
  21. package/dist/components/index.d.ts +15 -0
  22. package/dist/components/index.d.ts.map +1 -0
  23. package/dist/components/styles.d.ts +192 -0
  24. package/dist/components/styles.d.ts.map +1 -0
  25. package/dist/components/types.d.ts +18 -0
  26. package/dist/components/types.d.ts.map +1 -0
  27. package/dist/core/ComponentDefinition.d.ts +70 -0
  28. package/dist/core/ComponentDefinition.d.ts.map +1 -0
  29. package/dist/core/DisplayMode.d.ts +65 -0
  30. package/dist/core/DisplayMode.d.ts.map +1 -0
  31. package/dist/core/FixtureNode.d.ts +31 -0
  32. package/dist/core/FixtureNode.d.ts.map +1 -0
  33. package/dist/core/FixtureRegistry.d.ts +37 -0
  34. package/dist/core/FixtureRegistry.d.ts.map +1 -0
  35. package/dist/core/PropertySchema.d.ts +40 -0
  36. package/dist/core/PropertySchema.d.ts.map +1 -0
  37. package/dist/core/defineFixture.d.ts +109 -0
  38. package/dist/core/defineFixture.d.ts.map +1 -0
  39. package/dist/core/index.d.ts +12 -0
  40. package/dist/core/index.d.ts.map +1 -0
  41. package/dist/index.css +1 -0
  42. package/dist/index.d.ts +31 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +1386 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/lib/fixtureSizeCache.d.ts +12 -0
  47. package/dist/lib/fixtureSizeCache.d.ts.map +1 -0
  48. package/dist/lib/localStorageObservable.d.ts +16 -0
  49. package/dist/lib/localStorageObservable.d.ts.map +1 -0
  50. package/dist/lib/utils.d.ts +6 -0
  51. package/dist/lib/utils.d.ts.map +1 -0
  52. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/core/DisplayMode.ts","../src/core/PropertySchema.ts","../src/core/ComponentDefinition.ts","../src/core/defineFixture.ts","../src/core/FixtureNode.ts","../src/core/FixtureRegistry.ts","../../../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/client.js","../src/components/types.ts","../src/lib/localStorageObservable.ts","../src/components/ExplorerModel.ts","../src/components/styles.ts","../src/components/TitleBarButton.tsx","../src/components/icons.tsx","../src/components/TitleBar.tsx","../src/components/TreeView.tsx","../src/components/LeftSidebar.tsx","../src/components/RightSidebar.tsx","../src/components/FixturePreviewItem.tsx","../src/lib/fixtureSizeCache.ts","../src/components/PreviewArea.tsx","../src/components/Explorer.tsx","../src/index.ts"],"sourcesContent":["/**\n * Disposable resource that can be cleaned up.\n */\nexport interface Disposable {\n dispose(): void;\n}\n\n/**\n * Style definition for shadow DOM injection.\n */\nexport type StyleDefinition =\n | { readonly type: 'css'; readonly content: string }\n | { readonly type: 'url'; readonly href: string }\n | { readonly type: 'adopted'; readonly sheet: CSSStyleSheet };\n\n/**\n * Display mode for a component.\n */\nexport type DisplayMode = PageMode | ComponentMode;\n\n/**\n * Page mode - component fills a viewport with device presets.\n */\nexport interface PageMode {\n readonly type: 'page';\n /**\n * Device presets or custom viewport sizes.\n * When viewing, user can switch between these.\n */\n readonly viewports: ViewportPreset[];\n}\n\n/**\n * Component mode - renders at natural size.\n */\nexport interface ComponentMode {\n readonly type: 'component';\n}\n\n/**\n * Viewport preset - either a named preset or custom dimensions.\n */\nexport type ViewportPreset =\n | ViewportPresetName\n | { readonly name: string; readonly width: number; readonly height: number };\n\nexport type ViewportPresetName = 'mobile' | 'tablet' | 'desktop';\n\n/**\n * Standard viewport dimensions for presets.\n */\nexport const VIEWPORT_SIZES: Record<ViewportPresetName, { readonly width: number; readonly height: number }> = {\n mobile: { width: 390, height: 844 },\n tablet: { width: 768, height: 1024 },\n desktop: { width: 1440, height: 900 },\n};\n\n/**\n * Resolves a viewport preset to actual dimensions.\n */\nexport function resolveViewport(preset: ViewportPreset): { name: string; width: number; height: number } {\n if (typeof preset === 'string') {\n return { name: preset, ...VIEWPORT_SIZES[preset] };\n }\n return preset;\n}\n","/**\n * Schema for a component property.\n * Defines the type, name, and default value of a configurable property.\n */\nexport type PropertySchema =\n | BooleanProperty\n | StringProperty\n | NumberProperty\n | EnumProperty;\n\nexport interface BooleanProperty {\n readonly type: 'boolean';\n readonly name: string;\n readonly defaultValue: boolean;\n readonly description?: string;\n}\n\nexport interface StringProperty {\n readonly type: 'string';\n readonly name: string;\n readonly defaultValue: string;\n readonly description?: string;\n /** If true, render as multiline textarea */\n readonly multiline?: boolean;\n}\n\nexport interface NumberProperty {\n readonly type: 'number';\n readonly name: string;\n readonly defaultValue: number;\n readonly description?: string;\n readonly min?: number;\n readonly max?: number;\n readonly step?: number;\n}\n\nexport interface EnumProperty {\n readonly type: 'enum';\n readonly name: string;\n readonly defaultValue: string;\n readonly description?: string;\n readonly options: readonly string[];\n}\n\n/**\n * Gets the default values for a list of property schemas.\n */\nexport function getDefaultPropertyValues(properties: readonly PropertySchema[]): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n for (const prop of properties) {\n values[prop.name] = prop.defaultValue;\n }\n return values;\n}\n","import type { Disposable, DisplayMode, StyleDefinition } from './DisplayMode.js';\nimport type { PropertySchema } from './PropertySchema.js';\nimport type { DefineFixtureOptions, FixtureGroupEntry, singleFixtureBrand, fixtureGroupBrand, fixtureVariantsBrand } from './defineFixture.js';\n\n/**\n * Definition of a component fixture.\n * Components can render React, plain HTML, or any other UI library.\n */\nexport interface ComponentDefinition {\n /** Unique identifier within the fixture file */\n readonly id: string;\n\n /** Display name shown in the tree */\n readonly name: string;\n\n /** Optional description for documentation */\n readonly description?: string;\n\n /** How to isolate this component from other components */\n readonly isolation: 'iframe' | 'shadow-dom';\n\n /** How to display: page (device viewport) or component (natural size) */\n readonly displayMode: DisplayMode;\n\n /**\n * Stylesheets to inject into shadow root (for shadow-dom isolation).\n * Ignored when isolation is 'iframe'.\n */\n readonly styles?: readonly StyleDefinition[];\n\n /** Background pattern for the preview canvas: 'light' (default) or 'dark' for dark transparent pattern */\n readonly background: 'light' | 'dark';\n\n /** Property schema for the component */\n readonly properties: readonly PropertySchema[];\n\n /**\n * Render the component into the container.\n * Returns a disposable for cleanup (e.g., unmounting React).\n */\n render(container: HTMLElement, props: Record<string, unknown>): Disposable;\n}\n\n/**\n * A single fixture export created by defineFixture().\n */\nexport interface SingleFixtureExport {\n readonly [singleFixtureBrand]: true;\n readonly _options: DefineFixtureOptions;\n readonly _createDefinition: (id: string, name: string) => ComponentDefinition;\n}\n\n/**\n * A fixture group export created by defineFixtureGroup().\n */\nexport interface FixtureGroupExport {\n readonly [fixtureGroupBrand]: true;\n readonly _entries: { [key: string]: FixtureGroupEntry };\n}\n\n/**\n * A fixture variants export created by defineFixtureVariants().\n * Variants are rendered horizontally by default and have a distinct icon.\n */\nexport interface FixtureVariantsExport {\n readonly [fixtureVariantsBrand]: true;\n readonly _variants: { [key: string]: SingleFixtureExport };\n}\n\n/**\n * Fixture export type - a single fixture, a group, or variants.\n */\nexport type FixtureExport = SingleFixtureExport | FixtureGroupExport | FixtureVariantsExport;\n\n/**\n * Type guard for checking if a value is a ComponentDefinition.\n * @deprecated Use isSingleFixture or isFixtureGroup from defineFixture.ts instead\n */\nexport function isComponentDefinition(value: unknown): value is ComponentDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'render' in value &&\n typeof (value as ComponentDefinition).render === 'function' &&\n 'id' in value &&\n 'name' in value\n );\n}\n","import type { FixtureExport, SingleFixtureExport, FixtureGroupExport, FixtureVariantsExport, ComponentDefinition } from './ComponentDefinition.js';\nimport type { DisplayMode, Disposable, StyleDefinition } from './DisplayMode.js';\nimport type { PropertySchema } from './PropertySchema.js';\n\n/**\n * Options for defining a single component fixture.\n */\nexport interface DefineFixtureOptions {\n /** Optional description for documentation */\n description?: string;\n\n /** How to isolate: 'iframe' for full isolation, 'shadow-dom' (default) for lighter isolation */\n isolation?: 'iframe' | 'shadow-dom';\n\n /** Display mode: defaults to { type: 'component' } */\n displayMode?: DisplayMode;\n\n /** Styles to inject (for shadow-dom isolation) */\n styles?: StyleDefinition[];\n\n /** Background pattern for the preview canvas: 'light' (default) or 'dark' for dark transparent pattern */\n background?: 'light' | 'dark';\n\n /** Property definitions */\n properties?: PropertySchema[];\n\n /** Render function */\n render: (container: HTMLElement, props: Record<string, unknown>) => Disposable;\n}\n\n/** @deprecated Use DefineFixtureOptions instead */\nexport type DefineComponentOptions = DefineFixtureOptions;\n\n/** Brand symbol to identify single fixtures */\nexport const singleFixtureBrand = Symbol('singleFixture');\n\n/** Brand symbol to identify fixture groups */\nexport const fixtureGroupBrand = Symbol('fixtureGroup');\n\n/** Brand symbol to identify fixture variants */\nexport const fixtureVariantsBrand = Symbol('fixtureVariants');\n\n/**\n * Type guard for SingleFixtureExport.\n */\nexport function isSingleFixture(value: FixtureExport): value is SingleFixtureExport {\n return typeof value === 'object' && value !== null && singleFixtureBrand in value;\n}\n\n/**\n * Type guard for FixtureGroupExport.\n */\nexport function isFixtureGroup(value: FixtureExport): value is FixtureGroupExport {\n return typeof value === 'object' && value !== null && fixtureGroupBrand in value;\n}\n\n/**\n * Type guard for FixtureVariantsExport.\n */\nexport function isFixtureVariants(value: FixtureExport): value is FixtureVariantsExport {\n return typeof value === 'object' && value !== null && fixtureVariantsBrand in value;\n}\n\n/**\n * Creates the component definition from options (without id/name which are set at tree-building time).\n */\nfunction createComponentDefinition(\n options: DefineFixtureOptions,\n id: string,\n name: string\n): ComponentDefinition {\n return {\n id,\n name,\n description: options.description,\n isolation: options.isolation ?? 'shadow-dom',\n displayMode: options.displayMode ?? { type: 'component' },\n styles: options.styles,\n background: options.background ?? 'light',\n properties: options.properties ?? [],\n render: options.render,\n };\n}\n\n/**\n * Defines a single fixture.\n * \n * @example\n * ```ts\n * export default defineFixture({\n * properties: [\n * { type: 'string', name: 'label', defaultValue: 'Click me' },\n * ],\n * render: (container, props) => {\n * container.innerHTML = `<button>${props.label}</button>`;\n * return { dispose: () => { container.innerHTML = ''; } };\n * },\n * });\n * ```\n */\nexport function defineFixture(options: DefineFixtureOptions): SingleFixtureExport {\n return {\n [singleFixtureBrand]: true,\n _options: options,\n _createDefinition: (id: string, name: string) => createComponentDefinition(options, id, name),\n };\n}\n\n/**\n * Group entry: either a single fixture, a nested group, or variants.\n */\nexport type FixtureGroupEntry = SingleFixtureExport | FixtureGroupExport | FixtureVariantsExport;\n\n/**\n * Input for defineFixtureGroup.\n */\nexport type FixtureGroupInput = { [key: string]: FixtureGroupEntry };\n\n/**\n * Input for defineFixtureVariants (only single fixtures, no nesting).\n */\nexport type FixtureVariantsInput = { [key: string]: SingleFixtureExport };\n\n/**\n * Defines a group of fixtures with support for nesting.\n * \n * @example\n * ```ts\n * export default defineFixtureGroup({\n * Primary: defineFixture({\n * render: (container) => { ... },\n * }),\n * Variants: defineFixtureGroup({\n * Small: defineFixture({ ... }),\n * Large: defineFixture({ ... }),\n * }),\n * });\n * ```\n */\nexport function defineFixtureGroup(group: FixtureGroupInput): FixtureGroupExport {\n return {\n [fixtureGroupBrand]: true,\n _entries: group,\n };\n}\n\n/**\n * Defines a group of fixture variants (no nesting allowed).\n * Variants are rendered horizontally by default and have a distinct icon in the tree.\n * \n * @example\n * ```ts\n * export default defineFixtureGroup({\n * Button: defineFixtureVariants({\n * Small: defineFixture({ ... }),\n * Medium: defineFixture({ ... }),\n * Large: defineFixture({ ... }),\n * }),\n * });\n * ```\n */\nexport function defineFixtureVariants(variants: FixtureVariantsInput): FixtureVariantsExport {\n return {\n [fixtureVariantsBrand]: true,\n _variants: variants,\n };\n}\n","import type { ComponentDefinition, FixtureExport } from './ComponentDefinition.js';\nimport { isSingleFixture, isFixtureGroup, isFixtureVariants } from './defineFixture.js';\n\n/**\n * A node in the fixture tree.\n * Can be a folder (with children), variants (with children, horizontal layout), or a component leaf.\n */\nexport interface FixtureNode {\n /** Unique identifier (path segments joined by '/') */\n readonly id: string;\n\n /** Display name */\n readonly name: string;\n\n /** Node type: folder for groups, variants for horizontal variant display, component for leaves */\n readonly type: 'folder' | 'variants' | 'component';\n\n /** Children (for folders and variants) */\n readonly children?: readonly FixtureNode[];\n\n /** Component definition (only for component nodes) */\n readonly component?: ComponentDefinition;\n}\n\n/**\n * Creates a fixture tree from a map of fixture exports.\n * @param fixtures Map of fixture file path to exported fixture object\n */\nexport function createFixtureTree(fixtures: Map<string, FixtureExport>): FixtureNode {\n const root: MutableFixtureNode = {\n id: '',\n name: 'Components',\n type: 'folder',\n children: [],\n };\n\n for (const [filePath, fixtureExport] of fixtures) {\n // Extract folder name from file path (e.g., 'components/Button.fixture.tsx' -> 'Button')\n const baseName = extractBaseName(filePath);\n addFixtureExportToTree(root, [baseName], fixtureExport);\n }\n\n return root;\n}\n\ninterface MutableFixtureNode {\n id: string;\n name: string;\n type: 'folder' | 'variants' | 'component';\n children?: MutableFixtureNode[];\n component?: ComponentDefinition;\n}\n\nfunction extractBaseName(filePath: string): string {\n const fileName = filePath.split('/').pop() ?? filePath;\n // Remove .fixture.tsx, .fixture.ts, .fixture.jsx, .fixture.js\n return fileName.replace(/\\.fixture\\.(tsx?|jsx?)$/, '');\n}\n\nfunction addFixtureExportToTree(\n parent: MutableFixtureNode,\n pathSegments: string[],\n fixtureExport: FixtureExport\n): void {\n if (isSingleFixture(fixtureExport)) {\n // Single fixture - add as leaf\n const id = pathSegments.join('/');\n const name = pathSegments[pathSegments.length - 1];\n const componentNode: MutableFixtureNode = {\n id,\n name,\n type: 'component',\n component: fixtureExport._createDefinition(id, name),\n };\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(componentNode);\n } else if (isFixtureGroup(fixtureExport)) {\n // Fixture group - create or find folder and recurse\n const folderName = pathSegments[pathSegments.length - 1];\n const folderId = pathSegments.join('/');\n \n // Find or create the folder\n let folder = parent.children?.find(\n (c) => c.type === 'folder' && c.name === folderName\n );\n \n if (!folder) {\n folder = {\n id: folderId,\n name: folderName,\n type: 'folder',\n children: [],\n };\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(folder);\n }\n\n // Add each entry in the group\n for (const [key, entry] of Object.entries(fixtureExport._entries)) {\n addFixtureExportToTree(folder, [...pathSegments, key], entry);\n }\n } else if (isFixtureVariants(fixtureExport)) {\n // Fixture variants - create variants node with children\n const variantsName = pathSegments[pathSegments.length - 1];\n const variantsId = pathSegments.join('/');\n \n const variantsNode: MutableFixtureNode = {\n id: variantsId,\n name: variantsName,\n type: 'variants',\n children: [],\n };\n \n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(variantsNode);\n\n // Add each variant as a child component\n for (const [key, variant] of Object.entries(fixtureExport._variants)) {\n const childPath = [...pathSegments, key];\n const childId = childPath.join('/');\n const componentNode: MutableFixtureNode = {\n id: childId,\n name: key,\n type: 'component',\n component: variant._createDefinition(childId, key),\n };\n variantsNode.children!.push(componentNode);\n }\n }\n}\n\n/**\n * Finds a node in the tree by path.\n */\nexport function findNodeByPath(root: FixtureNode, path: string[]): FixtureNode | undefined {\n if (path.length === 0) {\n return root;\n }\n\n let current: FixtureNode | undefined = root;\n \n for (const segment of path) {\n if (!current || !current.children) {\n return undefined;\n }\n current = current.children.find((c) => c.name === segment);\n }\n\n return current;\n}\n\n/**\n * Collects all component nodes from a subtree.\n */\nexport function collectComponents(node: FixtureNode): ComponentDefinition[] {\n if (node.type === 'component' && node.component) {\n return [node.component];\n }\n\n const components: ComponentDefinition[] = [];\n for (const child of node.children ?? []) {\n components.push(...collectComponents(child));\n }\n return components;\n}\n","import { observableValue, derived, type IObservable, type IReader } from '@vscode/observables';\nimport type { ComponentDefinition, FixtureExport } from './ComponentDefinition.js';\nimport { createFixtureTree, findNodeByPath, type FixtureNode } from './FixtureNode.js';\n\n/**\n * Registry for discovered fixtures.\n * Holds the fixture tree as an observable for reactivity.\n */\nexport class FixtureRegistry {\n private readonly _fixtures = observableValue<Map<string, FixtureExport>>(this, new Map());\n\n /** Observable root of the fixture tree */\n readonly root: IObservable<FixtureNode> = derived(this, (reader) => {\n const fixtures = this._fixtures.read(reader);\n return createFixtureTree(fixtures);\n });\n\n /**\n * Registers a fixture file.\n * @param path The file path (e.g., 'components/Button.fixture.tsx')\n * @param fixtureExport The exported fixture object\n */\n register(path: string, fixtureExport: FixtureExport): void {\n const fixtures = new Map(this._fixtures.get());\n fixtures.set(path, fixtureExport);\n this._fixtures.set(fixtures, undefined);\n }\n\n /**\n * Unregisters a fixture file.\n * @param path The file path to remove\n */\n unregister(path: string): void {\n const fixtures = new Map(this._fixtures.get());\n if (fixtures.delete(path)) {\n this._fixtures.set(fixtures, undefined);\n }\n }\n\n /**\n * Clears all registered fixtures.\n */\n clear(): void {\n this._fixtures.set(new Map(), undefined);\n }\n\n /**\n * Gets a node by path.\n */\n getNode(reader: IReader, path: string[]): FixtureNode | undefined {\n const root = this.root.read(reader);\n return findNodeByPath(root, path);\n }\n\n /**\n * Gets a component by path (non-reactive, for use in preview iframe).\n * @param path Array of path segments (e.g., ['Button', 'Primary'])\n */\n getComponentByPath(path: string[]): ComponentDefinition | undefined {\n const fixtures = this._fixtures.get();\n const tree = createFixtureTree(fixtures);\n const node = findNodeByPath(tree, path);\n return node?.component;\n }\n}\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","import type { FixtureNode, ComponentDefinition } from '../core/index.js';\n\n/**\n * Explorer's tree node structure, derived from FixtureNode.\n * This is the explorer's own representation of the fixture tree.\n */\nexport interface ExplorerTreeNode {\n readonly id: string;\n readonly name: string;\n readonly type: 'folder' | 'variants' | 'component';\n readonly children?: readonly ExplorerTreeNode[];\n readonly component?: ComponentDefinition;\n}\n\n/**\n * Converts a FixtureNode tree to ExplorerTreeNode tree.\n * This allows the explorer to have its own tree structure.\n */\nexport function toExplorerTree(node: FixtureNode): ExplorerTreeNode {\n return {\n id: node.id,\n name: node.name,\n type: node.type,\n children: node.children?.map(toExplorerTree),\n component: node.component,\n };\n}\n","import { observableValue, type ISettableObservable } from '@vscode/observables';\n\nexport interface LocalStorageObservableOptions<T> {\n readonly storageKey: string;\n readonly defaultValue: T;\n /** Serialize value to string for localStorage. Defaults to JSON.stringify. */\n readonly serialize?: (value: T) => string;\n /** Deserialize string from localStorage. Defaults to JSON.parse. */\n readonly deserialize?: (raw: string) => T;\n}\n\n/**\n * Creates an observable that persists its value to localStorage.\n * The value is loaded from localStorage on creation (if present),\n * and saved to localStorage whenever it changes.\n */\nexport function createLocalStorageObservable<T>(\n owner: object,\n options: LocalStorageObservableOptions<T>\n): ISettableObservable<T> {\n const {\n storageKey,\n defaultValue,\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n } = options;\n\n // Try to load from localStorage\n let initialValue = defaultValue;\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored !== null) {\n initialValue = deserialize(stored);\n }\n } catch {\n // Ignore parse errors, use default\n }\n\n const obs = observableValue<T>(owner, initialValue);\n\n // Wrap the set method to persist to localStorage\n const originalSet = obs.set.bind(obs);\n obs.set = (value: T, tx: undefined) => {\n try {\n localStorage.setItem(storageKey, serialize(value));\n } catch {\n // Ignore storage errors (quota exceeded, etc.)\n }\n originalSet(value, tx);\n };\n\n return obs;\n}\n","import { observableValue, derived, IReader } from '@vscode/observables';\nimport { ViewModel, prop } from '@vscode/observables-react';\nimport type { FixtureRegistry, ComponentDefinition } from '../core/index.js';\nimport { type ExplorerTreeNode, toExplorerTree } from './types.js';\nimport { createLocalStorageObservable } from '../lib/localStorageObservable.js';\n\n/**\n * A fixture item to be rendered in the preview area.\n */\nexport interface FixtureItem {\n readonly id: string;\n readonly name: string;\n readonly path: string;\n readonly component: ComponentDefinition;\n}\n\n/**\n * A preview row can be either a single fixture or a horizontal variant group.\n */\nexport type PreviewRow =\n | { readonly type: 'single'; readonly fixture: FixtureItem }\n | { readonly type: 'variants'; readonly id: string; readonly name: string; readonly path: string; readonly fixtures: readonly FixtureItem[] };\n\nexport class ExplorerModel extends ViewModel({\n registry: prop.const<FixtureRegistry>(),\n}) {\n readonly leftSidebarVisible = createLocalStorageObservable<boolean>(this, {\n storageKey: 'component-explorer:leftSidebarVisible',\n defaultValue: true,\n });\n readonly rightSidebarVisible = createLocalStorageObservable<boolean>(this, {\n storageKey: 'component-explorer:rightSidebarVisible',\n defaultValue: true,\n });\n readonly isDarkTheme = createLocalStorageObservable<boolean>(this, {\n storageKey: 'component-explorer:isDarkTheme',\n defaultValue: true,\n });\n readonly selectedNodeId = createLocalStorageObservable<string | undefined>(this, {\n storageKey: 'component-explorer:selectedNodeId',\n defaultValue: undefined,\n });\n readonly expandedNodeIds = observableValue<ReadonlySet<string>>(this, new Set());\n\n /** The explorer's tree derived from the registry */\n readonly tree = derived(this, (reader) => {\n const root = this.props.registry.root.read(reader);\n return toExplorerTree(root);\n });\n\n readonly selectedNode = derived(this, (reader) => {\n const nodeId = this.selectedNodeId.read(reader);\n if (!nodeId) return undefined;\n const tree = this.tree.read(reader);\n return this._findNode(tree.children ?? [], nodeId);\n });\n\n /** List of preview rows to render based on current selection */\n readonly selectedFixtures = derived(this, (reader): readonly PreviewRow[] => {\n const selectedNode = this.selectedNode.read(reader);\n if (!selectedNode) return [];\n return this._collectPreviewRows(selectedNode, selectedNode.name);\n });\n\n toggleLeftSidebar = (): void => {\n this.leftSidebarVisible.set(!this.leftSidebarVisible.get(), undefined);\n };\n\n toggleRightSidebar = (): void => {\n this.rightSidebarVisible.set(!this.rightSidebarVisible.get(), undefined);\n };\n\n toggleTheme = (): void => {\n this.isDarkTheme.set(!this.isDarkTheme.get(), undefined);\n };\n\n selectNode = (nodeId: string): void => {\n this.selectedNodeId.set(nodeId, undefined);\n };\n\n toggleNodeExpanded = (nodeId: string): void => {\n const current = this.expandedNodeIds.get();\n const newSet = new Set(current);\n if (newSet.has(nodeId)) {\n newSet.delete(nodeId);\n } else {\n newSet.add(nodeId);\n }\n this.expandedNodeIds.set(newSet, undefined);\n };\n\n isNodeExpanded(nodeId: string, reader: IReader): boolean {\n return this.expandedNodeIds.read(reader).has(nodeId);\n }\n\n private _findNode(nodes: readonly ExplorerTreeNode[], id: string): ExplorerTreeNode | undefined {\n for (const node of nodes) {\n if (node.id === id) return node;\n if (node.children) {\n const found = this._findNode(node.children, id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n private _collectPreviewRows(node: ExplorerTreeNode, pathPrefix: string): PreviewRow[] {\n if (node.type === 'component' && node.component) {\n return [{\n type: 'single',\n fixture: {\n id: node.id,\n name: node.name,\n path: pathPrefix,\n component: node.component,\n },\n }];\n }\n\n if (node.type === 'variants') {\n // Collect all variant children as a single horizontal row\n const fixtures: FixtureItem[] = [];\n for (const child of node.children ?? []) {\n if (child.type === 'component' && child.component) {\n fixtures.push({\n id: child.id,\n name: child.name,\n path: `${pathPrefix} / ${child.name}`,\n component: child.component,\n });\n }\n }\n if (fixtures.length > 0) {\n return [{\n type: 'variants',\n id: node.id,\n name: node.name,\n path: pathPrefix,\n fixtures,\n }];\n }\n return [];\n }\n\n // Folder: recurse into children\n const result: PreviewRow[] = [];\n for (const child of node.children ?? []) {\n const childPath = pathPrefix ? `${pathPrefix} / ${child.name}` : child.name;\n result.push(...this._collectPreviewRows(child, childPath));\n }\n return result;\n }\n}\n","import * as React from 'react';\n\nexport const styles = {\n container: {\n display: 'flex',\n flexDirection: 'row' as const,\n height: '100%',\n width: '100%',\n fontFamily: 'var(--vscode-font-family)',\n fontSize: 'var(--vscode-font-size)',\n color: 'var(--vscode-foreground)',\n backgroundColor: 'var(--vscode-editor-background)',\n },\n centerArea: {\n display: 'flex',\n flexDirection: 'column' as const,\n flex: 1,\n overflow: 'hidden',\n },\n titleBar: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '35px',\n minHeight: '35px',\n padding: '0 10px',\n backgroundColor: 'var(--vscode-titleBar-activeBackground)',\n color: 'var(--vscode-titleBar-activeForeground)',\n borderBottom: '1px solid var(--vscode-titleBar-border, var(--vscode-panel-border))',\n },\n titleBarSection: {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n },\n titleBarCenter: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '13px',\n fontWeight: 400,\n },\n titleBarButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n border: 'none',\n background: 'transparent',\n color: 'var(--vscode-titleBar-activeForeground)',\n cursor: 'pointer',\n borderRadius: '4px',\n },\n titleBarButtonHover: {\n backgroundColor: 'var(--vscode-toolbar-hoverBackground)',\n },\n titleBarButtonActive: {\n backgroundColor: 'var(--vscode-toolbar-activeBackground)',\n color: 'var(--vscode-focusBorder)',\n },\n sidebar: {\n display: 'flex',\n flexDirection: 'column' as const,\n width: '260px',\n minWidth: '200px',\n backgroundColor: 'var(--vscode-sideBar-background)',\n borderRight: '1px solid var(--vscode-titleBar-border, var(--vscode-panel-border))',\n },\n sidebarRight: {\n borderRight: 'none',\n borderLeft: '1px solid var(--vscode-titleBar-border, var(--vscode-panel-border))',\n },\n sidebarHeader: {\n display: 'flex',\n alignItems: 'center',\n height: '35px',\n minHeight: '35px',\n padding: '0 12px',\n fontSize: '11px',\n fontWeight: 700,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.04em',\n color: 'var(--vscode-titleBar-activeForeground)',\n backgroundColor: 'var(--vscode-titleBar-activeBackground)',\n borderBottom: '1px solid var(--vscode-titleBar-border, var(--vscode-panel-border))',\n },\n sidebarContent: {\n flex: 1,\n overflow: 'auto',\n padding: '4px 0',\n },\n treeItem: {\n display: 'flex',\n alignItems: 'center',\n height: '22px',\n paddingRight: '8px',\n cursor: 'pointer',\n userSelect: 'none' as const,\n },\n treeItemSelected: {\n backgroundColor: 'var(--vscode-list-activeSelectionBackground)',\n color: 'var(--vscode-list-activeSelectionForeground)',\n },\n treeItemHover: {\n backgroundColor: 'var(--vscode-list-hoverBackground)',\n },\n treeItemChevron: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n color: 'var(--vscode-foreground)',\n opacity: 0.8,\n cursor: 'pointer',\n },\n treeItemChevronPlaceholder: {\n width: '16px',\n },\n treeItemIcon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n marginRight: '4px',\n },\n treeItemLabel: {\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n fontSize: '13px',\n },\n treeItemCount: {\n marginLeft: '8px',\n fontSize: '11px',\n color: 'var(--vscode-descriptionForeground)',\n },\n mainContent: {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--vscode-editor-background)',\n color: 'var(--vscode-descriptionForeground)',\n fontSize: '14px',\n },\n propertiesPanel: {\n padding: '12px',\n },\n propertyRow: {\n marginBottom: '12px',\n },\n propertyLabel: {\n fontSize: '12px',\n color: 'var(--vscode-foreground)',\n marginBottom: '4px',\n },\n propertyDescription: {\n fontSize: '11px',\n color: 'var(--vscode-descriptionForeground)',\n marginTop: '2px',\n },\n propertyInput: {\n width: '100%',\n height: '26px',\n padding: '0 8px',\n fontSize: '13px',\n color: 'var(--vscode-input-foreground)',\n backgroundColor: 'var(--vscode-input-background)',\n border: '1px solid var(--vscode-input-border, transparent)',\n borderRadius: '2px',\n outline: 'none',\n boxSizing: 'border-box' as const,\n },\n propertySelect: {\n width: '100%',\n height: '26px',\n padding: '0 8px',\n fontSize: '13px',\n color: 'var(--vscode-dropdown-foreground)',\n backgroundColor: 'var(--vscode-dropdown-background)',\n border: '1px solid var(--vscode-dropdown-border)',\n borderRadius: '2px',\n outline: 'none',\n boxSizing: 'border-box' as const,\n cursor: 'pointer',\n },\n} as const;\n\n// Helper to merge styles\nexport function mergeStyles(...styleObjects: (React.CSSProperties | undefined | false)[]): React.CSSProperties {\n return Object.assign({}, ...styleObjects.filter(Boolean));\n}\n","import * as React from 'react';\nimport { observableValue } from '@vscode/observables';\nimport { viewWithModel, ViewModel, prop } from '@vscode/observables-react';\nimport { styles, mergeStyles } from './styles.js';\n\nclass TitleBarButtonModel extends ViewModel({\n active: prop<boolean>(),\n}) {\n readonly isHovered = observableValue<boolean>(this, false);\n\n get active() { return this.props.active; }\n\n setHovered = (hovered: boolean): void => {\n this.isHovered.set(hovered, undefined);\n };\n}\n\nexport const TitleBarButton = viewWithModel(\n TitleBarButtonModel,\n {\n onClick: prop.const<() => void>(),\n title: prop.const<string>(),\n children: prop.const<React.ReactNode>(),\n },\n (reader, model, props) => {\n const isHovered = model.isHovered.read(reader);\n const active = model.active.read(reader);\n\n const buttonStyle = mergeStyles(\n styles.titleBarButton,\n isHovered && !active && styles.titleBarButtonHover,\n active && styles.titleBarButtonActive,\n );\n\n return (\n <button\n style={buttonStyle}\n onClick={props.onClick}\n title={props.title}\n onMouseEnter={() => model.setHovered(true)}\n onMouseLeave={() => model.setHovered(false)}\n >\n {props.children}\n </button>\n );\n }\n);\n","import * as React from 'react';\n\nexport const ChevronRightIcon = ({ style }: { style?: React.CSSProperties }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" style={style}>\n <path d=\"M5.7 13.7L5 13l4.6-4.6L5 3.7l.7-.7 5.3 5.4-5.3 5.3z\" />\n </svg>\n);\n\nexport const ChevronDownIcon = ({ style }: { style?: React.CSSProperties }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" style={style}>\n <path d=\"M11 5.5L6 10.5L5.3 9.8L9.6 5.5L5.3 1.2L6 0.5L11 5.5z\" transform=\"rotate(90 8 5.5)\" />\n </svg>\n);\n\nexport const ComponentIcon = ({ style }: { style?: React.CSSProperties }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" style={style}>\n <path d=\"M14.5 2H9l-.35.15-.65.64-.65-.64L7 2H1.5l-.5.5v10l.5.5H7l.35-.15.65-.64.65.64.35.15h5.5l.5-.5v-10l-.5-.5zm-7 10H2V3h5v.86L5.85 5l1.15 1.14V10l-1.15-1.14L7 7.72V12zm6 0H8V7.72l1.15 1.14L8 10V6.14L9.15 5 8 3.86V3h5v9z\" />\n </svg>\n);\n\nexport const FolderIcon = ({ style }: { style?: React.CSSProperties }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" style={style}>\n <path d=\"M14.5 3H7.71l-.85-.85L6.5 2h-5l-.5.5v11l.5.5h13l.5-.5v-10l-.5-.5zm-.5 10H2V6h12v7zm0-8H2V3h4.29l.85.85.36.15H14v1z\" />\n </svg>\n);\n\nexport const PanelLeftIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2v12h12V2H2zm11 11H6V3h7v10zM3 3h2v10H3V3z\" />\n </svg>\n);\n\nexport const PanelRightIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M2 2v12h12V2H2zm6 11V3h5v10H8zM3 3h4v10H3V3z\" />\n </svg>\n);\n\nexport const SunIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z\" />\n </svg>\n);\n\nexport const MoonIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path d=\"M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z\" />\n </svg>\n);\n","import { view, prop } from '@vscode/observables-react';\nimport { styles } from './styles.js';\nimport { TitleBarButton } from './TitleBarButton.js';\nimport { PanelLeftIcon, PanelRightIcon, SunIcon, MoonIcon } from './icons.js';\nimport type { ExplorerModel } from './ExplorerModel.js';\n\nexport const TitleBar = view(\n {\n model: prop.const<ExplorerModel>(),\n },\n (reader, props) => {\n const model = props.model;\n const leftVisible = model.leftSidebarVisible.read(reader);\n const rightVisible = model.rightSidebarVisible.read(reader);\n const isDarkTheme = model.isDarkTheme.read(reader);\n const selectedNode = model.selectedNode.read(reader);\n\n return (\n <div style={styles.titleBar}>\n <div style={styles.titleBarSection}>\n <TitleBarButton\n active={leftVisible}\n onClick={model.toggleLeftSidebar}\n title=\"Toggle left sidebar\"\n >\n <PanelLeftIcon />\n </TitleBarButton>\n </div>\n <div style={styles.titleBarCenter}>\n {selectedNode ? (\n <>\n <span style={{ color: 'var(--vscode-textLink-foreground)' }}>&lt;</span>\n <span>{selectedNode.name}</span>\n <span style={{ color: 'var(--vscode-textLink-foreground)' }}>/&gt;</span>\n </>\n ) : (\n <span style={{ color: 'var(--vscode-descriptionForeground)' }}>No component selected</span>\n )}\n </div>\n <div style={styles.titleBarSection}>\n <TitleBarButton\n active={false}\n onClick={model.toggleTheme}\n title={isDarkTheme ? 'Switch to light theme' : 'Switch to dark theme'}\n >\n {isDarkTheme ? <SunIcon /> : <MoonIcon />}\n </TitleBarButton>\n <TitleBarButton\n active={rightVisible}\n onClick={model.toggleRightSidebar}\n title=\"Toggle right sidebar\"\n >\n <PanelRightIcon />\n </TitleBarButton>\n </div>\n </div>\n );\n }\n);\n","import * as React from 'react';\nimport { observableValue } from '@vscode/observables';\nimport { view, viewWithModel, ViewModel, prop } from '@vscode/observables-react';\nimport { styles, mergeStyles } from './styles.js';\nimport { ChevronRightIcon, ChevronDownIcon, ComponentIcon, FolderIcon } from './icons.js';\nimport type { ExplorerModel } from './ExplorerModel.js';\nimport type { ExplorerTreeNode } from './types.js';\n\n// TreeView - renders a list of nodes\nexport const TreeView = view(\n {\n model: prop.const<ExplorerModel>(),\n nodes: prop.const<readonly ExplorerTreeNode[]>(),\n depth: prop.const<number>(),\n },\n (_reader, props) => (\n <>\n {props.nodes.map((node) => (\n <TreeItem key={node.id} model={props.model} node={node} depth={props.depth} />\n ))}\n </>\n )\n);\n\n// TreeItem - ViewModel for hover state\nclass TreeItemModel extends ViewModel({\n model: prop.const<ExplorerModel>(),\n node: prop.const<ExplorerTreeNode>(),\n depth: prop.const<number>(),\n}) {\n readonly isHovered = observableValue<boolean>(this, false);\n\n // Expose props for render function\n get explorerModel(): ExplorerModel { return this.props.model; }\n get treeNode(): ExplorerTreeNode { return this.props.node; }\n get treeDepth(): number { return this.props.depth; }\n\n setHovered = (hovered: boolean): void => {\n this.isHovered.set(hovered, undefined);\n };\n\n handleClick = (): void => {\n this.props.model.selectNode(this.props.node.id);\n };\n\n handleDoubleClick = (): void => {\n if (this._hasChildren) {\n this.props.model.toggleNodeExpanded(this.props.node.id);\n }\n };\n\n handleChevronClick = (e: React.MouseEvent): void => {\n e.stopPropagation();\n this.props.model.toggleNodeExpanded(this.props.node.id);\n };\n\n private get _hasChildren(): boolean {\n return !!(this.props.node.children && this.props.node.children.length > 0);\n }\n}\n\nexport const TreeItem = viewWithModel(TreeItemModel, {}, (reader, itemModel) => {\n const model = itemModel.explorerModel;\n const node = itemModel.treeNode;\n const depth = itemModel.treeDepth;\n const hasChildren = !!(node.children && node.children.length > 0);\n const isExpanded = hasChildren ? model.isNodeExpanded(node.id, reader) : false;\n const selectedId = model.selectedNodeId.read(reader);\n const isSelected = selectedId === node.id;\n const isHovered = itemModel.isHovered.read(reader);\n\n const itemStyle = mergeStyles(\n styles.treeItem,\n { paddingLeft: `${8 + depth * 12}px` },\n isSelected && styles.treeItemSelected,\n !isSelected && isHovered && styles.treeItemHover,\n );\n\n return (\n <>\n <div\n style={itemStyle}\n onClick={itemModel.handleClick}\n onDoubleClick={itemModel.handleDoubleClick}\n onMouseEnter={() => itemModel.setHovered(true)}\n onMouseLeave={() => itemModel.setHovered(false)}\n >\n {hasChildren ? (\n <div style={styles.treeItemChevron} onClick={itemModel.handleChevronClick}>\n {isExpanded ? <ChevronDownIcon /> : <ChevronRightIcon />}\n </div>\n ) : (\n <div style={styles.treeItemChevronPlaceholder} />\n )}\n <div style={styles.treeItemIcon}>\n {node.type === 'folder' \n ? <FolderIcon style={{ color: 'var(--vscode-symbolIcon-folderForeground)' }} />\n : <ComponentIcon style={{ color: '#deb45b' }} />\n }\n </div>\n <span style={styles.treeItemLabel}>{node.name}</span>\n {hasChildren && (\n <span style={styles.treeItemCount}>{node.children!.length}</span>\n )}\n </div>\n {hasChildren && isExpanded && (\n <TreeView model={model} nodes={node.children!} depth={depth + 1} />\n )}\n </>\n );\n});\n","import { view, prop } from '@vscode/observables-react';\nimport { styles } from './styles.js';\nimport { TreeView } from './TreeView.js';\nimport type { ExplorerModel } from './ExplorerModel.js';\n\nexport const LeftSidebar = view(\n {\n model: prop.const<ExplorerModel>(),\n },\n (reader, props) => {\n const tree = props.model.tree.read(reader);\n return (\n <div style={styles.sidebar}>\n <div style={styles.sidebarHeader}>Explorer</div>\n <div style={styles.sidebarContent}>\n <TreeView model={props.model} nodes={tree.children ?? []} depth={0} />\n </div>\n </div>\n );\n }\n);\n","import * as React from 'react';\nimport { observableValue } from '@vscode/observables';\nimport { view, viewWithModel, ViewModel, prop } from '@vscode/observables-react';\nimport { styles, mergeStyles } from './styles.js';\nimport type { ExplorerTreeNode } from './types.js';\n\n// ToggleSwitch with observable state\nclass ToggleSwitchModel extends ViewModel({}) {\n readonly checked = observableValue<boolean>(this, false);\n\n toggle = (): void => {\n this.checked.set(!this.checked.get(), undefined);\n };\n}\n\nconst ToggleSwitch = viewWithModel(ToggleSwitchModel, {}, (reader, model) => {\n const checked = model.checked.read(reader);\n\n const trackStyle: React.CSSProperties = {\n position: 'relative',\n width: '36px',\n height: '18px',\n backgroundColor: checked ? 'var(--vscode-button-background)' : 'var(--vscode-input-background)',\n borderRadius: '9px',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n border: '1px solid var(--vscode-input-border, transparent)',\n };\n\n const thumbStyle: React.CSSProperties = {\n position: 'absolute',\n top: '2px',\n left: checked ? '18px' : '2px',\n width: '12px',\n height: '12px',\n backgroundColor: 'var(--vscode-foreground)',\n borderRadius: '50%',\n transition: 'left 0.2s',\n };\n\n return (\n <div style={trackStyle} onClick={model.toggle}>\n <div style={thumbStyle} />\n </div>\n );\n});\n\n// PropertiesContent - shows mock properties for a component\nconst PropertiesContent = view(\n {\n node: prop.const<ExplorerTreeNode>(),\n },\n (_reader, props) => {\n if (props.node.type !== 'component') {\n return (\n <div style={{ padding: '12px', color: 'var(--vscode-descriptionForeground)', fontSize: '12px' }}>\n Select a component (not a folder) to view its properties\n </div>\n );\n }\n\n return (\n <div style={styles.propertiesPanel}>\n <div style={styles.propertyRow}>\n <div style={styles.propertyLabel}>\n children<span style={{ color: 'var(--vscode-descriptionForeground)' }}> : string</span>\n </div>\n <input\n type=\"text\"\n style={styles.propertyInput as React.CSSProperties}\n defaultValue=\"Click me\"\n placeholder=\"Enter text...\"\n />\n <div style={styles.propertyDescription}>Button text content</div>\n </div>\n\n <div style={styles.propertyRow}>\n <div style={styles.propertyLabel}>\n variant<span style={{ color: 'var(--vscode-descriptionForeground)' }}> : select</span>\n </div>\n <select style={styles.propertySelect as React.CSSProperties} defaultValue=\"default\">\n <option value=\"default\">default</option>\n <option value=\"primary\">primary</option>\n <option value=\"secondary\">secondary</option>\n <option value=\"destructive\">destructive</option>\n </select>\n <div style={styles.propertyDescription}>Visual style variant</div>\n </div>\n\n <div style={styles.propertyRow}>\n <div style={styles.propertyLabel}>\n size<span style={{ color: 'var(--vscode-descriptionForeground)' }}> : select</span>\n </div>\n <select style={styles.propertySelect as React.CSSProperties} defaultValue=\"default\">\n <option value=\"sm\">sm</option>\n <option value=\"default\">default</option>\n <option value=\"lg\">lg</option>\n </select>\n <div style={styles.propertyDescription}>Button size</div>\n </div>\n\n <div style={styles.propertyRow}>\n <div style={styles.propertyLabel}>\n disabled<span style={{ color: 'var(--vscode-descriptionForeground)' }}> : boolean</span>\n </div>\n <ToggleSwitch />\n <div style={styles.propertyDescription}>Disable the button</div>\n </div>\n </div>\n );\n }\n);\n\n// RightSidebar\nexport const RightSidebar = view(\n {\n selectedNode: prop.const<ExplorerTreeNode | undefined>(),\n },\n (_reader, props) => (\n <div style={mergeStyles(styles.sidebar, styles.sidebarRight)}>\n <div style={styles.sidebarHeader}>\n <span style={{ marginRight: '6px', color: 'var(--vscode-textLink-foreground)' }}>&lt;/&gt;</span>\n Props\n </div>\n <div style={styles.sidebarContent}>\n {props.selectedNode ? (\n <PropertiesContent node={props.selectedNode} />\n ) : (\n <div style={{ padding: '12px', color: 'var(--vscode-descriptionForeground)', fontSize: '12px' }}>\n Select a component to view its properties\n </div>\n )}\n </div>\n </div>\n )\n);\n","import * as React from 'react';\nimport { observableValue } from '@vscode/observables';\nimport { viewWithModel, ViewModel, prop } from '@vscode/observables-react';\nimport type { ComponentDefinition, Disposable } from '../core/index.js';\nimport { resolveViewport } from '../core/index.js';\nimport type { FixtureItem } from './ExplorerModel.js';\n\nclass FixturePreviewItemModel extends ViewModel({\n fixture: prop.const<FixtureItem>(),\n onSizeChange: prop.const<(id: string, width: number, height: number) => void>(),\n compact: prop.const<boolean | undefined>(),\n}) {\n private _containerRef: HTMLDivElement | null = null;\n private _shadowRoot: ShadowRoot | null = null;\n private _renderContainer: HTMLDivElement | null = null;\n private _disposable: Disposable | (() => void) | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n\n readonly measuredWidth = observableValue<number | undefined>(this, undefined);\n readonly measuredHeight = observableValue<number | undefined>(this, undefined);\n\n get fixture(): FixtureItem { return this.props.fixture; }\n get onSizeChange(): (id: string, width: number, height: number) => void { return this.props.onSizeChange; }\n get compact(): boolean { return this.props.compact ?? false; }\n\n setContainerRef = (el: HTMLDivElement | null): void => {\n if (el === this._containerRef) return;\n\n // Cleanup previous\n this._cleanup();\n\n this._containerRef = el;\n if (!el) return;\n\n const component = this.fixture.component;\n\n if (component.isolation === 'shadow-dom') {\n this._renderInShadowDom(el, component);\n } else {\n // For iframe isolation, render directly (iframe handles isolation)\n this._renderDirect(el, component);\n }\n\n // Set up resize observer on the render container (the actual content)\n // NOT the shadow host, which may have min-height set\n const elementToObserve = this._renderContainer ?? el;\n this._resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n if (height > 0) {\n const roundedWidth = Math.round(width);\n const roundedHeight = Math.round(height);\n this.measuredWidth.set(roundedWidth, undefined);\n this.measuredHeight.set(roundedHeight, undefined);\n this.onSizeChange(this.fixture.id, roundedWidth, roundedHeight);\n }\n }\n });\n this._resizeObserver.observe(elementToObserve);\n };\n\n private _renderInShadowDom(container: HTMLDivElement, component: ComponentDefinition): void {\n // Reuse existing shadow root if present (shadow roots cannot be removed once attached)\n if (container.shadowRoot) {\n this._shadowRoot = container.shadowRoot;\n // Clear previous content\n while (this._shadowRoot.firstChild) {\n this._shadowRoot.removeChild(this._shadowRoot.firstChild);\n }\n this._shadowRoot.adoptedStyleSheets = [];\n } else {\n this._shadowRoot = container.attachShadow({ mode: 'open' });\n }\n\n // Inject styles if any\n if (component.styles) {\n for (const style of component.styles) {\n if (style.type === 'css') {\n const styleEl = document.createElement('style');\n styleEl.textContent = style.content;\n this._shadowRoot.appendChild(styleEl);\n } else if (style.type === 'url') {\n const linkEl = document.createElement('link');\n linkEl.rel = 'stylesheet';\n linkEl.href = style.href;\n this._shadowRoot.appendChild(linkEl);\n } else if (style.type === 'adopted') {\n this._shadowRoot.adoptedStyleSheets = [\n ...this._shadowRoot.adoptedStyleSheets,\n style.sheet,\n ];\n }\n }\n }\n\n // Create render container (transparent, checkered shows through)\n const renderContainer = document.createElement('div');\n renderContainer.style.display = 'inline-block';\n this._renderContainer = renderContainer;\n this._shadowRoot.appendChild(renderContainer);\n\n // Get default property values\n const props = this._getDefaultProps(component);\n this._disposable = component.render(renderContainer, props);\n }\n\n private _renderDirect(container: HTMLDivElement, component: ComponentDefinition): void {\n this._renderContainer = container;\n const props = this._getDefaultProps(component);\n this._disposable = component.render(container, props);\n }\n\n private _getDefaultProps(component: ComponentDefinition): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n for (const prop of component.properties) {\n props[prop.name] = prop.defaultValue;\n }\n return props;\n }\n\n private _cleanup(): void {\n if (this._disposable) {\n if (typeof this._disposable === 'function') {\n (this._disposable as () => void)();\n } else if (typeof this._disposable.dispose === 'function') {\n this._disposable.dispose();\n }\n }\n this._disposable = null;\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this._shadowRoot = null;\n this._renderContainer = null;\n }\n\n dispose(): void {\n this._cleanup();\n }\n}\n\nexport const FixturePreviewItem = viewWithModel(\n FixturePreviewItemModel,\n {},\n (reader, model) => {\n const fixture = model.fixture;\n const component = fixture.component;\n const displayMode = component.displayMode;\n const measuredWidth = model.measuredWidth.read(reader);\n const measuredHeight = model.measuredHeight.read(reader);\n const compact = model.compact;\n\n // For page mode, use viewport dimensions\n let containerStyle: React.CSSProperties;\n if (displayMode.type === 'page') {\n const viewport = displayMode.viewports[0];\n const resolved = resolveViewport(viewport);\n containerStyle = {\n width: resolved.width,\n height: resolved.height,\n overflow: 'auto',\n };\n } else {\n // Component mode - natural size, let content determine dimensions\n containerStyle = {\n display: 'inline-block',\n };\n }\n\n const dimensionsText = measuredWidth && measuredHeight\n ? `${measuredWidth} × ${measuredHeight}`\n : '';\n\n const wrapperStyle = compact ? previewItemStyles.wrapperCompact : previewItemStyles.wrapper;\n const nameStyle = compact ? previewItemStyles.nameCompact : previewItemStyles.name;\n\n return (\n <div style={wrapperStyle}>\n <div style={previewItemStyles.labelRow}>\n <span style={nameStyle}>{fixture.name}</span>\n {!compact && dimensionsText && (\n <span style={previewItemStyles.dimensions}>{dimensionsText}</span>\n )}\n </div>\n <div style={getCanvasStyle(component.background)}>\n <div ref={model.setContainerRef} style={containerStyle} />\n </div>\n </div>\n );\n }\n);\n\n// Checkered pattern for transparency background (Figma-style)\nconst CHECKER_SIZE = 8;\n\nfunction createCheckerPattern(baseColor: string, checkerColor: string): string {\n return `\n linear-gradient(45deg, ${checkerColor} 25%, transparent 25%),\n linear-gradient(-45deg, ${checkerColor} 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, ${checkerColor} 75%),\n linear-gradient(-45deg, transparent 75%, ${checkerColor} 75%)\n `;\n}\n\nconst lightPattern = {\n backgroundColor: '#ffffff',\n backgroundImage: createCheckerPattern('#ffffff', '#e5e5e5'),\n};\n\nconst darkPattern = {\n backgroundColor: '#1e1e1e',\n backgroundImage: createCheckerPattern('#1e1e1e', '#2d2d2d'),\n};\n\nconst canvasBaseStyle: React.CSSProperties = {\n display: 'inline-block',\n padding: '12px',\n borderRadius: '4px',\n backgroundSize: `${CHECKER_SIZE * 2}px ${CHECKER_SIZE * 2}px`,\n backgroundPosition: `0 0, 0 ${CHECKER_SIZE}px, ${CHECKER_SIZE}px -${CHECKER_SIZE}px, -${CHECKER_SIZE}px 0`,\n boxShadow: '0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.08)',\n};\n\nfunction getCanvasStyle(background: 'light' | 'dark'): React.CSSProperties {\n const pattern = background === 'dark' ? darkPattern : lightPattern;\n return {\n ...canvasBaseStyle,\n backgroundColor: pattern.backgroundColor,\n backgroundImage: pattern.backgroundImage,\n };\n}\n\nconst previewItemStyles = {\n wrapper: {\n marginBottom: '32px',\n } as React.CSSProperties,\n wrapperCompact: {\n marginBottom: '0',\n } as React.CSSProperties,\n labelRow: {\n display: 'flex',\n alignItems: 'baseline',\n gap: '8px',\n marginBottom: '8px',\n } as React.CSSProperties,\n name: {\n fontSize: '12px',\n fontWeight: 500,\n color: 'var(--vscode-foreground)',\n } as React.CSSProperties,\n nameCompact: {\n fontSize: '11px',\n fontWeight: 500,\n color: 'var(--vscode-descriptionForeground)',\n } as React.CSSProperties,\n dimensions: {\n fontSize: '11px',\n color: 'var(--vscode-descriptionForeground)',\n fontFamily: 'var(--vscode-editor-font-family, monospace)',\n } as React.CSSProperties,\n};\n","const STORAGE_KEY = 'component-explorer:fixtureSizes';\nconst MAX_ENTRIES = 500; // Limit cache size to avoid localStorage bloat\n\ninterface CachedSizes {\n [fixtureId: string]: { width: number; height: number };\n}\n\nlet _cache: CachedSizes | null = null;\n\nfunction loadCache(): CachedSizes {\n if (_cache !== null) return _cache;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n _cache = JSON.parse(stored);\n return _cache!;\n }\n } catch {\n // Ignore parse errors\n }\n _cache = {};\n return _cache;\n}\n\nfunction saveCache(): void {\n if (_cache === null) return;\n\n try {\n // Prune if too many entries (keep most recent by insertion order)\n const entries = Object.entries(_cache);\n if (entries.length > MAX_ENTRIES) {\n _cache = Object.fromEntries(entries.slice(-MAX_ENTRIES));\n }\n localStorage.setItem(STORAGE_KEY, JSON.stringify(_cache));\n } catch {\n // Ignore storage errors (quota exceeded, etc.)\n }\n}\n\nexport function getCachedSize(fixtureId: string): { width: number; height: number } | undefined {\n const cache = loadCache();\n return cache[fixtureId];\n}\n\nexport function setCachedSize(fixtureId: string, width: number, height: number): void {\n const cache = loadCache();\n cache[fixtureId] = { width, height };\n saveCache();\n}\n\nexport function getCachedHeight(fixtureId: string): number | undefined {\n return getCachedSize(fixtureId)?.height;\n}\n\n/**\n * Returns all cached heights as a Map for initializing the in-memory observable.\n * This allows the virtual scroll to use accurate heights from the first render.\n */\nexport function getAllCachedHeights(): ReadonlyMap<string, number> {\n const cache = loadCache();\n const result = new Map<string, number>();\n for (const [id, size] of Object.entries(cache)) {\n result.set(id, size.height);\n }\n return result;\n}\n","import * as React from 'react';\nimport { observableValue } from '@vscode/observables';\nimport { view, viewWithModel, ViewModel, prop } from '@vscode/observables-react';\nimport type { ExplorerModel, FixtureItem, PreviewRow } from './ExplorerModel.js';\nimport { FixturePreviewItem } from './FixturePreviewItem.js';\nimport { getAllCachedHeights, setCachedSize } from '../lib/fixtureSizeCache.js';\n\nconst ESTIMATED_ITEM_HEIGHT = 280; // Header + estimated content + margins\nconst SCROLL_POSITION_STORAGE_KEY = 'component-explorer:scrollPositions';\nconst MAX_SCROLL_ENTRIES = 100;\n\ninterface ScrollPositions {\n [nodeId: string]: number;\n}\n\nfunction loadScrollPositions(): ScrollPositions {\n try {\n const stored = localStorage.getItem(SCROLL_POSITION_STORAGE_KEY);\n if (stored) return JSON.parse(stored);\n } catch { /* ignore */ }\n return {};\n}\n\nfunction saveScrollPosition(nodeId: string, scrollTop: number): void {\n try {\n const positions = loadScrollPositions();\n positions[nodeId] = scrollTop;\n // Prune old entries\n const entries = Object.entries(positions);\n const pruned = entries.length > MAX_SCROLL_ENTRIES\n ? Object.fromEntries(entries.slice(-MAX_SCROLL_ENTRIES))\n : positions;\n localStorage.setItem(SCROLL_POSITION_STORAGE_KEY, JSON.stringify(pruned));\n } catch { /* ignore */ }\n}\n\nfunction getScrollPosition(nodeId: string): number {\n return loadScrollPositions()[nodeId] ?? 0;\n}\n\nclass PreviewAreaModel extends ViewModel({\n model: prop.const<ExplorerModel>(),\n}) {\n private readonly _visibleIds = observableValue<ReadonlySet<string>>(this, new Set());\n // Pre-load cached heights from localStorage for accurate initial render\n private readonly _itemHeights = observableValue<ReadonlyMap<string, number>>(this, getAllCachedHeights());\n private _intersectionObserver: IntersectionObserver | null = null;\n private _scrollContainerRef: HTMLDivElement | null = null;\n private readonly _pendingObservations = new Map<HTMLDivElement, string>();\n private _currentNodeId: string | undefined = undefined;\n private _scrollSaveTimeout: ReturnType<typeof setTimeout> | null = null;\n\n get explorerModel() { return this.props.model; }\n get visibleIds() { return this._visibleIds; }\n get itemHeights() { return this._itemHeights; }\n\n setScrollContainerRef = (el: HTMLDivElement | null): void => {\n // Remove scroll listener from old container\n if (this._scrollContainerRef) {\n this._scrollContainerRef.removeEventListener('scroll', this._handleScroll);\n }\n\n this._scrollContainerRef = el;\n this._setupIntersectionObserver();\n\n // Add scroll listener to new container\n if (el) {\n el.addEventListener('scroll', this._handleScroll, { passive: true });\n // Restore scroll position for current selection\n this._restoreScrollPosition();\n }\n };\n\n /** Called when selection changes to restore/reset scroll position */\n updateForSelection(nodeId: string | undefined): void {\n if (this._currentNodeId === nodeId) return;\n this._currentNodeId = nodeId;\n this._restoreScrollPosition();\n }\n\n private _restoreScrollPosition(): void {\n if (!this._scrollContainerRef || !this._currentNodeId) return;\n const savedPosition = getScrollPosition(this._currentNodeId);\n // Use requestAnimationFrame to ensure DOM is ready\n requestAnimationFrame(() => {\n if (this._scrollContainerRef) {\n this._scrollContainerRef.scrollTop = savedPosition;\n }\n });\n }\n\n private _handleScroll = (): void => {\n if (!this._scrollContainerRef || !this._currentNodeId) return;\n // Debounce scroll saves to avoid excessive localStorage writes\n if (this._scrollSaveTimeout) clearTimeout(this._scrollSaveTimeout);\n this._scrollSaveTimeout = setTimeout(() => {\n if (this._scrollContainerRef && this._currentNodeId) {\n saveScrollPosition(this._currentNodeId, this._scrollContainerRef.scrollTop);\n }\n }, 150);\n };\n\n private _setupIntersectionObserver(): void {\n this._intersectionObserver?.disconnect();\n\n if (!this._scrollContainerRef) return;\n\n this._intersectionObserver = new IntersectionObserver(\n (entries) => {\n const newVisible = new Set(this._visibleIds.get());\n for (const entry of entries) {\n const id = entry.target.getAttribute('data-fixture-id');\n if (!id) continue;\n\n if (entry.isIntersecting) {\n newVisible.add(id);\n } else {\n newVisible.delete(id);\n }\n }\n this._visibleIds.set(newVisible, undefined);\n },\n {\n root: this._scrollContainerRef,\n rootMargin: '200px 0px', // Pre-render items 200px before they come into view\n threshold: 0,\n }\n );\n\n // Process any pending observations (from child refs that ran before parent ref)\n for (const [el, fixtureId] of this._pendingObservations) {\n el.setAttribute('data-fixture-id', fixtureId);\n this._intersectionObserver.observe(el);\n }\n this._pendingObservations.clear();\n }\n\n observeElement = (el: HTMLDivElement | null, fixtureId: string): void => {\n if (!el) return;\n \n if (this._intersectionObserver) {\n el.setAttribute('data-fixture-id', fixtureId);\n this._intersectionObserver.observe(el);\n } else {\n // Queue for later - IntersectionObserver not ready yet\n this._pendingObservations.set(el, fixtureId);\n }\n };\n\n handleSizeChange = (id: string, width: number, height: number): void => {\n const current = this._itemHeights.get();\n if (current.get(id) !== height) {\n const newMap = new Map(current);\n newMap.set(id, height);\n this._itemHeights.set(newMap, undefined);\n }\n // Cache for future sessions\n setCachedSize(id, width, height);\n };\n\n getItemHeight = (id: string): number => {\n // Heights are pre-loaded from localStorage cache at init time\n return this._itemHeights.get().get(id) ?? ESTIMATED_ITEM_HEIGHT;\n };\n\n dispose(): void {\n this._intersectionObserver?.disconnect();\n if (this._scrollContainerRef) {\n this._scrollContainerRef.removeEventListener('scroll', this._handleScroll);\n }\n if (this._scrollSaveTimeout) clearTimeout(this._scrollSaveTimeout);\n }\n}\n\nexport const PreviewArea = viewWithModel(\n PreviewAreaModel,\n {},\n (reader, areaModel) => {\n const rows = areaModel.explorerModel.selectedFixtures.read(reader);\n const visibleIds = areaModel.visibleIds.read(reader);\n const selectedNodeId = areaModel.explorerModel.selectedNodeId.read(reader);\n\n // Update scroll position tracking when selection changes\n areaModel.updateForSelection(selectedNodeId);\n\n if (rows.length === 0) {\n return (\n <div style={styles.emptyState}>\n <span style={styles.emptyText}>Select a component or folder to preview</span>\n </div>\n );\n }\n\n return (\n <div ref={areaModel.setScrollContainerRef} style={styles.scrollContainer}>\n <div style={styles.content}>\n {rows.map((row) => {\n if (row.type === 'single') {\n return (\n <VirtualizedItem\n key={row.fixture.id}\n fixture={row.fixture}\n isVisible={visibleIds.has(row.fixture.id)}\n estimatedHeight={areaModel.getItemHeight(row.fixture.id)}\n onSizeChange={areaModel.handleSizeChange}\n observeElement={(el) => areaModel.observeElement(el, row.fixture.id)}\n />\n );\n } else {\n // Variants row - render horizontally\n return (\n <VariantsRow\n key={row.id}\n row={row}\n visibleIds={visibleIds}\n getItemHeight={areaModel.getItemHeight}\n onSizeChange={areaModel.handleSizeChange}\n observeElement={areaModel.observeElement}\n />\n );\n }\n })}\n </div>\n </div>\n );\n }\n);\n\n// Virtualized wrapper that shows placeholder when not visible\nconst VirtualizedItem = view(\n {\n fixture: prop.const<FixtureItem>(),\n isVisible: prop<boolean>(),\n estimatedHeight: prop<number>(),\n onSizeChange: prop.const<(id: string, width: number, height: number) => void>(),\n observeElement: prop.const<(el: HTMLDivElement | null) => void>(),\n },\n (reader, props) => {\n const isVisible = props.isVisible.read(reader);\n const estimatedHeight = props.estimatedHeight.read(reader);\n\n return (\n <div ref={props.observeElement} style={{ minHeight: isVisible ? undefined : estimatedHeight }}>\n {isVisible ? (\n <FixturePreviewItem\n fixture={props.fixture}\n onSizeChange={props.onSizeChange}\n compact={false}\n />\n ) : (\n <div style={{ ...styles.placeholder, height: estimatedHeight }}>\n <span style={styles.placeholderText}>{props.fixture.name}</span>\n </div>\n )}\n </div>\n );\n }\n);\n\n// Extract variants row type for props\ntype VariantsRowData = Extract<PreviewRow, { type: 'variants' }>;\n\n// Horizontal row of variants\nconst VariantsRow = view(\n {\n row: prop.const<VariantsRowData>(),\n visibleIds: prop<ReadonlySet<string>>(),\n getItemHeight: prop.const<(id: string) => number>(),\n onSizeChange: prop.const<(id: string, width: number, height: number) => void>(),\n observeElement: prop.const<(el: HTMLDivElement | null, fixtureId: string) => void>(),\n },\n (reader, props) => {\n const visibleIds = props.visibleIds.read(reader);\n const row = props.row;\n\n return (\n <div style={styles.variantsContainer}>\n <div style={styles.variantsHeader}>\n <span style={styles.variantsTitle}>{row.path}</span>\n </div>\n <div style={styles.variantsContent}>\n {row.fixtures.map((fixture) => (\n <VariantItem\n key={fixture.id}\n fixture={fixture}\n isVisible={visibleIds.has(fixture.id)}\n estimatedHeight={props.getItemHeight(fixture.id)}\n onSizeChange={props.onSizeChange}\n observeElement={(el) => props.observeElement(el, fixture.id)}\n />\n ))}\n </div>\n </div>\n );\n }\n);\n\n// Individual variant item (rendered more compactly)\nconst VariantItem = view(\n {\n fixture: prop.const<FixtureItem>(),\n isVisible: prop<boolean>(),\n estimatedHeight: prop<number>(),\n onSizeChange: prop.const<(id: string, width: number, height: number) => void>(),\n observeElement: prop.const<(el: HTMLDivElement | null) => void>(),\n },\n (reader, props) => {\n const isVisible = props.isVisible.read(reader);\n const estimatedHeight = props.estimatedHeight.read(reader);\n\n return (\n <div ref={props.observeElement} style={styles.variantItem}>\n {isVisible ? (\n <FixturePreviewItem\n fixture={props.fixture}\n onSizeChange={props.onSizeChange}\n compact\n />\n ) : (\n <div style={{ ...styles.variantPlaceholder, height: estimatedHeight }}>\n <span style={styles.placeholderText}>{props.fixture.name}</span>\n </div>\n )}\n </div>\n );\n }\n);\n\nconst styles = {\n scrollContainer: {\n flex: 1,\n overflow: 'auto',\n backgroundColor: 'var(--vscode-editor-background)',\n } as React.CSSProperties,\n content: {\n padding: '32px',\n } as React.CSSProperties,\n emptyState: {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--vscode-editor-background)',\n } as React.CSSProperties,\n emptyText: {\n color: 'var(--vscode-descriptionForeground)',\n fontSize: '14px',\n } as React.CSSProperties,\n placeholder: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--vscode-editor-inactiveSelectionBackground)',\n borderRadius: '4px',\n marginBottom: '32px',\n opacity: 0.5,\n } as React.CSSProperties,\n placeholderText: {\n color: 'var(--vscode-descriptionForeground)',\n fontSize: '11px',\n } as React.CSSProperties,\n variantsContainer: {\n marginBottom: '32px',\n } as React.CSSProperties,\n variantsHeader: {\n marginBottom: '12px',\n } as React.CSSProperties,\n variantsTitle: {\n fontSize: '13px',\n fontWeight: 500,\n color: 'var(--vscode-foreground)',\n } as React.CSSProperties,\n variantsContent: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n gap: '16px',\n } as React.CSSProperties,\n variantItem: {\n flex: '0 0 auto',\n } as React.CSSProperties,\n variantPlaceholder: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'var(--vscode-editor-inactiveSelectionBackground)',\n borderRadius: '4px',\n opacity: 0.5,\n minWidth: '150px',\n } as React.CSSProperties,\n};\n","import { viewWithModel } from '@vscode/observables-react';\nimport { FixtureRegistry, defineFixture } from '../core/index.js';\nimport { ExplorerModel } from './ExplorerModel.js';\nimport { TitleBar } from './TitleBar.js';\nimport { LeftSidebar } from './LeftSidebar.js';\nimport { RightSidebar } from './RightSidebar.js';\nimport { PreviewArea } from './PreviewArea.js';\nimport { styles } from './styles.js';\n\nexport const Explorer = viewWithModel(\n ExplorerModel,\n {},\n (reader, model) => {\n const leftVisible = model.leftSidebarVisible.read(reader);\n const rightVisible = model.rightSidebarVisible.read(reader);\n const isDarkTheme = model.isDarkTheme.read(reader);\n const selectedNode = model.selectedNode.read(reader);\n\n const themeClass = isDarkTheme ? 'vscode-theme default-dark-plus' : 'vscode-theme default-light-plus';\n\n return (\n <div className={themeClass} style={styles.container}>\n {leftVisible && <LeftSidebar model={model} />}\n <div style={styles.centerArea}>\n <TitleBar model={model} />\n <PreviewArea model={model} />\n </div>\n {rightVisible && <RightSidebar selectedNode={selectedNode} />}\n </div>\n );\n }\n);\n\n/** Creates a demo registry with sample fixtures */\nfunction createDemoRegistry(): FixtureRegistry {\n const registry = new FixtureRegistry();\n \n registry.register('components/Button.fixture.tsx', defineFixture({\n Primary: {\n render: (container) => {\n container.innerHTML = '<button>Primary Button</button>';\n return { dispose: () => { container.innerHTML = ''; } };\n },\n },\n Icon: {\n render: (container) => {\n container.innerHTML = '<button>🔔 Icon Button</button>';\n return { dispose: () => { container.innerHTML = ''; } };\n },\n },\n }));\n \n registry.register('components/Input.fixture.tsx', defineFixture({\n Text: {\n render: (container) => {\n container.innerHTML = '<input type=\\\"text\\\" placeholder=\\\"Text Input\\\" />';\n return { dispose: () => { container.innerHTML = ''; } };\n },\n },\n Search: {\n render: (container) => {\n container.innerHTML = '<input type=\\\"search\\\" placeholder=\\\"Search...\\\" />';\n return { dispose: () => { container.innerHTML = ''; } };\n },\n },\n }));\n \n registry.register('components/Card.fixture.tsx', defineFixture({\n Basic: {\n render: (container) => {\n container.innerHTML = '<div style=\\\"border: 1px solid #ccc; padding: 16px;\\\">Basic Card</div>';\n return { dispose: () => { container.innerHTML = ''; } };\n },\n },\n }));\n \n registry.register('components/Feedback.fixture.tsx', defineFixture({\n Badge: {\n render: (container) => {\n container.innerHTML = '<span style=\\\"background: blue; color: white; padding: 2px 8px; border-radius: 4px;\\\">Badge</span>';\n return { dispose: () => { container.innerHTML = ''; } };\n },\n },\n Alert: {\n render: (container) => {\n container.innerHTML = '<div style=\\\"background: #ffffcc; padding: 8px; border: 1px solid #cc0;\\\">Alert message</div>';\n return { dispose: () => { container.innerHTML = ''; } };\n },\n },\n }));\n \n return registry;\n}\n\n// Re-export with default registry convenience\nexport function ExplorerWithDefaults() {\n const registry = createDemoRegistry();\n return <Explorer registry={registry} />;\n}\n","\nexport * from './core/index.js';\n\nimport { FixtureRegistry, type FixtureExport } from './core/index.js';\nimport './styles.css';\n\nimport './vscode-styles/default-dark-plus.css';\nimport './vscode-styles/default-light-plus.css';\nimport { createRoot } from 'react-dom/client';\nimport { createElement } from 'react';\nimport { Explorer } from './components/index.js';\n\n// Main exports\nexport { Explorer, ExplorerWithDefaults, ExplorerModel } from './components/index.js';\nexport type { ExplorerTreeNode } from './components/index.js';\nexport { toExplorerTree } from './components/index.js';\n\n// Sub-components\nexport {\n TitleBar,\n TitleBarButton,\n LeftSidebar,\n RightSidebar,\n TreeView,\n TreeItem,\n} from './components/index.js';\n\n// Icons\nexport * from './components/icons.js';\n\n// Styles utilities\nexport { styles, mergeStyles } from './components/index.js';\n\nexport interface FixtureModules {\n [path: string]: { default?: unknown };\n}\n\n/**\n * The main Component Explorer application.\n * Create with `new ExplorerApp(element, fixtureModules)`.\n */\nexport class ExplorerApp {\n private readonly _root: ReturnType<typeof createRoot>;\n private readonly _registry = new FixtureRegistry();\n\n constructor(element: HTMLElement, fixtureModules: FixtureModules) {\n this._populateRegistry(fixtureModules);\n this._root = createRoot(element);\n this._root.render(createElement(Explorer, { registry: this._registry }));\n }\n\n private _populateRegistry(fixtureModules: FixtureModules): void {\n this._registry.clear();\n for (const [path, module] of Object.entries(fixtureModules)) {\n const fixture = module.default;\n if (fixture && typeof fixture === 'object') {\n this._registry.register(path, fixture as FixtureExport);\n }\n }\n }\n\n /**\n * Updates the fixtures. The UI will update automatically since the registry is observable.\n */\n updateFixtures(fixtureModules: FixtureModules): void {\n this._populateRegistry(fixtureModules);\n }\n\n /**\n * Unmounts the explorer and cleans up resources.\n */\n dispose(): void {\n this._root.unmount();\n }\n}\n"],"names":["VIEWPORT_SIZES","resolveViewport","preset","getDefaultPropertyValues","properties","values","prop","isComponentDefinition","value","singleFixtureBrand","fixtureGroupBrand","fixtureVariantsBrand","isSingleFixture","isFixtureGroup","isFixtureVariants","createComponentDefinition","options","id","name","defineFixture","defineFixtureGroup","group","defineFixtureVariants","variants","createFixtureTree","fixtures","root","filePath","fixtureExport","baseName","extractBaseName","addFixtureExportToTree","parent","pathSegments","componentNode","folderName","folderId","folder","_a","c","key","entry","variantsName","variantsNode","variant","childId","findNodeByPath","path","current","segment","collectComponents","node","components","child","FixtureRegistry","__publicField","observableValue","derived","reader","tree","m","require$$0","client","i","h","o","toExplorerTree","createLocalStorageObservable","owner","storageKey","defaultValue","serialize","deserialize","initialValue","stored","obs","originalSet","tx","ExplorerModel","ViewModel","nodeId","selectedNode","newSet","nodes","found","pathPrefix","result","childPath","styles","mergeStyles","styleObjects","TitleBarButtonModel","hovered","TitleBarButton","viewWithModel","model","props","isHovered","active","buttonStyle","jsx","ChevronRightIcon","style","ChevronDownIcon","ComponentIcon","FolderIcon","PanelLeftIcon","PanelRightIcon","SunIcon","MoonIcon","TitleBar","view","leftVisible","rightVisible","isDarkTheme","jsxs","Fragment","TreeView","_reader","TreeItem","TreeItemModel","e","itemModel","depth","hasChildren","isExpanded","isSelected","itemStyle","LeftSidebar","ToggleSwitchModel","ToggleSwitch","checked","trackStyle","thumbStyle","PropertiesContent","RightSidebar","FixturePreviewItemModel","el","component","elementToObserve","entries","width","height","roundedWidth","roundedHeight","container","styleEl","linkEl","renderContainer","FixturePreviewItem","fixture","displayMode","measuredWidth","measuredHeight","compact","containerStyle","viewport","resolved","dimensionsText","wrapperStyle","previewItemStyles","nameStyle","getCanvasStyle","CHECKER_SIZE","createCheckerPattern","baseColor","checkerColor","lightPattern","darkPattern","canvasBaseStyle","background","pattern","STORAGE_KEY","MAX_ENTRIES","_cache","loadCache","saveCache","setCachedSize","fixtureId","cache","getAllCachedHeights","size","ESTIMATED_ITEM_HEIGHT","SCROLL_POSITION_STORAGE_KEY","MAX_SCROLL_ENTRIES","loadScrollPositions","saveScrollPosition","scrollTop","positions","pruned","getScrollPosition","PreviewAreaModel","newMap","savedPosition","newVisible","PreviewArea","areaModel","rows","visibleIds","selectedNodeId","row","VirtualizedItem","VariantsRow","isVisible","estimatedHeight","VariantItem","Explorer","createDemoRegistry","registry","ExplorerWithDefaults","ExplorerApp","element","fixtureModules","createRoot","createElement","module"],"mappings":"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","x_google_ignoreList":[6]}
@@ -0,0 +1,12 @@
1
+ export declare function getCachedSize(fixtureId: string): {
2
+ width: number;
3
+ height: number;
4
+ } | undefined;
5
+ export declare function setCachedSize(fixtureId: string, width: number, height: number): void;
6
+ export declare function getCachedHeight(fixtureId: string): number | undefined;
7
+ /**
8
+ * Returns all cached heights as a Map for initializing the in-memory observable.
9
+ * This allows the virtual scroll to use accurate heights from the first render.
10
+ */
11
+ export declare function getAllCachedHeights(): ReadonlyMap<string, number>;
12
+ //# sourceMappingURL=fixtureSizeCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtureSizeCache.d.ts","sourceRoot":"","sources":["../../src/lib/fixtureSizeCache.ts"],"names":[],"mappings":"AAwCA,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAG9F;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIpF;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAOjE"}
@@ -0,0 +1,16 @@
1
+ import { ISettableObservable } from '@vscode/observables';
2
+ export interface LocalStorageObservableOptions<T> {
3
+ readonly storageKey: string;
4
+ readonly defaultValue: T;
5
+ /** Serialize value to string for localStorage. Defaults to JSON.stringify. */
6
+ readonly serialize?: (value: T) => string;
7
+ /** Deserialize string from localStorage. Defaults to JSON.parse. */
8
+ readonly deserialize?: (raw: string) => T;
9
+ }
10
+ /**
11
+ * Creates an observable that persists its value to localStorage.
12
+ * The value is loaded from localStorage on creation (if present),
13
+ * and saved to localStorage whenever it changes.
14
+ */
15
+ export declare function createLocalStorageObservable<T>(owner: object, options: LocalStorageObservableOptions<T>): ISettableObservable<T>;
16
+ //# sourceMappingURL=localStorageObservable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localStorageObservable.d.ts","sourceRoot":"","sources":["../../src/lib/localStorageObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,MAAM,WAAW,6BAA6B,CAAC,CAAC;IAC9C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAC5C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC,GACxC,mBAAmB,CAAC,CAAC,CAAC,CAiCxB"}
@@ -0,0 +1,6 @@
1
+ import { ClassValue } from 'clsx';
2
+ /**
3
+ * Utility for combining Tailwind CSS classes with proper merging.
4
+ */
5
+ export declare function cn(...inputs: ClassValue[]): string;
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C;;GAEG;AACH,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAElD"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@vscode/component-explorer",
3
+ "version": "0.1.1-0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ },
12
+ "./styles.css": "./dist/index.css",
13
+ "./src/styles.css": "./src/styles.css",
14
+ "./src/*": "./src/*",
15
+ "./vscode-styles/*": "./vscode-styles/*"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "vscode-styles"
20
+ ],
21
+ "scripts": {
22
+ "build": "vite build",
23
+ "dev": "vite build --watch",
24
+ "test": "vitest --run --passWithNoTests"
25
+ },
26
+ "dependencies": {
27
+ "@radix-ui/react-checkbox": "^1.3.3",
28
+ "@radix-ui/react-collapsible": "^1.1.12",
29
+ "@radix-ui/react-label": "^2.1.8",
30
+ "@radix-ui/react-scroll-area": "^1.2.10",
31
+ "@radix-ui/react-select": "^2.2.6",
32
+ "@radix-ui/react-separator": "^1.1.4",
33
+ "@radix-ui/react-slot": "^1.2.4",
34
+ "@radix-ui/react-tooltip": "^1.1.8",
35
+ "@vscode/observables": "workspace:*",
36
+ "@vscode/observables-react": "workspace:*",
37
+ "class-variance-authority": "^0.7.1",
38
+ "clsx": "^2.1.1",
39
+ "lucide-react": "^0.563.0",
40
+ "react": "^18.2.0",
41
+ "react-dom": "^18.2.0",
42
+ "tailwind-merge": "^2.6.0"
43
+ },
44
+ "devDependencies": {
45
+ "@tailwindcss/vite": "^4.1.4",
46
+ "@types/react": "^18.2.0",
47
+ "@types/react-dom": "^18.2.0",
48
+ "@vitejs/plugin-react": "^4.3.4",
49
+ "tailwindcss": "^4.1.4",
50
+ "typescript": "^5.4.0",
51
+ "vite": "^6.4.1",
52
+ "vite-plugin-dts": "^4.5.4",
53
+ "vitest": "^1.3.0"
54
+ },
55
+ "peerDependencies": {
56
+ "react": "^18.2.0",
57
+ "react-dom": "^18.2.0"
58
+ }
59
+ }