@fuzdev/fuz_ui 0.191.3 → 0.192.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/ApiModulesList.svelte +3 -3
  2. package/dist/ColorSchemeInput.svelte +6 -6
  3. package/dist/ContextmenuLinkEntry.svelte +1 -1
  4. package/dist/ContextmenuRoot.svelte +10 -10
  5. package/dist/ContextmenuRootForSafariCompatibility.svelte +19 -19
  6. package/dist/ContextmenuSeparator.svelte +3 -3
  7. package/dist/ContextmenuSubmenu.svelte +3 -3
  8. package/dist/CopyToClipboard.svelte +3 -3
  9. package/dist/DeclarationLink.svelte +1 -1
  10. package/dist/Dialog.svelte +16 -16
  11. package/dist/Docs.svelte +9 -9
  12. package/dist/DocsFooter.svelte +2 -2
  13. package/dist/DocsList.svelte +7 -7
  14. package/dist/DocsMenu.svelte +1 -1
  15. package/dist/DocsPageLinks.svelte +4 -4
  16. package/dist/DocsPrimaryNav.svelte +2 -2
  17. package/dist/DocsSecondaryNav.svelte +4 -4
  18. package/dist/DocsTertiaryNav.svelte +6 -6
  19. package/dist/GithubLink.svelte +1 -1
  20. package/dist/Hashlink.svelte +2 -2
  21. package/dist/HueInput.svelte +6 -6
  22. package/dist/LibraryDetail.svelte +8 -8
  23. package/dist/LibrarySummary.svelte +4 -4
  24. package/dist/MdnLink.svelte +1 -1
  25. package/dist/ModuleLink.svelte +1 -1
  26. package/dist/PasteFromClipboard.svelte +1 -1
  27. package/dist/PendingAnimation.svelte +2 -2
  28. package/dist/PendingButton.svelte +2 -2
  29. package/dist/ProjectLinks.svelte +4 -4
  30. package/dist/Teleport.svelte +2 -2
  31. package/dist/ThemeInput.svelte +5 -5
  32. package/dist/TomeContent.svelte +1 -1
  33. package/dist/TomeHeader.svelte +3 -3
  34. package/dist/TomeLink.svelte +1 -1
  35. package/dist/TomeSection.svelte +1 -1
  36. package/dist/TomeSectionHeader.svelte +3 -3
  37. package/dist/api_search.svelte.js +2 -2
  38. package/dist/contextmenu_state.svelte.d.ts.map +1 -1
  39. package/dist/contextmenu_state.svelte.js +10 -8
  40. package/dist/csp.d.ts +81 -90
  41. package/dist/csp.d.ts.map +1 -1
  42. package/dist/csp.js +150 -163
  43. package/dist/csp_of_fuzdev.d.ts +13 -3
  44. package/dist/csp_of_fuzdev.d.ts.map +1 -1
  45. package/dist/csp_of_fuzdev.js +23 -7
  46. package/dist/dimensions.svelte.d.ts.map +1 -1
  47. package/dist/dimensions.svelte.js +2 -2
  48. package/dist/library.svelte.d.ts +1 -1
  49. package/dist/library_generate.js +1 -1
  50. package/dist/style_variable_helpers.svelte.d.ts.map +1 -1
  51. package/dist/style_variable_helpers.svelte.js +1 -1
  52. package/dist/theme_state.svelte.d.ts.map +1 -1
  53. package/dist/theme_state.svelte.js +2 -2
  54. package/dist/tsdoc_helpers.d.ts +9 -0
  55. package/dist/tsdoc_helpers.d.ts.map +1 -1
  56. package/dist/tsdoc_helpers.js +15 -5
  57. package/package.json +6 -6
  58. package/src/lib/api_search.svelte.ts +2 -2
  59. package/src/lib/contextmenu_state.svelte.ts +9 -8
  60. package/src/lib/csp.ts +229 -259
  61. package/src/lib/csp_of_fuzdev.ts +24 -8
  62. package/src/lib/dimensions.svelte.ts +2 -2
  63. package/src/lib/library_generate.ts +1 -1
  64. package/src/lib/style_variable_helpers.svelte.ts +1 -1
  65. package/src/lib/theme_state.svelte.ts +2 -2
  66. package/src/lib/tsdoc_helpers.ts +18 -7
