@fuzdev/fuz_ui 0.191.4 โ†’ 0.193.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 (77) hide show
  1. package/dist/ApiIndex.svelte +3 -3
  2. package/dist/ApiModule.svelte +2 -2
  3. package/dist/ApiModulesList.svelte +3 -3
  4. package/dist/ColorSchemeInput.svelte +6 -6
  5. package/dist/ContextmenuLinkEntry.svelte +1 -1
  6. package/dist/ContextmenuRoot.svelte +10 -10
  7. package/dist/ContextmenuRootForSafariCompatibility.svelte +19 -19
  8. package/dist/ContextmenuSeparator.svelte +3 -3
  9. package/dist/ContextmenuSubmenu.svelte +3 -3
  10. package/dist/CopyToClipboard.svelte +3 -3
  11. package/dist/DeclarationLink.svelte +1 -1
  12. package/dist/Dialog.svelte +16 -16
  13. package/dist/Docs.svelte +12 -12
  14. package/dist/DocsFooter.svelte +2 -2
  15. package/dist/DocsList.svelte +7 -7
  16. package/dist/DocsMenu.svelte +4 -4
  17. package/dist/DocsMenu.svelte.d.ts.map +1 -1
  18. package/dist/DocsPageLinks.svelte +4 -4
  19. package/dist/DocsPrimaryNav.svelte +2 -2
  20. package/dist/DocsSecondaryNav.svelte +4 -4
  21. package/dist/DocsTertiaryNav.svelte +13 -13
  22. package/dist/DocsTertiaryNav.svelte.d.ts +1 -1
  23. package/dist/GithubLink.svelte +1 -1
  24. package/dist/Hashlink.svelte +2 -2
  25. package/dist/HueInput.svelte +5 -5
  26. package/dist/LibraryDetail.svelte +8 -8
  27. package/dist/LibrarySummary.svelte +4 -4
  28. package/dist/MdnLink.svelte +1 -1
  29. package/dist/ModuleLink.svelte +1 -1
  30. package/dist/PasteFromClipboard.svelte +1 -1
  31. package/dist/PendingAnimation.svelte +2 -2
  32. package/dist/PendingButton.svelte +2 -2
  33. package/dist/ProjectLinks.svelte +4 -4
  34. package/dist/Teleport.svelte +2 -2
  35. package/dist/ThemeInput.svelte +5 -5
  36. package/dist/TomeContent.svelte +3 -3
  37. package/dist/TomeHeader.svelte +15 -14
  38. package/dist/TomeHeader.svelte.d.ts.map +1 -1
  39. package/dist/TomeLink.svelte +13 -6
  40. package/dist/TomeLink.svelte.d.ts +1 -1
  41. package/dist/TomeLink.svelte.d.ts.map +1 -1
  42. package/dist/TomeSection.svelte +1 -1
  43. package/dist/TomeSectionHeader.svelte +3 -3
  44. package/dist/api_search.svelte.js +2 -2
  45. package/dist/contextmenu_state.svelte.d.ts.map +1 -1
  46. package/dist/contextmenu_state.svelte.js +11 -10
  47. package/dist/csp.d.ts +81 -90
  48. package/dist/csp.d.ts.map +1 -1
  49. package/dist/csp.js +145 -163
  50. package/dist/csp_of_fuzdev.d.ts +13 -3
  51. package/dist/csp_of_fuzdev.d.ts.map +1 -1
  52. package/dist/csp_of_fuzdev.js +23 -7
  53. package/dist/dimensions.svelte.d.ts.map +1 -1
  54. package/dist/dimensions.svelte.js +2 -2
  55. package/dist/library.svelte.d.ts +1 -1
  56. package/dist/library_generate.js +1 -1
  57. package/dist/style_variable_helpers.svelte.d.ts.map +1 -1
  58. package/dist/style_variable_helpers.svelte.js +1 -1
  59. package/dist/theme_state.svelte.d.ts.map +1 -1
  60. package/dist/theme_state.svelte.js +2 -2
  61. package/dist/tome.d.ts +8 -3
  62. package/dist/tome.d.ts.map +1 -1
  63. package/dist/tome.js +24 -8
  64. package/dist/tsdoc_helpers.d.ts +9 -0
  65. package/dist/tsdoc_helpers.d.ts.map +1 -1
  66. package/dist/tsdoc_helpers.js +15 -5
  67. package/package.json +5 -5
  68. package/src/lib/api_search.svelte.ts +2 -2
  69. package/src/lib/contextmenu_state.svelte.ts +11 -10
  70. package/src/lib/csp.ts +224 -258
  71. package/src/lib/csp_of_fuzdev.ts +24 -8
  72. package/src/lib/dimensions.svelte.ts +2 -2
  73. package/src/lib/library_generate.ts +1 -1
  74. package/src/lib/style_variable_helpers.svelte.ts +1 -1
  75. package/src/lib/theme_state.svelte.ts +2 -2
  76. package/src/lib/tome.ts +25 -8
  77. package/src/lib/tsdoc_helpers.ts +18 -7
@@ -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.4",
3
+ "version": "0.193.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.61.1",
86
+ "@fuzdev/gro": "^0.199.1",
87
87
  "@jridgewell/trace-mapping": "^0.3.31",
88
- "@ryanatkn/eslint-config": "^0.10.1",
88
+ "@ryanatkn/eslint-config": "^0.12.1",
89
89
  "@sveltejs/acorn-typescript": "^1.0.9",
90
90
  "@sveltejs/adapter-static": "^3.0.10",
91
91
  "@sveltejs/kit": "^2.55.0",
@@ -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
@@ -253,7 +253,7 @@ export class ContextmenuState {
253
253
  do {
254
254
  i.selected = true;
255
255
  new_selections.unshift(i);
256
- } while ((i = i.menu) && i.menu); // eslint-disable-line @typescript-eslint/no-unnecessary-condition
256
+ } while ((i = i.menu) && i.menu);
257
257
  this.selections = new_selections;
258
258
  }
259
259
 
@@ -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
 
@@ -417,7 +418,7 @@ export const contextmenu_open = (
417
418
  // `navigator.vibrate()` works with `ContextmenuRoot` but gets blocked by some browsers
418
419
  // when used with `ContextmenuRootForSafariCompatibility` because its longpress
419
420
  // workaround triggers from a timeout rather than a direct user interaction.
420
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
421
+
421
422
  if (BROWSER && vibrate && navigator.vibrate) {
422
423
  navigator.vibrate(CONTEXTMENU_OPEN_VIBRATE_DURATION);
423
424
  }