@stacksjs/stx 0.2.9 → 0.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/README.md +16 -11
  2. package/dist/a11y.d.ts +2 -1
  3. package/dist/analyzer.d.ts +4 -0
  4. package/dist/app-shell.d.ts +72 -0
  5. package/dist/app.d.ts +1 -0
  6. package/dist/broadcasting.d.ts +77 -0
  7. package/dist/build-assets.d.ts +32 -0
  8. package/dist/build-mode-detector.d.ts +26 -0
  9. package/dist/build.d.ts +31 -0
  10. package/dist/builtins/icon.d.ts +7 -0
  11. package/dist/builtins/index.d.ts +21 -0
  12. package/dist/builtins/stx-image.d.ts +2 -0
  13. package/dist/builtins/stx-link.d.ts +2 -0
  14. package/dist/builtins/stx-loading-indicator.d.ts +2 -0
  15. package/dist/bundle-analyzer/index.d.ts +2 -0
  16. package/dist/bundle-analyzer.js +20 -20
  17. package/dist/caching.d.ts +27 -0
  18. package/dist/cli.js +3941 -2609
  19. package/dist/client-helpers.d.ts +7 -3
  20. package/dist/client-script-bundler.d.ts +27 -0
  21. package/dist/client-script.d.ts +5 -1
  22. package/dist/client.d.ts +1 -0
  23. package/dist/component-hmr.d.ts +1 -0
  24. package/dist/component-processing.d.ts +107 -0
  25. package/dist/component-registry.d.ts +54 -0
  26. package/dist/component-renderer.d.ts +18 -0
  27. package/dist/components/StxImage.stx +12 -0
  28. package/dist/components/StxLink.stx +18 -8
  29. package/dist/composables/index.d.ts +7 -0
  30. package/dist/composables/use-broadcast-channel.d.ts +1 -0
  31. package/dist/composables/use-channel.d.ts +67 -0
  32. package/dist/composables/use-intersection-observer.d.ts +2 -0
  33. package/dist/composables/use-keyboard.d.ts +1 -0
  34. package/dist/composables/use-mouse.d.ts +1 -0
  35. package/dist/composables/use-router.d.ts +4 -0
  36. package/dist/composables/use-websocket.d.ts +1 -0
  37. package/dist/composables.d.ts +2 -0
  38. package/dist/composition-api.d.ts +1 -0
  39. package/dist/computed.d.ts +1 -0
  40. package/dist/config.d.ts +12 -1
  41. package/dist/craft-bridge.d.ts +6 -3
  42. package/dist/craft-components.d.ts +1 -0
  43. package/dist/craft.js +39 -33
  44. package/dist/deploy/index.d.ts +1 -0
  45. package/dist/dev-server/crosswind.d.ts +2 -5
  46. package/dist/dev-server/native-window.d.ts +19 -1
  47. package/dist/dev-server/serve-app.d.ts +15 -0
  48. package/dist/dev-server/serve-file.d.ts +3 -0
  49. package/dist/dev-server/serve-markdown.d.ts +3 -0
  50. package/dist/dev-server/serve-multi.d.ts +5 -0
  51. package/dist/dev-server/types.d.ts +2 -0
  52. package/dist/dev-server.d.ts +6 -40
  53. package/dist/devtools.d.ts +1 -0
  54. package/dist/directive-api.d.ts +1 -1
  55. package/dist/document-shell.d.ts +33 -0
  56. package/dist/error-boundaries.d.ts +1 -0
  57. package/dist/events.d.ts +1 -0
  58. package/dist/expressions.d.ts +38 -0
  59. package/dist/forms-validation.d.ts +2 -0
  60. package/dist/head.d.ts +1 -0
  61. package/dist/hot-reload.d.ts +1 -0
  62. package/dist/hydration-runtime.d.ts +1 -0
  63. package/dist/hydration.d.ts +1 -0
  64. package/dist/i18n.d.ts +3 -1
  65. package/dist/image-optimization/build-plugin.d.ts +1 -0
  66. package/dist/index.d.ts +22 -1
  67. package/dist/index.js +5569 -4182
  68. package/dist/inline-assets.d.ts +28 -0
  69. package/dist/internal-markdown.d.ts +0 -4
  70. package/dist/jsx-runtime.d.ts +1 -0
  71. package/dist/keep-alive.d.ts +1 -0
  72. package/dist/manifest.d.ts +41 -0
  73. package/dist/markdown.d.ts +1 -0
  74. package/dist/media/client/blur-up.d.ts +1 -0
  75. package/dist/media/client/lazy-load.d.ts +1 -0
  76. package/dist/media/client/upload-handler.d.ts +1 -0
  77. package/dist/media/shared/cache.d.ts +2 -0
  78. package/dist/media/video/index.d.ts +1 -0
  79. package/dist/media/video/processor/thumbnail.d.ts +1 -0
  80. package/dist/misc-directives.d.ts +49 -0
  81. package/dist/parser/directive-parser.d.ts +13 -0
  82. package/dist/performance-utils.d.ts +2 -0
  83. package/dist/placeholder.d.ts +45 -0
  84. package/dist/plugin-system.d.ts +32 -2
  85. package/dist/process.d.ts +11 -1
  86. package/dist/production-builder.d.ts +42 -0
  87. package/dist/production-server.d.ts +19 -0
  88. package/dist/props.d.ts +1 -0
  89. package/dist/pwa.js +3883 -2679
  90. package/dist/reactive.d.ts +2 -16
  91. package/dist/reactivity.d.ts +1 -0
  92. package/dist/router.d.ts +1 -1
  93. package/dist/runtime-injection.d.ts +20 -0
  94. package/dist/runtime.d.ts +2 -2
  95. package/dist/script-classifier.d.ts +35 -0
  96. package/dist/script-validation.d.ts +16 -0
  97. package/dist/server-bindings.d.ts +7 -0
  98. package/dist/server-components.d.ts +4 -0
  99. package/dist/signal-processing.d.ts +109 -0
  100. package/dist/signals-api.d.ts +309 -0
  101. package/dist/signals.d.ts +2 -309
  102. package/dist/spa-shell.d.ts +1 -0
  103. package/dist/ssg.js +3862 -2655
  104. package/dist/ssr.d.ts +1 -0
  105. package/dist/state-management.d.ts +27 -0
  106. package/dist/store-imports.d.ts +24 -0
  107. package/dist/store-loader.d.ts +16 -0
  108. package/dist/story/bun-test.d.ts +1 -0
  109. package/dist/story/compiled-output.d.ts +1 -0
  110. package/dist/story/interactions.d.ts +1 -0
  111. package/dist/story/renderer.d.ts +2 -0
  112. package/dist/story/setup.d.ts +1 -0
  113. package/dist/story/ui/code-panel.d.ts +1 -0
  114. package/dist/stx.d.ts +437 -0
  115. package/dist/style-scoping.d.ts +23 -0
  116. package/dist/template-compiler.d.ts +31 -0
  117. package/dist/template-hydrator.d.ts +18 -0
  118. package/dist/transitions.d.ts +1 -0
  119. package/dist/types/config-types.d.ts +62 -0
  120. package/dist/validator.d.ts +1 -0
  121. package/dist/variable-extractor.d.ts +1 -1
  122. package/dist/view-composers.d.ts +1 -0
  123. package/dist/virtual-scrolling.d.ts +1 -0
  124. package/dist/visual-testing.js +2 -2
  125. package/dist/web-components.d.ts +1 -0
  126. package/dist/x-element.d.ts +1 -0
  127. package/package.json +72 -7
  128. package/stx.d.ts +437 -0
