@stacksjs/stx 0.2.155 → 0.2.156

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 (240) hide show
  1. package/dist/a11y.d.ts +87 -46
  2. package/dist/animation.d.ts +96 -42
  3. package/dist/appearance-bootstrap.d.ts +49 -15
  4. package/dist/asset-roots.d.ts +32 -0
  5. package/dist/asset-roots.js +7 -0
  6. package/dist/assets.d.ts +9 -7
  7. package/dist/async-components.d.ts +78 -56
  8. package/dist/auth.d.ts +3 -0
  9. package/dist/build-externalize.d.ts +40 -0
  10. package/dist/build-externalize.js +63 -0
  11. package/dist/build-id.d.ts +22 -22
  12. package/dist/build-message.d.ts +73 -2
  13. package/dist/build-message.js +47 -8
  14. package/dist/builtins/attrs.d.ts +14 -0
  15. package/dist/builtins/drawer.d.ts +22 -0
  16. package/dist/builtins/icon.d.ts +16 -2
  17. package/dist/builtins/index.d.ts +5 -15
  18. package/dist/builtins/modal.d.ts +24 -0
  19. package/dist/builtins/safe-image.d.ts +42 -0
  20. package/dist/builtins/stx-image.d.ts +27 -0
  21. package/dist/builtins/stx-link.d.ts +9 -0
  22. package/dist/builtins/stx-loading-indicator.d.ts +11 -0
  23. package/dist/builtins/suspense.d.ts +28 -0
  24. package/dist/builtins/toast.d.ts +17 -0
  25. package/dist/builtins/transition-group.d.ts +25 -0
  26. package/dist/caching.d.ts +12 -15
  27. package/dist/cli.js +1798 -908
  28. package/dist/client/directive.d.ts +7 -0
  29. package/dist/client/index.d.ts +0 -1
  30. package/dist/client-script-bundler.d.ts +63 -5
  31. package/dist/client-script-bundler.js +30 -2
  32. package/dist/client-script.d.ts +102 -47
  33. package/dist/client-script.js +15 -3
  34. package/dist/codemod.d.ts +56 -0
  35. package/dist/codemod.js +192 -0
  36. package/dist/color-mode-boot.d.ts +83 -65
  37. package/dist/component-client-factories.d.ts +1 -6
  38. package/dist/component-processing.d.ts +58 -49
  39. package/dist/component-processing.js +1 -1
  40. package/dist/component-registry.d.ts +94 -31
  41. package/dist/component-renderer.d.ts +18 -0
  42. package/dist/composable-loader.d.ts +24 -0
  43. package/dist/composable-loader.js +12 -9
  44. package/dist/composables/index.d.ts +7 -0
  45. package/dist/composables/index.js +1 -0
  46. package/dist/composables/use-fetch.js +30 -2
  47. package/dist/composables/use-form.d.ts +91 -0
  48. package/dist/composables/use-form.js +112 -0
  49. package/dist/composables.d.ts +64 -60
  50. package/dist/computed.d.ts +86 -92
  51. package/dist/conditionals.d.ts +24 -8
  52. package/dist/conditionals.js +16 -0
  53. package/dist/config.d.ts +34 -21
  54. package/dist/config.js +35 -14
  55. package/dist/craft.js +1476 -768
  56. package/dist/crosswind-config.d.ts +58 -0
  57. package/dist/crosswind-config.js +40 -0
  58. package/dist/csp.d.ts +107 -41
  59. package/dist/defer.d.ts +24 -0
  60. package/dist/dev-server/crosswind.d.ts +35 -26
  61. package/dist/dev-server/crosswind.js +2 -18
  62. package/dist/dev-server/serve-app.js +4 -3
  63. package/dist/dev-server/terminal-colors.d.ts +32 -32
  64. package/dist/directive-api.d.ts +86 -43
  65. package/dist/document-shell.d.ts +54 -41
  66. package/dist/dynamic-components.d.ts +9 -0
  67. package/dist/error-boundaries.d.ts +47 -41
  68. package/dist/error-handling.d.ts +1 -1
  69. package/dist/errors/codes.d.ts +51 -43
  70. package/dist/errors/formatter.d.ts +58 -38
  71. package/dist/errors/index.d.ts +5 -61
  72. package/dist/errors/logger.d.ts +114 -40
  73. package/dist/errors/sanitizer.d.ts +53 -23
  74. package/dist/errors/types.d.ts +44 -31
  75. package/dist/events.d.ts +86 -25
  76. package/dist/expressions.d.ts +50 -42
  77. package/dist/forms-validation.d.ts +138 -123
  78. package/dist/forms-validation.js +1 -90
  79. package/dist/forms.d.ts +120 -66
  80. package/dist/forms.js +31 -11
  81. package/dist/fragment-container.d.ts +57 -0
  82. package/dist/fragment-container.js +109 -0
  83. package/dist/framework-composables.d.ts +32 -0
  84. package/dist/head.d.ts +156 -114
  85. package/dist/heatmap.d.ts +152 -72
  86. package/dist/html-masking.d.ts +40 -34
  87. package/dist/hydration-runtime.d.ts +20 -24
  88. package/dist/i18n.d.ts +93 -32
  89. package/dist/image-optimization/auto-sibling.d.ts +32 -4
  90. package/dist/includes.d.ts +69 -7
  91. package/dist/index.d.ts +66 -0
  92. package/dist/index.js +23 -0
  93. package/dist/internal-markdown.d.ts +12 -8
  94. package/dist/island-chunking.d.ts +30 -13
  95. package/dist/keep-alive.d.ts +72 -52
  96. package/dist/layout-types.d.ts +45 -0
  97. package/dist/layout-types.js +56 -0
  98. package/dist/lazy-module.d.ts +10 -0
  99. package/dist/loops.d.ts +66 -0
  100. package/dist/loops.js +47 -6
  101. package/dist/markdown.d.ts +0 -1
  102. package/dist/media/image/component.d.ts +25 -9
  103. package/dist/media/image/directive.d.ts +15 -1
  104. package/dist/media/image/placeholder.d.ts +20 -9
  105. package/dist/media/image/processor/cache.d.ts +40 -18
  106. package/dist/media/image/processor/index.d.ts +1 -10
  107. package/dist/media/image/processor/optimizer.d.ts +12 -1
  108. package/dist/media/image/processor/responsive.d.ts +16 -6
  109. package/dist/media/image/srcset.d.ts +47 -50
  110. package/dist/media/shared/cache.d.ts +51 -31
  111. package/dist/media/shared/hash.d.ts +7 -0
  112. package/dist/media/types.d.ts +1235 -754
  113. package/dist/media/video/directive.d.ts +15 -1
  114. package/dist/media/video/index.d.ts +39 -17
  115. package/dist/media/video/processor/cache.d.ts +42 -19
  116. package/dist/media/video/processor/index.d.ts +1 -18
  117. package/dist/media/video/processor/streaming.d.ts +17 -10
  118. package/dist/media/video/processor/thumbnail.d.ts +21 -15
  119. package/dist/media/video/processor/transcoder.d.ts +11 -1
  120. package/dist/method-spoofing.d.ts +7 -0
  121. package/dist/middleware.d.ts +60 -0
  122. package/dist/owned-routes.d.ts +42 -0
  123. package/dist/owned-routes.js +26 -0
  124. package/dist/page-meta.d.ts +38 -0
  125. package/dist/page-meta.js +16 -0
  126. package/dist/parser/directive-parser.d.ts +57 -45
  127. package/dist/parser/expression-parser.d.ts +33 -35
  128. package/dist/parser/index.d.ts +4 -39
  129. package/dist/parser/tokenizer.d.ts +61 -49
  130. package/dist/partial-hydration.d.ts +82 -50
  131. package/dist/performance-utils.d.ts +217 -124
  132. package/dist/placeholder.d.ts +18 -9
  133. package/dist/plugin-system.d.ts +264 -115
  134. package/dist/process.d.ts +11 -6
  135. package/dist/process.js +21 -4
  136. package/dist/production-builder.js +7 -0
  137. package/dist/prop-sentinels.d.ts +11 -11
  138. package/dist/public-env.d.ts +14 -0
  139. package/dist/pwa/directives.d.ts +12 -3
  140. package/dist/pwa/inject.d.ts +10 -0
  141. package/dist/pwa/precache.d.ts +22 -16
  142. package/dist/pwa/service-worker.d.ts +12 -0
  143. package/dist/pwa.js +1318 -610
  144. package/dist/reactive-bindings.d.ts +34 -11
  145. package/dist/reactive.d.ts +58 -30
  146. package/dist/reactive.js +56 -31
  147. package/dist/render.js +1 -0
  148. package/dist/route-middleware.d.ts +2 -35
  149. package/dist/route-types.d.ts +134 -0
  150. package/dist/route-types.js +24 -0
  151. package/dist/router.d.ts +5 -7
  152. package/dist/routes.d.ts +1 -3
  153. package/dist/runtime-globals.d.ts +147 -24
  154. package/dist/runtime-globals.js +16 -1
  155. package/dist/runtime-injection.d.ts +8 -0
  156. package/dist/runtime-injection.js +33 -24
  157. package/dist/script-emit.d.ts +30 -0
  158. package/dist/script-json.d.ts +36 -0
  159. package/dist/script-json.js +6 -0
  160. package/dist/script-validation.d.ts +21 -4
  161. package/dist/seo.d.ts +118 -47
  162. package/dist/server-bindings.d.ts +21 -0
  163. package/dist/sfc-template.d.ts +8 -8
  164. package/dist/signal-processing.d.ts +35 -15
  165. package/dist/signals-api.d.ts +117 -58
  166. package/dist/signals-api.js +7 -4
  167. package/dist/signals.d.ts +24 -17
  168. package/dist/signals.js +765 -60
  169. package/dist/site-builder/build.js +8 -0
  170. package/dist/site-url.d.ts +46 -0
  171. package/dist/site-url.js +70 -0
  172. package/dist/slots.d.ts +86 -20
  173. package/dist/source-signature.d.ts +45 -0
  174. package/dist/source-signature.js +20 -0
  175. package/dist/ssg.d.ts +285 -142
  176. package/dist/ssg.js +1268 -556
  177. package/dist/state-dir.d.ts +4 -4
  178. package/dist/state-management.d.ts +0 -12
  179. package/dist/state-management.js +8 -25
  180. package/dist/store-imports.d.ts +23 -0
  181. package/dist/store-imports.js +3 -0
  182. package/dist/store-loader.d.ts +10 -0
  183. package/dist/store-loader.js +10 -9
  184. package/dist/story/analytics.d.ts +138 -60
  185. package/dist/story/bookmarks.d.ts +87 -34
  186. package/dist/story/cli.d.ts +123 -69
  187. package/dist/story/collect/scanner.d.ts +4 -0
  188. package/dist/story/collect/tree.d.ts +8 -1
  189. package/dist/story/commands/build.d.ts +11 -6
  190. package/dist/story/commands/dev.d.ts +15 -8
  191. package/dist/story/commands/preview.d.ts +13 -7
  192. package/dist/story/config-watcher.d.ts +20 -13
  193. package/dist/story/config.d.ts +11 -8
  194. package/dist/story/context.d.ts +14 -8
  195. package/dist/story/hmr.d.ts +24 -26
  196. package/dist/story/hot-swap.d.ts +34 -23
  197. package/dist/story/keyboard-shortcuts.d.ts +23 -18
  198. package/dist/story/output.d.ts +46 -44
  199. package/dist/story/performance.d.ts +107 -45
  200. package/dist/story/presets.d.ts +107 -41
  201. package/dist/story/renderer.d.ts +41 -27
  202. package/dist/story/search.d.ts +23 -12
  203. package/dist/story/server.d.ts +21 -11
  204. package/dist/story/setup.d.ts +23 -15
  205. package/dist/story/testing.d.ts +65 -40
  206. package/dist/story/types.d.ts +262 -160
  207. package/dist/streaming.d.ts +119 -57
  208. package/dist/stx-virtual-ts.d.ts +165 -0
  209. package/dist/stx-virtual-ts.js +372 -0
  210. package/dist/stx.d.ts +78 -1
  211. package/dist/style-scoping.d.ts +17 -4
  212. package/dist/suspense.d.ts +67 -52
  213. package/dist/teleport.d.ts +22 -0
  214. package/dist/template-tag-balance.d.ts +22 -6
  215. package/dist/transitions.d.ts +66 -55
  216. package/dist/typecheck.d.ts +77 -0
  217. package/dist/typecheck.js +156 -0
  218. package/dist/types/component-types.d.ts +187 -122
  219. package/dist/types/config-types.d.ts +758 -297
  220. package/dist/types/context-types.d.ts +46 -24
  221. package/dist/types/csp-types.d.ts +70 -66
  222. package/dist/types/directive-types.d.ts +211 -155
  223. package/dist/types/index.d.ts +6 -109
  224. package/dist/types/pwa-types.d.ts +273 -148
  225. package/dist/types.d.ts +0 -1
  226. package/dist/typescript-templates.d.ts +11 -0
  227. package/dist/unresolved-identifiers.d.ts +24 -22
  228. package/dist/unresolved-identifiers.js +2 -0
  229. package/dist/utils.d.ts +24 -21
  230. package/dist/validator.d.ts +28 -26
  231. package/dist/variable-extractor.d.ts +48 -13
  232. package/dist/variable-extractor.js +27 -4
  233. package/dist/view-composers.d.ts +80 -81
  234. package/dist/virtual-scrolling.d.ts +101 -81
  235. package/dist/vue-template.d.ts +23 -0
  236. package/dist/web-components/css-scoping.d.ts +21 -11
  237. package/dist/web-components.d.ts +81 -58
  238. package/dist/x-element.d.ts +0 -1
  239. package/package.json +5 -5
  240. package/stx.d.ts +78 -1
