@craft-ts/component 0.7.0-beta.13

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 (190) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +36 -0
  3. package/src/index.d.ts +40 -0
  4. package/src/index.d.ts.map +1 -0
  5. package/src/index.js +38 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/a11y-control.d.ts +58 -0
  8. package/src/lib/a11y-control.d.ts.map +1 -0
  9. package/src/lib/a11y-control.js +74 -0
  10. package/src/lib/a11y-control.js.map +1 -0
  11. package/src/lib/a11y.d.ts +87 -0
  12. package/src/lib/a11y.d.ts.map +1 -0
  13. package/src/lib/a11y.js +96 -0
  14. package/src/lib/a11y.js.map +1 -0
  15. package/src/lib/ai/ai-context-menu.d.ts +140 -0
  16. package/src/lib/ai/ai-context-menu.d.ts.map +1 -0
  17. package/src/lib/ai/ai-context-menu.js +66 -0
  18. package/src/lib/ai/ai-context-menu.js.map +1 -0
  19. package/src/lib/ai/ai-send-dialog.d.ts +1263 -0
  20. package/src/lib/ai/ai-send-dialog.d.ts.map +1 -0
  21. package/src/lib/ai/ai-send-dialog.js +288 -0
  22. package/src/lib/ai/ai-send-dialog.js.map +1 -0
  23. package/src/lib/ai/send-context-to-ai.d.ts +29 -0
  24. package/src/lib/ai/send-context-to-ai.d.ts.map +1 -0
  25. package/src/lib/ai/send-context-to-ai.js +127 -0
  26. package/src/lib/ai/send-context-to-ai.js.map +1 -0
  27. package/src/lib/assert-defined-input.d.ts +26 -0
  28. package/src/lib/assert-defined-input.d.ts.map +1 -0
  29. package/src/lib/assert-defined-input.js +47 -0
  30. package/src/lib/assert-defined-input.js.map +1 -0
  31. package/src/lib/block.d.ts +36 -0
  32. package/src/lib/block.d.ts.map +1 -0
  33. package/src/lib/block.js +55 -0
  34. package/src/lib/block.js.map +1 -0
  35. package/src/lib/bootstrap.d.ts +32 -0
  36. package/src/lib/bootstrap.d.ts.map +1 -0
  37. package/src/lib/bootstrap.js +60 -0
  38. package/src/lib/bootstrap.js.map +1 -0
  39. package/src/lib/bridge.d.ts +56 -0
  40. package/src/lib/bridge.d.ts.map +1 -0
  41. package/src/lib/bridge.js +81 -0
  42. package/src/lib/bridge.js.map +1 -0
  43. package/src/lib/component.d.ts +46 -0
  44. package/src/lib/component.d.ts.map +1 -0
  45. package/src/lib/component.js +118 -0
  46. package/src/lib/component.js.map +1 -0
  47. package/src/lib/composition.d.ts +17 -0
  48. package/src/lib/composition.d.ts.map +1 -0
  49. package/src/lib/composition.js +28 -0
  50. package/src/lib/composition.js.map +1 -0
  51. package/src/lib/craft-defaults.d.ts +2 -0
  52. package/src/lib/craft-defaults.d.ts.map +1 -0
  53. package/src/lib/craft-defaults.js +41 -0
  54. package/src/lib/craft-defaults.js.map +1 -0
  55. package/src/lib/craft-host-tokens.d.ts +6 -0
  56. package/src/lib/craft-host-tokens.d.ts.map +1 -0
  57. package/src/lib/craft-host-tokens.js +7 -0
  58. package/src/lib/craft-host-tokens.js.map +1 -0
  59. package/src/lib/craft-router-outlet.d.ts +15 -0
  60. package/src/lib/craft-router-outlet.d.ts.map +1 -0
  61. package/src/lib/craft-router-outlet.js +10 -0
  62. package/src/lib/craft-router-outlet.js.map +1 -0
  63. package/src/lib/css-vars.d.ts +31 -0
  64. package/src/lib/css-vars.d.ts.map +1 -0
  65. package/src/lib/css-vars.js +43 -0
  66. package/src/lib/css-vars.js.map +1 -0
  67. package/src/lib/css-vars.type.d.ts +151 -0
  68. package/src/lib/css-vars.type.d.ts.map +1 -0
  69. package/src/lib/css-vars.type.js +1 -0
  70. package/src/lib/css-vars.type.js.map +1 -0
  71. package/src/lib/defer.d.ts +31 -0
  72. package/src/lib/defer.d.ts.map +1 -0
  73. package/src/lib/defer.js +19 -0
  74. package/src/lib/defer.js.map +1 -0
  75. package/src/lib/directive.d.ts +9 -0
  76. package/src/lib/directive.d.ts.map +1 -0
  77. package/src/lib/directive.js +31 -0
  78. package/src/lib/directive.js.map +1 -0
  79. package/src/lib/each-scheduling.d.ts +59 -0
  80. package/src/lib/each-scheduling.d.ts.map +1 -0
  81. package/src/lib/each-scheduling.js +120 -0
  82. package/src/lib/each-scheduling.js.map +1 -0
  83. package/src/lib/each.d.ts +29 -0
  84. package/src/lib/each.d.ts.map +1 -0
  85. package/src/lib/each.js +23 -0
  86. package/src/lib/each.js.map +1 -0
  87. package/src/lib/factory-runtime.d.ts +5 -0
  88. package/src/lib/factory-runtime.d.ts.map +1 -0
  89. package/src/lib/factory-runtime.js +26 -0
  90. package/src/lib/factory-runtime.js.map +1 -0
  91. package/src/lib/field-exception-block.d.ts +96 -0
  92. package/src/lib/field-exception-block.d.ts.map +1 -0
  93. package/src/lib/field-exception-block.js +44 -0
  94. package/src/lib/field-exception-block.js.map +1 -0
  95. package/src/lib/host-runtime.d.ts +60 -0
  96. package/src/lib/host-runtime.d.ts.map +1 -0
  97. package/src/lib/host-runtime.js +16 -0
  98. package/src/lib/host-runtime.js.map +1 -0
  99. package/src/lib/hydrate.d.ts +15 -0
  100. package/src/lib/hydrate.d.ts.map +1 -0
  101. package/src/lib/hydrate.js +79 -0
  102. package/src/lib/hydrate.js.map +1 -0
  103. package/src/lib/hyperscript.d.ts +148 -0
  104. package/src/lib/hyperscript.d.ts.map +1 -0
  105. package/src/lib/hyperscript.js +96 -0
  106. package/src/lib/hyperscript.js.map +1 -0
  107. package/src/lib/if-block.d.ts +8 -0
  108. package/src/lib/if-block.d.ts.map +1 -0
  109. package/src/lib/if-block.js +16 -0
  110. package/src/lib/if-block.js.map +1 -0
  111. package/src/lib/locator.d.ts +170 -0
  112. package/src/lib/locator.d.ts.map +1 -0
  113. package/src/lib/locator.js +151 -0
  114. package/src/lib/locator.js.map +1 -0
  115. package/src/lib/match-block.d.ts +38 -0
  116. package/src/lib/match-block.d.ts.map +1 -0
  117. package/src/lib/match-block.js +29 -0
  118. package/src/lib/match-block.js.map +1 -0
  119. package/src/lib/pending-block.d.ts +125 -0
  120. package/src/lib/pending-block.d.ts.map +1 -0
  121. package/src/lib/pending-block.js +48 -0
  122. package/src/lib/pending-block.js.map +1 -0
  123. package/src/lib/project.d.ts +19 -0
  124. package/src/lib/project.d.ts.map +1 -0
  125. package/src/lib/project.js +56 -0
  126. package/src/lib/project.js.map +1 -0
  127. package/src/lib/render/hydration-metadata.d.ts +3 -0
  128. package/src/lib/render/hydration-metadata.d.ts.map +1 -0
  129. package/src/lib/render/hydration-metadata.js +8 -0
  130. package/src/lib/render/hydration-metadata.js.map +1 -0
  131. package/src/lib/render/hydration.d.ts +24 -0
  132. package/src/lib/render/hydration.d.ts.map +1 -0
  133. package/src/lib/render/hydration.js +181 -0
  134. package/src/lib/render/hydration.js.map +1 -0
  135. package/src/lib/render/interpreter.d.ts +32 -0
  136. package/src/lib/render/interpreter.d.ts.map +1 -0
  137. package/src/lib/render/interpreter.js +3588 -0
  138. package/src/lib/render/interpreter.js.map +1 -0
  139. package/src/lib/render/server-style-collector.d.ts +6 -0
  140. package/src/lib/render/server-style-collector.d.ts.map +1 -0
  141. package/src/lib/render/server-style-collector.js +23 -0
  142. package/src/lib/render/server-style-collector.js.map +1 -0
  143. package/src/lib/render/ssr-coordinator.d.ts +20 -0
  144. package/src/lib/render/ssr-coordinator.d.ts.map +1 -0
  145. package/src/lib/render/ssr-coordinator.js +99 -0
  146. package/src/lib/render/ssr-coordinator.js.map +1 -0
  147. package/src/lib/render/string-dom.d.ts +9 -0
  148. package/src/lib/render/string-dom.d.ts.map +1 -0
  149. package/src/lib/render/string-dom.js +377 -0
  150. package/src/lib/render/string-dom.js.map +1 -0
  151. package/src/lib/render/style-registry.d.ts +14 -0
  152. package/src/lib/render/style-registry.d.ts.map +1 -0
  153. package/src/lib/render/style-registry.js +79 -0
  154. package/src/lib/render/style-registry.js.map +1 -0
  155. package/src/lib/render/style-scope.d.ts +30 -0
  156. package/src/lib/render/style-scope.d.ts.map +1 -0
  157. package/src/lib/render/style-scope.js +261 -0
  158. package/src/lib/render/style-scope.js.map +1 -0
  159. package/src/lib/render/vnode.d.ts +330 -0
  160. package/src/lib/render/vnode.d.ts.map +1 -0
  161. package/src/lib/render/vnode.js +293 -0
  162. package/src/lib/render/vnode.js.map +1 -0
  163. package/src/lib/server-render.d.ts +34 -0
  164. package/src/lib/server-render.d.ts.map +1 -0
  165. package/src/lib/server-render.js +84 -0
  166. package/src/lib/server-render.js.map +1 -0
  167. package/src/lib/start.d.ts +13 -0
  168. package/src/lib/start.d.ts.map +1 -0
  169. package/src/lib/start.js +20 -0
  170. package/src/lib/start.js.map +1 -0
  171. package/src/lib/template-contract.d.ts +347 -0
  172. package/src/lib/template-contract.d.ts.map +1 -0
  173. package/src/lib/template-contract.js +1 -0
  174. package/src/lib/template-contract.js.map +1 -0
  175. package/src/lib/template.d.ts +11 -0
  176. package/src/lib/template.d.ts.map +1 -0
  177. package/src/lib/template.js +21 -0
  178. package/src/lib/template.js.map +1 -0
  179. package/src/lib/testing.d.ts +157 -0
  180. package/src/lib/testing.d.ts.map +1 -0
  181. package/src/lib/testing.js +416 -0
  182. package/src/lib/testing.js.map +1 -0
  183. package/src/lib/types.d.ts +442 -0
  184. package/src/lib/types.d.ts.map +1 -0
  185. package/src/lib/types.js +22 -0
  186. package/src/lib/types.js.map +1 -0
  187. package/testing/public-api.d.ts +3 -0
  188. package/testing/public-api.d.ts.map +1 -0
  189. package/testing/public-api.js +3 -0
  190. package/testing/public-api.js.map +1 -0
