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.
- package/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/components/Search.svelte +320 -0
- package/dist/components/Search.svelte.d.ts +31 -0
- package/dist/components/SearchButton.svelte +82 -0
- package/dist/components/SearchButton.svelte.d.ts +13 -0
- package/dist/components/SearchProvider.svelte +87 -0
- package/dist/components/SearchProvider.svelte.d.ts +17 -0
- package/dist/components/accordion/Accordion.svelte +150 -0
- package/dist/components/accordion/Accordion.svelte.d.ts +25 -0
- package/dist/components/accordion/AccordionCover.svelte +68 -0
- package/dist/components/accordion/AccordionCover.svelte.d.ts +13 -0
- package/dist/components/accordion/AccordionGroup.svelte +23 -0
- package/dist/components/accordion/AccordionGroup.svelte.d.ts +8 -0
- package/dist/components/accordion/accordion-url-utils.d.ts +4 -0
- package/dist/components/accordion/accordion-url-utils.js +48 -0
- package/dist/components/accordion/index.d.ts +29 -0
- package/dist/components/accordion/index.js +6 -0
- package/dist/components/badge/Badge.svelte +152 -0
- package/dist/components/badge/Badge.svelte.d.ts +23 -0
- package/dist/components/badge/index.d.ts +1 -0
- package/dist/components/badge/index.js +2 -0
- package/dist/components/callout/Callout.svelte +317 -0
- package/dist/components/callout/Callout.svelte.d.ts +17 -0
- package/dist/components/callout/Check.svelte +9 -0
- package/dist/components/callout/Check.svelte.d.ts +4 -0
- package/dist/components/callout/Danger.svelte +9 -0
- package/dist/components/callout/Danger.svelte.d.ts +4 -0
- package/dist/components/callout/Info.svelte +9 -0
- package/dist/components/callout/Info.svelte.d.ts +4 -0
- package/dist/components/callout/Note.svelte +9 -0
- package/dist/components/callout/Note.svelte.d.ts +4 -0
- package/dist/components/callout/Tip.svelte +9 -0
- package/dist/components/callout/Tip.svelte.d.ts +4 -0
- package/dist/components/callout/Warning.svelte +9 -0
- package/dist/components/callout/Warning.svelte.d.ts +4 -0
- package/dist/components/callout/index.d.ts +8 -0
- package/dist/components/callout/index.js +8 -0
- package/dist/components/card/Card.svelte +172 -0
- package/dist/components/card/Card.svelte.d.ts +21 -0
- package/dist/components/card/index.d.ts +3 -0
- package/dist/components/card/index.js +2 -0
- package/dist/components/code-block/BaseCodeBlock.svelte +249 -0
- package/dist/components/code-block/BaseCodeBlock.svelte.d.ts +10 -0
- package/dist/components/code-block/CodeBlock.svelte +185 -0
- package/dist/components/code-block/CodeBlock.svelte.d.ts +5 -0
- package/dist/components/code-block/CodeFooter.svelte +34 -0
- package/dist/components/code-block/CodeFooter.svelte.d.ts +8 -0
- package/dist/components/code-block/CodeHeader.svelte +52 -0
- package/dist/components/code-block/CodeHeader.svelte.d.ts +11 -0
- package/dist/components/code-block/CopyToClipboardButton.svelte +124 -0
- package/dist/components/code-block/CopyToClipboardButton.svelte.d.ts +4 -0
- package/dist/components/code-block/index.d.ts +10 -0
- package/dist/components/code-block/index.js +5 -0
- package/dist/components/code-block/types.d.ts +85 -0
- package/dist/components/code-block/types.js +1 -0
- package/dist/components/code-group/CodeGroup.svelte +327 -0
- package/dist/components/code-group/CodeGroup.svelte.d.ts +24 -0
- package/dist/components/code-group/CodeGroupSelect.svelte +170 -0
- package/dist/components/code-group/CodeGroupSelect.svelte.d.ts +25 -0
- package/dist/components/code-group/CodeSelectDropdown.svelte +74 -0
- package/dist/components/code-group/CodeSelectDropdown.svelte.d.ts +9 -0
- package/dist/components/code-group/LanguageDropdown.svelte +134 -0
- package/dist/components/code-group/LanguageDropdown.svelte.d.ts +11 -0
- package/dist/components/code-group/LanguageIcon.svelte +24 -0
- package/dist/components/code-group/LanguageIcon.svelte.d.ts +8 -0
- package/dist/components/code-group/context.d.ts +14 -0
- package/dist/components/code-group/context.js +2 -0
- package/dist/components/code-group/index.d.ts +8 -0
- package/dist/components/code-group/index.js +4 -0
- package/dist/components/color/Color.svelte +34 -0
- package/dist/components/color/Color.svelte.d.ts +10 -0
- package/dist/components/color/ColorItem.svelte +140 -0
- package/dist/components/color/ColorItem.svelte.d.ts +10 -0
- package/dist/components/color/ColorRow.svelte +27 -0
- package/dist/components/color/ColorRow.svelte.d.ts +8 -0
- package/dist/components/color/index.d.ts +1 -0
- package/dist/components/color/index.js +8 -0
- package/dist/components/columns/Box.svelte +15 -0
- package/dist/components/columns/Box.svelte.d.ts +7 -0
- package/dist/components/columns/Columns.svelte +31 -0
- package/dist/components/columns/Columns.svelte.d.ts +10 -0
- package/dist/components/columns/constants.d.ts +5 -0
- package/dist/components/columns/constants.js +3 -0
- package/dist/components/columns/index.d.ts +5 -0
- package/dist/components/columns/index.js +3 -0
- package/dist/components/expandable/Expandable.svelte +182 -0
- package/dist/components/expandable/Expandable.svelte.d.ts +22 -0
- package/dist/components/expandable/index.d.ts +3 -0
- package/dist/components/expandable/index.js +2 -0
- package/dist/components/frame/Frame.svelte +118 -0
- package/dist/components/frame/Frame.svelte.d.ts +15 -0
- package/dist/components/frame/index.d.ts +3 -0
- package/dist/components/frame/index.js +2 -0
- package/dist/components/icon/Icon.svelte +129 -0
- package/dist/components/icon/Icon.svelte.d.ts +18 -0
- package/dist/components/icon/index.d.ts +2 -0
- package/dist/components/icon/index.js +1 -0
- package/dist/components/index.d.ts +22 -0
- package/dist/components/index.js +22 -0
- package/dist/components/mermaid/Mermaid.svelte +181 -0
- package/dist/components/mermaid/Mermaid.svelte.d.ts +11 -0
- package/dist/components/mermaid/ZoomControls.svelte +74 -0
- package/dist/components/mermaid/ZoomControls.svelte.d.ts +12 -0
- package/dist/components/mermaid/index.d.ts +7 -0
- package/dist/components/mermaid/index.js +4 -0
- package/dist/components/mermaid/use-pan-zoom.svelte.d.ts +11 -0
- package/dist/components/mermaid/use-pan-zoom.svelte.js +41 -0
- package/dist/components/panel/Panel.svelte +27 -0
- package/dist/components/panel/Panel.svelte.d.ts +9 -0
- package/dist/components/panel/index.d.ts +3 -0
- package/dist/components/panel/index.js +2 -0
- package/dist/components/property/DeprecatedPill.svelte +16 -0
- package/dist/components/property/DeprecatedPill.svelte.d.ts +6 -0
- package/dist/components/property/InfoPill.svelte +32 -0
- package/dist/components/property/InfoPill.svelte.d.ts +10 -0
- package/dist/components/property/ParamHead.svelte +188 -0
- package/dist/components/property/ParamHead.svelte.d.ts +22 -0
- package/dist/components/property/Property.svelte +123 -0
- package/dist/components/property/Property.svelte.d.ts +24 -0
- package/dist/components/property/RequiredPill.svelte +16 -0
- package/dist/components/property/RequiredPill.svelte.d.ts +6 -0
- package/dist/components/property/index.d.ts +11 -0
- package/dist/components/property/index.js +6 -0
- package/dist/components/search/index.d.ts +7 -0
- package/dist/components/search/index.js +4 -0
- package/dist/components/search/use-search.d.ts +9 -0
- package/dist/components/search/use-search.js +6 -0
- package/dist/components/steps/Step.svelte +314 -0
- package/dist/components/steps/Step.svelte.d.ts +26 -0
- package/dist/components/steps/Steps.svelte +51 -0
- package/dist/components/steps/Steps.svelte.d.ts +11 -0
- package/dist/components/steps/constants.d.ts +4 -0
- package/dist/components/steps/constants.js +2 -0
- package/dist/components/steps/context.d.ts +10 -0
- package/dist/components/steps/context.js +2 -0
- package/dist/components/steps/index.d.ts +32 -0
- package/dist/components/steps/index.js +6 -0
- package/dist/components/tabs/Tabs.svelte +254 -0
- package/dist/components/tabs/Tabs.svelte.d.ts +16 -0
- package/dist/components/tabs/TabsItem.svelte +56 -0
- package/dist/components/tabs/TabsItem.svelte.d.ts +15 -0
- package/dist/components/tabs/context.d.ts +20 -0
- package/dist/components/tabs/context.js +2 -0
- package/dist/components/tabs/index.d.ts +27 -0
- package/dist/components/tabs/index.js +5 -0
- package/dist/components/tile/Tile.svelte +124 -0
- package/dist/components/tile/Tile.svelte.d.ts +12 -0
- package/dist/components/tile/index.d.ts +2 -0
- package/dist/components/tile/index.js +1 -0
- package/dist/components/tooltip/Tooltip.svelte +170 -0
- package/dist/components/tooltip/Tooltip.svelte.d.ts +23 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +1 -0
- package/dist/components/tree/Tree.svelte +226 -0
- package/dist/components/tree/Tree.svelte.d.ts +9 -0
- package/dist/components/tree/TreeFile.svelte +44 -0
- package/dist/components/tree/TreeFile.svelte.d.ts +6 -0
- package/dist/components/tree/TreeFolder.svelte +107 -0
- package/dist/components/tree/TreeFolder.svelte.d.ts +10 -0
- package/dist/components/tree/context.d.ts +3 -0
- package/dist/components/tree/context.js +7 -0
- package/dist/components/tree/index.d.ts +10 -0
- package/dist/components/tree/index.js +9 -0
- package/dist/components/tree/tree-level-context.d.ts +8 -0
- package/dist/components/tree/tree-level-context.js +7 -0
- package/dist/components/tree/use-tree-level.d.ts +3 -0
- package/dist/components/tree/use-tree-level.js +5 -0
- package/dist/components/tree/utils.d.ts +9 -0
- package/dist/components/tree/utils.js +86 -0
- package/dist/components/update/Update.svelte +210 -0
- package/dist/components/update/Update.svelte.d.ts +34 -0
- package/dist/components/update/index.d.ts +4 -0
- package/dist/components/update/index.js +3 -0
- package/dist/components/view/View.svelte +52 -0
- package/dist/components/view/View.svelte.d.ts +14 -0
- package/dist/components/view/index.d.ts +3 -0
- package/dist/components/view/index.js +2 -0
- package/dist/constants/brands.d.ts +2 -0
- package/dist/constants/brands.js +4 -0
- package/dist/constants/index.d.ts +6 -0
- package/dist/constants/index.js +6 -0
- package/dist/constants/selectors.d.ts +125 -0
- package/dist/constants/selectors.js +125 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/use-expandable-memory.svelte.d.ts +6 -0
- package/dist/hooks/use-expandable-memory.svelte.js +89 -0
- package/dist/hooks/use-expandable.svelte.d.ts +15 -0
- package/dist/hooks/use-expandable.svelte.js +53 -0
- package/dist/hooks/use-get-shiki-highlighted-html.svelte.d.ts +8 -0
- package/dist/hooks/use-get-shiki-highlighted-html.svelte.js +36 -0
- package/dist/hooks/use-has-hover.d.ts +2 -0
- package/dist/hooks/use-has-hover.js +10 -0
- package/dist/hooks/use-is-dark-theme.svelte.d.ts +3 -0
- package/dist/hooks/use-is-dark-theme.svelte.js +25 -0
- package/dist/hooks/use-isomorphic-layout-effect.d.ts +3 -0
- package/dist/hooks/use-isomorphic-layout-effect.js +6 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/styles.css +2 -0
- package/dist/utils/cn.d.ts +3 -0
- package/dist/utils/cn.js +7 -0
- package/dist/utils/copy-to-clipboard.d.ts +4 -0
- package/dist/utils/copy-to-clipboard.js +50 -0
- package/dist/utils/dedent.d.ts +1 -0
- package/dist/utils/dedent.js +125 -0
- package/dist/utils/enhance-video-props.d.ts +4 -0
- package/dist/utils/enhance-video-props.js +25 -0
- package/dist/utils/get-node-text.d.ts +2 -0
- package/dist/utils/get-node-text.js +26 -0
- package/dist/utils/icon-utils.d.ts +18 -0
- package/dist/utils/icon-utils.js +30 -0
- package/dist/utils/is-absolute-url.d.ts +4 -0
- package/dist/utils/is-absolute-url.js +11 -0
- package/dist/utils/is-remote-url.d.ts +2 -0
- package/dist/utils/is-remote-url.js +12 -0
- package/dist/utils/make-marker-ids-unique.d.ts +2 -0
- package/dist/utils/make-marker-ids-unique.js +36 -0
- package/dist/utils/shiki/code-styling.d.ts +13 -0
- package/dist/utils/shiki/code-styling.js +1 -0
- package/dist/utils/shiki/constants.d.ts +21 -0
- package/dist/utils/shiki/constants.js +116 -0
- package/dist/utils/shiki/get-code-styling.d.ts +9 -0
- package/dist/utils/shiki/get-code-styling.js +38 -0
- package/dist/utils/shiki/get-shiki-background-colors.d.ts +20 -0
- package/dist/utils/shiki/get-shiki-background-colors.js +56 -0
- package/dist/utils/shiki/index.d.ts +30 -0
- package/dist/utils/shiki/index.js +209 -0
- package/dist/utils/shiki/lib.d.ts +4 -0
- package/dist/utils/shiki/lib.js +49 -0
- package/dist/utils/shiki/shiki-themes.d.ts +2 -0
- package/dist/utils/shiki/shiki-themes.js +64 -0
- package/dist/utils/shiki/snippet-presets.d.ts +27 -0
- package/dist/utils/shiki/snippet-presets.js +44 -0
- package/dist/utils/shiki/worker-client.d.ts +9 -0
- package/dist/utils/shiki/worker-client.js +22 -0
- package/dist/utils/shiki/worker.d.ts +1 -0
- package/dist/utils/shiki/worker.js +134 -0
- package/dist/utils/slugify.d.ts +2 -0
- package/dist/utils/slugify.js +9 -0
- 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,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,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,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,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,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;
|