@@ -1,3 +1,7 @@
1
+ /** The directory used when nothing configures one. */
2
+ export declare const DEFAULT_STATE_DIR = ".stx";
3
+ /** Environment variable that overrides both the config and the default. */
4
+ export declare const STATE_DIR_ENV_VAR = "STX_DIR";
1
5
  /**
2
6
  * Records the `stateDir` coming from `stx.config.ts`.
3
7
  *
@@ -30,7 +34,3 @@ export declare function stateDir(root?: string, ...segments: string[]): string;
30
34
  */
31
35
  export declare function rebaseOntoStateDir(value: string): string;
32
36
  export declare function rebaseOntoStateDir(value: string | undefined): string | undefined;
33
- /** The directory used when nothing configures one. */
34
- export declare const DEFAULT_STATE_DIR: '.stx';
35
- /** Environment variable that overrides both the config and the default. */
36
- export declare const STATE_DIR_ENV_VAR: 'STX_DIR';
@@ -75,18 +75,6 @@ export declare function createStoreDirective(storeName: string): {
75
75
  hasEndTag: boolean
76
76
  handler: () => string
77
77
  };
78
- /**
79
- * Serialize all stores for SSR hydration.
80
- */
81
- export declare function serializeStores(): string;
82
- /**
83
- * Hydrate stores from serialized state.
84
- */
85
- export declare function hydrateStores(serialized: string): void;
86
- /**
87
- * Generate hydration script for SSR.
88
- */
89
- export declare function generateHydrationScript(): string;
90
78
  /**
91
79
  * Initialize DevTools integration.
92
80
  */
