components-svelte 0.1.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 (242) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/components/Search.svelte +320 -0
  4. package/dist/components/Search.svelte.d.ts +31 -0
  5. package/dist/components/SearchButton.svelte +82 -0
  6. package/dist/components/SearchButton.svelte.d.ts +13 -0
  7. package/dist/components/SearchProvider.svelte +87 -0
  8. package/dist/components/SearchProvider.svelte.d.ts +17 -0
  9. package/dist/components/accordion/Accordion.svelte +150 -0
  10. package/dist/components/accordion/Accordion.svelte.d.ts +25 -0
  11. package/dist/components/accordion/AccordionCover.svelte +68 -0
  12. package/dist/components/accordion/AccordionCover.svelte.d.ts +13 -0
  13. package/dist/components/accordion/AccordionGroup.svelte +23 -0
  14. package/dist/components/accordion/AccordionGroup.svelte.d.ts +8 -0
  15. package/dist/components/accordion/accordion-url-utils.d.ts +4 -0
  16. package/dist/components/accordion/accordion-url-utils.js +48 -0
  17. package/dist/components/accordion/index.d.ts +29 -0
  18. package/dist/components/accordion/index.js +6 -0
  19. package/dist/components/badge/Badge.svelte +152 -0
  20. package/dist/components/badge/Badge.svelte.d.ts +23 -0
  21. package/dist/components/badge/index.d.ts +1 -0
  22. package/dist/components/badge/index.js +2 -0
  23. package/dist/components/callout/Callout.svelte +317 -0
  24. package/dist/components/callout/Callout.svelte.d.ts +17 -0
  25. package/dist/components/callout/Check.svelte +9 -0
  26. package/dist/components/callout/Check.svelte.d.ts +4 -0
  27. package/dist/components/callout/Danger.svelte +9 -0
  28. package/dist/components/callout/Danger.svelte.d.ts +4 -0
  29. package/dist/components/callout/Info.svelte +9 -0
  30. package/dist/components/callout/Info.svelte.d.ts +4 -0
  31. package/dist/components/callout/Note.svelte +9 -0
  32. package/dist/components/callout/Note.svelte.d.ts +4 -0
  33. package/dist/components/callout/Tip.svelte +9 -0
  34. package/dist/components/callout/Tip.svelte.d.ts +4 -0
  35. package/dist/components/callout/Warning.svelte +9 -0
  36. package/dist/components/callout/Warning.svelte.d.ts +4 -0
  37. package/dist/components/callout/index.d.ts +8 -0
  38. package/dist/components/callout/index.js +8 -0
  39. package/dist/components/card/Card.svelte +172 -0
  40. package/dist/components/card/Card.svelte.d.ts +21 -0
  41. package/dist/components/card/index.d.ts +3 -0
  42. package/dist/components/card/index.js +2 -0
  43. package/dist/components/code-block/BaseCodeBlock.svelte +249 -0
  44. package/dist/components/code-block/BaseCodeBlock.svelte.d.ts +10 -0
  45. package/dist/components/code-block/CodeBlock.svelte +185 -0
  46. package/dist/components/code-block/CodeBlock.svelte.d.ts +5 -0
  47. package/dist/components/code-block/CodeFooter.svelte +34 -0
  48. package/dist/components/code-block/CodeFooter.svelte.d.ts +8 -0
  49. package/dist/components/code-block/CodeHeader.svelte +52 -0
  50. package/dist/components/code-block/CodeHeader.svelte.d.ts +11 -0
  51. package/dist/components/code-block/CopyToClipboardButton.svelte +124 -0
  52. package/dist/components/code-block/CopyToClipboardButton.svelte.d.ts +4 -0
  53. package/dist/components/code-block/index.d.ts +10 -0
  54. package/dist/components/code-block/index.js +5 -0
  55. package/dist/components/code-block/types.d.ts +85 -0
  56. package/dist/components/code-block/types.js +1 -0
  57. package/dist/components/code-group/CodeGroup.svelte +327 -0
  58. package/dist/components/code-group/CodeGroup.svelte.d.ts +24 -0
  59. package/dist/components/code-group/CodeGroupSelect.svelte +170 -0
  60. package/dist/components/code-group/CodeGroupSelect.svelte.d.ts +25 -0
  61. package/dist/components/code-group/CodeSelectDropdown.svelte +74 -0
  62. package/dist/components/code-group/CodeSelectDropdown.svelte.d.ts +9 -0
  63. package/dist/components/code-group/LanguageDropdown.svelte +134 -0
  64. package/dist/components/code-group/LanguageDropdown.svelte.d.ts +11 -0
  65. package/dist/components/code-group/LanguageIcon.svelte +24 -0
  66. package/dist/components/code-group/LanguageIcon.svelte.d.ts +8 -0
  67. package/dist/components/code-group/context.d.ts +14 -0
  68. package/dist/components/code-group/context.js +2 -0
  69. package/dist/components/code-group/index.d.ts +8 -0
  70. package/dist/components/code-group/index.js +4 -0
  71. package/dist/components/color/Color.svelte +34 -0
  72. package/dist/components/color/Color.svelte.d.ts +10 -0
  73. package/dist/components/color/ColorItem.svelte +140 -0
  74. package/dist/components/color/ColorItem.svelte.d.ts +10 -0
  75. package/dist/components/color/ColorRow.svelte +27 -0
  76. package/dist/components/color/ColorRow.svelte.d.ts +8 -0
  77. package/dist/components/color/index.d.ts +1 -0
  78. package/dist/components/color/index.js +8 -0
  79. package/dist/components/columns/Box.svelte +15 -0
  80. package/dist/components/columns/Box.svelte.d.ts +7 -0
  81. package/dist/components/columns/Columns.svelte +31 -0
  82. package/dist/components/columns/Columns.svelte.d.ts +10 -0
  83. package/dist/components/columns/constants.d.ts +5 -0
  84. package/dist/components/columns/constants.js +3 -0
  85. package/dist/components/columns/index.d.ts +5 -0
  86. package/dist/components/columns/index.js +3 -0
  87. package/dist/components/expandable/Expandable.svelte +182 -0
  88. package/dist/components/expandable/Expandable.svelte.d.ts +22 -0
  89. package/dist/components/expandable/index.d.ts +3 -0
  90. package/dist/components/expandable/index.js +2 -0
  91. package/dist/components/frame/Frame.svelte +118 -0
  92. package/dist/components/frame/Frame.svelte.d.ts +15 -0
  93. package/dist/components/frame/index.d.ts +3 -0
  94. package/dist/components/frame/index.js +2 -0
  95. package/dist/components/icon/Icon.svelte +129 -0
  96. package/dist/components/icon/Icon.svelte.d.ts +18 -0
  97. package/dist/components/icon/index.d.ts +2 -0
  98. package/dist/components/icon/index.js +1 -0
  99. package/dist/components/index.d.ts +22 -0
  100. package/dist/components/index.js +22 -0
  101. package/dist/components/mermaid/Mermaid.svelte +181 -0
  102. package/dist/components/mermaid/Mermaid.svelte.d.ts +11 -0
  103. package/dist/components/mermaid/ZoomControls.svelte +74 -0
  104. package/dist/components/mermaid/ZoomControls.svelte.d.ts +12 -0
  105. package/dist/components/mermaid/index.d.ts +7 -0
  106. package/dist/components/mermaid/index.js +4 -0
  107. package/dist/components/mermaid/use-pan-zoom.svelte.d.ts +11 -0
  108. package/dist/components/mermaid/use-pan-zoom.svelte.js +41 -0
  109. package/dist/components/panel/Panel.svelte +27 -0
  110. package/dist/components/panel/Panel.svelte.d.ts +9 -0
  111. package/dist/components/panel/index.d.ts +3 -0
  112. package/dist/components/panel/index.js +2 -0
  113. package/dist/components/property/DeprecatedPill.svelte +16 -0
  114. package/dist/components/property/DeprecatedPill.svelte.d.ts +6 -0
  115. package/dist/components/property/InfoPill.svelte +32 -0
  116. package/dist/components/property/InfoPill.svelte.d.ts +10 -0
  117. package/dist/components/property/ParamHead.svelte +188 -0
  118. package/dist/components/property/ParamHead.svelte.d.ts +22 -0
  119. package/dist/components/property/Property.svelte +123 -0
  120. package/dist/components/property/Property.svelte.d.ts +24 -0
  121. package/dist/components/property/RequiredPill.svelte +16 -0
  122. package/dist/components/property/RequiredPill.svelte.d.ts +6 -0
  123. package/dist/components/property/index.d.ts +11 -0
  124. package/dist/components/property/index.js +6 -0
  125. package/dist/components/search/index.d.ts +7 -0
  126. package/dist/components/search/index.js +4 -0
  127. package/dist/components/search/use-search.d.ts +9 -0
  128. package/dist/components/search/use-search.js +6 -0
  129. package/dist/components/steps/Step.svelte +314 -0
  130. package/dist/components/steps/Step.svelte.d.ts +26 -0
  131. package/dist/components/steps/Steps.svelte +51 -0
  132. package/dist/components/steps/Steps.svelte.d.ts +11 -0
  133. package/dist/components/steps/constants.d.ts +4 -0
  134. package/dist/components/steps/constants.js +2 -0
  135. package/dist/components/steps/context.d.ts +10 -0
  136. package/dist/components/steps/context.js +2 -0
  137. package/dist/components/steps/index.d.ts +32 -0
  138. package/dist/components/steps/index.js +6 -0
  139. package/dist/components/tabs/Tabs.svelte +254 -0
  140. package/dist/components/tabs/Tabs.svelte.d.ts +16 -0
  141. package/dist/components/tabs/TabsItem.svelte +56 -0
  142. package/dist/components/tabs/TabsItem.svelte.d.ts +15 -0
  143. package/dist/components/tabs/context.d.ts +20 -0
  144. package/dist/components/tabs/context.js +2 -0
  145. package/dist/components/tabs/index.d.ts +27 -0
  146. package/dist/components/tabs/index.js +5 -0
  147. package/dist/components/tile/Tile.svelte +124 -0
  148. package/dist/components/tile/Tile.svelte.d.ts +12 -0
  149. package/dist/components/tile/index.d.ts +2 -0
  150. package/dist/components/tile/index.js +1 -0
  151. package/dist/components/tooltip/Tooltip.svelte +170 -0
  152. package/dist/components/tooltip/Tooltip.svelte.d.ts +23 -0
  153. package/dist/components/tooltip/index.d.ts +2 -0
  154. package/dist/components/tooltip/index.js +1 -0
  155. package/dist/components/tree/Tree.svelte +226 -0
  156. package/dist/components/tree/Tree.svelte.d.ts +9 -0
  157. package/dist/components/tree/TreeFile.svelte +44 -0
  158. package/dist/components/tree/TreeFile.svelte.d.ts +6 -0
  159. package/dist/components/tree/TreeFolder.svelte +107 -0
  160. package/dist/components/tree/TreeFolder.svelte.d.ts +10 -0
  161. package/dist/components/tree/context.d.ts +3 -0
  162. package/dist/components/tree/context.js +7 -0
  163. package/dist/components/tree/index.d.ts +10 -0
  164. package/dist/components/tree/index.js +9 -0
  165. package/dist/components/tree/tree-level-context.d.ts +8 -0
  166. package/dist/components/tree/tree-level-context.js +7 -0
  167. package/dist/components/tree/use-tree-level.d.ts +3 -0
  168. package/dist/components/tree/use-tree-level.js +5 -0
  169. package/dist/components/tree/utils.d.ts +9 -0
  170. package/dist/components/tree/utils.js +86 -0
  171. package/dist/components/update/Update.svelte +210 -0
  172. package/dist/components/update/Update.svelte.d.ts +34 -0
  173. package/dist/components/update/index.d.ts +4 -0
  174. package/dist/components/update/index.js +3 -0
  175. package/dist/components/view/View.svelte +52 -0
  176. package/dist/components/view/View.svelte.d.ts +14 -0
  177. package/dist/components/view/index.d.ts +3 -0
  178. package/dist/components/view/index.js +2 -0
  179. package/dist/constants/brands.d.ts +2 -0
  180. package/dist/constants/brands.js +4 -0
  181. package/dist/constants/index.d.ts +6 -0
  182. package/dist/constants/index.js +6 -0
  183. package/dist/constants/selectors.d.ts +125 -0
  184. package/dist/constants/selectors.js +125 -0
  185. package/dist/hooks/index.d.ts +8 -0
  186. package/dist/hooks/index.js +6 -0
  187. package/dist/hooks/use-expandable-memory.svelte.d.ts +6 -0
  188. package/dist/hooks/use-expandable-memory.svelte.js +89 -0
  189. package/dist/hooks/use-expandable.svelte.d.ts +15 -0
  190. package/dist/hooks/use-expandable.svelte.js +53 -0
  191. package/dist/hooks/use-get-shiki-highlighted-html.svelte.d.ts +8 -0
  192. package/dist/hooks/use-get-shiki-highlighted-html.svelte.js +36 -0
  193. package/dist/hooks/use-has-hover.d.ts +2 -0
  194. package/dist/hooks/use-has-hover.js +10 -0
  195. package/dist/hooks/use-is-dark-theme.svelte.d.ts +3 -0
  196. package/dist/hooks/use-is-dark-theme.svelte.js +25 -0
  197. package/dist/hooks/use-isomorphic-layout-effect.d.ts +3 -0
  198. package/dist/hooks/use-isomorphic-layout-effect.js +6 -0
  199. package/dist/index.d.ts +2 -0
  200. package/dist/index.js +2 -0
  201. package/dist/styles.css +2 -0
  202. package/dist/utils/cn.d.ts +3 -0
  203. package/dist/utils/cn.js +7 -0
  204. package/dist/utils/copy-to-clipboard.d.ts +4 -0
  205. package/dist/utils/copy-to-clipboard.js +50 -0
  206. package/dist/utils/dedent.d.ts +1 -0
  207. package/dist/utils/dedent.js +125 -0
  208. package/dist/utils/enhance-video-props.d.ts +4 -0
  209. package/dist/utils/enhance-video-props.js +25 -0
  210. package/dist/utils/get-node-text.d.ts +2 -0
  211. package/dist/utils/get-node-text.js +26 -0
  212. package/dist/utils/icon-utils.d.ts +18 -0
  213. package/dist/utils/icon-utils.js +30 -0
  214. package/dist/utils/is-absolute-url.d.ts +4 -0
  215. package/dist/utils/is-absolute-url.js +11 -0
  216. package/dist/utils/is-remote-url.d.ts +2 -0
  217. package/dist/utils/is-remote-url.js +12 -0
  218. package/dist/utils/make-marker-ids-unique.d.ts +2 -0
  219. package/dist/utils/make-marker-ids-unique.js +36 -0
  220. package/dist/utils/shiki/code-styling.d.ts +13 -0
  221. package/dist/utils/shiki/code-styling.js +1 -0
  222. package/dist/utils/shiki/constants.d.ts +21 -0
  223. package/dist/utils/shiki/constants.js +116 -0
  224. package/dist/utils/shiki/get-code-styling.d.ts +9 -0
  225. package/dist/utils/shiki/get-code-styling.js +38 -0
  226. package/dist/utils/shiki/get-shiki-background-colors.d.ts +20 -0
  227. package/dist/utils/shiki/get-shiki-background-colors.js +56 -0
  228. package/dist/utils/shiki/index.d.ts +30 -0
  229. package/dist/utils/shiki/index.js +209 -0
  230. package/dist/utils/shiki/lib.d.ts +4 -0
  231. package/dist/utils/shiki/lib.js +49 -0
  232. package/dist/utils/shiki/shiki-themes.d.ts +2 -0
  233. package/dist/utils/shiki/shiki-themes.js +64 -0
  234. package/dist/utils/shiki/snippet-presets.d.ts +27 -0
  235. package/dist/utils/shiki/snippet-presets.js +44 -0
  236. package/dist/utils/shiki/worker-client.d.ts +9 -0
  237. package/dist/utils/shiki/worker-client.js +22 -0
  238. package/dist/utils/shiki/worker.d.ts +1 -0
  239. package/dist/utils/shiki/worker.js +134 -0
  240. package/dist/utils/slugify.d.ts +2 -0
  241. package/dist/utils/slugify.js +9 -0
  242. package/package.json +100 -0