@@ -0,0 +1,125 @@
1
+ import { type CraftDirective } from './types';
2
+ import type { CraftNodeChildren } from './render/vnode';
3
+ import type { SsrMode } from '@craft-ts/core';
4
+ export declare const PENDING_BLOCK_DIRECTIVE: unique symbol;
5
+ /**
6
+ * Where the fallback is inserted relative to the suspended subtree. The subtree
7
+ * itself is kept mounted but **detached from the document** while it is
8
+ * pending (its nodes live in a DocumentFragment — they are not `hidden` via
9
+ * CSS), so its state survives the wait. Assistive tech is told via
10
+ * `aria-busy` / `aria-live` on the fallback, not via the detached source.
11
+ */
12
+ export type PendingBlockPosition = 'before' | 'after';
13
+ export type PendingFallback = () => CraftNodeChildren;
14
+ /**
15
+ * What to render for one source. A bare function covers the suspended case; the
16
+ * object form adds `reloading`, rendered **next to the still-visible subtree**
17
+ * when the source already has a value and is refetching.
18
+ */
19
+ export type PendingBlockHandler = PendingFallback | {
20
+ readonly pending: PendingFallback;
21
+ readonly reloading?: PendingFallback;
22
+ };
23
+ /** One handler per async source name, for the `.exhaustive` form. */
24
+ export type PendingBlockHandlers = Readonly<Record<string, PendingBlockHandler>>;
25
+ type HandlerChildrenOf<Handler> = Handler extends () => infer Children ? Children : Handler extends {
26
+ readonly pending: () => infer Pending;
27
+ readonly reloading?: () => infer Reloading;
28
+ } ? Pending | Reloading : never;
29
+ export type PendingBlockHandlerChildren<Handler> = HandlerChildrenOf<Handler>;
30
+ /** Resolves the children a handler renders for one of its two states. */
31
+ export declare function resolvePendingBlockHandler(handler: PendingBlockHandler, state: 'pending' | 'reloading'): CraftNodeChildren;
32
+ /**
33
+ * Thrown when a `CraftNotSettled` escapes every `pendingBlock` boundary — the
34
+ * runtime counterpart of the compile-time check, for the cases the types cannot
35
+ * see (a settled read hidden inside a lambda, a dynamically built subtree).
36
+ */
37
+ export declare class CraftUnhandledPendingError extends Error {
38
+ readonly source: string;
39
+ constructor(source: string);
40
+ }
41
+ export type PendingBlockDirective<Handlers extends PendingBlockHandlers | undefined = undefined, FallbackChildren extends CraftNodeChildren = CraftNodeChildren> = CraftDirective & {
42
+ readonly [PENDING_BLOCK_DIRECTIVE]: {
43
+ /** `undefined` for the catch-all form: every source below is covered. */
44
+ readonly handlers: Handlers;
45
+ readonly fallback: PendingFallback | undefined;
46
+ readonly reloading: PendingFallback | undefined;
47
+ readonly position: PendingBlockPosition;
48
+ readonly ssr: SsrMode | undefined;
49
+ /** Phantom carrier — the fallback's own nodes, never read at runtime. */
50
+ readonly fallbackChildren?: FallbackChildren;
51
+ };
52
+ };
53
+ /**
54
+ * The sources a `pendingBlock` leaves uncovered. The catch-all form covers
55
+ * everything below it; the `.exhaustive` form covers only the sources it names.
56
+ */
57
+ export type PendingBlockResidualSources<Sources extends string, Handlers extends PendingBlockHandlers | undefined> = Handlers extends PendingBlockHandlers ? Exclude<Sources, Extract<keyof Handlers, string>> : never;
58
+ /** Exhaustiveness check for `pendingBlock.exhaustive({...})`. */
59
+ export type PendingBlockExhaustiveCheck<Sources extends string, Handlers extends PendingBlockHandlers> = [Exclude<Sources, Extract<keyof Handlers, string>>] extends [never] ? [Exclude<Extract<keyof Handlers, string>, Sources>] extends [never] ? unknown : {
60
+ 'pendingBlock.exhaustive has fallbacks for sources that never suspend here': Exclude<Extract<keyof Handlers, string>, Sources>;
61
+ } : {
62
+ 'pendingBlock.exhaustive is missing a fallback for async sources': Exclude<Sources, Extract<keyof Handlers, string>>;
63
+ };
64
+ type PendingBlockBaseOptions<Fallback extends PendingFallback = PendingFallback> = Readonly<{
65
+ /**
66
+ * Rendered next to the still-visible subtree while a source that already has
67
+ * a value is refetching. A refetch does not suspend — the stale value stays
68
+ * on screen — so this is how the boundary reports it.
69
+ */
70
+ readonly reloading?: Fallback;
71
+ /** Where the fallback goes relative to the (hidden) subtree. Defaults to `'before'`. */
72
+ readonly position?: PendingBlockPosition;
73
+ }>;
74
+ /**
75
+ * A client-only SSR boundary must name the shell that replaces the skipped
76
+ * subtree. Other modes may omit it when an exhaustive handler or an outer
77
+ * boundary owns the pending UI.
78
+ */
79
+ export type PendingBlockOptions<Fallback extends PendingFallback = PendingFallback> = PendingBlockBaseOptions<Fallback> & (Readonly<{
80
+ readonly ssr: 'client';
81
+ readonly fallback: Fallback;
82
+ }> | Readonly<{
83
+ readonly ssr?: Exclude<SsrMode, 'client'>;
84
+ /** Rendered while the subtree has an async source with no value yet. */
85
+ readonly fallback?: Fallback;
86
+ }>);
87
+ interface PendingBlockFactory {
88
+ /**
89
+ * A boundary that renders `fallback` while **any** async source read below it
90
+ * has no value yet — the template equivalent of Solid's `Suspense`.
91
+ *
92
+ * ```ts
93
+ * div([span(users.settledValue)]).pipe(
94
+ * pendingBlock({ fallback: () => span('Chargement…') }),
95
+ * )
96
+ * ```
97
+ *
98
+ * The suspended subtree stays mounted (detached from the document, not
99
+ * CSS-hidden) so nothing below it is torn down and rebuilt when the data
100
+ * arrives. The fallback is announced with `aria-live="polite"`.
101
+ */
102
+ <Fallback extends PendingFallback>(options?: PendingBlockOptions<Fallback>): PendingBlockDirective<undefined, ReturnType<Fallback> extends CraftNodeChildren ? ReturnType<Fallback> : CraftNodeChildren>;
103
+ /**
104
+ * A boundary with one fallback per async source, checked exhaustively against
105
+ * the sources actually read below it — an unlisted source is a compile error,
106
+ * and so is a fallback for a source that never suspends here.
107
+ *
108
+ * ```ts
109
+ * div([...]).pipe(
110
+ * pendingBlock.exhaustive({
111
+ * users: () => SkeletonList(),
112
+ * orders: () => SkeletonRows(),
113
+ * }),
114
+ * )
115
+ * ```
116
+ *
117
+ * When several listed sources are pending at once, the fallback of the first
118
+ * one to suspend is rendered.
119
+ */
120
+ exhaustive<const Handlers extends PendingBlockHandlers>(handlers: Handlers, options?: Omit<PendingBlockOptions, 'fallback' | 'reloading'>): PendingBlockDirective<Handlers, PendingBlockHandlerChildren<Handlers[keyof Handlers]> extends CraftNodeChildren ? PendingBlockHandlerChildren<Handlers[keyof Handlers]> : CraftNodeChildren>;
121
+ }
122
+ export declare const pendingBlock: PendingBlockFactory;
123
+ export declare function isPendingBlockDirective(value: unknown): value is PendingBlockDirective<PendingBlockHandlers | undefined>;
124
+ export {};
125
+ //# sourceMappingURL=pending-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-block.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/pending-block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { CRAFT_DIRECTIVE } from './types';
2
+ export const PENDING_BLOCK_DIRECTIVE = Symbol('craft-pending-block-directive');
3
+ /** Resolves the children a handler renders for one of its two states. */
4
+ export function resolvePendingBlockHandler(handler, state) {
5
+ if (typeof handler === 'function') {
6
+ return state === 'pending' ? handler() : [];
7
+ }
8
+ return state === 'pending'
9
+ ? handler.pending()
10
+ : (handler.reloading?.() ?? []);
11
+ }
12
+ /**
13
+ * Thrown when a `CraftNotSettled` escapes every `pendingBlock` boundary — the
14
+ * runtime counterpart of the compile-time check, for the cases the types cannot
15
+ * see (a settled read hidden inside a lambda, a dynamically built subtree).
16
+ */
17
+ export class CraftUnhandledPendingError extends Error {
18
+ source;
19
+ constructor(source) {
20
+ super(`Craft async source "${source}" suspended outside of any pendingBlock(...) boundary.`);
21
+ this.name = 'CraftUnhandledPendingError';
22
+ this.source = source;
23
+ }
24
+ }
25
+ function createPendingBlockDirective(handlers, fallback, reloading, position, ssr) {
26
+ const directive = (() => undefined);
27
+ Object.defineProperty(directive, CRAFT_DIRECTIVE, {
28
+ value: {
29
+ name: handlers ? 'pendingBlock.exhaustive' : 'pendingBlock',
30
+ meta: {},
31
+ logic: (baseLogic) => baseLogic,
32
+ template: (baseTemplate) => baseTemplate,
33
+ },
34
+ enumerable: false,
35
+ });
36
+ Object.defineProperty(directive, PENDING_BLOCK_DIRECTIVE, {
37
+ value: { handlers, fallback, reloading, position, ssr },
38
+ enumerable: false,
39
+ });
40
+ return directive;
41
+ }
42
+ export const pendingBlock = Object.assign((options = {}) => createPendingBlockDirective(undefined, options.fallback, options.reloading, options.position ?? 'before', options.ssr), {
43
+ exhaustive: (handlers, options = {}) => createPendingBlockDirective(handlers, undefined, undefined, options.position ?? 'before', options.ssr),
44
+ });
45
+ export function isPendingBlockDirective(value) {
46
+ return (typeof value === 'function' && PENDING_BLOCK_DIRECTIVE in value);
47
+ }
48
+ //# sourceMappingURL=pending-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-block.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/pending-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAuB,MAAM,SAAS,CAAC;AAI/D,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC;AAyC/E,yEAAyE;AACzE,MAAM,UAAU,0BAA0B,CACxC,OAA4B,EAC5B,KAA8B;IAE9B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,KAAK,SAAS;QACxB,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE;QACnB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,MAAM,CAAS;IAExB,YAAY,MAAc;QACxB,KAAK,CACH,uBAAuB,MAAM,wDAAwD,CACtF,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAiDD,SAAS,2BAA2B,CAGlC,QAAkB,EAClB,QAAqC,EACrC,SAAsC,EACtC,QAA8B,EAC9B,GAAwB;IAExB,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,CACtB,SAAS,CAA+C,CAAC;IAE3D,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,eAAe,EAAE;QAChD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,cAAc;YAC3D,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,CAAC,SAAkC,EAAE,EAAE,CAAC,SAAS;YACxD,QAAQ,EAAE,CAAC,YAAmC,EAAE,EAAE,CAAC,YAAY;SAChE;QACD,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,uBAAuB,EAAE;QACxD,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE;QACvD,UAAU,EAAE,KAAK;KAClB,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAyFD,MAAM,CAAC,MAAM,YAAY,GAAwB,MAAM,CAAC,MAAM,CAC5D,CAAC,UAA+B,EAAE,EAAE,EAAE,CACpC,2BAA2B,CACzB,SAAS,EACT,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,QAAQ,IAAI,QAAQ,EAC5B,OAAO,CAAC,GAAG,CACZ,EACH;IACE,UAAU,EAAE,CACV,QAA8B,EAC9B,UAA+D,EAAE,EACjE,EAAE,CACF,2BAA2B,CACzB,QAAQ,EACR,SAAS,EACT,SAAS,EACT,OAAO,CAAC,QAAQ,IAAI,QAAQ,EAC5B,OAAO,CAAC,GAAG,CACZ;CACJ,CACqB,CAAC;AAEzB,MAAM,UAAU,uBAAuB,CACrC,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,UAAU,IAAI,uBAAuB,IAAK,KAAgB,CAC5E,CAAC;AACJ,CAAC","sourcesContent":["import { CRAFT_DIRECTIVE, type CraftDirective } from './types';\nimport type { CraftNodeChildren } from './render/vnode';\nimport type { SsrMode } from '@craft-ts/core';\n\nexport const PENDING_BLOCK_DIRECTIVE = Symbol('craft-pending-block-directive');\n\n/**\n * Where the fallback is inserted relative to the suspended subtree. The subtree\n * itself is kept mounted but **detached from the document** while it is\n * pending (its nodes live in a DocumentFragment — they are not `hidden` via\n * CSS), so its state survives the wait. Assistive tech is told via\n * `aria-busy` / `aria-live` on the fallback, not via the detached source.\n */\nexport type PendingBlockPosition = 'before' | 'after';\n\nexport type PendingFallback = () => CraftNodeChildren;\n\n/**\n * What to render for one source. A bare function covers the suspended case; the\n * object form adds `reloading`, rendered **next to the still-visible subtree**\n * when the source already has a value and is refetching.\n */\nexport type PendingBlockHandler =\n | PendingFallback\n | {\n readonly pending: PendingFallback;\n readonly reloading?: PendingFallback;\n };\n\n/** One handler per async source name, for the `.exhaustive` form. */\nexport type PendingBlockHandlers = Readonly<\n Record<string, PendingBlockHandler>\n>;\n\ntype HandlerChildrenOf<Handler> = Handler extends () => infer Children\n ? Children\n : Handler extends {\n readonly pending: () => infer Pending;\n readonly reloading?: () => infer Reloading;\n }\n ? Pending | Reloading\n : never;\n\nexport type PendingBlockHandlerChildren<Handler> = HandlerChildrenOf<Handler>;\n\n/** Resolves the children a handler renders for one of its two states. */\nexport function resolvePendingBlockHandler(\n handler: PendingBlockHandler,\n state: 'pending' | 'reloading',\n): CraftNodeChildren {\n if (typeof handler === 'function') {\n return state === 'pending' ? handler() : [];\n }\n\n return state === 'pending'\n ? handler.pending()\n : (handler.reloading?.() ?? []);\n}\n\n/**\n * Thrown when a `CraftNotSettled` escapes every `pendingBlock` boundary — the\n * runtime counterpart of the compile-time check, for the cases the types cannot\n * see (a settled read hidden inside a lambda, a dynamically built subtree).\n */\nexport class CraftUnhandledPendingError extends Error {\n readonly source: string;\n\n constructor(source: string) {\n super(\n `Craft async source \"${source}\" suspended outside of any pendingBlock(...) boundary.`,\n );\n this.name = 'CraftUnhandledPendingError';\n this.source = source;\n }\n}\n\nexport type PendingBlockDirective<\n Handlers extends PendingBlockHandlers | undefined = undefined,\n FallbackChildren extends CraftNodeChildren = CraftNodeChildren,\n> = CraftDirective & {\n readonly [PENDING_BLOCK_DIRECTIVE]: {\n /** `undefined` for the catch-all form: every source below is covered. */\n readonly handlers: Handlers;\n readonly fallback: PendingFallback | undefined;\n readonly reloading: PendingFallback | undefined;\n readonly position: PendingBlockPosition;\n readonly ssr: SsrMode | undefined;\n /** Phantom carrier — the fallback's own nodes, never read at runtime. */\n readonly fallbackChildren?: FallbackChildren;\n };\n};\n\n/**\n * The sources a `pendingBlock` leaves uncovered. The catch-all form covers\n * everything below it; the `.exhaustive` form covers only the sources it names.\n */\nexport type PendingBlockResidualSources<\n Sources extends string,\n Handlers extends PendingBlockHandlers | undefined,\n> = Handlers extends PendingBlockHandlers\n ? Exclude<Sources, Extract<keyof Handlers, string>>\n : never;\n\n/** Exhaustiveness check for `pendingBlock.exhaustive({...})`. */\nexport type PendingBlockExhaustiveCheck<\n Sources extends string,\n Handlers extends PendingBlockHandlers,\n> = [Exclude<Sources, Extract<keyof Handlers, string>>] extends [never]\n ? [Exclude<Extract<keyof Handlers, string>, Sources>] extends [never]\n ? unknown\n : {\n 'pendingBlock.exhaustive has fallbacks for sources that never suspend here': Exclude<\n Extract<keyof Handlers, string>,\n Sources\n >;\n }\n : {\n 'pendingBlock.exhaustive is missing a fallback for async sources': Exclude<\n Sources,\n Extract<keyof Handlers, string>\n >;\n };\n\nfunction createPendingBlockDirective<\n Handlers extends PendingBlockHandlers | undefined,\n>(\n handlers: Handlers,\n fallback: PendingFallback | undefined,\n reloading: PendingFallback | undefined,\n position: PendingBlockPosition,\n ssr: SsrMode | undefined,\n): PendingBlockDirective<Handlers> {\n const directive = (() =>\n undefined) as unknown as PendingBlockDirective<Handlers>;\n\n Object.defineProperty(directive, CRAFT_DIRECTIVE, {\n value: {\n name: handlers ? 'pendingBlock.exhaustive' : 'pendingBlock',\n meta: {},\n logic: (baseLogic: (...args: any[]) => any) => baseLogic,\n template: (baseTemplate: (context: any) => any) => baseTemplate,\n },\n enumerable: false,\n });\n Object.defineProperty(directive, PENDING_BLOCK_DIRECTIVE, {\n value: { handlers, fallback, reloading, position, ssr },\n enumerable: false,\n });\n\n return directive;\n}\n\ntype PendingBlockBaseOptions<\n Fallback extends PendingFallback = PendingFallback,\n> = Readonly<{\n /**\n * Rendered next to the still-visible subtree while a source that already has\n * a value is refetching. A refetch does not suspend — the stale value stays\n * on screen — so this is how the boundary reports it.\n */\n readonly reloading?: Fallback;\n /** Where the fallback goes relative to the (hidden) subtree. Defaults to `'before'`. */\n readonly position?: PendingBlockPosition;\n}>;\n\n/**\n * A client-only SSR boundary must name the shell that replaces the skipped\n * subtree. Other modes may omit it when an exhaustive handler or an outer\n * boundary owns the pending UI.\n */\nexport type PendingBlockOptions<\n Fallback extends PendingFallback = PendingFallback,\n> = PendingBlockBaseOptions<Fallback> &\n (\n | Readonly<{\n readonly ssr: 'client';\n readonly fallback: Fallback;\n }>\n | Readonly<{\n readonly ssr?: Exclude<SsrMode, 'client'>;\n /** Rendered while the subtree has an async source with no value yet. */\n readonly fallback?: Fallback;\n }>\n );\n\ninterface PendingBlockFactory {\n /**\n * A boundary that renders `fallback` while **any** async source read below it\n * has no value yet — the template equivalent of Solid's `Suspense`.\n *\n * ```ts\n * div([span(users.settledValue)]).pipe(\n * pendingBlock({ fallback: () => span('Chargement…') }),\n * )\n * ```\n *\n * The suspended subtree stays mounted (detached from the document, not\n * CSS-hidden) so nothing below it is torn down and rebuilt when the data\n * arrives. The fallback is announced with `aria-live=\"polite\"`.\n */\n <Fallback extends PendingFallback>(\n options?: PendingBlockOptions<Fallback>,\n ): PendingBlockDirective<\n undefined,\n ReturnType<Fallback> extends CraftNodeChildren\n ? ReturnType<Fallback>\n : CraftNodeChildren\n >;\n\n /**\n * A boundary with one fallback per async source, checked exhaustively against\n * the sources actually read below it — an unlisted source is a compile error,\n * and so is a fallback for a source that never suspends here.\n *\n * ```ts\n * div([...]).pipe(\n * pendingBlock.exhaustive({\n * users: () => SkeletonList(),\n * orders: () => SkeletonRows(),\n * }),\n * )\n * ```\n *\n * When several listed sources are pending at once, the fallback of the first\n * one to suspend is rendered.\n */\n exhaustive<const Handlers extends PendingBlockHandlers>(\n handlers: Handlers,\n options?: Omit<PendingBlockOptions, 'fallback' | 'reloading'>,\n ): PendingBlockDirective<\n Handlers,\n PendingBlockHandlerChildren<\n Handlers[keyof Handlers]\n > extends CraftNodeChildren\n ? PendingBlockHandlerChildren<Handlers[keyof Handlers]>\n : CraftNodeChildren\n >;\n}\n\nexport const pendingBlock: PendingBlockFactory = Object.assign(\n (options: PendingBlockOptions = {}) =>\n createPendingBlockDirective(\n undefined,\n options.fallback,\n options.reloading,\n options.position ?? 'before',\n options.ssr,\n ),\n {\n exhaustive: (\n handlers: PendingBlockHandlers,\n options: Omit<PendingBlockOptions, 'fallback' | 'reloading'> = {},\n ) =>\n createPendingBlockDirective(\n handlers,\n undefined,\n undefined,\n options.position ?? 'before',\n options.ssr,\n ),\n },\n) as PendingBlockFactory;\n\nexport function isPendingBlockDirective(\n value: unknown,\n): value is PendingBlockDirective<PendingBlockHandlers | undefined> {\n return (\n typeof value === 'function' && PENDING_BLOCK_DIRECTIVE in (value as object)\n );\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import type { CraftNodeChildren, CraftNodeChildrenDependencies, ProjectionNode } from './render/vnode';
2
+ import { CONTENT_DECLARATION_CONTEXT, CONTENT_OUTPUT, CONTENT_RENDERABLE, CONTENT_STYLE_POLICY, type ContentOptions, type InputValue, type ProjectionUnit, type RenderableContent } from './types';
3
+ type ContentOutput<Value> = Value extends (...args: any[]) => infer Output ? Output : never;
4
+ type RenderableContentOutput<Value> = ContentOutput<Value> extends CraftNodeChildren ? ContentOutput<Value> : CraftNodeChildren;
5
+ /** Brands deferred DOM content and records the caller's style opt-in. */
6
+ export declare function content<Output extends CraftNodeChildren, const Options extends ContentOptions | undefined = undefined>(renderer: () => Output, options?: Options): RenderableContent<Output> & {
7
+ readonly [CONTENT_RENDERABLE]: true;
8
+ readonly [CONTENT_DECLARATION_CONTEXT]: unknown;
9
+ readonly [CONTENT_STYLE_POLICY]: Options extends {
10
+ readonly allowContainerStyles: true;
11
+ } ? 'allow-container-styles' : 'isolated';
12
+ readonly [CONTENT_OUTPUT]: Output;
13
+ };
14
+ /** Renders either deferred DOM content or a component with a projection contract. */
15
+ export declare function renderContent<Value extends RenderableContent>(value: Value | InputValue<Value>): ProjectionNode<CraftNodeChildrenDependencies<RenderableContentOutput<Value>>, RenderableContentOutput<Value>>;
16
+ export declare function renderContent<Value extends ProjectionUnit<any>>(value: Value | InputValue<Value>): ProjectionNode<CraftNodeChildrenDependencies<Value>, Value>;
17
+ export declare function renderContent<SlotName extends string, Value extends RenderableContent>(slotName: SlotName, value: Value | InputValue<Value>): ProjectionNode<CraftNodeChildrenDependencies<RenderableContentOutput<Value>>, RenderableContentOutput<Value>>;
18
+ export {};
19
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../../../libs/component/src/lib/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,6BAA6B,EAC7B,cAAc,EACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,cAAc,EAEnB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAEjB,KAAK,aAAa,CAAC,KAAK,IAAI,KAAK,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,MAAM,GACtE,MAAM,GACN,KAAK,CAAC;AAEV,KAAK,uBAAuB,CAAC,KAAK,IAChC,aAAa,CAAC,KAAK,CAAC,SAAS,iBAAiB,GAC1C,aAAa,CAAC,KAAK,CAAC,GACpB,iBAAiB,CAAC;AAsBxB,yEAAyE;AACzE,wBAAgB,OAAO,CACrB,MAAM,SAAS,iBAAiB,EAChC,KAAK,CAAC,OAAO,SAAS,cAAc,GAAG,SAAS,GAAG,SAAS,EAE5D,QAAQ,EAAE,MAAM,MAAM,EACtB,OAAO,CAAC,EAAE,OAAO,GAChB,iBAAiB,CAAC,MAAM,CAAC,GAAG;IAC7B,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC;IACpC,QAAQ,CAAC,CAAC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAChD,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,OAAO,SAAS;QAC/C,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC;KACrC,GACG,wBAAwB,GACxB,UAAU,CAAC;IACf,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACnC,CAuBA;AAUD,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,SAAS,iBAAiB,EAC3D,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAC/B,cAAc,CACf,6BAA6B,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAC7D,uBAAuB,CAAC,KAAK,CAAC,CAC/B,CAAC;AACF,wBAAgB,aAAa,CAAC,KAAK,SAAS,cAAc,CAAC,GAAG,CAAC,EAC7D,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAC/B,cAAc,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/D,wBAAgB,aAAa,CAC3B,QAAQ,SAAS,MAAM,EACvB,KAAK,SAAS,iBAAiB,EAE/B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAC/B,cAAc,CACf,6BAA6B,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAC7D,uBAAuB,CAAC,KAAK,CAAC,CAC/B,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { isGeneratorFunction, isYieldableValue } from '@craft-ts/core';
2
+ import { currentCraftRenderContext } from './render/vnode';
3
+ import { CONTENT_DECLARATION_CONTEXT, CONTENT_OUTPUT, CONTENT_RENDERABLE, CONTENT_STYLE_POLICY, } from './types';
4
+ function contentStylePolicy(value) {
5
+ return value[CONTENT_STYLE_POLICY] === 'allow-container-styles'
6
+ ? 'allow-container-styles'
7
+ : 'isolated';
8
+ }
9
+ function defineContentPolicy(renderer, policy) {
10
+ Object.defineProperty(renderer, CONTENT_STYLE_POLICY, {
11
+ value: policy,
12
+ enumerable: false,
13
+ configurable: false,
14
+ writable: false,
15
+ });
16
+ }
17
+ /** Brands deferred DOM content and records the caller's style opt-in. */
18
+ export function content(renderer, options) {
19
+ defineContentPolicy(renderer, options?.allowContainerStyles === true
20
+ ? 'allow-container-styles'
21
+ : 'isolated');
22
+ Object.defineProperty(renderer, CONTENT_DECLARATION_CONTEXT, {
23
+ value: currentCraftRenderContext(),
24
+ enumerable: false,
25
+ configurable: false,
26
+ writable: false,
27
+ });
28
+ return renderer;
29
+ }
30
+ function isComponentUnit(value) {
31
+ return (typeof value === 'object' &&
32
+ value !== null &&
33
+ value.kind === 'component');
34
+ }
35
+ export function renderContent(slotNameOrValue, maybeValue) {
36
+ const named = typeof slotNameOrValue === 'string';
37
+ const slotName = named ? slotNameOrValue : undefined;
38
+ const value = (named ? maybeValue : slotNameOrValue);
39
+ const isYieldableReader = isGeneratorFunction(value) || isYieldableValue(value);
40
+ const declarationContext = isComponentUnit(value)
41
+ ? (value.declarationContext ?? currentCraftRenderContext())
42
+ : typeof value === 'function' && !isYieldableReader
43
+ ? (value[CONTENT_DECLARATION_CONTEXT] ?? currentCraftRenderContext())
44
+ : currentCraftRenderContext();
45
+ const policy = typeof value === 'function' && !isYieldableReader
46
+ ? contentStylePolicy(value)
47
+ : 'isolated';
48
+ return {
49
+ kind: 'projection',
50
+ render: () => (isComponentUnit(value) || isYieldableReader ? value : value()),
51
+ ...(slotName ? { slotName } : {}),
52
+ stylePolicy: policy,
53
+ declarationContext,
54
+ };
55
+ }
56
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../libs/component/src/lib/project.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GAMrB,MAAM,SAAS,CAAC;AAWjB,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAQ,KAA+D,CACrE,oBAAoB,CACrB,KAAK,wBAAwB;QAC5B,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAqC,EACrC,MAA0B;IAE1B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,oBAAoB,EAAE;QACpD,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,OAAO,CAIrB,QAAsB,EACtB,OAAiB;IAWjB,mBAAmB,CACjB,QAAQ,EACR,OAAO,EAAE,oBAAoB,KAAK,IAAI;QACpC,CAAC,CAAC,wBAAwB;QAC1B,CAAC,CAAC,UAAU,CACf,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,2BAA2B,EAAE;QAC3D,KAAK,EAAE,yBAAyB,EAAE;QAClC,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,KAAK;QACnB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IACH,OAAO,QASN,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAqC,CAAC,IAAI,KAAK,WAAW,CAC5D,CAAC;AACJ,CAAC;AAsBD,MAAM,UAAU,aAAa,CAC3B,eAIkD,EAClD,UAGkD;IAElD,MAAM,KAAK,GAAG,OAAO,eAAe,KAAK,QAAQ,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAGD,CAAC;IACnD,MAAM,iBAAiB,GACrB,mBAAmB,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,kBAAkB,GAAG,eAAe,CAAC,KAAK,CAAC;QAC/C,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,EAAE,CAAC;QAC3D,CAAC,CAAC,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,iBAAiB;YACjD,CAAC,CAAC,CACE,KACD,CAAC,2BAA2B,CAAC,IAAI,yBAAyB,EAAE,CAAC;YAChE,CAAC,CAAC,yBAAyB,EAAE,CAAC;IAClC,MAAM,MAAM,GACV,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,iBAAiB;QAC/C,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAC3B,CAAC,CAAC,UAAU,CAAC;IAEjB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,GAAG,EAAE,CACX,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAEzC;QACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,WAAW,EAAE,MAAM;QACnB,kBAAkB;KACnB,CAAC;AACJ,CAAC","sourcesContent":["import type {\n CraftNodeChildren,\n CraftNodeChildrenDependencies,\n ProjectionNode,\n} from './render/vnode';\nimport { isGeneratorFunction, isYieldableValue } from '@craft-ts/core';\nimport { currentCraftRenderContext } from './render/vnode';\nimport {\n CONTENT_DECLARATION_CONTEXT,\n CONTENT_OUTPUT,\n CONTENT_RENDERABLE,\n CONTENT_STYLE_POLICY,\n type ContentOptions,\n type ContentStylePolicy,\n type InputValue,\n type ProjectionUnit,\n type RenderableContent,\n} from './types';\n\ntype ContentOutput<Value> = Value extends (...args: any[]) => infer Output\n ? Output\n : never;\n\ntype RenderableContentOutput<Value> =\n ContentOutput<Value> extends CraftNodeChildren\n ? ContentOutput<Value>\n : CraftNodeChildren;\n\nfunction contentStylePolicy(value: unknown): ContentStylePolicy {\n return (value as Partial<Record<typeof CONTENT_STYLE_POLICY, unknown>>)[\n CONTENT_STYLE_POLICY\n ] === 'allow-container-styles'\n ? 'allow-container-styles'\n : 'isolated';\n}\n\nfunction defineContentPolicy(\n renderer: (...args: any[]) => unknown,\n policy: ContentStylePolicy,\n): void {\n Object.defineProperty(renderer, CONTENT_STYLE_POLICY, {\n value: policy,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n}\n\n/** Brands deferred DOM content and records the caller's style opt-in. */\nexport function content<\n Output extends CraftNodeChildren,\n const Options extends ContentOptions | undefined = undefined,\n>(\n renderer: () => Output,\n options?: Options,\n): RenderableContent<Output> & {\n readonly [CONTENT_RENDERABLE]: true;\n readonly [CONTENT_DECLARATION_CONTEXT]: unknown;\n readonly [CONTENT_STYLE_POLICY]: Options extends {\n readonly allowContainerStyles: true;\n }\n ? 'allow-container-styles'\n : 'isolated';\n readonly [CONTENT_OUTPUT]: Output;\n} {\n defineContentPolicy(\n renderer,\n options?.allowContainerStyles === true\n ? 'allow-container-styles'\n : 'isolated',\n );\n Object.defineProperty(renderer, CONTENT_DECLARATION_CONTEXT, {\n value: currentCraftRenderContext(),\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return renderer as RenderableContent<Output> & {\n readonly [CONTENT_RENDERABLE]: true;\n readonly [CONTENT_DECLARATION_CONTEXT]: unknown;\n readonly [CONTENT_STYLE_POLICY]: Options extends {\n readonly allowContainerStyles: true;\n }\n ? 'allow-container-styles'\n : 'isolated';\n readonly [CONTENT_OUTPUT]: Output;\n };\n}\n\nfunction isComponentUnit(value: unknown): value is ProjectionUnit {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { readonly kind?: unknown }).kind === 'component'\n );\n}\n\n/** Renders either deferred DOM content or a component with a projection contract. */\nexport function renderContent<Value extends RenderableContent>(\n value: Value | InputValue<Value>,\n): ProjectionNode<\n CraftNodeChildrenDependencies<RenderableContentOutput<Value>>,\n RenderableContentOutput<Value>\n>;\nexport function renderContent<Value extends ProjectionUnit<any>>(\n value: Value | InputValue<Value>,\n): ProjectionNode<CraftNodeChildrenDependencies<Value>, Value>;\nexport function renderContent<\n SlotName extends string,\n Value extends RenderableContent,\n>(\n slotName: SlotName,\n value: Value | InputValue<Value>,\n): ProjectionNode<\n CraftNodeChildrenDependencies<RenderableContentOutput<Value>>,\n RenderableContentOutput<Value>\n>;\nexport function renderContent(\n slotNameOrValue:\n | string\n | RenderableContent\n | ProjectionUnit\n | InputValue<RenderableContent | ProjectionUnit>,\n maybeValue?:\n | RenderableContent\n | ProjectionUnit\n | InputValue<RenderableContent | ProjectionUnit>,\n): ProjectionNode {\n const named = typeof slotNameOrValue === 'string';\n const slotName = named ? slotNameOrValue : undefined;\n const value = (named ? maybeValue : slotNameOrValue) as\n | RenderableContent\n | ProjectionUnit\n | InputValue<RenderableContent | ProjectionUnit>;\n const isYieldableReader =\n isGeneratorFunction(value) || isYieldableValue(value);\n const declarationContext = isComponentUnit(value)\n ? (value.declarationContext ?? currentCraftRenderContext())\n : typeof value === 'function' && !isYieldableReader\n ? ((\n value as Partial<Record<typeof CONTENT_DECLARATION_CONTEXT, unknown>>\n )[CONTENT_DECLARATION_CONTEXT] ?? currentCraftRenderContext())\n : currentCraftRenderContext();\n const policy =\n typeof value === 'function' && !isYieldableReader\n ? contentStylePolicy(value)\n : 'isolated';\n\n return {\n kind: 'projection',\n render: () =>\n (isComponentUnit(value) || isYieldableReader ? value : value()) as\n | ProjectionUnit\n | CraftNodeChildren,\n ...(slotName ? { slotName } : {}),\n stylePolicy: policy,\n declarationContext,\n };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function setNodeHydrationKey(node: object, key: string): void;
2
+ export declare function hydrationKeyOf(node: object): string | undefined;
3
+ //# sourceMappingURL=hydration-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration-metadata.d.ts","sourceRoot":"","sources":["../../../../../../libs/component/src/lib/render/hydration-metadata.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAEnE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/D"}
@@ -0,0 +1,8 @@
1
+ const hydrationKeys = new WeakMap();
2
+ export function setNodeHydrationKey(node, key) {
3
+ hydrationKeys.set(node, key);
4
+ }
5
+ export function hydrationKeyOf(node) {
6
+ return hydrationKeys.get(node);
7
+ }
8
+ //# sourceMappingURL=hydration-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration-metadata.js","sourceRoot":"","sources":["../../../../../../libs/component/src/lib/render/hydration-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,GAAW;IAC3D,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC","sourcesContent":["const hydrationKeys = new WeakMap<object, string>();\n\nexport function setNodeHydrationKey(node: object, key: string): void {\n hydrationKeys.set(node, key);\n}\n\nexport function hydrationKeyOf(node: object): string | undefined {\n return hydrationKeys.get(node);\n}\n"]}
@@ -0,0 +1,24 @@
1
+ export type HydrationMismatchReason = 'element-absent' | 'tag-mismatch' | 'text-absent' | 'text-mismatch' | 'boundary-absent';
2
+ export declare class HydrationMismatchError extends Error {
3
+ readonly key: string;
4
+ readonly expected: string;
5
+ readonly actual: string | null;
6
+ readonly reason: HydrationMismatchReason;
7
+ readonly actualNode: Node | null;
8
+ constructor(options: Readonly<{
9
+ key: string;
10
+ expected: string;
11
+ actual: string | null;
12
+ reason: HydrationMismatchReason;
13
+ actualNode?: Node | null;
14
+ }>);
15
+ }
16
+ export type HydrationCursor = Readonly<{
17
+ claimElement(key: string, tag: string): Element;
18
+ claimText(key: string, expected?: string): Text;
19
+ claimBoundary(key: string, label: string): Comment;
20
+ recordMismatch(error: HydrationMismatchError): void;
21
+ finish(): void;
22
+ }>;
23
+ export declare function createHydrationCursor(host: Element, onMismatch?: (error: HydrationMismatchError) => void): HydrationCursor;
24
+ //# sourceMappingURL=hydration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration.d.ts","sourceRoot":"","sources":["../../../../../../libs/component/src/lib/render/hydration.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAC/B,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,eAAe,GACf,iBAAiB,CAAC;AAEtB,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;gBAG/B,OAAO,EAAE,QAAQ,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,EAAE,uBAAuB,CAAC;QAChC,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;KAC1B,CAAC;CAYL;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACnD,cAAc,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACpD,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC,CAAC;AAQH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,EACb,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GACnD,eAAe,CAoIjB"}
@@ -0,0 +1,181 @@
1
+ export class HydrationMismatchError extends Error {
2
+ key;
3
+ expected;
4
+ actual;
5
+ reason;
6
+ actualNode;
7
+ constructor(options) {
8
+ super(`Craft hydration mismatch at "${options.key}": expected ${options.expected}, received ${options.actual ?? 'nothing'} (${options.reason}).`);
9
+ this.name = 'HydrationMismatchError';
10
+ this.key = options.key;
11
+ this.expected = options.expected;
12
+ this.actual = options.actual;
13
+ this.reason = options.reason;
14
+ this.actualNode = options.actualNode ?? null;
15
+ }
16
+ }
17
+ export function createHydrationCursor(host, onMismatch) {
18
+ const elements = new Map();
19
+ const boundaries = new Map();
20
+ const text = new Map();
21
+ const claimed = new Set();
22
+ const mismatches = [];
23
+ for (const element of host.querySelectorAll('[data-craft-hk]')) {
24
+ const key = element.getAttribute('data-craft-hk');
25
+ if (key)
26
+ elements.set(key, element);
27
+ }
28
+ walkComments(host, (comment) => {
29
+ const marker = parseMarker(comment.data);
30
+ if (!marker)
31
+ return;
32
+ if (marker.label === 'craft-text:start') {
33
+ const end = nextComment(comment.nextSibling, 'craft-text:end', marker.key);
34
+ if (!end)
35
+ return;
36
+ let value = comment.nextSibling;
37
+ if (value === end) {
38
+ value = host.ownerDocument.createTextNode('');
39
+ end.parentNode?.insertBefore(value, end);
40
+ }
41
+ if (value?.nodeType === Node.TEXT_NODE) {
42
+ text.set(marker.key, {
43
+ text: value,
44
+ start: comment,
45
+ end,
46
+ });
47
+ }
48
+ return;
49
+ }
50
+ if (marker.label !== 'craft-text:end') {
51
+ boundaries.set(boundaryAddress(marker.key, marker.label), comment);
52
+ }
53
+ });
54
+ const cursor = {
55
+ claimElement(key, tag) {
56
+ const element = elements.get(key);
57
+ if (!element) {
58
+ throw new HydrationMismatchError({
59
+ key,
60
+ expected: `<${tag}>`,
61
+ actual: null,
62
+ reason: 'element-absent',
63
+ });
64
+ }
65
+ if (element.tagName.toLowerCase() !== tag.toLowerCase()) {
66
+ throw new HydrationMismatchError({
67
+ key,
68
+ expected: `<${tag}>`,
69
+ actual: `<${element.tagName.toLowerCase()}>`,
70
+ reason: 'tag-mismatch',
71
+ actualNode: element,
72
+ });
73
+ }
74
+ claimed.add(element);
75
+ return element;
76
+ },
77
+ claimText(key, expected) {
78
+ const entry = text.get(key);
79
+ if (!entry) {
80
+ throw new HydrationMismatchError({
81
+ key,
82
+ expected: expected === undefined ? 'text' : JSON.stringify(expected),
83
+ actual: null,
84
+ reason: 'text-absent',
85
+ });
86
+ }
87
+ if (expected !== undefined && entry.text.nodeValue !== expected) {
88
+ throw new HydrationMismatchError({
89
+ key,
90
+ expected: JSON.stringify(expected),
91
+ actual: JSON.stringify(entry.text.nodeValue),
92
+ reason: 'text-mismatch',
93
+ actualNode: entry.text,
94
+ });
95
+ }
96
+ claimed.add(entry.text);
97
+ claimed.add(entry.start);
98
+ claimed.add(entry.end);
99
+ return entry.text;
100
+ },
101
+ claimBoundary(key, label) {
102
+ const comment = boundaries.get(boundaryAddress(key, label));
103
+ if (!comment) {
104
+ throw new HydrationMismatchError({
105
+ key,
106
+ expected: `<!--${label}-->`,
107
+ actual: null,
108
+ reason: 'boundary-absent',
109
+ });
110
+ }
111
+ claimed.add(comment);
112
+ return comment;
113
+ },
114
+ recordMismatch(error) {
115
+ mismatches.push(error);
116
+ onMismatch?.(error);
117
+ },
118
+ finish() {
119
+ for (const entry of text.values()) {
120
+ if (claimed.has(entry.text)) {
121
+ entry.start.remove();
122
+ entry.end.remove();
123
+ }
124
+ else {
125
+ entry.start.remove();
126
+ entry.text.remove();
127
+ entry.end.remove();
128
+ }
129
+ }
130
+ for (const element of elements.values()) {
131
+ if (!claimed.has(element) && element.parentNode)
132
+ element.remove();
133
+ }
134
+ for (const comment of boundaries.values()) {
135
+ if (!claimed.has(comment) && comment.parentNode)
136
+ comment.remove();
137
+ }
138
+ if (mismatches.length > 0 && isDevelopment()) {
139
+ console.warn(`Craft hydrated with ${mismatches.length} local remount${mismatches.length === 1 ? '' : 's'}.`, mismatches);
140
+ }
141
+ },
142
+ };
143
+ return cursor;
144
+ }
145
+ function walkComments(parent, visit) {
146
+ for (const child of [...parent.childNodes]) {
147
+ if (child.nodeType === Node.COMMENT_NODE)
148
+ visit(child);
149
+ walkComments(child, visit);
150
+ }
151
+ }
152
+ function nextComment(node, label, key) {
153
+ let current = node;
154
+ while (current) {
155
+ if (current.nodeType === Node.COMMENT_NODE) {
156
+ const marker = parseMarker(current.data);
157
+ if (marker?.label === label && marker.key === key) {
158
+ return current;
159
+ }
160
+ }
161
+ current = current.nextSibling;
162
+ }
163
+ return null;
164
+ }
165
+ function parseMarker(value) {
166
+ const separator = value.lastIndexOf('|hk:');
167
+ if (separator === -1)
168
+ return null;
169
+ return {
170
+ label: value.slice(0, separator),
171
+ key: value.slice(separator + 4),
172
+ };
173
+ }
174
+ function boundaryAddress(key, label) {
175
+ return `${key}\u0000${label}`;
176
+ }
177
+ function isDevelopment() {
178
+ const processRef = globalThis.process;
179
+ return (processRef === undefined || processRef.env?.['NODE_ENV'] !== 'production');
180
+ }
181
+ //# sourceMappingURL=hydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../../../../../libs/component/src/lib/render/hydration.ts"],"names":[],"mappings":"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","sourcesContent":["export type HydrationMismatchReason =\n | 'element-absent'\n | 'tag-mismatch'\n | 'text-absent'\n | 'text-mismatch'\n | 'boundary-absent';\n\nexport class HydrationMismatchError extends Error {\n readonly key: string;\n readonly expected: string;\n readonly actual: string | null;\n readonly reason: HydrationMismatchReason;\n readonly actualNode: Node | null;\n\n constructor(\n options: Readonly<{\n key: string;\n expected: string;\n actual: string | null;\n reason: HydrationMismatchReason;\n actualNode?: Node | null;\n }>,\n ) {\n super(\n `Craft hydration mismatch at \"${options.key}\": expected ${options.expected}, received ${options.actual ?? 'nothing'} (${options.reason}).`,\n );\n this.name = 'HydrationMismatchError';\n this.key = options.key;\n this.expected = options.expected;\n this.actual = options.actual;\n this.reason = options.reason;\n this.actualNode = options.actualNode ?? null;\n }\n}\n\nexport type HydrationCursor = Readonly<{\n claimElement(key: string, tag: string): Element;\n claimText(key: string, expected?: string): Text;\n claimBoundary(key: string, label: string): Comment;\n recordMismatch(error: HydrationMismatchError): void;\n finish(): void;\n}>;\n\ntype TextClaim = Readonly<{\n text: Text;\n start: Comment;\n end: Comment;\n}>;\n\nexport function createHydrationCursor(\n host: Element,\n onMismatch?: (error: HydrationMismatchError) => void,\n): HydrationCursor {\n const elements = new Map<string, Element>();\n const boundaries = new Map<string, Comment>();\n const text = new Map<string, TextClaim>();\n const claimed = new Set<Node>();\n const mismatches: HydrationMismatchError[] = [];\n\n for (const element of host.querySelectorAll<Element>('[data-craft-hk]')) {\n const key = element.getAttribute('data-craft-hk');\n if (key) elements.set(key, element);\n }\n\n walkComments(host, (comment) => {\n const marker = parseMarker(comment.data);\n if (!marker) return;\n if (marker.label === 'craft-text:start') {\n const end = nextComment(\n comment.nextSibling,\n 'craft-text:end',\n marker.key,\n );\n if (!end) return;\n let value = comment.nextSibling;\n if (value === end) {\n value = host.ownerDocument.createTextNode('');\n end.parentNode?.insertBefore(value, end);\n }\n if (value?.nodeType === Node.TEXT_NODE) {\n text.set(marker.key, {\n text: value as Text,\n start: comment,\n end,\n });\n }\n return;\n }\n if (marker.label !== 'craft-text:end') {\n boundaries.set(boundaryAddress(marker.key, marker.label), comment);\n }\n });\n\n const cursor: HydrationCursor = {\n claimElement(key, tag) {\n const element = elements.get(key);\n if (!element) {\n throw new HydrationMismatchError({\n key,\n expected: `<${tag}>`,\n actual: null,\n reason: 'element-absent',\n });\n }\n if (element.tagName.toLowerCase() !== tag.toLowerCase()) {\n throw new HydrationMismatchError({\n key,\n expected: `<${tag}>`,\n actual: `<${element.tagName.toLowerCase()}>`,\n reason: 'tag-mismatch',\n actualNode: element,\n });\n }\n claimed.add(element);\n return element;\n },\n claimText(key, expected) {\n const entry = text.get(key);\n if (!entry) {\n throw new HydrationMismatchError({\n key,\n expected: expected === undefined ? 'text' : JSON.stringify(expected),\n actual: null,\n reason: 'text-absent',\n });\n }\n if (expected !== undefined && entry.text.nodeValue !== expected) {\n throw new HydrationMismatchError({\n key,\n expected: JSON.stringify(expected),\n actual: JSON.stringify(entry.text.nodeValue),\n reason: 'text-mismatch',\n actualNode: entry.text,\n });\n }\n claimed.add(entry.text);\n claimed.add(entry.start);\n claimed.add(entry.end);\n return entry.text;\n },\n claimBoundary(key, label) {\n const comment = boundaries.get(boundaryAddress(key, label));\n if (!comment) {\n throw new HydrationMismatchError({\n key,\n expected: `<!--${label}-->`,\n actual: null,\n reason: 'boundary-absent',\n });\n }\n claimed.add(comment);\n return comment;\n },\n recordMismatch(error) {\n mismatches.push(error);\n onMismatch?.(error);\n },\n finish() {\n for (const entry of text.values()) {\n if (claimed.has(entry.text)) {\n entry.start.remove();\n entry.end.remove();\n } else {\n entry.start.remove();\n entry.text.remove();\n entry.end.remove();\n }\n }\n for (const element of elements.values()) {\n if (!claimed.has(element) && element.parentNode) element.remove();\n }\n for (const comment of boundaries.values()) {\n if (!claimed.has(comment) && comment.parentNode) comment.remove();\n }\n if (mismatches.length > 0 && isDevelopment()) {\n console.warn(\n `Craft hydrated with ${mismatches.length} local remount${mismatches.length === 1 ? '' : 's'}.`,\n mismatches,\n );\n }\n },\n };\n\n return cursor;\n}\n\nfunction walkComments(parent: Node, visit: (comment: Comment) => void): void {\n for (const child of [...parent.childNodes]) {\n if (child.nodeType === Node.COMMENT_NODE) visit(child as Comment);\n walkComments(child, visit);\n }\n}\n\nfunction nextComment(\n node: Node | null,\n label: string,\n key: string,\n): Comment | null {\n let current = node;\n while (current) {\n if (current.nodeType === Node.COMMENT_NODE) {\n const marker = parseMarker((current as Comment).data);\n if (marker?.label === label && marker.key === key) {\n return current as Comment;\n }\n }\n current = current.nextSibling;\n }\n return null;\n}\n\nfunction parseMarker(value: string): { label: string; key: string } | null {\n const separator = value.lastIndexOf('|hk:');\n if (separator === -1) return null;\n return {\n label: value.slice(0, separator),\n key: value.slice(separator + 4),\n };\n}\n\nfunction boundaryAddress(key: string, label: string): string {\n return `${key}\\u0000${label}`;\n}\n\nfunction isDevelopment(): boolean {\n const processRef = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n return (\n processRef === undefined || processRef.env?.['NODE_ENV'] !== 'production'\n );\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import { type CraftServiceProvider, type CraftDomAdapter, type CraftRenderIdentity } from '@craft-ts/core';
2
+ import { Injector } from '../host-runtime';
3
+ import { type CraftComponent } from '../types';
4
+ import { CraftStyleRegistry } from './style-registry';
5
+ import { type RuntimeLocatorCriteria } from '../locator';
6
+ import { type HydrationCursor } from './hydration';
7
+ import type { CraftSsrCoordinator } from './ssr-coordinator';
8
+ import type { CraftServerStyleCollector } from './server-style-collector';
9
+ export interface MountedCraftComponent<Props extends object> {
10
+ updateProps(props: Props): void;
11
+ destroy(): void;
12
+ }
13
+ export interface MountedCraftTemplate<Context> {
14
+ updateContext(context: Context): void;
15
+ locator(tag: string, criteria: RuntimeLocatorCriteria): Element | undefined;
16
+ destroy(): void;
17
+ }
18
+ export type InterpretedRenderOptions = Readonly<{
19
+ renderer: CraftDomAdapter;
20
+ mode?: 'create' | 'hydrate';
21
+ identity?: CraftRenderIdentity;
22
+ hydration?: HydrationCursor;
23
+ emitHydrationKeys?: boolean;
24
+ styleRoot?: Document | ShadowRoot;
25
+ styles?: CraftStyleRegistry;
26
+ ssr?: CraftSsrCoordinator;
27
+ serverStyles?: CraftServerStyleCollector;
28
+ }>;
29
+ export declare function mountInterpretedComponent<Props extends object>(component: CraftComponent<Props>, host: Element, injector: Injector | object, props: Props): MountedCraftComponent<Props>;
30
+ export declare function mountInterpretedComponentWithOptions<Props extends object>(component: CraftComponent<Props>, host: Element, injector: Injector | object, props: Props, options: InterpretedRenderOptions): MountedCraftComponent<Props>;
31
+ export declare function mountInterpretedComponentTemplate<Context>(component: CraftComponent<any>, host: Element, injector: Injector | object, context: Context, additionalProviders?: readonly CraftServiceProvider[]): MountedCraftTemplate<Context>;
32
+ //# sourceMappingURL=interpreter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../../../../../../libs/component/src/lib/render/interpreter.ts"],"names":[],"mappings":"AAAA,OAAO,EAwCL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EAepB,KAAK,mBAAmB,EAIzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAKL,QAAQ,EAQT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAgDlB,OAAO,EAEL,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,YAAY,CAAC;AACpB,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AA8lK1E,MAAM,WAAW,qBAAqB,CAAC,KAAK,SAAS,MAAM;IACzD,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAChC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB,CAAC,OAAO;IAC3C,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,sBAAsB,GAAG,OAAO,GAAG,SAAS,CAAC;IAC5E,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAClC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,YAAY,CAAC,EAAE,yBAAyB,CAAC;CAC1C,CAAC,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,KAAK,SAAS,MAAM,EAC5D,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,EAChC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAC3B,KAAK,EAAE,KAAK,GACX,qBAAqB,CAAC,KAAK,CAAC,CAoB9B;AAED,wBAAgB,oCAAoC,CAAC,KAAK,SAAS,MAAM,EACvE,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,EAChC,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAC3B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,wBAAwB,GAChC,qBAAqB,CAAC,KAAK,CAAC,CAyC9B;AAED,wBAAgB,iCAAiC,CAAC,OAAO,EACvD,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,EAC9B,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,QAAQ,GAAG,MAAM,EAC3B,OAAO,EAAE,OAAO,EAChB,mBAAmB,GAAE,SAAS,oBAAoB,EAAO,GACxD,oBAAoB,CAAC,OAAO,CAAC,CAqD/B"}