@@ -1,3 +1,4 @@
1
+ import { recordStoreMutation, registerStore as registerDevToolsStore } from "./devtools.js";
1
2
  const globalState = {
2
3
  stores: new Map,
3
4
  subscriptions: new Map
@@ -105,8 +106,9 @@ export function createStore(initialValue, options = {}) {
105
106
  console.error("[stx-store] Subscriber error:", error);
106
107
  }
107
108
  }, devToolsNotify = devtools ? (action, newValue) => {
108
- if (typeof window < "u" && window.__STX_DEVTOOLS__)
109
- window.__STX_DEVTOOLS__.onStoreChange(name || "unnamed", action, newValue);
109
+ recordStoreMutation(name || "unnamed", action, currentValue, newValue);
110
+ if (typeof window < "u")
111
+ window.__STX_DEVTOOLS__?.onStoreChange?.(name || "unnamed", action, newValue);
110
112
  } : () => {}, baseSet = (value) => {
111
113
  const prevValue = currentValue;
112
114
  if (!equals(value, prevValue)) {
@@ -152,8 +154,11 @@ export function createStore(initialValue, options = {}) {
152
154
  };
153
155
  for (const mw of middleware.reverse())
154
156
  wrappedSet = mw(baseSet, () => currentValue, store)(wrappedSet);
155
- if (name)
157
+ if (name) {
156
158
  registerStore(name, store);
159
+ if (devtools)
160
+ registerDevToolsStore(name, currentValue ?? {}, {}, []);
161
+ }
157
162
  return store;
158
163
  }
159
164
  export function createReadonlyStore(getter, options = {}) {
@@ -324,28 +329,6 @@ export function createStoreDirective(storeName) {
324
329
  }
325
330
  };
326
331
  }
