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,317 @@
1
+ <script lang="ts">
2
+ import Color from "color";
3
+ import type { Snippet } from "svelte";
4
+ import Icon from "../icon/Icon.svelte";
5
+ import { Classes } from "../../constants/selectors";
6
+ import { cn } from "../../utils/cn";
7
+ import type { IconLibrary, IconType } from "../../utils/icon-utils";
8
+
9
+ export type CalloutVariant =
10
+ | "info"
11
+ | "warning"
12
+ | "note"
13
+ | "tip"
14
+ | "check"
15
+ | "danger"
16
+ | "custom";
17
+
18
+ export type CalloutProps = {
19
+ children?: Snippet;
20
+ title?: string;
21
+ variant?: CalloutVariant;
22
+ icon?: Snippet | string;
23
+ iconType?: IconType;
24
+ iconLibrary?: IconLibrary;
25
+ color?: string;
26
+ class?: string;
27
+ ariaLabel?: string;
28
+ };
29
+
30
+ const variantConfig = {
31
+ info: {
32
+ icon: "info",
33
+ defaultAriaLabel: "Info",
34
+ className:
35
+ "border border-stone-200 bg-stone-50 dark:border-stone-700 dark:bg-white/10",
36
+ childrenClassName: "text-stone-800 dark:text-stone-300",
37
+ },
38
+ warning: {
39
+ icon: "warning",
40
+ defaultAriaLabel: "Warning",
41
+ className:
42
+ 'border border-yellow-200 bg-yellow-50 dark:border-yellow-900 dark:bg-yellow-600/20 **:data-[component-part="callout-icon"]:mt-px',
43
+ childrenClassName: "text-yellow-800 dark:text-yellow-300",
44
+ },
45
+ note: {
46
+ icon: "note",
47
+ defaultAriaLabel: "Note",
48
+ className:
49
+ "border border-blue-200 bg-blue-50 dark:border-blue-900 dark:bg-blue-600/20",
50
+ childrenClassName: "text-blue-800 dark:text-blue-300",
51
+ },
52
+ tip: {
53
+ icon: "tip",
54
+ defaultAriaLabel: "Tip",
55
+ className:
56
+ 'border border-green-200 bg-green-50 dark:border-green-900 dark:bg-green-600/20 **:data-[component-part="callout-icon"]:mt-px',
57
+ childrenClassName: "text-green-800 dark:text-green-300",
58
+ },
59
+ check: {
60
+ icon: "check",
61
+ defaultAriaLabel: "Check",
62
+ className:
63
+ "border border-green-200 bg-green-50 dark:border-green-900 dark:bg-green-600/20",
64
+ childrenClassName: "text-green-800 dark:text-green-300",
65
+ },
66
+ danger: {
67
+ icon: "danger",
68
+ defaultAriaLabel: "Danger",
69
+ className:
70
+ "border border-red-200 bg-red-50 dark:border-red-900 dark:bg-red-600/20",
71
+ childrenClassName: "text-red-800 dark:text-red-300",
72
+ },
73
+ } as const;
74
+
75
+ let {
76
+ children,
77
+ title,
78
+ variant = "custom",
79
+ icon,
80
+ iconType,
81
+ iconLibrary,
82
+ color,
83
+ class: className,
84
+ ariaLabel,
85
+ }: CalloutProps = $props();
86
+
87
+ let customColor = $derived.by(() => {
88
+ if (variant !== "custom" || !color) return undefined;
89
+
90
+ try {
91
+ const baseColor = Color(color);
92
+ return {
93
+ hexColor: baseColor.hex(),
94
+ isDarkColor: baseColor.isDark(),
95
+ lighterTextColor: baseColor.lighten(0.5),
96
+ darkerTextColor: baseColor.darken(0.5),
97
+ };
98
+ } catch {
99
+ return undefined;
100
+ }
101
+ });
102
+
103
+ let finalColor = $derived(
104
+ variant === "custom" && color && customColor ? color : undefined
105
+ );
106
+
107
+ let variantClassName = $derived.by(() => {
108
+ if (variant === "custom") {
109
+ if (customColor) {
110
+ return "border border-(--callout-border-color-light,#71717a33) bg-(--callout-bg-color-light,#71717a1a) dark:border-(--callout-border-color-dark,#71717a4d) dark:bg-(--callout-bg-color-dark,#71717a1a)";
111
+ }
112
+
113
+ return "border border-stone-500/20 bg-stone-50/50 dark:border-stone-500/30 dark:bg-stone-500/10";
114
+ }
115
+
116
+ return variantConfig[variant].className;
117
+ });
118
+
119
+ let childrenClassName = $derived.by(() => {
120
+ if (variant === "custom") {
121
+ if (customColor) {
122
+ return "mt-1 text-(--callout-text-color) dark:text-(--dark-callout-text-color)";
123
+ }
124
+
125
+ return "text-stone-900 dark:text-stone-200";
126
+ }
127
+
128
+ return variantConfig[variant].childrenClassName;
129
+ });
130
+
131
+ let customStyle = $derived.by(() => {
132
+ if (customColor) {
133
+ const { hexColor, isDarkColor } = customColor;
134
+
135
+ return {
136
+ "--callout-border-color-light": `${hexColor}33`,
137
+ "--callout-bg-color-light": `${hexColor}1a`,
138
+ "--callout-border-color-dark": `${hexColor}${isDarkColor ? "66" : "4d"}`,
139
+ "--callout-bg-color-dark": `${hexColor}${isDarkColor ? "4d" : "1a"}`,
140
+ } as Record<string, string>;
141
+ }
142
+
143
+ return {};
144
+ });
145
+
146
+ let customTextStyle = $derived.by(() => {
147
+ if (customColor) {
148
+ return {
149
+ "--callout-text-color": customColor.darkerTextColor.hex(),
150
+ "--dark-callout-text-color": customColor.lighterTextColor.hex(),
151
+ } as Record<string, string>;
152
+ }
153
+
154
+ return {};
155
+ });
156
+
157
+ let combinedCustomStyle = $derived({ ...customStyle, ...customTextStyle });
158
+
159
+ function styleToString(s: Record<string, string>): string {
160
+ return Object.entries(s)
161
+ .map(([key, value]) => `${key}:${value}`)
162
+ .join(";");
163
+ }
164
+
165
+ let config = $derived(
166
+ variant === "custom" ? undefined : variantConfig[variant]
167
+ );
168
+ </script>
169
+
170
+ {#snippet InfoIconSnippet()}
171
+ <svg
172
+ aria-label={ariaLabel || "Info"}
173
+ class="size-5 flex-none text-stone-800 dark:text-stone-300"
174
+ fill="currentColor"
175
+ role="img"
176
+ viewBox="0 0 20 20"
177
+ >
178
+ <path d="M8 0C3.58125 0 0 3.58125 0 8C0 12.4187 3.58125 16 8 16C12.4187 16 16 12.4187 16 8C16 3.58125 12.4187 0 8 0ZM8 14.5C4.41563 14.5 1.5 11.5841 1.5 8C1.5 4.41594 4.41563 1.5 8 1.5C11.5844 1.5 14.5 4.41594 14.5 8C14.5 11.5841 11.5844 14.5 8 14.5ZM9.25 10.5H8.75V7.75C8.75 7.3375 8.41563 7 8 7H7C6.5875 7 6.25 7.3375 6.25 7.75C6.25 8.1625 6.5875 8.5 7 8.5H7.25V10.5H6.75C6.3375 10.5 6 10.8375 6 11.25C6 11.6625 6.3375 12 6.75 12H9.25C9.66406 12 10 11.6641 10 11.25C10 10.8359 9.66563 10.5 9.25 10.5ZM8 6C8.55219 6 9 5.55219 9 5C9 4.44781 8.55219 4 8 4C7.44781 4 7 4.44687 7 5C7 5.55313 7.44687 6 8 6Z" />
179
+ </svg>
180
+ {/snippet}
181
+
182
+ {#snippet WarningIconSnippet()}
183
+ <svg
184
+ aria-label={ariaLabel || "Warning"}
185
+ class="size-5 flex-none text-yellow-800 dark:text-yellow-300"
186
+ fill="none"
187
+ role="img"
188
+ stroke="currentColor"
189
+ stroke-width="2"
190
+ viewBox="0 0 24 24"
191
+ >
192
+ <path
193
+ d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
194
+ stroke-linecap="round"
195
+ stroke-linejoin="round"
196
+ />
197
+ </svg>
198
+ {/snippet}
199
+
200
+ {#snippet NoteIconSnippet()}
201
+ <svg
202
+ aria-label={ariaLabel || "Note"}
203
+ class="size-4 text-blue-800 dark:text-blue-300"
204
+ fill="currentColor"
205
+ height="14"
206
+ role="img"
207
+ viewBox="0 0 14 14"
208
+ width="14"
209
+ >
210
+ <path
211
+ clip-rule="evenodd"
212
+ d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"
213
+ fill-rule="evenodd"
214
+ />
215
+ </svg>
216
+ {/snippet}
217
+
218
+ {#snippet TipIconSnippet()}
219
+ <svg
220
+ aria-label={ariaLabel || "Tip"}
221
+ class="h-auto w-3.5 text-green-800 dark:text-green-300"
222
+ fill="currentColor"
223
+ height="14"
224
+ role="img"
225
+ viewBox="0 0 11 14"
226
+ width="11"
227
+ >
228
+ <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z" />
229
+ </svg>
230
+ {/snippet}
231
+
232
+ {#snippet CheckIconSnippet()}
233
+ <svg
234
+ aria-label={ariaLabel || "Check"}
235
+ class="h-auto w-3.5 text-green-800 dark:text-green-300"
236
+ fill="currentColor"
237
+ role="img"
238
+ viewBox="0 0 448 512"
239
+ >
240
+ <path d="M438.6 105.4C451.1 117.9 451.1 138.1 438.6 150.6L182.6 406.6C170.1 419.1 149.9 419.1 137.4 406.6L9.372 278.6C-3.124 266.1-3.124 245.9 9.372 233.4C21.87 220.9 42.13 220.9 54.63 233.4L159.1 338.7L393.4 105.4C405.9 92.88 426.1 92.88 438.6 105.4H438.6z" />
241
+ </svg>
242
+ {/snippet}
243
+
244
+ {#snippet DangerIconSnippet()}
245
+ <svg
246
+ aria-label={ariaLabel || "Danger"}
247
+ class="size-4 flex-none text-red-800 dark:text-red-300"
248
+ fill="currentColor"
249
+ height="14"
250
+ role="img"
251
+ viewBox="0 0 512 512"
252
+ width="14"
253
+ >
254
+ <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z" />
255
+ </svg>
256
+ {/snippet}
257
+
258
+ <div
259
+ class={cn(
260
+ Classes.Callout,
261
+ "my-4 flex gap-3 overflow-hidden rounded-2xl px-5 py-4",
262
+ variantClassName,
263
+ className
264
+ )}
265
+ data-callout-type={variant}
266
+ style={styleToString(combinedCustomStyle)}
267
+ >
268
+ {#if variant === "custom"}
269
+ {#if icon}
270
+ <div
271
+ class="mt-0.5 w-4"
272
+ data-component-part="callout-icon"
273
+ aria-label={ariaLabel}
274
+ >
275
+ {#if typeof icon === "string"}
276
+ <Icon
277
+ class="m-0! size-4 shrink-0"
278
+ color={finalColor}
279
+ icon={icon}
280
+ iconLibrary={iconLibrary}
281
+ iconType={iconType}
282
+ />
283
+ {:else}
284
+ {@render icon()}
285
+ {/if}
286
+ </div>
287
+ {/if}
288
+ {:else if config}
289
+ <div class="mt-0.5 w-4" data-component-part="callout-icon">
290
+ {#if config.icon === "info"}{@render InfoIconSnippet()}
291
+ {:else if config.icon === "warning"}{@render WarningIconSnippet()}
292
+ {:else if config.icon === "note"}{@render NoteIconSnippet()}
293
+ {:else if config.icon === "tip"}{@render TipIconSnippet()}
294
+ {:else if config.icon === "check"}{@render CheckIconSnippet()}
295
+ {:else if config.icon === "danger"}{@render DangerIconSnippet()}
296
+ {/if}
297
+ </div>
298
+ {/if}
299
+ <div
300
+ class={cn(
301
+ "prose dark:prose-invert w-full min-w-0 text-sm [&_a]:border-current [&_a]:text-current! [&_code]:text-current! [&_kbd]:bg-stone-100 [&_kbd]:text-current! dark:[&_kbd]:bg-stone-800 [&_strong]:text-current!",
302
+ title && "[&>:nth-child(2)]:mt-3",
303
+ childrenClassName
304
+ )}
305
+ data-component-part="callout-content"
306
+ style={styleToString(customTextStyle)}
307
+ >
308
+ {#if title}
309
+ <div class="font-semibold" data-component-part="callout-title">
310
+ {title}
311
+ </div>
312
+ {/if}
313
+ {#if children}
314
+ {@render children()}
315
+ {/if}
316
+ </div>
317
+ </div>
@@ -0,0 +1,17 @@
1
+ import type { Snippet } from "svelte";
2
+ import type { IconLibrary, IconType } from "../../utils/icon-utils";
3
+ export type CalloutVariant = "info" | "warning" | "note" | "tip" | "check" | "danger" | "custom";
4
+ export type CalloutProps = {
5
+ children?: Snippet;
6
+ title?: string;
7
+ variant?: CalloutVariant;
8
+ icon?: Snippet | string;
9
+ iconType?: IconType;
10
+ iconLibrary?: IconLibrary;
11
+ color?: string;
12
+ class?: string;
13
+ ariaLabel?: string;
14
+ };
15
+ declare const Callout: import("svelte").Component<CalloutProps, {}, "">;
16
+ type Callout = ReturnType<typeof Callout>;
17
+ export default Callout;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import Callout, { type CalloutProps } from "./Callout.svelte";
3
+
4
+ let { children, ...props }: Omit<CalloutProps, "variant"> = $props();
5
+ </script>
6
+
7
+ <Callout variant="check" {...props}>
8
+ {#if children}{@render children()}{/if}
9
+ </Callout>
@@ -0,0 +1,4 @@
1
+ import { type CalloutProps } from "./Callout.svelte";
2
+ declare const Check: import("svelte").Component<Omit<CalloutProps, "variant">, {}, "">;
3
+ type Check = ReturnType<typeof Check>;
4
+ export default Check;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import Callout, { type CalloutProps } from "./Callout.svelte";
3
+
4
+ let { children, ...props }: Omit<CalloutProps, "variant"> = $props();
5
+ </script>
6
+
7
+ <Callout variant="danger" {...props}>
8
+ {#if children}{@render children()}{/if}
9
+ </Callout>
@@ -0,0 +1,4 @@
1
+ import { type CalloutProps } from "./Callout.svelte";
2
+ declare const Danger: import("svelte").Component<Omit<CalloutProps, "variant">, {}, "">;
3
+ type Danger = ReturnType<typeof Danger>;
4
+ export default Danger;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import Callout, { type CalloutProps } from "./Callout.svelte";
3
+
4
+ let { children, ...props }: Omit<CalloutProps, "variant"> = $props();
5
+ </script>
6
+
7
+ <Callout variant="info" {...props}>
8
+ {#if children}{@render children()}{/if}
9
+ </Callout>
@@ -0,0 +1,4 @@
1
+ import { type CalloutProps } from "./Callout.svelte";
2
+ declare const Info: import("svelte").Component<Omit<CalloutProps, "variant">, {}, "">;
3
+ type Info = ReturnType<typeof Info>;
4
+ export default Info;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import Callout, { type CalloutProps } from "./Callout.svelte";
3
+
4
+ let { children, ...props }: Omit<CalloutProps, "variant"> = $props();
5
+ </script>
6
+
7
+ <Callout variant="note" {...props}>
8
+ {#if children}{@render children()}{/if}
9
+ </Callout>
@@ -0,0 +1,4 @@
1
+ import { type CalloutProps } from "./Callout.svelte";
2
+ declare const Note: import("svelte").Component<Omit<CalloutProps, "variant">, {}, "">;
3
+ type Note = ReturnType<typeof Note>;
4
+ export default Note;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import Callout, { type CalloutProps } from "./Callout.svelte";
3
+
4
+ let { children, ...props }: Omit<CalloutProps, "variant"> = $props();
5
+ </script>
6
+
7
+ <Callout variant="tip" {...props}>
8
+ {#if children}{@render children()}{/if}
9
+ </Callout>
@@ -0,0 +1,4 @@
1
+ import { type CalloutProps } from "./Callout.svelte";
2
+ declare const Tip: import("svelte").Component<Omit<CalloutProps, "variant">, {}, "">;
3
+ type Tip = ReturnType<typeof Tip>;
4
+ export default Tip;
@@ -0,0 +1,9 @@
1
+ <script lang="ts">
2
+ import Callout, { type CalloutProps } from "./Callout.svelte";
3
+
4
+ let { children, ...props }: Omit<CalloutProps, "variant"> = $props();
5
+ </script>
6
+
7
+ <Callout variant="warning" {...props}>
8
+ {#if children}{@render children()}{/if}
9
+ </Callout>
@@ -0,0 +1,4 @@
1
+ import { type CalloutProps } from "./Callout.svelte";
2
+ declare const Warning: import("svelte").Component<Omit<CalloutProps, "variant">, {}, "">;
3
+ type Warning = ReturnType<typeof Warning>;
4
+ export default Warning;
@@ -0,0 +1,8 @@
1
+ export type { CalloutProps, CalloutVariant } from "./Callout.svelte";
2
+ export { default as Callout } from "./Callout.svelte";
3
+ export { default as Check } from "./Check.svelte";
4
+ export { default as Danger } from "./Danger.svelte";
5
+ export { default as Info } from "./Info.svelte";
6
+ export { default as Note } from "./Note.svelte";
7
+ export { default as Tip } from "./Tip.svelte";
8
+ export { default as Warning } from "./Warning.svelte";
@@ -0,0 +1,8 @@
1
+ export { default as Callout } from "./Callout.svelte";
2
+ // Backward compatibility exports
3
+ export { default as Check } from "./Check.svelte";
4
+ export { default as Danger } from "./Danger.svelte";
5
+ export { default as Info } from "./Info.svelte";
6
+ export { default as Note } from "./Note.svelte";
7
+ export { default as Tip } from "./Tip.svelte";
8
+ export { default as Warning } from "./Warning.svelte";
@@ -0,0 +1,172 @@
1
+ <script lang="ts">
2
+ import { ArrowUpRight } from "@lucide/svelte";
3
+ import Icon from "../icon/Icon.svelte";
4
+ import { Classes } from "../../constants/selectors";
5
+ import { cn } from "../../utils/cn";
6
+ import { isRemoteUrl } from "../../utils/is-remote-url";
7
+ import type { IconLibrary, IconType } from "../../utils/icon-utils";
8
+ import type { Snippet } from "svelte";
9
+
10
+ type CardProps = {
11
+ title?: string | Snippet;
12
+ icon?: string | Snippet;
13
+ iconType?: IconType;
14
+ iconLibrary?: IconLibrary;
15
+ color?: string;
16
+ horizontal?: boolean;
17
+ href?: string;
18
+ img?: string;
19
+ children?: string | Snippet;
20
+ disabled?: boolean;
21
+ cta?: string;
22
+ arrow?: boolean;
23
+ as?: string;
24
+ class?: string;
25
+ };
26
+
27
+ let {
28
+ title,
29
+ icon,
30
+ iconType,
31
+ iconLibrary,
32
+ color,
33
+ horizontal,
34
+ href,
35
+ img,
36
+ children,
37
+ disabled,
38
+ cta,
39
+ arrow,
40
+ as,
41
+ class: className,
42
+ }: CardProps = $props();
43
+
44
+ // Svelte Icon handling — mirrors React Card Icon logic
45
+ let iconSnippet: Snippet | undefined = $derived.by(() => {
46
+ if (typeof icon === "string") {
47
+ return undefined; // Will render via Icon component in template
48
+ }
49
+ return icon as Snippet | undefined;
50
+ });
51
+ let isIconString = $derived(typeof icon === "string");
52
+ let resolvedHref = $derived(disabled ? undefined : href);
53
+ let Component: any = $derived(disabled ? "div" : as || (href !== undefined ? "a" : "div"));
54
+ let isExternalLink = $derived(isRemoteUrl(resolvedHref ?? ""));
55
+ let shouldShowArrowIcon = $derived(arrow ?? isExternalLink);
56
+ let cardClass = $derived(
57
+ cn(
58
+ Classes.Card,
59
+ "group relative my-2 block w-full overflow-hidden rounded-2xl border border-stone-950/10 bg-white font-normal ring-2 ring-transparent dark:border-white/10 dark:bg-background-dark",
60
+ resolvedHref && "cursor-pointer",
61
+ resolvedHref && "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary dark:focus-visible:ring-primary-light",
62
+ className
63
+ )
64
+ );
65
+ </script>
66
+
67
+ {#snippet renderIcon()}
68
+ {#if icon}
69
+ {#if isIconString}
70
+ <Icon
71
+ class="m-0! size-6 shrink-0"
72
+ color={color}
73
+ icon={icon as string}
74
+ iconLibrary={iconLibrary}
75
+ iconType={iconType}
76
+ overrideColor={!!color}
77
+ />
78
+ {:else if iconSnippet}
79
+ <div class="size-6 fill-stone-800 text-stone-800 dark:fill-stone-100 dark:text-stone-100" data-component-part="card-icon">
80
+ {@render iconSnippet()}
81
+ </div>
82
+ {/if}
83
+ {/if}
84
+ {/snippet}
85
+
86
+ {#snippet cardContent()}
87
+ {#if img}
88
+ {@const imageAlt = img.match(/\/([^/]+)\.[^.]+$/)?.[1] ?? ""}
89
+ <img alt={imageAlt} class="not-prose w-full object-cover object-center" data-component-part="card-image" src={img} />
90
+ {/if}
91
+ <div class={cn("relative px-6 py-5", horizontal && "flex items-center gap-x-4")} data-component-part="card-content-container">
92
+ {#if resolvedHref}
93
+ <div
94
+ aria-hidden="true"
95
+ class={cn("absolute top-5 right-5 text-stone-400 group-hover:text-primary dark:text-stone-500 dark:group-hover:text-primary-light", !shouldShowArrowIcon && "hidden")}
96
+ data-component-part="card-arrow"
97
+ >
98
+ <ArrowUpRight class="size-4" />
99
+ </div>
100
+ {/if}
101
+ {@render renderIcon()}
102
+ <div class="min-w-0 flex-1">
103
+ {#if title}
104
+ <h2
105
+ class={cn("not-prose wrap-break-word font-semibold text-base text-stone-800 dark:text-white", icon !== null && icon !== undefined && !horizontal && "mt-4")}
106
+ data-component-part="card-title"
107
+ >
108
+ {#if typeof title === "string"}
109
+ {title}
110
+ {:else}
111
+ {@render title()}
112
+ {/if}
113
+ </h2>
114
+ {/if}
115
+ <div
116
+ class={cn(
117
+ "prose wrap-break-word mt-1 font-normal text-base leading-6",
118
+ title ? "text-stone-600 dark:text-stone-400" : "text-stone-700 dark:text-stone-300",
119
+ horizontal && "mt-0 leading-6"
120
+ )}
121
+ data-component-part="card-content"
122
+ >
123
+ {#if children}
124
+ {#if typeof children === "string"}
125
+ {children}
126
+ {:else}
127
+ {@render children()}
128
+ {/if}
129
+ {/if}
130
+ </div>
131
+ {#if cta}
132
+ <div class="mt-8" data-component-part="card-cta">
133
+ <span
134
+ class={cn(
135
+ "flex flex-row items-center gap-2 text-left font-medium text-sm text-stone-600 dark:text-stone-400",
136
+ !disabled && "group-hover:text-primary group-hover:dark:text-primary-light",
137
+ disabled && "opacity-50"
138
+ )}
139
+ >
140
+ {cta}
141
+ <svg aria-hidden="true" class="h-6 rotate-0 overflow-visible" height="24" viewBox="0 -9 3 24" width="3">
142
+ <path d="M0 0L3 3L0 6" fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5" />
143
+ </svg>
144
+ </span>
145
+ </div>
146
+ {/if}
147
+ </div>
148
+ </div>
149
+ {/snippet}
150
+
151
+ <!-- Svelte GenericCard — mirrors React GenericCard, 1:1 Tailwind/classes — use plain div/a for HMR, not svelte:element -->
152
+ {#if Component === "a"}
153
+ <a
154
+ class={cardClass}
155
+ data-card-debug={cardClass}
156
+ data-component="card"
157
+ href={resolvedHref}
158
+ target={isExternalLink ? "_blank" : undefined}
159
+ rel={isExternalLink ? "noreferrer" : undefined}
160
+ >
161
+ {@render cardContent()}
162
+ </a>
163
+ {:else}
164
+ <div
165
+ class={cardClass}
166
+ data-card-debug={cardClass}
167
+ data-component="card"
168
+ >
169
+ {@render cardContent()}
170
+ </div>
171
+ {/if}
172
+
@@ -0,0 +1,21 @@
1
+ import type { IconLibrary, IconType } from "../../utils/icon-utils";
2
+ import type { Snippet } from "svelte";
3
+ type CardProps = {
4
+ title?: string | Snippet;
5
+ icon?: string | Snippet;
6
+ iconType?: IconType;
7
+ iconLibrary?: IconLibrary;
8
+ color?: string;
9
+ horizontal?: boolean;
10
+ href?: string;
11
+ img?: string;
12
+ children?: string | Snippet;
13
+ disabled?: boolean;
14
+ cta?: string;
15
+ arrow?: boolean;
16
+ as?: string;
17
+ class?: string;
18
+ };
19
+ declare const Card: import("svelte").Component<CardProps, {}, "">;
20
+ type Card = ReturnType<typeof Card>;
21
+ export default Card;
@@ -0,0 +1,3 @@
1
+ import Card from "./Card.svelte";
2
+ export { Card };
3
+ export type { default as CardProps } from "./Card.svelte";
@@ -0,0 +1,2 @@
1
+ import Card from "./Card.svelte";
2
+ export { Card };