package/dist/ssr.d.ts CHANGED
@@ -88,6 +88,7 @@ export declare interface AppConfig {
88
88
  sessionStore?: SessionStore
89
89
  }
90
90
  /** Route handler */
91
+ // eslint-disable-next-line pickier/no-unused-vars
91
92
  export type RouteHandler = (ctx: RequestContext) => Response | Promise<Response>;
92
93
  /** Middleware function */
93
94
  export type Middleware = (ctx: RequestContext, next: () => Promise<Response>) => Response | Promise<Response>;
@@ -146,6 +146,32 @@ export declare function initDevTools(): void;
146
146
  * </script>
147
147
  * ```
148
148
  */
149
+ /**
150
+ * Define a store using a setup function (composition API style).
151
+ * The function receives no arguments and returns an object of signals,
152
+ * derived values, and action functions.
153
+ *
154
+ * ```ts
155
+ * defineStore('auth', () => {
156
+ * const user = state(null)
157
+ * const isAuthenticated = derived(() => !!user())
158
+ * function login(data) { user.set(data) }
159
+ * return { user, isAuthenticated, login }
160
+ * })
161
+ * ```
162
+ */
163
+ export declare function defineStore<T extends Record<string, any>>(id: string, setup: () => T, options?: { persist?: boolean | { pick?: string[], storage?: string, key?: string } }): T;
164
+ /**
165
+ * Define a store using an options object (options API style).
166
+ *
167
+ * ```ts
168
+ * defineStore('counter', {
169
+ * state: () => ({ count: 0 }),
170
+ * getters: { doubled: (s) => s.count * 2 },
171
+ * actions: { increment() { this.count++ } },
172
+ * })
173
+ * ```
174
+ */
149
175
  export declare function defineStore<S extends object, G extends Record<string, (state: S) => any> = Record<string, never>, A extends Record<string, (...args: any[]) => any> = Record<string, never>,>(id: string, options: DefineStoreOptions<S, G, A>): DefinedStoreWithGettersAndActions<S, G, A>;
150
176
  /**
151
177
  * Get a defined store by name.
@@ -263,6 +289,7 @@ export declare interface DefinedStore<S, G extends Record<string, (state: S) =>
263
289
  $id: string
264
290
  }
265
291
  /** Subscription callback */
292
+ // eslint-disable-next-line pickier/no-unused-vars
266
293
  export type Subscriber<T> = (value: T, previousValue: T | undefined) => void;
267
294
  /** Unsubscribe function */
268
295
  export type Unsubscribe = () => void;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Store Import Transformation
3
+ *
4
+ * Transforms `import { x } from '@stores'` statements in client scripts
5
+ * into runtime lookups against the global store registry.
6
+ *
7
+ * @module store-imports
8
+ */
9
+ /**
10
+ * Transform import statements from @stores to runtime code.
11
+ *
12
+ * Transforms:
13
+ * ```js
14
+ * import { appStore, chatStore } from '@stores'
15
+ * ```
16
+ *
17
+ * Into:
18
+ * ```js
19
+ * const { appStore, chatStore } = window.__STX_STORES__
20
+ * ```
21
+ *
22
+ * Also transforms @composables imports to window.__composables.
23
+ */
24
+ export declare function transformStoreImports(code: string): string;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Discover store files from storesDir and bundle them into a single
3
+ * script that can be injected into the page.
4
+ *
5
+ * The bundle runs `defineStore(...)` for each store — since the signals
6
+ * runtime is already loaded, `defineStore`/`state`/`derived` are globals.
7
+ *
8
+ * Pass an absolute `storesDir` to look up stores there. When omitted, falls
9
+ * back to reading `storesDir` from the stx config at the current working
10
+ * directory — which is only correct when run from the app's own root.
11
+ */
12
+ export declare function getStoreScript(storesDir?: string): Promise<string | null>;
13
+ /**
14
+ * Clear the cached store script (for dev mode hot reload).
15
+ */
16
+ export declare function clearStoreCache(): void;
@@ -19,6 +19,7 @@ export declare function createStoryTests(options?: BunTestOptions): Promise<void
19
19
  /**
20
20
  * Run story tests programmatically
21
21
  */
22
+ // eslint-disable-next-line pickier/no-unused-vars
22
23
  export declare function runStoryTests(options?: BunTestOptions): Promise<{
23
24
  passed: number
24
25
  failed: number
@@ -2,6 +2,7 @@ import type { ServerStoryFile, StoryContext } from './types';
2
2
  /**
3
3
  * Get compiled HTML output for a story variant
4
4
  */
5
+ // eslint-disable-next-line pickier/no-unused-vars
5
6
  export declare function getCompiledOutput(ctx: StoryContext, story: ServerStoryFile, variantId: string, options?: CompiledOutputOptions): Promise<string>;
6
7
  /**
7
8
  * Generate compiled output panel HTML
@@ -6,6 +6,7 @@ export declare function parseInteractionBlocks(content: string): InteractionTest
6
6
  /**
7
7
  * Run interaction tests for a story
8
8
  */
9
+ // eslint-disable-next-line pickier/no-unused-vars
9
10
  export declare function runInteractionTests(_ctx: StoryContext, story: ServerStoryFile, tests: InteractionTest[]): Promise<InteractionTestResult[]>;
10
11
  /**
11
12
  * Generate interaction test helpers script (for browser)
@@ -2,6 +2,7 @@ import type { ServerStoryFile, StoryContext } from './types';
2
2
  /**
3
3
  * Render a story component with props
4
4
  */
5
+ // eslint-disable-next-line pickier/no-unused-vars
5
6
  export declare function renderStoryComponent(ctx: StoryContext, componentPath: string, options?: StoryRenderOptions): Promise<StoryRenderResult>;
6
7
  /**
7
8
  * Render a story variant
@@ -10,6 +11,7 @@ export declare function renderStoryVariant(ctx: StoryContext, story: ServerStory
10
11
  /**
11
12
  * Render an inline template string
12
13
  */
14
+ // eslint-disable-next-line pickier/no-unused-vars
13
15
  export declare function renderInlineTemplate(ctx: StoryContext, template: string, props?: Record<string, any>): Promise<StoryRenderResult>;
14
16
  /**
15
17
  * Clear the story component cache
@@ -44,4 +44,5 @@ export declare interface SetupContext {
44
44
  /**
45
45
  * Setup function signature
46
46
  */
47
+ // eslint-disable-next-line pickier/no-unused-vars
47
48
  export type SetupFunction = (ctx: SetupContext) => void | Promise<void>;
@@ -2,6 +2,7 @@ import type { AnalyzedComponent, ServerStoryFile } from '../types';
2
2
  /**
3
3
  * Generate code panel HTML
4
4
  */
5
+ // eslint-disable-next-line pickier/no-unused-vars
5
6
  export declare function generateCodePanel(story: ServerStoryFile, component: AnalyzedComponent | null, activeTab?: CodePanelTab): string;
6
7
  /**
7
8
  * Get source code for a component
package/dist/stx.d.ts ADDED
@@ -0,0 +1,437 @@
1
+ /**
2
+ * STX Ambient Type Declarations
3
+ *
4
+ * This file is shipped with the @stacksjs/stx package and referenced from
5
+ * the package's main types entry. When stx is installed, TypeScript picks
6
+ * these declarations up automatically — apps do NOT need to write their own
7
+ * stx.d.ts workaround for runtime globals.
8
+ *
9
+ * What's declared here:
10
+ * 1. Module declarations for `*.stx` and `*.md` imports
11
+ * 2. Runtime globals injected by the stx signals runtime into <script client>
12
+ * blocks (signals, lifecycle, stores, composables, head, routing, etc.)
13
+ * 3. The `window.stx` registry interface
14
+ *
15
+ * Source of truth for the auto-imported global list:
16
+ * packages/stx/src/client-script.ts → STX_AUTO_IMPORTS
17
+ * packages/stx/src/signals.ts → window.stx = { ... }
18
+ */
19
+
20
+ // ============================================================================
21
+ // Module declarations
22
+ // ============================================================================
23
+
24
+ // Allow importing .stx files
25
+ declare module '*.stx'
26
+
27
+ // Allow importing .md files with frontmatter
28
+ declare module '*.md' {
29
+ const content: string
30
+ const data: Record<string, any>
31
+ export default content
32
+ export { data }
33
+ }
34
+
35
+ // ============================================================================
36
+ // Signal types
37
+ // ============================================================================
38
+
39
+ interface StxSignal<T> {
40
+ (): T
41
+ set: (value: T) => void
42
+ update: (fn: (current: T) => T) => void
43
+ subscribe: (cb: (value: T) => void) => () => void
44
+ readonly _isSignal: true
45
+ }
46
+
47
+ interface StxDerivedSignal<T> {
48
+ (): T
49
+ readonly _isSignal: true
50
+ }
51
+
52
+ interface StxRef<T> {
53
+ value: T
54
+ }
55
+
56
+ type StxCleanup = () => void
57
+
58
+ // ============================================================================
59
+ // Signals (modern reactivity)
60
+ // ============================================================================
61
+
62
+ declare function state<T>(initial: T): StxSignal<T>
63
+ declare function derived<T>(compute: () => T): StxDerivedSignal<T>
64
+ declare function effect(fn: () => void | StxCleanup): StxCleanup
65
+ declare function batch(fn: () => void): void
66
+ declare function untrack<T>(value: T | StxSignal<T> | StxDerivedSignal<T>): T
67
+ declare function peek<T>(fn: () => T): T
68
+ declare function isSignal(value: unknown): value is StxSignal<unknown>
69
+ declare function isDerived(value: unknown): value is StxDerivedSignal<unknown>
70
+
71
+ // ============================================================================
72
+ // Lifecycle
73
+ // ============================================================================
74
+
75
+ declare function onMount(fn: () => void | StxCleanup): void
76
+ declare function onDestroy(fn: () => void): void
77
+ declare function onBeforeMount(fn: () => void): void
78
+ declare function onMounted(fn: () => void | StxCleanup): void
79
+ declare function onBeforeUpdate(fn: () => void): void
80
+ declare function onUpdated(fn: () => void): void
81
+ declare function onBeforeUnmount(fn: () => void): void
82
+ declare function onUnmounted(fn: () => void): void
83
+ declare function onErrorCaptured(fn: (error: unknown, instance: any, info: string) => boolean | void): void
84
+
85
+ // ============================================================================
86
+ // Template refs
87
+ // ============================================================================
88
+
89
+ declare function useRef<T = HTMLElement>(name: string): { current: T | null }
90
+
91
+ // ============================================================================
92
+ // Routing / navigation
93
+ // ============================================================================
94
+
95
+ declare function navigate(url: string, options?: { replace?: boolean }): void
96
+ declare function goBack(): void
97
+ declare function goForward(): void
98
+ declare function useRoute(): {
99
+ path: string
100
+ params: Record<string, string>
101
+ query: Record<string, string>
102
+ hash: string
103
+ }
104
+ declare function setRouteParams(params: Record<string, string>): void
105
+ declare function useSearchParams(): {
106
+ get: (key: string) => string | null
107
+ set: (key: string, value: string) => void
108
+ delete: (key: string) => void
109
+ has: (key: string) => boolean
110
+ }
111
+
112
+ // ============================================================================
113
+ // Data fetching
114
+ // ============================================================================
115
+
116
+ interface StxQueryResult<T> {
117
+ data: StxSignal<T | null>
118
+ loading: StxSignal<boolean>
119
+ error: StxSignal<Error | null>
120
+ refetch: () => Promise<void>
121
+ }
122
+
123
+ interface StxMutationResult<T> {
124
+ data: StxSignal<T | null>
125
+ loading: StxSignal<boolean>
126
+ error: StxSignal<Error | null>
127
+ mutate: (body?: any) => Promise<T>
128
+ }
129
+
130
+ declare function useFetch<T = any>(url: string, options?: any): StxQueryResult<T>
131
+ declare function useQuery<T = any>(url: string, options?: any): StxQueryResult<T>
132
+ declare function useMutation<T = any>(url: string, options?: any): StxMutationResult<T>
133
+
134
+ // ============================================================================
135
+ // DOM utilities
136
+ // ============================================================================
137
+
138
+ declare function useEventListener<K extends keyof WindowEventMap>(
139
+ target: Window | Document | HTMLElement | string | null,
140
+ event: K,
141
+ handler: (event: WindowEventMap[K]) => void,
142
+ options?: boolean | AddEventListenerOptions,
143
+ ): StxCleanup
144
+ declare function useEventListener(
145
+ target: Window | Document | HTMLElement | string | null,
146
+ event: string,
147
+ handler: (event: Event) => void,
148
+ options?: boolean | AddEventListenerOptions,
149
+ ): StxCleanup
150
+ declare function useMeta(meta: Record<string, string>): void
151
+ declare function useClickOutside(target: any, handler: (event: MouseEvent) => void): StxCleanup
152
+ declare function useFocus(target: any): { focused: StxSignal<boolean>, focus: () => void, blur: () => void }
153
+
154
+ // ============================================================================
155
+ // Timers / scheduling
156
+ // ============================================================================
157
+
158
+ declare function useDebounce<T extends (...args: any[]) => any>(fn: T, delay: number): T
159
+ declare function useDebouncedValue<T>(value: StxSignal<T>, delay: number): StxSignal<T>
160
+ declare function useThrottle<T extends (...args: any[]) => any>(fn: T, delay: number): T
161
+ declare function useInterval(fn: () => void, ms: number, options?: { immediate?: boolean }): {
162
+ start: () => void
163
+ stop: () => void
164
+ isActive: StxSignal<boolean>
165
+ }
166
+ declare function useTimeout(fn: () => void, ms: number): {
167
+ start: () => void
168
+ stop: () => void
169
+ isPending: StxSignal<boolean>
170
+ }
171
+ declare function nextTick(fn?: () => void): Promise<void>
172
+
173
+ // ============================================================================
174
+ // State utilities
175
+ // ============================================================================
176
+
177
+ declare function useToggle(initial?: boolean): [StxSignal<boolean>, (value?: boolean) => void]
178
+ declare function useCounter(initial?: number, options?: { min?: number, max?: number }): {
179
+ count: StxSignal<number>
180
+ inc: (n?: number) => void
181
+ dec: (n?: number) => void
182
+ set: (n: number) => void
183
+ reset: () => void
184
+ }
185
+ declare function useAsync<T>(fn: () => Promise<T>): {
186
+ data: StxSignal<T | null>
187
+ loading: StxSignal<boolean>
188
+ error: StxSignal<Error | null>
189
+ execute: () => Promise<T>
190
+ }
191
+
192
+ // ============================================================================
193
+ // Storage
194
+ // ============================================================================
195
+
196
+ declare function useLocalStorage<T>(key: string, defaultValue: T): StxSignal<T>
197
+ declare function useSessionStorage<T>(key: string, defaultValue: T): StxSignal<T>
198
+
199
+ // ============================================================================
200
+ // WebSocket
201
+ // ============================================================================
202
+
203
+ declare function useWebSocket(url: string, options?: {
204
+ immediate?: boolean
205
+ autoReconnect?: boolean | { retries?: number, delay?: number }
206
+ onMessage?: (event: MessageEvent) => void
207
+ onConnected?: () => void
208
+ onDisconnected?: () => void
209
+ onError?: (event: Event) => void
210
+ }): {
211
+ status: StxSignal<'CONNECTING' | 'OPEN' | 'CLOSING' | 'CLOSED'>
212
+ data: StxSignal<any>
213
+ send: (data: string | ArrayBuffer | Blob) => void
214
+ open: () => void
215
+ close: () => void
216
+ ws: WebSocket | null
217
+ }
218
+
219
+ // ============================================================================
220
+ // Color mode
221
+ // ============================================================================
222
+
223
+ declare function useColorMode(): {
224
+ mode: StxSignal<'light' | 'dark' | 'auto'>
225
+ setMode: (mode: 'light' | 'dark' | 'auto') => void
226
+ }
227
+ declare function useDark(): StxSignal<boolean>
228
+
229
+ // ============================================================================
230
+ // Head / SEO
231
+ // ============================================================================
232
+
233
+ interface StxHeadConfig {
234
+ title?: string
235
+ titleTemplate?: string | ((title?: string) => string)
236
+ meta?: Array<Record<string, string>>
237
+ link?: Array<Record<string, string>>
238
+ script?: Array<Record<string, string> & { children?: string }>
239
+ style?: Array<Record<string, string> & { children?: string }>
240
+ htmlAttrs?: Record<string, string>
241
+ bodyAttrs?: Record<string, string>
242
+ }
243
+
244
+ interface StxSeoMetaConfig {
245
+ title?: string
246
+ description?: string
247
+ keywords?: string
248
+ author?: string
249
+ ogTitle?: string
250
+ ogDescription?: string
251
+ ogImage?: string
252
+ ogUrl?: string
253
+ ogType?: string
254
+ twitterCard?: 'summary' | 'summary_large_image' | 'app' | 'player'
255
+ twitterTitle?: string
256
+ twitterDescription?: string
257
+ twitterImage?: string
258
+ robots?: string
259
+ canonical?: string
260
+ }
261
+
262
+ declare function useHead(config: StxHeadConfig): void
263
+ declare function useSeoMeta(config: StxSeoMetaConfig): void
264
+
265
+ // ============================================================================
266
+ // Vue-style reactivity (alternative API)
267
+ // ============================================================================
268
+
269
+ declare function ref<T>(value: T): StxRef<T>
270
+ declare function reactive<T extends object>(target: T): T
271
+ declare function computed<T>(getter: () => T): StxRef<T>
272
+ declare function watch<T>(
273
+ source: (() => T) | StxRef<T> | StxSignal<T>,
274
+ callback: (value: T, oldValue: T) => void,
275
+ options?: { immediate?: boolean, deep?: boolean },
276
+ ): StxCleanup
277
+ declare function watchEffect(fn: () => void): StxCleanup
278
+ declare function watchMultiple(
279
+ sources: Array<() => any>,
280
+ callback: (values: any[], oldValues: any[]) => void,
281
+ options?: { immediate?: boolean },
282
+ ): StxCleanup
283
+
284
+ // ============================================================================
285
+ // Component definition / composition API
286
+ // ============================================================================
287
+
288
+ declare function defineProps<T extends Record<string, any> = Record<string, any>>(definitions?: any): T
289
+ declare function withDefaults<T extends Record<string, any>>(props: T, defaults: Partial<T>): T
290
+ declare function defineEmits<T extends string = string>(): (event: T, payload?: any) => void
291
+ declare function defineExpose<T extends Record<string, any>>(exposed: T): void
292
+ declare function provide<T>(key: string | symbol, value: T): void
293
+ declare function inject<T>(key: string | symbol, defaultValue?: T): T | undefined
294
+ declare function getCurrentInstance(): any
295
+ declare function useSlots(): Record<string, any>
296
+ declare function useAttrs(): Record<string, any>
297
+ declare function $computed<T>(getter: () => T): StxRef<T>
298
+ declare function $watch<T>(
299
+ source: (() => T) | StxRef<T> | StxSignal<T>,
300
+ callback: (value: T, oldValue: T) => void,
301
+ options?: { immediate?: boolean, deep?: boolean },
302
+ ): StxCleanup
303
+
304
+ // ============================================================================
305
+ // Stores (Pinia-inspired, signals-based)
306
+ // ============================================================================
307
+
308
+ interface StxStorePersistOptions {
309
+ pick?: string[]
310
+ storage?: 'localStorage' | 'sessionStorage'
311
+ key?: string
312
+ }
313
+
314
+ interface StxStoreOptions {
315
+ persist?: boolean | StxStorePersistOptions
316
+ }
317
+
318
+ declare function defineStore<T>(
319
+ id: string,
320
+ setup: () => T,
321
+ options?: StxStoreOptions,
322
+ ): () => T
323
+ declare function defineStore<S extends Record<string, any>, G extends Record<string, any>, A extends Record<string, any>>(
324
+ id: string,
325
+ options: {
326
+ state?: () => S
327
+ getters?: G
328
+ actions?: A
329
+ persist?: boolean | StxStorePersistOptions
330
+ },
331
+ ): () => S & G & A
332
+ declare function useStore<T = any>(id: string): T
333
+ declare function createStore<T>(setup: () => T, options?: StxStoreOptions): () => T
334
+ declare function action<T extends (...args: any[]) => any>(fn: T): T
335
+ declare function createSelector<T, R>(selector: (state: T) => R): (state: T) => R
336
+
337
+ // ============================================================================
338
+ // JSX runtime (Vue/React style)
339
+ // ============================================================================
340
+
341
+ declare function h(tag: string | Function, props?: Record<string, any> | null, ...children: any[]): any
342
+ declare const Fragment: unique symbol
343
+
344
+ // ============================================================================
345
+ // window.stx registry
346
+ // ============================================================================
347
+
348
+ interface StxRuntimeRegistry {
349
+ // Signals
350
+ state: typeof state
351
+ derived: typeof derived
352
+ effect: typeof effect
353
+ batch: typeof batch
354
+ untrack: typeof untrack
355
+ peek: typeof peek
356
+ isSignal: typeof isSignal
357
+
358
+ // Lifecycle
359
+ onMount: typeof onMount
360
+ onDestroy: typeof onDestroy
361
+
362
+ // Composables
363
+ useFetch: typeof useFetch
364
+ useRef: typeof useRef
365
+ useQuery: typeof useQuery
366
+ useMutation: typeof useMutation
367
+
368
+ // Routing
369
+ navigate: typeof navigate
370
+ goBack: typeof goBack
371
+ goForward: typeof goForward
372
+ useRoute: typeof useRoute
373
+ setRouteParams: typeof setRouteParams
374
+ useSearchParams: typeof useSearchParams
375
+
376
+ // Composition
377
+ provide: typeof provide
378
+ defineProps: typeof defineProps
379
+ withDefaults: typeof withDefaults
380
+ defineEmits: typeof defineEmits
381
+ defineExpose: typeof defineExpose
382
+
383
+ // Vue compat
384
+ ref: typeof ref
385
+ reactive: typeof reactive
386
+ computed: typeof computed
387
+ watch: typeof watch
388
+ watchEffect: typeof watchEffect
389
+ $computed: typeof $computed
390
+ $watch: typeof $watch
391
+
392
+ // Utilities
393
+ useDebounce: typeof useDebounce
394
+ useDebouncedValue: typeof useDebouncedValue
395
+ useThrottle: typeof useThrottle
396
+ useInterval: typeof useInterval
397
+ useTimeout: typeof useTimeout
398
+ useToggle: typeof useToggle
399
+ useCounter: typeof useCounter
400
+ useClickOutside: typeof useClickOutside
401
+ useFocus: typeof useFocus
402
+ useAsync: typeof useAsync
403
+ useLocalStorage: typeof useLocalStorage
404
+ useEventListener: typeof useEventListener
405
+ useWebSocket: typeof useWebSocket
406
+ useColorMode: typeof useColorMode
407
+ useDark: typeof useDark
408
+ useHead: typeof useHead
409
+ useSeoMeta: typeof useSeoMeta
410
+
411
+ // Stores
412
+ defineStore: typeof defineStore
413
+ useStore: typeof useStore
414
+
415
+ // Mount API
416
+ mount: (setupFn: () => any) => void
417
+ mountEl: (selector: string, setupFn: () => any) => void
418
+
419
+ // Helpers (template helpers — populated by app)
420
+ helpers: Record<string, any>
421
+
422
+ // Internals (escape hatch)
423
+ [key: string]: any
424
+ }
425
+
426
+ // Bare global so existing code that references `stx` (without `window.`) still works
427
+ declare const stx: StxRuntimeRegistry
428
+
429
+ // Augment Window so `window.stx` is typed
430
+ interface Window {
431
+ stx: StxRuntimeRegistry
432
+ __STX_STORES__?: Record<string, any>
433
+ __STX_CURRENT_PROPS__?: Record<string, any>
434
+ __STX_CURRENT_ELEMENT__?: HTMLElement | null
435
+ __stxRouter?: boolean
436
+ __stxRouterConfig?: Record<string, any>
437
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Process all `<style scoped>` blocks in a template.
3
+ *
4
+ * For each `<style scoped>` block:
5
+ * 1. Generates a deterministic hash from the file path
6
+ * 2. Prefixes all CSS selectors with `[data-v-{hash}]`
7
+ * 3. Adds `data-v-{hash}` attribute to all top-level HTML elements
8
+ * 4. Replaces the `<style scoped>` tag with scoped CSS
9
+ *
10
+ * Non-scoped `<style>` tags pass through unchanged.
11
+ *
12
+ * @param template - The HTML template string
13
+ * @param filePath - Source file path (used for deterministic hash generation)
14
+ * @returns Processed template with scoped styles
15
+ */
16
+ export declare function processScopedStyles(template: string, filePath: string): ScopedStyleResult;
17
+ /**
18
+ * Result of processing scoped styles in a template
19
+ */
20
+ export declare interface ScopedStyleResult {
21
+ html: string
22
+ hasScoped: boolean
23
+ }
@@ -0,0 +1,31 @@
1
+ import { type PlaceholderMap } from './placeholder';
2
+ /**
3
+ * Compile a single .stx template file.
4
+ *
5
+ * Runs the full processDirectives pipeline in build mode ('compile'),
6
+ * producing pre-rendered HTML with placeholder tokens for dynamic content.
7
+ *
8
+ * @param filePath - Absolute path to the .stx file
9
+ * @param route - The URL route this page serves (e.g. '/jobs')
10
+ * @param options - Additional compilation options
11
+ */
12
+ export declare function compileTemplate(filePath: string, route: string, options?: {
13
+ componentsDir?: string
14
+ partialsDir?: string
15
+ layoutsDir?: string
16
+ debug?: boolean
17
+ }): Promise<CompiledTemplate>;
18
+ /**
19
+ * A pre-compiled template ready for serve-time hydration.
20
+ */
21
+ export declare interface CompiledTemplate {
22
+ route: string
23
+ sourceFile: string
24
+ html: string
25
+ fragment: string
26
+ placeholders: PlaceholderMap
27
+ hasServerScripts: boolean
28
+ serverScriptContent: string[]
29
+ dependencies: string[]
30
+ contentHash: string
31
+ }
@@ -0,0 +1,18 @@
1
+ import type { CompiledTemplate } from './template-compiler';
2
+ /**
3
+ * Hydrate a pre-compiled template with request-time data.
4
+ *
5
+ * This is the serve-time counterpart to compileTemplate(). It takes a
6
+ * compiled template (with placeholder tokens) and a request context,
7
+ * executes server scripts, evaluates expressions, and returns final HTML.
8
+ *
9
+ * @param compiled - The pre-compiled template from build time
10
+ * @param requestContext - Request-time context (route params, session, etc.)
11
+ * @returns Final HTML ready to send to the browser
12
+ */
13
+ export declare function hydrateTemplate(compiled: CompiledTemplate, requestContext?: Record<string, any>): Promise<string>;
14
+ /**
15
+ * Hydrate a fragment (for SPA navigation).
16
+ * Same as hydrateTemplate but returns the fragment portion.
17
+ */
18
+ export declare function hydrateFragment(compiled: CompiledTemplate, requestContext?: Record<string, any>): Promise<string>;
@@ -31,6 +31,7 @@ export declare function generateTransitionRuntime(): string;
31
31
  * <div @transition.slide-up.300="isOpen">Content</div>
32
32
  */
33
33
  export declare function processTransitionAttributes(template: string): string;
34
+ /* eslint-disable prefer-const, style/max-statements-per-line, no-super-linear-backtracking, regexp/no-unused-capturing-group */
34
35
  /**
35
36
  * STX Transitions
36
37
  *