327
- export function serializeStores() {
328
- const state = {};
329
- for (const [name, store] of globalState.stores.entries())
330
- state[name] = store.get();
331
- return JSON.stringify(state);
332
- }
333
- export function hydrateStores(serialized) {
334
- try {
335
- const state = JSON.parse(serialized);
336
- for (const [name, value] of Object.entries(state)) {
337
- const store = getStore(name);
338
- if (store)
339
- store.set(value);
340
- }
341
- } catch (error) {
342
- console.error("[stx-store] Hydration failed:", error);
343
- }
344
- }
345
- export function generateHydrationScript() {
346
- return `<script>window.__STX_STORE_STATE__=${serializeStores()};
347
- if(window.__STX_HYDRATE_STORES__){window.__STX_HYDRATE_STORES__()}</script>`;
348
- }
349
332
  export function initDevTools() {
350
333
  if (typeof window > "u")
351
334
  return;
@@ -22,3 +22,26 @@
22
22
  * Also transforms @composables imports to window.__composables.
23
23
  */
24
24
  export declare function transformStoreImports(code: string): string;
25
+ /**
26
+ * Remove `import` statements from a store or composable module body.
27
+ *
28
+ * These files are concatenated into one browser IIFE, so their imports have to
29
+ * go: `state`, `derived` and `defineStore` are runtime globals rather than real
30
+ * modules, and leaving the statements in makes the transpiler emit `require()`
31
+ * calls that fail in the browser.
32
+ *
33
+ * The previous pattern was line-anchored (`^import\s+.*from …$`), so a
34
+ * multi-line specifier list survived it — and survived Bun's transpiler too,
35
+ * because `import` is legal at a module's top level. It only failed once the
36
+ * body had been wrapped in the shared IIFE, where an import is a SyntaxError
37
+ * that takes EVERY store in the bundle with it, reported as a misleading
38
+ * "Store not found" (stacksjs/stx#1859).
39
+ *
40
+ * `[^'"]` between `import` and `from` is what keeps a multi-line match from
41
+ * running past its own statement into the next one's specifier: the clause
42
+ * never contains a quote, and the module specifier always does.
43
+ *
44
+ * Shared by both loaders because they carried byte-identical copies, which is
45
+ * how one of them would have been fixed and the other left behind.
46
+ */
47
+ export declare function stripModuleImports(code: string): string;
@@ -11,3 +11,6 @@ export function transformStoreImports(code) {
11
11
  });
