@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
package/src/lib/tome.ts CHANGED
@@ -4,10 +4,22 @@ import {z} from 'zod';
4
4
  import {ensure_start} from '@fuzdev/fuz_util/string.js';
5
5
 
6
6
  import {create_context} from './context_helpers.js';
7
- import {DOCS_PATH_DEFAULT, docs_slugify} from './docs_helpers.svelte.js';
7
+ import {DOCS_PATH_DEFAULT} from './docs_helpers.svelte.js';
8
8
 
9
9
  export const Tome = z.object({
10
- name: z.string(),
10
+ /**
11
+ * Stable identifier and URL path segment — must be a URL-safe slug
12
+ * (used directly as the route segment, the lookup key, and in
13
+ * `related_tomes` cross-references). Set `title` for the display label.
14
+ */
15
+ slug: z.string(),
16
+ /**
17
+ * Human-readable display label shown in menus, headings, and links.
18
+ * Falls back to `slug` when omitted, so set `title` to give multi-word or
19
+ * specially cased tomes a readable label (e.g. `slug: 'vite-plugin'` →
20
+ * `title: 'vite plugin'`).
21
+ */
22
+ title: z.string().optional(),
11
23
  // TODO maybe now this makes sense with mdz? summary: z.string(),
12
24
  category: z.string(),
13
25
  Component: z.custom<Component<any, any>>(),
@@ -20,22 +32,27 @@ export type Tome = z.infer<typeof Tome>;
20
32
  /**
21
33
  * @param hash - URL fragment to append, with or without the `#`
22
34
  */
23
- export const to_tome_pathname = (
35
+ export const tome_to_pathname = (
24
36
  item: Tome | string,
25
37
  docs_path = DOCS_PATH_DEFAULT,
26
38
  hash?: string,
27
39
  ): string => {
28
- const name = typeof item === 'string' ? item : item.name;
29
- const path = docs_path + '/' + docs_slugify(name);
40
+ const slug = typeof item === 'string' ? item : item.slug;
41
+ const path = docs_path + '/' + slug;
30
42
  return resolve((hash ? path + ensure_start(hash, '#') : path) as any);
31
43
  };
32
44
 
45
+ /**
46
+ * The display label for a tome — its `title` if set, else its `slug`.
47
+ */
48
+ export const tome_to_title = (tome: Tome): string => tome.title ?? tome.slug;
49
+
33
50
  export const tomes_context = create_context<() => Map<string, Tome>>();
34
51
 
35
- export const get_tome_by_name = (name: string): Tome => {
52
+ export const tome_get_by_slug = (slug: string): Tome => {
36
53
  const get_tomes = tomes_context.get();
37
- const tome = get_tomes().get(name);
38
- if (!tome) throw Error(`unable to find tome "${name}"`);
54
+ const tome = get_tomes().get(slug);
55
+ if (!tome) throw Error(`unable to find tome "${slug}"`);
39
56
  return tome;
40
57
  };
41
58
 
@@ -107,19 +107,14 @@ export const tsdoc_parse = (
107
107
  // Extract main comment text
108
108
  for (const comment of tsdoc_comments) {
109
109
  if (ts.isJSDoc(comment) && comment.comment) {
110
- const text =
111
- typeof comment.comment === 'string'
112
- ? comment.comment
113
- : comment.comment.map((c) => c.text).join('');
114
- full_text += text + '\n';
110
+ full_text += tsdoc_comment_to_text(comment.comment, source_file) + '\n';
115
111
  }
116
112
  }
117
113
 
118
114
  // Extract tags
119
115
  const tags = ts.getJSDocTags(node);
120
116
  for (const tag of tags) {
121
- const tag_text =
122
- typeof tag.comment === 'string' ? tag.comment : tag.comment?.map((c) => c.text).join('');
117
+ const tag_text = tag.comment ? tsdoc_comment_to_text(tag.comment, source_file) : undefined;
123
118
  const tag_name = tag.tagName.text;
124
119
 
125
120
  if (tag_name === 'param' && ts.isJSDocParameterTag(tag)) {
@@ -214,6 +209,22 @@ export const tsdoc_apply_to_declaration = (
214
209
  }
215
210
  };
216
211
 
212
+ /**
213
+ * Concatenates a JSDoc comment (string or node array) into plain text, preserving `{@link ...}`.
214
+ *
215
+ * `JSDocLink` / `JSDocLinkCode` / `JSDocLinkPlain` nodes have empty `.text` — the identifier
216
+ * lives on `.name`, not `.text`. Using `.text` alone silently drops link content; we fall back
217
+ * to the source-text representation for link nodes so `{@link Foo}` survives intact for downstream
218
+ * renderers (see `tsdoc_mdz.ts`).
219
+ */
220
+ export const tsdoc_comment_to_text = (
221
+ comment: string | ts.NodeArray<ts.JSDocComment>,
222
+ source_file: ts.SourceFile,
223
+ ): string => {
224
+ if (typeof comment === 'string') return comment;
225
+ return comment.map((c) => (ts.isJSDocLinkLike(c) ? c.getText(source_file) : c.text)).join('');
226
+ };
227
+
217
228
  /**
218
229
  * Clean raw JSDoc comment text by removing comment markers and leading asterisks.
219
230
  *