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,182 @@
1
+ <script module lang="ts">
2
+ // A module-local counter gives each instance a stable ID in SSR and the browser.
3
+ let nextExpandableId = 0;
4
+ </script>
5
+
6
+ <script lang="ts">
7
+ import { onMount as onMountLifecycle } from "svelte";
8
+ import type { Snippet } from "svelte";
9
+ import { Classes } from "../../constants/selectors";
10
+ import Icon from "../icon/Icon.svelte";
11
+ import { useExpandableMemory } from "../../hooks/use-expandable-memory.svelte";
12
+ import { cn } from "../../utils/cn";
13
+
14
+ const EXPANDABLE_CONTENT_CLASS = "expandable-content";
15
+ const DEFAULT_OPENED_TEXT = "Hide";
16
+ const DEFAULT_CLOSED_TEXT = "Show";
17
+ const DEFAULT_TITLE = "child attributes";
18
+
19
+ type ExpandableProps = {
20
+ title?: string;
21
+ defaultOpen?: boolean;
22
+ onChange?: (open: boolean) => void;
23
+ lazy?: boolean;
24
+ class?: string;
25
+ children?: Snippet;
26
+ uniqueParamId?: string;
27
+ onMount?: () => void;
28
+ onOpen?: () => void;
29
+ onClose?: () => void;
30
+ openedText?: string;
31
+ closedText?: string;
32
+ hasScrolledToAnchorRef?: { current: boolean };
33
+ anchor?: string;
34
+ };
35
+
36
+ let {
37
+ title = DEFAULT_TITLE,
38
+ defaultOpen = false,
39
+ onChange: onChangeProp,
40
+ lazy = false,
41
+ class: className,
42
+ children,
43
+ uniqueParamId,
44
+ onMount: onMountProp,
45
+ onOpen,
46
+ onClose,
47
+ openedText = DEFAULT_OPENED_TEXT,
48
+ closedText = DEFAULT_CLOSED_TEXT,
49
+ hasScrolledToAnchorRef,
50
+ anchor,
51
+ }: ExpandableProps = $props();
52
+
53
+ let expandableRef: HTMLDetailsElement | null = $state(null);
54
+ // Svelte state initializes once here, matching React useState semantics.
55
+ // svelte-ignore state_referenced_locally
56
+ const expandableMemory = useExpandableMemory(
57
+ () => uniqueParamId,
58
+ () => defaultOpen,
59
+ () => expandableRef
60
+ );
61
+
62
+ // Svelte state initializes once here, matching React useState semantics.
63
+ // svelte-ignore state_referenced_locally
64
+ let localOpen = $state(defaultOpen);
65
+
66
+ let containsAnchor = $derived(
67
+ Boolean(uniqueParamId && anchor?.includes(uniqueParamId))
68
+ );
69
+ let shouldOverrideForAnchor = $derived(
70
+ containsAnchor && !hasScrolledToAnchorRef?.current
71
+ );
72
+ let shouldUseSessionStorage = $derived(!!uniqueParamId);
73
+
74
+ let open = $derived(
75
+ shouldUseSessionStorage
76
+ ? shouldOverrideForAnchor
77
+ ? true
78
+ : expandableMemory.isInSessionStorage
79
+ ? expandableMemory.isExpanded
80
+ : defaultOpen
81
+ : localOpen
82
+ );
83
+
84
+ // Svelte state initializes once here, matching React useState semantics.
85
+ // svelte-ignore state_referenced_locally
86
+ let shouldRenderChildren = $state(open || !lazy);
87
+
88
+ // Svelte effect replaces React useLayoutEffect for rendering lazy children
89
+ // as soon as the expandable is opened.
90
+ $effect(() => {
91
+ if (open) {
92
+ shouldRenderChildren = true;
93
+ }
94
+ });
95
+
96
+ // Svelte lifecycle replaces the one-time React useEffect mount callback.
97
+ onMountLifecycle(() => {
98
+ onMountProp?.();
99
+ });
100
+
101
+ // Svelte has no direct equivalent of React useId; keep the generated value
102
+ // stable for this component instance so aria-controls remains consistent.
103
+ const svelteId = `expandable-${++nextExpandableId}`;
104
+ let contentId = $derived(
105
+ `${title}-${svelteId}-content`.replace(/\s+/g, "-")
106
+ );
107
+
108
+ function onChange(openState: boolean) {
109
+ shouldRenderChildren = true;
110
+
111
+ onChangeProp?.(openState);
112
+
113
+ if (openState) {
114
+ onOpen?.();
115
+ } else {
116
+ onClose?.();
117
+ }
118
+ }
119
+
120
+ function setOpenState(newOpenState: boolean) {
121
+ if (shouldUseSessionStorage) {
122
+ expandableMemory.onManualToggle(newOpenState);
123
+ } else {
124
+ localOpen = newOpenState;
125
+ }
126
+
127
+ onChange(newOpenState);
128
+ }
129
+
130
+ function handleToggle(event: Event) {
131
+ const details = event.currentTarget as HTMLDetailsElement;
132
+ const newState = details.open;
133
+ if (newState !== open) {
134
+ setOpenState(newState);
135
+ }
136
+ }
137
+ </script>
138
+
139
+ <details
140
+ bind:this={expandableRef}
141
+ class={cn(Classes.Expandable, "mt-4 rounded-xl border-standard", className)}
142
+ data-component-part="expandable"
143
+ data-testid={uniqueParamId ? `${uniqueParamId}-children` : undefined}
144
+ ontoggle={handleToggle}
145
+ open={open}
146
+ >
147
+ <summary
148
+ aria-controls={contentId}
149
+ aria-expanded={open}
150
+ class={cn(
151
+ "not-prose flex w-full cursor-pointer flex-row content-center items-center text-sm",
152
+ "rounded-t-xl px-3.5 py-3 text-stone-600 hover:bg-stone-50/50 hover:text-stone-900 dark:text-stone-300 dark:hover:bg-white/5 dark:hover:text-stone-200",
153
+ "list-none [&::-webkit-details-marker]:hidden",
154
+ !open && "rounded-b-xl"
155
+ )}
156
+ data-component-part="expandable-button"
157
+ >
158
+ <Icon
159
+ class={cn("size-2.5 bg-stone-400 transition-transform", open && "rotate-90")}
160
+ icon="angle-right"
161
+ overrideColor={true}
162
+ overrideSize={true}
163
+ />
164
+ <div class="ml-3 text-left leading-tight">
165
+ <p class="m-0" contenteditable="false">
166
+ {open ? openedText : closedText} {title}
167
+ </p>
168
+ </div>
169
+ </summary>
170
+ <div
171
+ class={cn(
172
+ EXPANDABLE_CONTENT_CLASS,
173
+ "mx-3 border-stone-100 border-t px-2 dark:border-white/10"
174
+ )}
175
+ data-component-part={EXPANDABLE_CONTENT_CLASS}
176
+ id={contentId}
177
+ >
178
+ {#if shouldRenderChildren && children}
179
+ {@render children()}
180
+ {/if}
181
+ </div>
182
+ </details>
@@ -0,0 +1,22 @@
1
+ import type { Snippet } from "svelte";
2
+ type ExpandableProps = {
3
+ title?: string;
4
+ defaultOpen?: boolean;
5
+ onChange?: (open: boolean) => void;
6
+ lazy?: boolean;
7
+ class?: string;
8
+ children?: Snippet;
9
+ uniqueParamId?: string;
10
+ onMount?: () => void;
11
+ onOpen?: () => void;
12
+ onClose?: () => void;
13
+ openedText?: string;
14
+ closedText?: string;
15
+ hasScrolledToAnchorRef?: {
16
+ current: boolean;
17
+ };
18
+ anchor?: string;
19
+ };
20
+ declare const Expandable: import("svelte").Component<ExpandableProps, {}, "">;
21
+ type Expandable = ReturnType<typeof Expandable>;
22
+ export default Expandable;
@@ -0,0 +1,3 @@
1
+ import Expandable from "./Expandable.svelte";
2
+ export type { default as ExpandableProps } from "./Expandable.svelte";
3
+ export { Expandable };
@@ -0,0 +1,2 @@
1
+ import Expandable from "./Expandable.svelte";
2
+ export { Expandable };
@@ -0,0 +1,118 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import { Classes } from "../../constants/selectors";
4
+ import Icon from "../icon/Icon.svelte";
5
+ import { cn } from "../../utils/cn";
6
+ import { enhanceVideoProps } from "../../utils/enhance-video-props";
7
+
8
+ type FrameStyle = Record<string, string | number | undefined>;
9
+
10
+ type FrameProps = {
11
+ as?: "div";
12
+ style?: FrameStyle;
13
+ class?: string;
14
+ className?: string;
15
+ children?: Snippet;
16
+ title?: string;
17
+ description?: string;
18
+ // Svelte snippet replaces React's renderDescription callback.
19
+ renderDescription?: Snippet<[string]>;
20
+ };
21
+
22
+ let {
23
+ as = "div",
24
+ style,
25
+ class: classAttribute,
26
+ className,
27
+ children,
28
+ title,
29
+ description,
30
+ renderDescription,
31
+ }: FrameProps = $props();
32
+
33
+ let frameClass = $derived(classAttribute ?? className);
34
+
35
+ // Svelte style strings replace React's CSSProperties object on the DOM node.
36
+ function styleToString(styles: FrameStyle | undefined): string | undefined {
37
+ if (!styles) {
38
+ return undefined;
39
+ }
40
+
41
+ return Object.entries(styles)
42
+ .filter(([, value]) => value !== undefined)
43
+ .map(([property, value]) => {
44
+ const cssProperty = property.startsWith("--")
45
+ ? property
46
+ : property.replace(/[A-Z]/g, (character) => `-${character.toLowerCase()}`);
47
+ return `${cssProperty}:${value}`;
48
+ })
49
+ .join(";");
50
+ }
51
+
52
+ </script>
53
+
54
+ <!-- `as` remains a div because FrameProps intentionally supports only div. -->
55
+ {#if as === "div"}
56
+ <div class={frameClass} data-component-part="frame-container">
57
+ {#if title}
58
+ <div class="not-prose mb-4 flex items-center space-x-2">
59
+ <span aria-hidden="true" class="contents">
60
+ <Icon
61
+ class="size-4 flex-none bg-stone-400 dark:bg-stone-300"
62
+ icon="diagram-project"
63
+ overrideColor={true}
64
+ overrideSize={true}
65
+ />
66
+ </span>
67
+ <p class="font-medium text-sm text-stone-700 dark:text-stone-200">
68
+ {title}
69
+ </p>
70
+ </div>
71
+ {/if}
72
+
73
+ <div
74
+ class={cn(
75
+ Classes.Frame,
76
+ "not-prose relative overflow-hidden rounded-2xl bg-stone-50/50 p-2 dark:bg-stone-800/25"
77
+ )}
78
+ data-component-part="frame"
79
+ data-name="frame"
80
+ style={styleToString(style)}
81
+ >
82
+ <div
83
+ aria-hidden="true"
84
+ class="mask-[linear-gradient(0deg,#fff,rgba(255,255,255,0.6))] dark:mask-[linear-gradient(0deg,rgba(255,255,255,0.1),rgba(255,255,255,0.5))] absolute inset-0 bg-grid-stone-200/20 dark:bg-grid-white/5"
85
+ data-component-part="frame-background-pattern"
86
+ style="background-position:10px 10px"
87
+ ></div>
88
+ <div
89
+ use:enhanceVideoProps
90
+ class="relative flex w-full justify-center overflow-hidden rounded-xl bg-white dark:bg-stone-800"
91
+ data-component-part="frame-content"
92
+ >
93
+ {#if children}
94
+ {@render children()}
95
+ {/if}
96
+ </div>
97
+
98
+ {#if description}
99
+ <div
100
+ class="relative mt-3 flex w-full justify-center rounded-2xl bg-white px-8 pt-0 pb-2 text-sm text-stone-700 dark:bg-stone-800 dark:text-stone-400"
101
+ contenteditable="false"
102
+ data-component-part="frame-description"
103
+ >
104
+ {#if renderDescription}
105
+ {@render renderDescription(description)}
106
+ {:else}
107
+ <p>{description}</p>
108
+ {/if}
109
+ </div>
110
+ {/if}
111
+ <div
112
+ aria-hidden="true"
113
+ class="pointer-events-none absolute inset-0 rounded-2xl border border-black/5 dark:border-white/5"
114
+ data-component-part="frame-border"
115
+ ></div>
116
+ </div>
117
+ </div>
118
+ {/if}
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from "svelte";
2
+ type FrameStyle = Record<string, string | number | undefined>;
3
+ type FrameProps = {
4
+ as?: "div";
5
+ style?: FrameStyle;
6
+ class?: string;
7
+ className?: string;
8
+ children?: Snippet;
9
+ title?: string;
10
+ description?: string;
11
+ renderDescription?: Snippet<[string]>;
12
+ };
13
+ declare const Frame: import("svelte").Component<FrameProps, {}, "">;
14
+ type Frame = ReturnType<typeof Frame>;
15
+ export default Frame;
@@ -0,0 +1,3 @@
1
+ import Frame from "./Frame.svelte";
2
+ export type { default as FrameProps } from "./Frame.svelte";
3
+ export { Frame };
@@ -0,0 +1,2 @@
1
+ import Frame from "./Frame.svelte";
2
+ export { Frame };
@@ -0,0 +1,129 @@
1
+ <script lang="ts">
2
+ import { MINTLIFY_ICONS_CDN_URL } from "../../constants/index";
3
+ import { Classes } from "../../constants/selectors";
4
+ import { cn } from "../../utils/cn";
5
+ import { getIconUrl, ICON_TYPES, type IconLibrary, type IconType, isBrandsIcon, type PageType } from "../../utils/icon-utils";
6
+ import { isAbsoluteUrl } from "../../utils/is-absolute-url";
7
+
8
+ type IconProps = {
9
+ icon: string;
10
+ iconType?: IconType;
11
+ class?: string;
12
+ color?: string;
13
+ colorLight?: string;
14
+ colorDark?: string;
15
+ overrideColor?: boolean;
16
+ size?: number;
17
+ overrideSize?: boolean;
18
+ iconLibrary?: IconLibrary;
19
+ basePath?: string;
20
+ pageType?: PageType;
21
+ };
22
+
23
+ let {
24
+ icon,
25
+ iconType,
26
+ color,
27
+ colorLight,
28
+ colorDark,
29
+ size,
30
+ class: className,
31
+ iconLibrary = "fontawesome",
32
+ basePath,
33
+ pageType,
34
+ overrideColor,
35
+ overrideSize,
36
+ }: IconProps = $props();
37
+
38
+ // Svelte style — replaces React CSSProperties
39
+ let style = $derived.by(() => {
40
+ const base: Record<string, string | number> = {
41
+ display: "inline-block",
42
+ verticalAlign: "middle",
43
+ };
44
+ if (!overrideSize) {
45
+ base.width = size || 16;
46
+ base.height = size || 16;
47
+ }
48
+ return base;
49
+ });
50
+
51
+ let hasLightDarkColors = $derived(!!(colorLight && colorDark));
52
+
53
+ let styleWithColors = $derived.by(() => {
54
+ const s: Record<string, string | number> = { ...style };
55
+ if (hasLightDarkColors) {
56
+ s["--color-light"] = colorLight!;
57
+ s["--color-dark"] = colorDark!;
58
+ }
59
+ return s;
60
+ });
61
+
62
+ let classNames = $derived(
63
+ cn(
64
+ Classes.Icon,
65
+ "inline",
66
+ !(color || hasLightDarkColors || overrideColor) && "bg-primary dark:bg-primary-light",
67
+ hasLightDarkColors && "bg-(--color-light) dark:bg-(--color-dark)",
68
+ className
69
+ )
70
+ );
71
+
72
+ let isPdf = $derived(pageType === "pdf");
73
+ let url = $derived(getIconUrl(icon.toLowerCase(), iconType, iconLibrary));
74
+
75
+ let isInvalidIconType = $derived(iconType ? !ICON_TYPES.includes(iconType as any) : false);
76
+
77
+ // For Svelte, we need to handle style string conversion
78
+ function styleToString(s: Record<string, string | number>): string {
79
+ return Object.entries(s)
80
+ .map(([k, v]) => {
81
+ const cssKey = k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
82
+ // Handle CSS variables --color-light
83
+ const key = k.startsWith("--") ? k : cssKey;
84
+ return `${key}:${v}`;
85
+ })
86
+ .join(";");
87
+ }
88
+
89
+ let isAbsoluteOrSlash = $derived(typeof icon === "string" && (isAbsoluteUrl(icon) || icon.startsWith("/")));
90
+ let isMintlifyCdn = $derived(isAbsoluteOrSlash && (icon.startsWith(MINTLIFY_ICONS_CDN_URL) || icon.startsWith("https://mintlify.b-cdn.net")));
91
+ </script>
92
+
93
+ {#if isInvalidIconType}
94
+ <!-- Svelte: log invalid iconType like React console.log -->
95
+ {console.log(`Invalid iconType ${iconType} expected one of: ${ICON_TYPES.join(", ")}`)}
96
+ {/if}
97
+
98
+ {#if isAbsoluteOrSlash}
99
+ {#if isMintlifyCdn}
100
+ <svg
101
+ class={classNames}
102
+ data-component-part="icon-svg"
103
+ style={`${styleToString(styleWithColors)}; -webkit-mask-image: url(${icon}); -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; mask-image: url(${icon}); mask-repeat: no-repeat; mask-position: center; mask-size: 100%; ${!hasLightDarkColors ? "background-color: currentColor;" : ""}`}
104
+ ></svg>
105
+ {:else}
106
+ {@const iconUrl = icon.startsWith("/") && basePath ? `${basePath}${icon}` : icon}
107
+ <img
108
+ alt={icon}
109
+ class={cn(classNames, "bg-transparent dark:bg-transparent")}
110
+ data-component-part="icon-image"
111
+ src={iconUrl}
112
+ style={styleToString(styleWithColors)}
113
+ />
114
+ {/if}
115
+ {:else if isPdf}
116
+ <img
117
+ alt={icon}
118
+ class={cn(classNames, !(color || overrideColor || hasLightDarkColors) && "bg-stone-800 dark:bg-stone-100")}
119
+ data-component-part="icon-image"
120
+ src={url}
121
+ style={`background-color: transparent; ${styleToString(styleWithColors)}`}
122
+ />
123
+ {:else}
124
+ <svg
125
+ class={cn(classNames, !(color || overrideColor || hasLightDarkColors) && "bg-stone-800 dark:bg-stone-100")}
126
+ data-component-part="icon-svg"
127
+ style={`${styleToString(styleWithColors)}; -webkit-mask-image: url(${url}); -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; mask-image: url(${url}); mask-repeat: no-repeat; mask-position: center; mask-size: ${iconLibrary === "lucide" && !isBrandsIcon(icon) ? "100%" : "auto"}; ${color ? `background-color: ${color};` : ""}`}
128
+ ></svg>
129
+ {/if}
@@ -0,0 +1,18 @@
1
+ import { type IconLibrary, type IconType, type PageType } from "../../utils/icon-utils";
2
+ type IconProps = {
3
+ icon: string;
4
+ iconType?: IconType;
5
+ class?: string;
6
+ color?: string;
7
+ colorLight?: string;
8
+ colorDark?: string;
9
+ overrideColor?: boolean;
10
+ size?: number;
11
+ overrideSize?: boolean;
12
+ iconLibrary?: IconLibrary;
13
+ basePath?: string;
14
+ pageType?: PageType;
15
+ };
16
+ declare const Icon: import("svelte").Component<IconProps, {}, "">;
17
+ type Icon = ReturnType<typeof Icon>;
18
+ export default Icon;
@@ -0,0 +1,2 @@
1
+ export { default as Icon } from "./Icon.svelte";
2
+ export type { default as IconProps } from "./Icon.svelte";
@@ -0,0 +1 @@
1
+ export { default as Icon } from "./Icon.svelte";
@@ -0,0 +1,22 @@
1
+ export * from "./accordion";
2
+ export * from "./badge";
3
+ export * from "./callout";
4
+ export * from "./card";
5
+ export * from "./code-block";
6
+ export * from "./code-group";
7
+ export * from "./color";
8
+ export * from "./columns";
9
+ export * from "./expandable";
10
+ export * from "./frame";
11
+ export * from "./icon";
12
+ export * from "./mermaid";
13
+ export * from "./panel";
14
+ export * from "./property";
15
+ export * from "./search";
16
+ export * from "./steps";
17
+ export * from "./tabs";
18
+ export * from "./tile";
19
+ export * from "./tooltip";
20
+ export * from "./tree";
21
+ export * from "./update";
22
+ export * from "./view";
@@ -0,0 +1,22 @@
1
+ export * from "./accordion";
2
+ export * from "./badge";
3
+ export * from "./callout";
4
+ export * from "./card";
5
+ export * from "./code-block";
6
+ export * from "./code-group";
7
+ export * from "./color";
8
+ export * from "./columns";
9
+ export * from "./expandable";
10
+ export * from "./frame";
11
+ export * from "./icon";
12
+ export * from "./mermaid";
13
+ export * from "./panel";
14
+ export * from "./property";
15
+ export * from "./search";
16
+ export * from "./steps";
17
+ export * from "./tabs";
18
+ export * from "./tile";
19
+ export * from "./tooltip";
20
+ export * from "./tree";
21
+ export * from "./update";
22
+ export * from "./view";