@@ -1,9 +1,25 @@
1
1
  /**
2
- * Trusted sources owned by fuz.dev.
2
+ * Per-directive sources that allow full interop between fuzdev/sister sites
3
+ * (`*.fuz.dev`, `*.zzz.software`) — loading assets and APIs from each other,
4
+ * and iframing in both directions.
5
+ *
6
+ * Pass into `create_csp_directives({extend: [csp_directives_of_fuzdev]})`.
7
+ * Intended for sites within the ecosystem; external apps usually want a
8
+ * narrower, hand-written allow-list.
9
+ *
10
+ * Deliberately scoped — `script-src`, `style-src`, `worker-src`, etc. are not
11
+ * granted, even between sister sites. Add at the call site if a specific page
12
+ * needs them.
3
13
  */
4
- export const csp_trusted_sources_of_fuzdev = [
5
- { source: 'https://*.fuz.dev/', trust: 'low' },
6
- { source: 'https://*.zzz.software/', trust: 'low' },
7
- // if needed
8
- // {source: 'https://fuzdev.github.io/', trust: 'low'},
9
- ];
14
+ export const csp_directives_of_fuzdev = {
15
+ 'img-src': ['https://*.fuz.dev/', 'https://*.zzz.software/'],
16
+ 'media-src': ['https://*.fuz.dev/', 'https://*.zzz.software/'],
17
+ 'font-src': ['https://*.fuz.dev/', 'https://*.zzz.software/'],
18
+ 'connect-src': ['https://*.fuz.dev/', 'https://*.zzz.software/'],
19
+ 'frame-src': ['https://*.fuz.dev/', 'https://*.zzz.software/'],
20
+ 'frame-ancestors': ['https://*.fuz.dev/', 'https://*.zzz.software/'],
21
+ // `child-src` is intentionally omitted — it defaults to `['none']`, and `extend` cannot
22
+ // append to a `'none'`-valued directive. Including it here would break the common
23
+ // `create_csp_directives({extend: [csp_directives_of_fuzdev]})` call. `frame-src` is its
24
+ // fallback target anyway, so direct opt-in via `frame-src` is the supported path.
25
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"dimensions.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/dimensions.svelte.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACtB,KAAK,EAAE,MAAM,CAAa;IAC1B,MAAM,EAAE,MAAM,CAAa;CAC3B"}
1
+ {"version":3,"file":"dimensions.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/dimensions.svelte.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU;IACtB,KAAK,EAAE,MAAM,CAAiB;IAC9B,MAAM,EAAE,MAAM,CAAiB;CAC/B"}
@@ -1,4 +1,4 @@
1
1
  export class Dimensions {
2
- width = $state(0);
3
- height = $state(0);
2
+ width = $state.raw(0);
3
+ height = $state.raw(0);
4
4
  }