@@ -0,0 +1,12 @@
1
+ const isRemoteUrl = (url) => {
2
+ if (typeof url !== "string")
3
+ return false;
4
+ try {
5
+ const urlObj = new URL(url);
6
+ return urlObj.protocol === "https:" || urlObj.protocol === "http:";
7
+ }
8
+ catch {
9
+ return false;
10
+ }
11
+ };
12
+ export { isRemoteUrl };
@@ -0,0 +1,2 @@
1
+ declare const makeMarkerIdsUnique: (svg: string, prefix: string) => string;
2
+ export { makeMarkerIdsUnique };
@@ -0,0 +1,36 @@
1
+ const MARKER_IDS = [
2
+ "arrowhead",
3
+ "crosshead",
4
+ "filled-head",
5
+ "sequencenumber",
6
+ "compositionStart",
7
+ "compositionEnd",
8
+ "aggregationStart",
9
+ "aggregationEnd",
10
+ "dependencyStart",
11
+ "dependencyEnd",
12
+ "extensionStart",
13
+ "extensionEnd",
14
+ "lollipopStart",
15
+ "lollipopEnd",
16
+ "ZERO_OR_ONE_START",
17
+ "ZERO_OR_ONE_END",
18
+ "ONLY_ONE_START",
19
+ "ONLY_ONE_END",
20
+ "ZERO_OR_MORE_START",
21
+ "ZERO_OR_MORE_END",
22
+ "ONE_OR_MORE_START",
23
+ "ONE_OR_MORE_END",
24
+ "MD_PARENT_START",
25
+ "MD_PARENT_END",
26
+ ];
27
+ const makeMarkerIdsUnique = (svg, prefix) => {
28
+ let result = svg;
29
+ for (const markerId of MARKER_IDS) {
30
+ const uniqueMarkerId = `${prefix}-${markerId}`;
31
+ result = result.replace(new RegExp(`id="${markerId}"`, "g"), `id="${uniqueMarkerId}"`);
32
+ result = result.replace(new RegExp(`url\\(#${markerId}\\)`, "g"), `url(#${uniqueMarkerId})`);
33
+ }
34
+ return result;
35
+ };
36
+ export { makeMarkerIdsUnique };
@@ -0,0 +1,13 @@
1
+ import type { SHIKI_THEMES } from "./shiki-themes";
2
+ type CodeBlockTheme = "dark" | "system";
3
+ type ShikiTheme = (typeof SHIKI_THEMES)[number];
4
+ type CodeStyling = CodeBlockTheme | {
5
+ languages?: {
6
+ custom?: string[];
7
+ };
8
+ theme?: ShikiTheme | {
9
+ light: ShikiTheme;
10
+ dark: ShikiTheme;
11
+ };
12
+ } | undefined;
13
+ export type { CodeStyling, CodeBlockTheme, ShikiTheme };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ import type { ShikiTheme } from "./code-styling";
2
+ import { SHIKI_THEMES } from "./shiki-themes";
3
+ declare const DEFAULT_DARK_THEME = "dark-plus";
4
+ declare const DEFAULT_LIGHT_THEME = "github-light-default";
5
+ type ShikiThemeType = (typeof SHIKI_THEMES)[number];
6
+ declare const LINE_HIGHLIGHT_CLASS_NAME = "line-highlight";
7
+ declare const LINE_FOCUS_CLASS_NAME = "line-focus";
8
+ declare const LINE_DIFF_ADD_CLASS_NAME = "line-diff line-add";
9
+ declare const LINE_DIFF_REMOVE_CLASS_NAME = "line-diff line-remove";
10
+ declare const SHIKI_CLASSNAME = "shiki shiki-themes";
11
+ declare const SHIKI_THEMES_EXCLUDING_CSS_VARIABLES_AND_DEFAULTS: ("red" | "andromeeda" | "aurora-x" | "ayu-dark" | "catppuccin-frappe" | "catppuccin-latte" | "catppuccin-macchiato" | "catppuccin-mocha" | "dracula" | "dracula-soft" | "everforest-dark" | "everforest-light" | "github-dark" | "github-dark-default" | "github-dark-dimmed" | "github-dark-high-contrast" | "github-light" | "github-light-high-contrast" | "gruvbox-dark-hard" | "gruvbox-dark-medium" | "gruvbox-dark-soft" | "gruvbox-light-hard" | "gruvbox-light-medium" | "gruvbox-light-soft" | "houston" | "kanagawa-dragon" | "kanagawa-lotus" | "kanagawa-wave" | "laserwave" | "light-plus" | "material-theme" | "material-theme-darker" | "material-theme-lighter" | "material-theme-ocean" | "material-theme-palenight" | "min-dark" | "min-light" | "monokai" | "night-owl" | "nord" | "one-dark-pro" | "one-light" | "plastic" | "poimandres" | "rose-pine" | "rose-pine-dawn" | "rose-pine-moon" | "slack-dark" | "slack-ochin" | "snazzy-light" | "solarized-dark" | "solarized-light" | "synthwave-84" | "tokyo-night" | "vesper" | "vitesse-black" | "vitesse-dark" | "vitesse-light")[];
12
+ declare const DEFAULT_DARK_BG = "#0B0C0E";
13
+ declare const DEFAULT_LIGHT_BG = "#FFFFFF";
14
+ declare const THEMES: [ShikiTheme, ShikiTheme, ...ShikiTheme[]];
15
+ declare const SHIKI_THEME_MAP: Record<"dark" | "light", ShikiTheme>;
16
+ declare const LANGS: readonly ["bash", "c", "c++", "dart", "go", "java", "javascript", "json", "kotlin", "php", "python", "ruby", "rust", "swift", "csharp", "typescript", "tsx", "yaml"];
17
+ type ShikiLanguage = (typeof LANGS)[number];
18
+ declare const SHIKI_COLOR_REPLACEMENTS: Record<string, string | Record<string, string>>;
19
+ declare const SHIKI_LANG_MAP: Record<string, ShikiLanguage>;
20
+ declare const SHIKI_DISPLAY_LANG_MAP: Record<string, string>;
21
+ export { SHIKI_CLASSNAME, SHIKI_LANG_MAP, SHIKI_COLOR_REPLACEMENTS, SHIKI_DISPLAY_LANG_MAP, SHIKI_THEME_MAP, SHIKI_THEMES_EXCLUDING_CSS_VARIABLES_AND_DEFAULTS, type ShikiLanguage, type ShikiThemeType, THEMES, LANGS, DEFAULT_DARK_BG, DEFAULT_LIGHT_BG, LINE_HIGHLIGHT_CLASS_NAME, LINE_FOCUS_CLASS_NAME, LINE_DIFF_ADD_CLASS_NAME, LINE_DIFF_REMOVE_CLASS_NAME, DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME, };
@@ -0,0 +1,116 @@
1
+ import { SHIKI_THEMES } from "./shiki-themes";
2
+ const DEFAULT_DARK_THEME = "dark-plus";
3
+ const DEFAULT_LIGHT_THEME = "github-light-default";
4
+ const LINE_HIGHLIGHT_CLASS_NAME = "line-highlight";
5
+ const LINE_FOCUS_CLASS_NAME = "line-focus";
6
+ const LINE_DIFF_ADD_CLASS_NAME = "line-diff line-add";
7
+ const LINE_DIFF_REMOVE_CLASS_NAME = "line-diff line-remove";
8
+ const SHIKI_CLASSNAME = "shiki shiki-themes";
9
+ const SHIKI_THEMES_EXCLUDING_CSS_VARIABLES_AND_DEFAULTS = SHIKI_THEMES.filter((theme) => theme !== "css-variables" &&
10
+ theme !== DEFAULT_DARK_THEME &&
11
+ theme !== DEFAULT_LIGHT_THEME);
12
+ const DEFAULT_DARK_BG = "#0B0C0E";
13
+ const DEFAULT_LIGHT_BG = "#FFFFFF";
14
+ const THEMES = [
15
+ DEFAULT_DARK_THEME,
16
+ DEFAULT_LIGHT_THEME,
17
+ ...SHIKI_THEMES_EXCLUDING_CSS_VARIABLES_AND_DEFAULTS,
18
+ ];
19
+ const SHIKI_THEME_MAP = {
20
+ dark: THEMES[0],
21
+ light: THEMES[1],
22
+ };
23
+ const LANGS = [
24
+ "bash",
25
+ "c",
26
+ "c++",
27
+ "dart",
28
+ "go",
29
+ "java",
30
+ "javascript",
31
+ "json",
32
+ "kotlin",
33
+ "php",
34
+ "python",
35
+ "ruby",
36
+ "rust",
37
+ "swift",
38
+ "csharp",
39
+ "typescript",
40
+ "tsx",
41
+ "yaml",
42
+ ];
43
+ const SHIKI_COLOR_REPLACEMENTS = {
44
+ [THEMES[0]]: {
45
+ "#1e1e1e": DEFAULT_DARK_BG,
46
+ },
47
+ };
48
+ const SHIKI_LANG_MAP = {
49
+ curl: "bash",
50
+ bash: "bash",
51
+ sh: "bash",
52
+ shell: "bash",
53
+ zsh: "bash",
54
+ shellscript: "bash",
55
+ c: "c",
56
+ csharp: "csharp",
57
+ "c++": "c++",
58
+ cpp: "c++",
59
+ cc: "c++",
60
+ go: "go",
61
+ golang: "go",
62
+ java: "java",
63
+ javascript: "javascript",
64
+ js: "javascript",
65
+ node: "javascript",
66
+ nodejs: "javascript",
67
+ json: "json",
68
+ jsonc: "json",
69
+ json5: "json",
70
+ php: "php",
71
+ python: "python",
72
+ py: "python",
73
+ typescript: "typescript",
74
+ ts: "typescript",
75
+ tsx: "tsx",
76
+ react: "tsx",
77
+ reactts: "tsx",
78
+ "react-ts": "tsx",
79
+ jsx: "tsx",
80
+ ruby: "ruby",
81
+ rb: "ruby",
82
+ rust: "rust",
83
+ rs: "rust",
84
+ rustc: "rust",
85
+ swift: "swift",
86
+ kotlin: "kotlin",
87
+ kt: "kotlin",
88
+ dart: "dart",
89
+ flutter: "dart",
90
+ yaml: "yaml",
91
+ yml: "yaml",
92
+ toml: "yaml",
93
+ };
94
+ const SHIKI_DISPLAY_LANG_MAP = {
95
+ bash: "cURL",
96
+ c: "C",
97
+ "c++": "C++",
98
+ "c#": "C#",
99
+ ".NET": ".NET",
100
+ dart: "Dart",
101
+ go: "Go",
102
+ java: "Java",
103
+ javascript: "Javascript",
104
+ json: "JSON",
105
+ kotlin: "Kotlin",
106
+ node: "Node.js",
107
+ php: "PHP",
108
+ python: "Python",
109
+ ruby: "Ruby",
110
+ rust: "Rust",
111
+ swift: "Swift",
112
+ typescript: "Typescript",
113
+ tsx: "TSX",
114
+ yaml: "YAML",
115
+ };
116
+ export { SHIKI_CLASSNAME, SHIKI_LANG_MAP, SHIKI_COLOR_REPLACEMENTS, SHIKI_DISPLAY_LANG_MAP, SHIKI_THEME_MAP, SHIKI_THEMES_EXCLUDING_CSS_VARIABLES_AND_DEFAULTS, THEMES, LANGS, DEFAULT_DARK_BG, DEFAULT_LIGHT_BG, LINE_HIGHLIGHT_CLASS_NAME, LINE_FOCUS_CLASS_NAME, LINE_DIFF_ADD_CLASS_NAME, LINE_DIFF_REMOVE_CLASS_NAME, DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME, };
@@ -0,0 +1,9 @@
1
+ import type { CodeStyling } from "./code-styling";
2
+ import { type ShikiThemeType } from "./constants";
3
+ declare const codeStylingToThemeOrThemes: (codeStylingFromConfig: CodeStyling) => {
4
+ themes: {
5
+ light: ShikiThemeType;
6
+ dark: ShikiThemeType;
7
+ };
8
+ };
9
+ export { codeStylingToThemeOrThemes };
@@ -0,0 +1,38 @@
1
+ import { DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME, } from "./constants";
2
+ const codeStylingToThemeOrThemes = (codeStylingFromConfig) => {
3
+ if (typeof codeStylingFromConfig === "object" &&
4
+ codeStylingFromConfig &&
5
+ "theme" in codeStylingFromConfig &&
6
+ typeof codeStylingFromConfig.theme === "object" &&
7
+ codeStylingFromConfig.theme) {
8
+ return {
9
+ themes: codeStylingFromConfig.theme,
10
+ };
11
+ }
12
+ if (typeof codeStylingFromConfig === "object" &&
13
+ codeStylingFromConfig &&
14
+ "theme" in codeStylingFromConfig &&
15
+ typeof codeStylingFromConfig.theme === "string") {
16
+ return {
17
+ themes: {
18
+ light: codeStylingFromConfig.theme,
19
+ dark: codeStylingFromConfig.theme,
20
+ },
21
+ };
22
+ }
23
+ if (codeStylingFromConfig === "dark") {
24
+ return {
25
+ themes: {
26
+ light: DEFAULT_DARK_THEME,
27
+ dark: DEFAULT_DARK_THEME,
28
+ },
29
+ };
30
+ }
31
+ return {
32
+ themes: {
33
+ light: DEFAULT_LIGHT_THEME,
34
+ dark: DEFAULT_DARK_THEME,
35
+ },
36
+ };
37
+ };
38
+ export { codeStylingToThemeOrThemes };
@@ -0,0 +1,20 @@
1
+ import type { CodeBlockTheme } from "./code-styling";
2
+ declare const getShikiBackgroundColors: (codeBlockTheme: CodeBlockTheme, html: string | undefined, children: unknown) => {
3
+ light: string | undefined;
4
+ dark: string | undefined;
5
+ } | undefined;
6
+ declare const getBackgroundColorsFromHtml: (html: string, defaultBgColors: {
7
+ light: string;
8
+ dark: string;
9
+ }) => {
10
+ light: string | undefined;
11
+ dark: string | undefined;
12
+ };
13
+ declare const getBackgroundColorsFromChildren: (children: unknown, defaultBgColors: {
14
+ light: string;
15
+ dark: string;
16
+ }) => {
17
+ light: string | undefined;
18
+ dark: string | undefined;
19
+ };
20
+ export { getShikiBackgroundColors, getBackgroundColorsFromHtml, getBackgroundColorsFromChildren, };
@@ -0,0 +1,56 @@
1
+ import { DEFAULT_DARK_BG, DEFAULT_LIGHT_BG } from "./constants";
2
+ const getShikiBackgroundColors = (codeBlockTheme, html, children) => {
3
+ const defaultBgColors = codeBlockTheme === "dark"
4
+ ? { light: DEFAULT_DARK_BG, dark: DEFAULT_DARK_BG }
5
+ : { light: DEFAULT_LIGHT_BG, dark: DEFAULT_DARK_BG };
6
+ if (html) {
7
+ return getBackgroundColorsFromHtml(html, defaultBgColors);
8
+ }
9
+ if (children) {
10
+ return getBackgroundColorsFromChildren(children, defaultBgColors);
11
+ }
12
+ return defaultBgColors;
13
+ };
14
+ const isTransparentOrUndefined = (color) => color === "transparent" || color === undefined;
15
+ const getBackgroundColorsFromHtml = (html, defaultBgColors) => {
16
+ const styles = html.split('style="');
17
+ if (styles.length < 2) {
18
+ return defaultBgColors;
19
+ }
20
+ const backgroundColor = styles[1]
21
+ ?.split("background-color:")[1]
22
+ ?.split(";")[0];
23
+ const shikiDarkBgValue = styles[1]
24
+ ?.split("--shiki-dark-bg:")[1]
25
+ ?.split(";")[0];
26
+ return {
27
+ light: isTransparentOrUndefined(backgroundColor)
28
+ ? defaultBgColors.light
29
+ : backgroundColor,
30
+ dark: isTransparentOrUndefined(shikiDarkBgValue)
31
+ ? defaultBgColors.dark
32
+ : shikiDarkBgValue,
33
+ };
34
+ };
35
+ const getBackgroundColorsFromChildren = (children, defaultBgColors) => {
36
+ if (children &&
37
+ typeof children === "object" &&
38
+ "style" in children &&
39
+ children.style &&
40
+ typeof children.style === "object" &&
41
+ "backgroundColor" in children.style &&
42
+ typeof children.style.backgroundColor === "string" &&
43
+ "--shiki-dark-bg" in children.style &&
44
+ typeof children.style["--shiki-dark-bg"] === "string") {
45
+ return {
46
+ light: isTransparentOrUndefined(children.style.backgroundColor)
47
+ ? defaultBgColors.light
48
+ : children.style.backgroundColor,
49
+ dark: isTransparentOrUndefined(children.style["--shiki-dark-bg"])
50
+ ? defaultBgColors.dark
51
+ : children.style["--shiki-dark-bg"],
52
+ };
53
+ }
54
+ return defaultBgColors;
55
+ };
56
+ export { getShikiBackgroundColors, getBackgroundColorsFromHtml, getBackgroundColorsFromChildren, };
@@ -0,0 +1,30 @@
1
+ import type { ShikiTransformer } from "@shikijs/types";
2
+ import type { CodeToHastOptions } from "shiki/types";
3
+ import type { CodeStyling } from "./code-styling";
4
+ import { SHIKI_CLASSNAME, type ShikiLanguage } from "./constants";
5
+ declare const SHIKI_TRANSFORMERS: ShikiTransformer[];
6
+ declare const highlighterPromise: Promise<void>;
7
+ declare function getShikiLanguage(lang: string | undefined): ShikiLanguage;
8
+ declare function getLanguageFromClassName(className: string | undefined, fallback?: string): string;
9
+ declare function loadShikiThemes(codeblocks?: CodeStyling): Promise<void>;
10
+ type ShikiHighlightedHtmlArgs = {
11
+ codeString: string;
12
+ codeBlockTheme: CodeStyling;
13
+ opts?: Partial<CodeToHastOptions> & {
14
+ highlightedLines?: number[];
15
+ focusedLines?: number[];
16
+ noAsync?: boolean;
17
+ };
18
+ } & ({
19
+ className: string | undefined;
20
+ fileName?: string;
21
+ } | {
22
+ language: string;
23
+ });
24
+ declare function getShikiHighlightedHtml(props: ShikiHighlightedHtmlArgs & {
25
+ opts: ShikiHighlightedHtmlArgs["opts"] & {
26
+ noAsync: true;
27
+ };
28
+ }): string | undefined;
29
+ declare function getShikiHighlightedHtml(props: ShikiHighlightedHtmlArgs): string | undefined | Promise<string | undefined>;
30
+ export { SHIKI_CLASSNAME, SHIKI_TRANSFORMERS, highlighterPromise, getShikiLanguage, getLanguageFromClassName, loadShikiThemes, type ShikiHighlightedHtmlArgs, getShikiHighlightedHtml, };
@@ -0,0 +1,209 @@
1
+ import { transformerMetaHighlight, transformerNotationDiff, transformerNotationFocus, transformerNotationHighlight, } from "@shikijs/transformers";
2
+ import { createHighlighter, hastToHtml } from "shiki";
3
+ import { createJavaScriptRegexEngine } from "shiki/engine/javascript";
4
+ import { MAX_PREVIEW_BYTES } from "../../constants";
5
+ import { codeStylingToThemeOrThemes } from "./get-code-styling";
6
+ import { getShikiLanguageFromPreset } from "./snippet-presets";
7
+ import { DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME, LANGS, LINE_DIFF_ADD_CLASS_NAME, LINE_DIFF_REMOVE_CLASS_NAME, LINE_FOCUS_CLASS_NAME, LINE_HIGHLIGHT_CLASS_NAME, SHIKI_COLOR_REPLACEMENTS, SHIKI_LANG_MAP, SHIKI_CLASSNAME, } from "./constants";
8
+ import { getShikiWorker } from "./worker-client";
9
+ const matchAlgorithm = {
10
+ matchAlgorithm: "v3",
11
+ };
12
+ const SHIKI_TRANSFORMERS = [
13
+ transformerMetaHighlight({
14
+ className: LINE_HIGHLIGHT_CLASS_NAME,
15
+ }),
16
+ transformerNotationHighlight({
17
+ ...matchAlgorithm,
18
+ classActiveLine: LINE_HIGHLIGHT_CLASS_NAME,
19
+ }),
20
+ transformerNotationFocus({
21
+ ...matchAlgorithm,
22
+ classActiveLine: LINE_FOCUS_CLASS_NAME,
23
+ }),
24
+ transformerNotationDiff({
25
+ ...matchAlgorithm,
26
+ classLineAdd: LINE_DIFF_ADD_CLASS_NAME,
27
+ classLineRemove: LINE_DIFF_REMOVE_CLASS_NAME,
28
+ }),
29
+ ];
30
+ const jsEngine = createJavaScriptRegexEngine({
31
+ forgiving: true,
32
+ cache: new Map(),
33
+ });
34
+ let highlighter;
35
+ let highlighterError;
36
+ let highlighterResolved = false;
37
+ const highlighterPromise = createHighlighter({
38
+ themes: [],
39
+ langs: [...LANGS],
40
+ engine: jsEngine,
41
+ })
42
+ .then((resolvedHighlighter) => {
43
+ highlighter = resolvedHighlighter;
44
+ })
45
+ .catch((error) => {
46
+ console.error(error);
47
+ highlighterError =
48
+ error ?? new Error("Unknown error occurred initializing highlighter");
49
+ })
50
+ .finally(() => {
51
+ highlighterResolved = true;
52
+ });
53
+ function getShikiLanguage(lang) {
54
+ const text = "text";
55
+ if (lang === undefined) {
56
+ return text;
57
+ }
58
+ const possibleStatusCode = Number(lang);
59
+ if (!Number.isNaN(possibleStatusCode) &&
60
+ possibleStatusCode > 99 &&
61
+ possibleStatusCode < 600) {
62
+ return "json";
63
+ }
64
+ const lower = lang.toLowerCase();
65
+ const presetLang = getShikiLanguageFromPreset(lower);
66
+ return SHIKI_LANG_MAP[presetLang] ?? SHIKI_LANG_MAP[lower] ?? text;
67
+ }
68
+ function getLanguageFromClassName(className, fallback) {
69
+ // biome-ignore lint/performance/useTopLevelRegex: TODO
70
+ const match = /language-(\w+)/.exec(className ?? "");
71
+ return match ? (match[1] ?? "text") : (fallback ?? "text");
72
+ }
73
+ function getThemesForCodeStyling(codeblocks) {
74
+ if (typeof codeblocks === "string" || !codeblocks) {
75
+ return codeblocks === "system" || !codeblocks
76
+ ? [DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME]
77
+ : [DEFAULT_DARK_THEME];
78
+ }
79
+ const { theme } = codeblocks;
80
+ if (typeof theme === "string") {
81
+ return [theme];
82
+ }
83
+ if (typeof theme === "object" && theme) {
84
+ return [theme.dark, theme.light];
85
+ }
86
+ return [DEFAULT_DARK_THEME, DEFAULT_LIGHT_THEME];
87
+ }
88
+ function areThemesLoaded(codeblocks) {
89
+ if (!highlighter) {
90
+ return false;
91
+ }
92
+ const loaded = highlighter.getLoadedThemes();
93
+ const needed = getThemesForCodeStyling(codeblocks);
94
+ return needed.every((theme) => theme === "css-variables" || loaded.includes(theme));
95
+ }
96
+ async function loadShikiThemes(codeblocks) {
97
+ await highlighterPromise;
98
+ if (!highlighter) {
99
+ return;
100
+ }
101
+ const loaded = highlighter.getLoadedThemes();
102
+ const toLoad = getThemesForCodeStyling(codeblocks).filter((theme) => theme !== "css-variables" && !loaded.includes(theme));
103
+ if (toLoad.length > 0) {
104
+ await highlighter.loadTheme(...toLoad);
105
+ }
106
+ }
107
+ function getShikiHighlightedHtml(props) {
108
+ if (!props.codeString || highlighterError !== undefined) {
109
+ return undefined;
110
+ }
111
+ if (highlighter === undefined) {
112
+ if (props.opts?.noAsync || highlighterResolved) {
113
+ return undefined;
114
+ }
115
+ return highlighterPromise
116
+ .then(() => getShikiHighlightedHtml(props))
117
+ .catch(() => undefined);
118
+ }
119
+ if (!areThemesLoaded(props.codeBlockTheme)) {
120
+ if (props.opts?.noAsync) {
121
+ return undefined;
122
+ }
123
+ return loadShikiThemes(props.codeBlockTheme)
124
+ .then(() => getShikiHighlightedHtml(props))
125
+ .catch(() => undefined);
126
+ }
127
+ let lang;
128
+ if ("language" in props) {
129
+ if (props.language === "text") {
130
+ return undefined;
131
+ }
132
+ lang = props.language;
133
+ }
134
+ else {
135
+ if (props.className === "lang-text") {
136
+ return undefined;
137
+ }
138
+ lang = getLanguageFromClassName(props.className, props.fileName);
139
+ }
140
+ if (props.codeString.length > MAX_PREVIEW_BYTES * 5) {
141
+ return undefined;
142
+ }
143
+ if (props.codeString.length > MAX_PREVIEW_BYTES) {
144
+ try {
145
+ const worker = getShikiWorker();
146
+ return worker ? worker.highlight(props) : undefined;
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ let html;
153
+ if (lang) {
154
+ try {
155
+ const serializer = props.opts?.highlightedLines?.length || props.opts?.focusedLines?.length
156
+ ? "codeToHast"
157
+ : "codeToHtml";
158
+ const code = props.codeString.trim();
159
+ const themeOrThemes = codeStylingToThemeOrThemes(props.codeBlockTheme);
160
+ html = highlighter[serializer](code, {
161
+ lang: getShikiLanguage(lang),
162
+ ...themeOrThemes,
163
+ colorReplacements: { ...SHIKI_COLOR_REPLACEMENTS },
164
+ transformers: SHIKI_TRANSFORMERS,
165
+ tabindex: false,
166
+ ...props.opts,
167
+ });
168
+ }
169
+ catch (error) {
170
+ console.error("error getting shiki highlighted html", error);
171
+ }
172
+ }
173
+ if (typeof html !== "object") {
174
+ return html;
175
+ }
176
+ const firstChild = html.children[0];
177
+ if (!firstChild) {
178
+ return undefined;
179
+ }
180
+ if (firstChild.type === "element" && firstChild.tagName === "pre") {
181
+ const codeElement = firstChild.children[0];
182
+ if (!codeElement?.children) {
183
+ return hastToHtml(html);
184
+ }
185
+ const spanElements = codeElement.children.filter((child) => child.type === "element" && child.tagName === "span");
186
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO
187
+ spanElements.forEach((child, index) => {
188
+ const actualIndex = index + 1;
189
+ if (typeof child.properties.class === "string") {
190
+ if (props.opts?.highlightedLines?.includes(actualIndex)) {
191
+ child.properties.class += " " + LINE_HIGHLIGHT_CLASS_NAME;
192
+ }
193
+ if (props.opts?.focusedLines?.includes(actualIndex)) {
194
+ child.properties.class += " " + LINE_FOCUS_CLASS_NAME;
195
+ }
196
+ }
197
+ else if (Array.isArray(child.properties.class)) {
198
+ if (props.opts?.highlightedLines?.includes(actualIndex)) {
199
+ child.properties.class.push(LINE_HIGHLIGHT_CLASS_NAME);
200
+ }
201
+ if (props.opts?.focusedLines?.includes(actualIndex)) {
202
+ child.properties.class.push(LINE_FOCUS_CLASS_NAME);
203
+ }
204
+ }
205
+ });
206
+ }
207
+ return hastToHtml(html);
208
+ }
209
+ export { SHIKI_CLASSNAME, SHIKI_TRANSFORMERS, highlighterPromise, getShikiLanguage, getLanguageFromClassName, loadShikiThemes, getShikiHighlightedHtml, };
@@ -0,0 +1,4 @@
1
+ declare function getCodeString(children: unknown, className?: string, forceExtract?: boolean): string;
2
+ declare function calculateCodeLinesFromHtml(html: string | undefined): number;
3
+ declare function useCalculateCodeLines(html: string | undefined, existingNumberOfLines?: number): number | undefined;
4
+ export { getCodeString, calculateCodeLinesFromHtml, useCalculateCodeLines };
@@ -0,0 +1,49 @@
1
+ import { dedent } from "../dedent";
2
+ import { getNodeText } from "../get-node-text";
3
+ import { SHIKI_CLASSNAME } from "./constants";
4
+ function findShikiClassName(children) {
5
+ if (!children || typeof children !== "object") {
6
+ return false;
7
+ }
8
+ if (Array.isArray(children)) {
9
+ for (const child of children) {
10
+ if (findShikiClassName(child)) {
11
+ return true;
12
+ }
13
+ }
14
+ }
15
+ if ("props" in children &&
16
+ children.props &&
17
+ typeof children.props === "object") {
18
+ if ("className" in children.props &&
19
+ typeof children.props.className === "string" &&
20
+ children.props.className.includes(SHIKI_CLASSNAME)) {
21
+ return true;
22
+ }
23
+ if ("children" in children.props) {
24
+ return findShikiClassName(children.props.children);
25
+ }
26
+ }
27
+ return false;
28
+ }
29
+ function getCodeString(children, className, forceExtract = false) {
30
+ const isShiki = className?.includes(SHIKI_CLASSNAME) || findShikiClassName(children);
31
+ if (isShiki && !forceExtract) {
32
+ return "";
33
+ }
34
+ return dedent(getNodeText(children));
35
+ }
36
+ function calculateCodeLinesFromHtml(html) {
37
+ if (!html || typeof html !== "string") {
38
+ return 0;
39
+ }
40
+ const lineMatches = html.match(/<span class="line/g);
41
+ return lineMatches ? lineMatches.length : 0;
42
+ }
43
+ function useCalculateCodeLines(html, existingNumberOfLines) {
44
+ if (existingNumberOfLines !== undefined) {
45
+ return existingNumberOfLines;
46
+ }
47
+ return html ? calculateCodeLinesFromHtml(html) : undefined;
48
+ }
49
+ export { getCodeString, calculateCodeLinesFromHtml, useCalculateCodeLines };
@@ -0,0 +1,2 @@
1
+ declare const SHIKI_THEMES: readonly ["andromeeda", "aurora-x", "ayu-dark", "catppuccin-frappe", "catppuccin-latte", "catppuccin-macchiato", "catppuccin-mocha", "dark-plus", "dracula", "dracula-soft", "everforest-dark", "everforest-light", "github-dark", "github-dark-default", "github-dark-dimmed", "github-dark-high-contrast", "github-light", "github-light-default", "github-light-high-contrast", "gruvbox-dark-hard", "gruvbox-dark-medium", "gruvbox-dark-soft", "gruvbox-light-hard", "gruvbox-light-medium", "gruvbox-light-soft", "houston", "kanagawa-dragon", "kanagawa-lotus", "kanagawa-wave", "laserwave", "light-plus", "material-theme", "material-theme-darker", "material-theme-lighter", "material-theme-ocean", "material-theme-palenight", "min-dark", "min-light", "monokai", "night-owl", "nord", "one-dark-pro", "one-light", "plastic", "poimandres", "red", "rose-pine", "rose-pine-dawn", "rose-pine-moon", "slack-dark", "slack-ochin", "snazzy-light", "solarized-dark", "solarized-light", "synthwave-84", "tokyo-night", "vesper", "vitesse-black", "vitesse-dark", "vitesse-light", "css-variables"];
2
+ export { SHIKI_THEMES };