12
12
  return code;
13
13
  }
14
+ export function stripModuleImports(code) {
15
+ return code.replace(/^import\s+[^'"]*?from\s*['"][^'"]+['"]\s*;?[ \t]*$/gm, "").replace(/^import\s+['"][^'"]+['"]\s*;?[ \t]*$/gm, "");
16
+ }
@@ -1,3 +1,13 @@
1
+ /**
2
+ * Store Auto-Loader
3
+ *
4
+ * Discovers .ts files in storesDir, bundles them with Bun.build,
5
+ * and returns a <script> tag to inject into the page. Stores are
6
+ * registered before any <script client> blocks run, so useStore()
7
+ * always finds them.
8
+ *
9
+ * @module store-loader
10
+ */
1
11
  export declare function getStoreScript(storesDir?: string): Promise<string | null>;
2
12
  /**
3
13
  * Clear the cached store script (for dev mode hot reload).
@@ -2,7 +2,8 @@ import path from "node:path";
2
2
  import { loadStxConfig } from "./config.js";
3
3
  import { getPublicEnvDefine } from "./public-env.js";
4
4
  import { STX_RUNTIME_GLOBALS } from "./runtime-globals.js";
5
- import { transformStoreImports } from "./store-imports.js";
5
+ import { readSigned, sourceSignature, writeSigned } from "./source-signature.js";
6
+ import { stripModuleImports, transformStoreImports } from "./store-imports.js";
6
7
  const _cachedStoreScripts = new Map;
7
8
  function collectDeclaredNames(code, into) {
8
9
  for (const match of code.matchAll(/\b(?:const|let|var|function|class)\s+([A-Z_a-z$][\w$]*)/g))
@@ -29,9 +30,6 @@ export async function getStoreScript(storesDir) {
29
30
  const config = await loadStxConfig();
30
31
  resolvedDir = path.resolve(config.root || process.cwd(), config.storesDir || "stores");
31
32
  }
32
- const cached = _cachedStoreScripts.get(resolvedDir);
33
- if (cached !== void 0)
34
- return cached || null;
35
33
  const glob = new Bun.Glob("*.ts"), storeFiles = [];
36
34
  try {
37
35
  for await (const file of glob.scan({ cwd: resolvedDir, absolute: !0 })) {
@@ -43,11 +41,14 @@ export async function getStoreScript(storesDir) {
43
41
  storeFiles.push(file);
44
42
  }
45
43
  } catch {
46
- _cachedStoreScripts.set(resolvedDir, "");
44
+ writeSigned(_cachedStoreScripts, resolvedDir, "", "");
47
45
  return null;
48
46
  }
47
+ const signature = sourceSignature(storeFiles), cached = readSigned(_cachedStoreScripts, resolvedDir, signature);
48
+ if (cached !== void 0)
49
+ return cached || null;
49
50
  if (storeFiles.length === 0) {
50
- _cachedStoreScripts.set(resolvedDir, "");
51
+ writeSigned(_cachedStoreScripts, resolvedDir, signature, "");
51
52
  return null;
52
53
  }
53
54
  const filesWithDeps = [];
@@ -70,7 +71,7 @@ export async function getStoreScript(storesDir) {
70
71
  const storeName = path.basename(file, ".ts");
71
72
  collectDeclaredNames(code, declaredNames);
72
73
  code = transformStoreImports(code);
73
- code = code.replace(/^import\s+.*from\s+['"][^'"]+['"]\s*;?\s*$/gm, "");
74
+ code = stripModuleImports(code);
74
75
  code = code.replace(/^export\s+(default\s+)?/gm, "");
75
76
  code = transpiler.transformSync(code);
76
77
  chunks.push(`// Store: ${storeName}
@@ -79,7 +80,7 @@ ${code.trim()}`);
79
80
  console.warn(`[stx] Failed to load store ${file}:`, e);
80
81
  }
81
82
  if (chunks.length === 0) {
82
- _cachedStoreScripts.set(resolvedDir, "");
83
+ writeSigned(_cachedStoreScripts, resolvedDir, signature, "");
83
84
  return null;
84
85
  }
85
86
  const joinedChunks = chunks.join(`
@@ -90,7 +91,7 @@ ${STX_RUNTIME_GLOBALS.filter((name) => !declaredNames.has(name) && new RegExp(`\
90
91
  `)}
91
92
  ${joinedChunks}
92
93
  })();`;
93
- _cachedStoreScripts.set(resolvedDir, code);
94
+ writeSigned(_cachedStoreScripts, resolvedDir, signature, code);
94
95
  return code;
95
96
  }
96
97
  export function clearStoreCache() {
@@ -1,85 +1,163 @@
1
1
  /**
2
- * Generate analytics dashboard HTML
2
+ * STX Story - Component Usage Analytics
3
+ * Track which components are viewed most, which props are changed most
3
4
  */
4
- export declare function getAnalyticsDashboardHtml(mostViewed: Array<{ componentId: string, viewCount: number }>, mostChangedProps: Array<{ propName: string, changeCount: number }>): string;
5
5
  /**
6
- * Generate analytics styles
6
+ * Analytics event types
7
7
  */
8
- export declare function getAnalyticsStyles(): string;
8
+ export type AnalyticsEventType = 'view' | 'prop_change' | 'variant_switch' | 'search' | 'bookmark' | 'copy_code' | 'test_run';
9
9
  /**
10
10
  * Analytics event
11
11
  */
12
- export declare interface AnalyticsEvent {
13
- type: AnalyticsEventType
14
- timestamp: number
15
- componentId?: string
16
- variantId?: string
17
- propName?: string
18
- query?: string
19
- metadata?: Record<string, any>
12
+ export interface AnalyticsEvent {
13
+ /** Event type */
14
+ type: AnalyticsEventType;
15
+ /** Timestamp */
16
+ timestamp: number;
17
+ /** Component ID */
18
+ componentId?: string;
19
+ /** Variant ID */
20
+ variantId?: string;
21
+ /** Prop name (for prop_change) */
22
+ propName?: string;
23
+ /** Search query (for search) */
24
+ query?: string;
25
+ /** Additional metadata */
26
+ metadata?: Record<string, any>;
20
27
  }
21
28
  /**
22
29
  * Component analytics summary
23
30
  */
24
- export declare interface ComponentAnalytics {
25
- componentId: string
26
- componentName: string
27
- viewCount: number
28
- uniqueViews: number
29
- lastViewed?: number
30
- propChanges: Record<string, number>
31
- topChangedProps: string[]
32
- variantViews: Record<string, number>
33
- avgTimeSpent: number
31
+ export interface ComponentAnalytics {
32
+ /** Component ID */
33
+ componentId: string;
34
+ /** Component name */
35
+ componentName: string;
36
+ /** Total views */
37
+ viewCount: number;
38
+ /** Unique view sessions */
39
+ uniqueViews: number;
40
+ /** Last viewed timestamp */
41
+ lastViewed?: number;
42
+ /** Prop change counts */
43
+ propChanges: Record<string, number>;
44
+ /** Most changed props */
45
+ topChangedProps: string[];
46
+ /** Variant view counts */
47
+ variantViews: Record<string, number>;
48
+ /** Average time spent (ms) */
49
+ avgTimeSpent: number;
34
50
  }
35
51
  /**
36
52
  * Analytics storage
37
53
  */
38
- export declare interface AnalyticsStorage {
39
- version: number
40
- events: AnalyticsEvent[]
41
- sessions: AnalyticsSession[]
54
+ export interface AnalyticsStorage {
55
+ version: number;
56
+ events: AnalyticsEvent[];
57
+ sessions: AnalyticsSession[];
42
58
  }
43
59
  /**
44
60
  * Analytics session
45
61
  */
46
- export declare interface AnalyticsSession {
47
- id: string
48
- startTime: number
49
- endTime?: number
50
- componentViews: string[]
62
+ export interface AnalyticsSession {
63
+ id: string;
64
+ startTime: number;
65
+ endTime?: number;
66
+ componentViews: string[];
51
67
  }
52
- /**
53
- * Analytics event types
54
- */
55
- export type AnalyticsEventType = | 'view'
56
- | 'prop_change'
57
- | 'variant_switch'
58
- | 'search'
59
- | 'bookmark'
60
- | 'copy_code'
61
- | 'test_run';
62
68
  /**
63
69
  * Analytics tracker
64
70
  */
65
71
  export declare class AnalyticsTracker {
66
- constructor(rootDir: string);
67
- save(): Promise<void>;
68
- startSession(): void;
69
- endSession(): void;
70
- track(event: Omit<AnalyticsEvent, 'timestamp'>): void;
71
- trackView(componentId: string, variantId?: string): void;
72
- trackPropChange(componentId: string, propName: string, value: any): void;
73
- trackVariantSwitch(componentId: string, variantId: string): void;
74
- trackSearch(query: string, resultCount: number): void;
75
- getComponentAnalytics(componentId: string, componentName: string): ComponentAnalytics;
76
- getMostViewedComponents(limit?: number): Array<{ componentId: string, viewCount: number }>;
77
- getMostChangedProps(limit?: number): Array<{ propName: string, changeCount: number }>;
78
- getSearchAnalytics(): {
79
- totalSearches: number
80
- topQueries: Array<{ query: string, count: number }>
81
- avgResultCount: number
82
- };
83
- clear(): void;
84
- exportAnalytics(): string;
72
+ private storage;
73
+ private storagePath;
74
+ private currentSession;
75
+ private dirty;
76
+ private viewStartTimes;
77
+ constructor(rootDir: string);
78
+ private loadStorage;
79
+ save(): Promise<void>;
80
+ /**
81
+ * Start a new session
82
+ */
83
+ startSession(): void;
84
+ /**
85
+ * End current session
86
+ */
87
+ endSession(): void;
88
+ /**
89
+ * Track an event
90
+ */
91
+ track(event: Omit<AnalyticsEvent, 'timestamp'>): void;
92
+ /**
93
+ * Track component view
94
+ */
95
+ trackView(componentId: string, variantId?: string): void;
96
+ /**
97
+ * End view timing for a component
98
+ */
99
+ private endViewTiming;
100
+ /**
101
+ * Track prop change
102
+ */
103
+ trackPropChange(componentId: string, propName: string, value: any): void;
104
+ /**
105
+ * Track variant switch
106
+ */
107
+ trackVariantSwitch(componentId: string, variantId: string): void;
108
+ /**
109
+ * Track search
110
+ */
111
+ trackSearch(query: string, resultCount: number): void;
112
+ /**
113
+ * Get analytics for a component
114
+ */
115
+ getComponentAnalytics(componentId: string, componentName: string): ComponentAnalytics;
116
+ /**
117
+ * Get most viewed components
118
+ */
119
+ getMostViewedComponents(limit?: number): Array<{
120
+ componentId: string;
121
+ viewCount: number;
122
+ }>;
123
+ /**
124
+ * Get most changed props across all components
125
+ */
126
+ getMostChangedProps(limit?: number): Array<{
127
+ propName: string;
128
+ changeCount: number;
129
+ }>;
130
+ /**
131
+ * Get search analytics
132
+ */
133
+ getSearchAnalytics(): {
134
+ totalSearches: number;
135
+ topQueries: Array<{
136
+ query: string;
137
+ count: number;
138
+ }>;
139
+ avgResultCount: number;
140
+ };
141
+ /**
142
+ * Clear all analytics
143
+ */
144
+ clear(): void;
145
+ /**
146
+ * Export analytics as JSON
147
+ */
148
+ exportAnalytics(): string;
85
149
  }
150
+ /**
151
+ * Generate analytics dashboard HTML
152
+ */
153
+ export declare function getAnalyticsDashboardHtml(mostViewed: Array<{
154
+ componentId: string;
155
+ viewCount: number;
156
+ }>, mostChangedProps: Array<{
157
+ propName: string;
158
+ changeCount: number;
159
+ }>): string;
160
+ /**
161
+ * Generate analytics styles
162
+ */
163
+ export declare function getAnalyticsStyles(): string;
@@ -1,49 +1,102 @@
1
1
  /**
2
- * Generate bookmarks panel HTML
3
- */
4
- export declare function getBookmarksPanelHtml(bookmarks: Bookmark[]): string;
5
- /**
6
- * Generate bookmarks panel styles
2
+ * STX Story - Bookmarks
3
+ * Bookmark component+variant+props combinations for quick access
7
4
  */
8
- export declare function getBookmarksPanelStyles(): string;
9
- /**
10
- * Generate bookmarks client script
11
- */
12
- export declare function getBookmarksScript(): string;
13
5
  /**
14
6
  * Bookmark entry
15
7
  */
16
- export declare interface Bookmark {
17
- id: string
18
- name: string
19
- storyId: string
20
- variantId: string
21
- props: Record<string, any>
22
- created: number
23
- notes?: string
24
- color?: string
8
+ export interface Bookmark {
9
+ /** Bookmark ID */
10
+ id: string;
11
+ /** Display name */
12
+ name: string;
13
+ /** Story ID */
14
+ storyId: string;
15
+ /** Variant ID */
16
+ variantId: string;
17
+ /** Props state */
18
+ props: Record<string, any>;
19
+ /** Created timestamp */
20
+ created: number;
21
+ /** Notes */
22
+ notes?: string;
23
+ /** Color label */
24
+ color?: string;
25
25
  }
26
26
  /**
27
27
  * Bookmarks storage
28
28
  */
29
- export declare interface BookmarksStorage {
30
- version: number
31
- bookmarks: Bookmark[]
29
+ export interface BookmarksStorage {
30
+ version: number;
31
+ bookmarks: Bookmark[];
32
32
  }
33
33
  /**
34
34
  * Bookmarks manager
35
35
  */
36
36
  export declare class BookmarksManager {
37
- constructor(rootDir: string);
38
- save(): Promise<void>;
39
- addBookmark(storyId: string, variantId: string, props: Record<string, any>, options?: { name?: string, notes?: string, color?: string }): Bookmark;
40
- getAllBookmarks(): Bookmark[];
41
- getBookmarksForStory(storyId: string): Bookmark[];
42
- getBookmark(id: string): Bookmark | undefined;
43
- isBookmarked(storyId: string, variantId: string): boolean;
44
- updateBookmark(id: string, updates: Partial<Omit<Bookmark, 'id' | 'created'>>): Bookmark | undefined;
45
- deleteBookmark(id: string): boolean;
46
- toggleBookmark(storyId: string, variantId: string, props: Record<string, any>): { added: boolean, bookmark?: Bookmark };
47
- exportBookmarks(): string;
48
- importBookmarks(json: string, merge?: boolean): number;
37
+ private storage;
38
+ private storagePath;
39
+ private dirty;
40
+ constructor(rootDir: string);
41
+ private loadStorage;
42
+ save(): Promise<void>;
43
+ /**
44
+ * Add a bookmark
45
+ */
46
+ addBookmark(storyId: string, variantId: string, props: Record<string, any>, options?: {
47
+ name?: string;
48
+ notes?: string;
49
+ color?: string;
50
+ }): Bookmark;
51
+ /**
52
+ * Get all bookmarks
53
+ */
54
+ getAllBookmarks(): Bookmark[];
55
+ /**
56
+ * Get bookmarks for a story
57
+ */
58
+ getBookmarksForStory(storyId: string): Bookmark[];
59
+ /**
60
+ * Get a bookmark by ID
61
+ */
62
+ getBookmark(id: string): Bookmark | undefined;
63
+ /**
64
+ * Check if a combination is bookmarked
65
+ */
66
+ isBookmarked(storyId: string, variantId: string): boolean;
67
+ /**
68
+ * Update a bookmark
69
+ */
70
+ updateBookmark(id: string, updates: Partial<Omit<Bookmark, 'id' | 'created'>>): Bookmark | undefined;
71
+ /**
72
+ * Delete a bookmark
73
+ */
74
+ deleteBookmark(id: string): boolean;
75
+ /**
76
+ * Toggle bookmark for a combination
77
+ */
78
+ toggleBookmark(storyId: string, variantId: string, props: Record<string, any>): {
79
+ added: boolean;
80
+ bookmark?: Bookmark;
81
+ };
82
+ /**
83
+ * Export bookmarks
84
+ */
85
+ exportBookmarks(): string;
86
+ /**
87
+ * Import bookmarks
88
+ */
89
+ importBookmarks(json: string, merge?: boolean): number;
49
90
  }
91
+ /**
92
+ * Generate bookmarks panel HTML
93
+ */
94
+ export declare function getBookmarksPanelHtml(bookmarks: Bookmark[]): string;
95
+ /**
96
+ * Generate bookmarks panel styles
97
+ */
98
+ export declare function getBookmarksPanelStyles(): string;
99
+ /**
100
+ * Generate bookmarks client script
101
+ */
102
+ export declare function getBookmarksScript(): string;