@@ -25,7 +25,7 @@ export declare class Library {
25
25
  readonly package_json: {
26
26
  [x: string]: unknown;
27
27
  name: string;
28
- version: string;
28
+ version?: string | undefined;
29
29
  private?: boolean | undefined;
30
30
  description?: string | undefined;
31
31
  tagline?: string | undefined;
@@ -81,7 +81,7 @@ export const library_generate = (input) => {
81
81
  // Phase 1: Analyze all modules and collect re-exports
82
82
  const source_json = {
83
83
  name: package_json.name,
84
- version: package_json.version,
84
+ version: package_json.version || '',
85
85
  modules,
86
86
  };
87
87
  // Collect re-exports for phase 2 merging
@@ -1 +1 @@
1
- {"version":3,"file":"style_variable_helpers.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/style_variable_helpers.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAK/D,qBAAa,qBAAqB;IACjC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAa;gBAE5B,OAAO,GAAE,aAAa,GAAG,IAAW;CAGhD;AAED,eAAO,MAAM,yBAAyB;;;CAAwD,CAAC"}
1
+ {"version":3,"file":"style_variable_helpers.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/style_variable_helpers.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAK/D,qBAAa,qBAAqB;IACjC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAiB;gBAEhC,OAAO,GAAE,aAAa,GAAG,IAAW;CAGhD;AAED,eAAO,MAAM,yBAAyB;;;CAAwD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { create_context } from './context_helpers.js';
2
2
  // TODO maybe change this to a generic wrapper class for any value?
3
3
  export class SelectedStyleVariable {
4
- value = $state();
4
+ value = $state.raw();
5
5
  constructor(initial = null) {
6
6
  this.value = initial;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"theme_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/theme_state.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,KAAK,EAAC,MAAM,0BAA0B,CAAC;AAOrF,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAExD,qBAAa,UAAU;IACtB,KAAK,EAAE,KAAK,CAAa;IACzB,YAAY,EAAE,WAAW,CAAa;gBAE1B,OAAO,CAAC,EAAE,iBAAiB;IAUvC,MAAM,IAAI,cAAc;CAMxB;AACD,eAAO,MAAM,mBAAmB;2CAAwB,UAAU;4BAAV,UAAU;uBAAV,UAAU,WAAV,UAAU;CAAG,CAAC;AAEtE,eAAO,MAAM,iBAAiB,GAAI,cAAc,WAAW,GAAG,IAAI,KAAG,IAOpE,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C,eAAO,MAAM,iBAAiB,GAC7B,cAAc,WAAW,GAAG,IAAI,EAChC,YAA8B,KAC5B,IAEF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC7B,WAAU,WAAoB,EAC9B,YAA8B,KAC5B,WAA4E,CAAC;AAEhF,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,GAAG,IAAI,EAAE,YAAuB,KAAG,IAEzE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,WAAU,KAA0B,EAAE,YAAuB,KAAG,KAC3C,CAAC"}
1
+ {"version":3,"file":"theme_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/theme_state.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,KAAK,EAAC,MAAM,0BAA0B,CAAC;AAOrF,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAExD,qBAAa,UAAU;IACtB,KAAK,EAAE,KAAK,CAAiB;IAC7B,YAAY,EAAE,WAAW,CAAiB;gBAE9B,OAAO,CAAC,EAAE,iBAAiB;IAUvC,MAAM,IAAI,cAAc;CAMxB;AACD,eAAO,MAAM,mBAAmB;2CAAwB,UAAU;4BAAV,UAAU;uBAAV,UAAU,WAAV,UAAU;CAAG,CAAC;AAEtE,eAAO,MAAM,iBAAiB,GAAI,cAAc,WAAW,GAAG,IAAI,KAAG,IAOpE,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C,eAAO,MAAM,iBAAiB,GAC7B,cAAc,WAAW,GAAG,IAAI,EAChC,YAA8B,KAC5B,IAEF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC7B,WAAU,WAAoB,EAC9B,YAA8B,KAC5B,WAA4E,CAAC;AAEhF,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,GAAG,IAAI,EAAE,YAAuB,KAAG,IAEzE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,WAAU,KAA0B,EAAE,YAAuB,KAAG,KAC3C,CAAC"}
@@ -4,8 +4,8 @@ import { BROWSER } from 'esm-env';
4
4
  import { create_context } from './context_helpers.js';
5
5
  import { load_from_storage, save_to_storage } from './storage.js';
6
6
  export class ThemeState {
7
- theme = $state();
8
- color_scheme = $state();
7
+ theme = $state.raw();
8
+ color_scheme = $state.raw();
9
9
  constructor(options) {
10
10
  const theme = options?.theme ?? default_themes[0];
11
11
  const color_scheme = options?.color_scheme ?? 'auto';
@@ -98,6 +98,15 @@ export declare const tsdoc_parse: (node: ts.Node, source_file: ts.SourceFile) =>
98
98
  * @mutates declaration - adds doc_comment, deprecated_message, examples, see_also, throws, since fields
99
99
  */
100
100
  export declare const tsdoc_apply_to_declaration: (declaration: DeclarationJson, tsdoc: TsdocParsedComment | undefined) => void;
101
+ /**
102
+ * Concatenates a JSDoc comment (string or node array) into plain text, preserving `{@link ...}`.
103
+ *
104
+ * `JSDocLink` / `JSDocLinkCode` / `JSDocLinkPlain` nodes have empty `.text` — the identifier
105
+ * lives on `.name`, not `.text`. Using `.text` alone silently drops link content; we fall back
106
+ * to the source-text representation for link nodes so `{@link Foo}` survives intact for downstream
107
+ * renderers (see `tsdoc_mdz.ts`).
108
+ */
109
+ export declare const tsdoc_comment_to_text: (comment: string | ts.NodeArray<ts.JSDocComment>, source_file: ts.SourceFile) => string;
101
110
  /**
102
111
  * Clean raw JSDoc comment text by removing comment markers and leading asterisks.
103
112
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tsdoc_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/tsdoc_helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACrD,oCAAoC;IACpC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,GACvB,MAAM,EAAE,CAAC,IAAI,EACb,aAAa,EAAE,CAAC,UAAU,KACxB,kBAAkB,GAAG,SAyFvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GACtC,aAAa,eAAe,EAC5B,OAAO,kBAAkB,GAAG,SAAS,KACnC,IAmBF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,cAAc,MAAM,KAAG,MAAM,GAAG,SAUnE,CAAC"}
1
+ {"version":3,"file":"tsdoc_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/tsdoc_helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACrD,oCAAoC;IACpC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,GACvB,MAAM,EAAE,CAAC,IAAI,EACb,aAAa,EAAE,CAAC,UAAU,KACxB,kBAAkB,GAAG,SAoFvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GACtC,aAAa,eAAe,EAC5B,OAAO,kBAAkB,GAAG,SAAS,KACnC,IAmBF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GACjC,SAAS,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,EAC/C,aAAa,EAAE,CAAC,UAAU,KACxB,MAGF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAAI,cAAc,MAAM,KAAG,MAAM,GAAG,SAUnE,CAAC"}
@@ -74,16 +74,13 @@ export const tsdoc_parse = (node, source_file) => {
74
74
  // Extract main comment text
75
75
  for (const comment of tsdoc_comments) {
76
76
  if (ts.isJSDoc(comment) && comment.comment) {
77
- const text = typeof comment.comment === 'string'
78
- ? comment.comment
79
- : comment.comment.map((c) => c.text).join('');
80
- full_text += text + '\n';
77
+ full_text += tsdoc_comment_to_text(comment.comment, source_file) + '\n';
81
78
  }
82
79
  }
83
80
  // Extract tags
84
81
  const tags = ts.getJSDocTags(node);
85
82
  for (const tag of tags) {
86
- const tag_text = typeof tag.comment === 'string' ? tag.comment : tag.comment?.map((c) => c.text).join('');
83
+ const tag_text = tag.comment ? tsdoc_comment_to_text(tag.comment, source_file) : undefined;
87
84
  const tag_name = tag.tagName.text;
88
85
  if (tag_name === 'param' && ts.isJSDocParameterTag(tag)) {
89
86
  // Extract parameter name and description
@@ -177,6 +174,19 @@ export const tsdoc_apply_to_declaration = (declaration, tsdoc) => {
177
174
  declaration.since = tsdoc.since;
178
175
  }
179
176
  };
177
+ /**
178
+ * Concatenates a JSDoc comment (string or node array) into plain text, preserving `{@link ...}`.
179
+ *
180
+ * `JSDocLink` / `JSDocLinkCode` / `JSDocLinkPlain` nodes have empty `.text` — the identifier
181
+ * lives on `.name`, not `.text`. Using `.text` alone silently drops link content; we fall back
182
+ * to the source-text representation for link nodes so `{@link Foo}` survives intact for downstream
183
+ * renderers (see `tsdoc_mdz.ts`).
184
+ */
185
+ export const tsdoc_comment_to_text = (comment, source_file) => {
186
+ if (typeof comment === 'string')
187
+ return comment;
188
+ return comment.map((c) => (ts.isJSDocLinkLike(c) ? c.getText(source_file) : c.text)).join('');
189
+ };
180
190
  /**
181
191
  * Clean raw JSDoc comment text by removing comment markers and leading asterisks.
182
192
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fuzdev/fuz_ui",
3
- "version": "0.191.3",
3
+ "version": "0.192.0",
4
4
  "description": "Svelte UI library",
5
5
  "tagline": "friendly user zystem",
6
6
  "glyph": "🧶",
@@ -81,11 +81,11 @@
81
81
  "devDependencies": {
82
82
  "@changesets/changelog-git": "^0.2.1",
83
83
  "@fuzdev/fuz_code": "^0.45.1",
84
- "@fuzdev/fuz_css": "^0.58.0",
85
- "@fuzdev/fuz_util": "^0.55.0",
86
- "@fuzdev/gro": "^0.197.2",
84
+ "@fuzdev/fuz_css": "^0.59.0",
85
+ "@fuzdev/fuz_util": "^0.57.0",
86
+ "@fuzdev/gro": "^0.198.0",
87
87
  "@jridgewell/trace-mapping": "^0.3.31",
88
- "@ryanatkn/eslint-config": "^0.10.1",
88
+ "@ryanatkn/eslint-config": "^0.11.0",
89
89
  "@sveltejs/acorn-typescript": "^1.0.9",
90
90
  "@sveltejs/adapter-static": "^3.0.10",
91
91
  "@sveltejs/kit": "^2.55.0",
@@ -101,7 +101,7 @@
101
101
  "magic-string": "^0.30.21",
102
102
  "prettier": "^3.7.4",
103
103
  "prettier-plugin-svelte": "^3.5.1",
104
- "svelte": "^5.54.1",
104
+ "svelte": "^5.55.0",
105
105
  "svelte-check": "^4.4.5",
106
106
  "svelte2tsx": "^0.7.52",
107
107
  "tslib": "^2.8.1",
@@ -24,7 +24,7 @@ export interface ApiSearchState {
24
24
  * Creates unified search state for the API index page (modules and declarations).
25
25
  */
26
26
  export const create_api_search = (library: Library): ApiSearchState => {
27
- let query = $state('');
27
+ let query = $state.raw('');
28
28
 
29
29
  // Module filtering
30
30
  const all_modules = $derived(library.modules_sorted);
@@ -77,7 +77,7 @@ export const create_api_search = (library: Library): ApiSearchState => {
77
77
  export const create_module_declaration_search = (
78
78
  declarations: Array<Declaration>,
79
79
  ): DeclarationSearchState => {
80
- let query = $state('');
80
+ let query = $state.raw('');
81
81
 
82
82
  const all = $derived(declarations);
83
83
 
@@ -31,9 +31,9 @@ export class EntryState {
31
31
  readonly run: () => ContextmenuRun;
32
32
  readonly disabled: () => boolean;
33
33
 
34
- selected: boolean = $state(false);
35
- pending: boolean = $state(false);
36
- error_message: string | null = $state(null);
34
+ selected: boolean = $state.raw(false);
35
+ pending: boolean = $state.raw(false);
36
+ error_message: string | null = $state.raw(null);
37
37
  promise: Promise<ContextmenuActivateResult> | null = $state.raw(null);
38
38
 
39
39
  constructor(
@@ -52,7 +52,7 @@ export class SubmenuState {
52
52
  readonly menu: SubmenuState | RootMenuState;
53
53
  readonly depth: number;
54
54
 
55
- selected: boolean = $state(false);
55
+ selected: boolean = $state.raw(false);
56
56
  items: ReadonlyArray<ItemState> = $state.raw([]);
57
57
 
58
58
  constructor(menu: SubmenuState | RootMenuState, depth: number) {
@@ -90,11 +90,11 @@ export class ContextmenuState {
90
90
  readonly has_custom_layout: boolean;
91
91
 
92
92
  // State for external consumers.
93
- opened: boolean = $state(false);
94
- x: number = $state(0);
95
- y: number = $state(0);
93
+ opened: boolean = $state.raw(false);
94
+ x: number = $state.raw(0);
95
+ y: number = $state.raw(0);
96
96
  params: ReadonlyArray<ContextmenuParams> = $state.raw([]);
97
- error: string | undefined = $state();
97
+ error: string | undefined = $state.raw();
98
98
 
99
99
  // These arrays use immutable updates (reassignment, not mutation).
100
100
  // If you need reactivity, use `$contextmenu` in a reactive statement to react to all changes, and
@@ -301,6 +301,7 @@ export class ContextmenuState {
301
301
 
302
302
  select_last(): void {
303
303
  const {items} = this.selections.at(-1)?.menu ?? this.root_menu;
304
+ if (!items.length) return;
304
305
  this.select(items.at(-1)!);
305
306
  }
306
307