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,150 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import slugify from "@sindresorhus/slugify";
|
|
3
|
+
import { cn } from "../../utils/cn";
|
|
4
|
+
// @ts-ignore - Svelte component default export
|
|
5
|
+
import AccordionCover from "./AccordionCover.svelte";
|
|
6
|
+
import { CONNECTING_CHARACTER } from "./accordion-url-utils";
|
|
7
|
+
import { getContext, setContext } from "svelte";
|
|
8
|
+
import type { Snippet } from "svelte";
|
|
9
|
+
|
|
10
|
+
// Svelte context key for parentIds — replaces React createContext
|
|
11
|
+
const AccordionContextKey = "accordion-context";
|
|
12
|
+
|
|
13
|
+
type AccordionProps = {
|
|
14
|
+
title: string | Snippet;
|
|
15
|
+
description?: string;
|
|
16
|
+
defaultOpen?: boolean | string;
|
|
17
|
+
icon?: string | Snippet;
|
|
18
|
+
iconType?: string;
|
|
19
|
+
children?: Snippet;
|
|
20
|
+
class?: string;
|
|
21
|
+
_disabled?: boolean;
|
|
22
|
+
trackOpen?: (event: { title: string }) => void;
|
|
23
|
+
trackClose?: (event: { title: string }) => void;
|
|
24
|
+
onMount?: () => void;
|
|
25
|
+
topOffset?: string;
|
|
26
|
+
getInitialOpenFromUrl?: (id: string, parentIds: string[]) => boolean;
|
|
27
|
+
onUrlStateChange?: (isOpen: boolean, id: string | undefined, parentIds: string[]) => void;
|
|
28
|
+
_onKeyDownCapture?: (e: KeyboardEvent) => void;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
let {
|
|
32
|
+
title,
|
|
33
|
+
description,
|
|
34
|
+
defaultOpen = false,
|
|
35
|
+
icon,
|
|
36
|
+
iconType,
|
|
37
|
+
children,
|
|
38
|
+
class: className,
|
|
39
|
+
_disabled,
|
|
40
|
+
trackOpen,
|
|
41
|
+
trackClose,
|
|
42
|
+
onMount,
|
|
43
|
+
topOffset,
|
|
44
|
+
getInitialOpenFromUrl,
|
|
45
|
+
onUrlStateChange,
|
|
46
|
+
_onKeyDownCapture,
|
|
47
|
+
}: AccordionProps = $props();
|
|
48
|
+
|
|
49
|
+
// Svelte helper for title string — replaces React titleStr
|
|
50
|
+
let titleStr = $derived(typeof title === "string" ? title as string : "");
|
|
51
|
+
|
|
52
|
+
function handleChange(open: boolean) {
|
|
53
|
+
if (open) {
|
|
54
|
+
trackOpen?.({ title: titleStr });
|
|
55
|
+
} else {
|
|
56
|
+
trackClose?.({ title: titleStr });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Svelte Icon handling — keep string | Snippet as is, AccordionCover will render string via placeholder (mirrors React Icon)
|
|
61
|
+
|
|
62
|
+
// Use Svelte context for parentIds — replaces React useContext(AccordionContext)
|
|
63
|
+
let parentContext = getContext<{ parentIds: string[] }>(AccordionContextKey);
|
|
64
|
+
let parentIds = $derived(parentContext?.parentIds ?? []);
|
|
65
|
+
|
|
66
|
+
// Svelte id generation — replaces React useId + slugify
|
|
67
|
+
let generatedId = $derived(Math.random().toString(36).slice(2, 9));
|
|
68
|
+
let id = $derived(
|
|
69
|
+
typeof title === "string"
|
|
70
|
+
? slugify(title.split(CONNECTING_CHARACTER).join("-"), { decamelize: false })
|
|
71
|
+
: generatedId
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
// Svelte initial open logic — replaces React initialOpen IIFE
|
|
75
|
+
let initialOpen = $derived.by(() => {
|
|
76
|
+
if (getInitialOpenFromUrl && id) {
|
|
77
|
+
const urlResult = getInitialOpenFromUrl(id, parentIds);
|
|
78
|
+
if (urlResult === true) return true;
|
|
79
|
+
}
|
|
80
|
+
// Handle defaultOpen being string "true" as in React
|
|
81
|
+
if (defaultOpen === true || (typeof defaultOpen === "string" && defaultOpen === "true")) return true;
|
|
82
|
+
return false;
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// svelte-ignore state_referenced_locally
|
|
86
|
+
let open = $state(initialOpen);
|
|
87
|
+
// svelte-ignore state_referenced_locally
|
|
88
|
+
let openRef = $state(initialOpen);
|
|
89
|
+
|
|
90
|
+
// Svelte effect for onMount and URL initial — replaces React useEffect
|
|
91
|
+
$effect(() => {
|
|
92
|
+
if (getInitialOpenFromUrl && id) {
|
|
93
|
+
const urlResult = getInitialOpenFromUrl(id, parentIds);
|
|
94
|
+
if (urlResult === true && !openRef) {
|
|
95
|
+
open = true;
|
|
96
|
+
openRef = true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
onMount?.();
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
function onClickOpen(isOpen: boolean) {
|
|
103
|
+
open = isOpen;
|
|
104
|
+
openRef = isOpen;
|
|
105
|
+
|
|
106
|
+
if (!_disabled && onUrlStateChange) {
|
|
107
|
+
onUrlStateChange(isOpen, typeof title === "string" ? id : undefined, parentIds);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
handleChange(isOpen);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Svelte context provider for children — replaces React AccordionContext.Provider
|
|
114
|
+
let childParentIds = $derived([...parentIds, ...(typeof title === "string" ? [id] : [])]);
|
|
115
|
+
setContext(AccordionContextKey, {
|
|
116
|
+
get parentIds() {
|
|
117
|
+
return childParentIds;
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Svelte details toggle handler — replaces React onToggle
|
|
122
|
+
function handleToggle(e: Event) {
|
|
123
|
+
const details = e.currentTarget as HTMLDetailsElement;
|
|
124
|
+
const newState = details.open;
|
|
125
|
+
if (newState !== openRef) {
|
|
126
|
+
onClickOpen(newState);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
</script>
|
|
130
|
+
|
|
131
|
+
<details
|
|
132
|
+
class={cn("mb-3 cursor-default overflow-hidden rounded-2xl border border-stone-200/70 bg-white dark:border-white/10 dark:bg-[#0b0c0e]", className)}
|
|
133
|
+
data-component-part="accordion"
|
|
134
|
+
open={open}
|
|
135
|
+
ontoggle={handleToggle}
|
|
136
|
+
onkeydowncapture={_onKeyDownCapture}
|
|
137
|
+
>
|
|
138
|
+
<AccordionCover description={description} icon={icon} iconType={iconType} id={id} open={open} title={title} topOffset={topOffset} />
|
|
139
|
+
<div
|
|
140
|
+
aria-labelledby={`${id}-label`}
|
|
141
|
+
class="prose prose-stone dark:prose-invert mx-6 mt-2 mb-4 cursor-default overflow-x-auto"
|
|
142
|
+
data-component-part="accordion-content"
|
|
143
|
+
id={`${id}-accordion-children`}
|
|
144
|
+
role="region"
|
|
145
|
+
>
|
|
146
|
+
{#if children}
|
|
147
|
+
{@render children()}
|
|
148
|
+
{/if}
|
|
149
|
+
</div>
|
|
150
|
+
</details>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type AccordionProps = {
|
|
3
|
+
title: string | Snippet;
|
|
4
|
+
description?: string;
|
|
5
|
+
defaultOpen?: boolean | string;
|
|
6
|
+
icon?: string | Snippet;
|
|
7
|
+
iconType?: string;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
class?: string;
|
|
10
|
+
_disabled?: boolean;
|
|
11
|
+
trackOpen?: (event: {
|
|
12
|
+
title: string;
|
|
13
|
+
}) => void;
|
|
14
|
+
trackClose?: (event: {
|
|
15
|
+
title: string;
|
|
16
|
+
}) => void;
|
|
17
|
+
onMount?: () => void;
|
|
18
|
+
topOffset?: string;
|
|
19
|
+
getInitialOpenFromUrl?: (id: string, parentIds: string[]) => boolean;
|
|
20
|
+
onUrlStateChange?: (isOpen: boolean, id: string | undefined, parentIds: string[]) => void;
|
|
21
|
+
_onKeyDownCapture?: (e: KeyboardEvent) => void;
|
|
22
|
+
};
|
|
23
|
+
declare const Accordion: import("svelte").Component<AccordionProps, {}, "">;
|
|
24
|
+
type Accordion = ReturnType<typeof Accordion>;
|
|
25
|
+
export default Accordion;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from "../../utils/cn";
|
|
3
|
+
import { ChevronRight } from "@lucide/svelte";
|
|
4
|
+
import Icon from "../icon/Icon.svelte";
|
|
5
|
+
import type { Snippet } from "svelte";
|
|
6
|
+
|
|
7
|
+
type AccordionCoverProps = {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string | Snippet;
|
|
10
|
+
description?: string;
|
|
11
|
+
open: boolean;
|
|
12
|
+
icon?: string | Snippet;
|
|
13
|
+
iconType?: string;
|
|
14
|
+
topOffset?: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
let { id, title, description, open, icon, iconType, topOffset = "-top-18" }: AccordionCoverProps = $props();
|
|
18
|
+
|
|
19
|
+
// Svelte helper to check if title is string for rendering
|
|
20
|
+
let isTitleString = $derived(typeof title === "string");
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<!-- Svelte summary — replaces React summary with same Tailwind and ARIA -->
|
|
24
|
+
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
25
|
+
<summary
|
|
26
|
+
aria-controls={`${id}-accordion-children`}
|
|
27
|
+
aria-expanded={open}
|
|
28
|
+
class="not-prose relative flex w-full cursor-pointer list-none flex-row content-center items-center space-x-2 rounded-t-xl px-5 py-4 hover:bg-stone-100 hover:dark:bg-stone-800 [&::-webkit-details-marker]:hidden"
|
|
29
|
+
data-component-part="accordion-button"
|
|
30
|
+
id={`${id}-label`}
|
|
31
|
+
>
|
|
32
|
+
<div class={cn("absolute", topOffset)} id={id}></div>
|
|
33
|
+
<div class="mr-2" data-component-part="accordion-caret-right">
|
|
34
|
+
<ChevronRight
|
|
35
|
+
class={cn("size-3 text-stone-700 transition dark:text-stone-400", open && "-mt-1 rotate-90 duration-200", !open && "duration-75")}
|
|
36
|
+
size={12}
|
|
37
|
+
/>
|
|
38
|
+
</div>
|
|
39
|
+
{#if icon}
|
|
40
|
+
<div
|
|
41
|
+
class="flex size-4 items-center justify-center fill-stone-800 text-stone-800 dark:fill-stone-100 dark:text-stone-100"
|
|
42
|
+
data-component-part="accordion-icon"
|
|
43
|
+
>
|
|
44
|
+
{#if typeof icon === "string"}
|
|
45
|
+
<Icon icon={icon} iconType={iconType as any} size={16} />
|
|
46
|
+
{:else}
|
|
47
|
+
{@render icon()}
|
|
48
|
+
{/if}
|
|
49
|
+
</div>
|
|
50
|
+
{/if}
|
|
51
|
+
<div
|
|
52
|
+
class="w-full text-left leading-tight"
|
|
53
|
+
data-component-part="accordion-title-container"
|
|
54
|
+
>
|
|
55
|
+
<p class="m-0 font-medium text-stone-900 dark:text-stone-200" data-component-part="accordion-title">
|
|
56
|
+
{#if isTitleString}
|
|
57
|
+
{title}
|
|
58
|
+
{:else}
|
|
59
|
+
{@render (title as Snippet)()}
|
|
60
|
+
{/if}
|
|
61
|
+
</p>
|
|
62
|
+
{#if description}
|
|
63
|
+
<p class="m-0 text-stone-900 dark:text-stone-200" data-component-part="accordion-description">
|
|
64
|
+
{description}
|
|
65
|
+
</p>
|
|
66
|
+
{/if}
|
|
67
|
+
</div>
|
|
68
|
+
</summary>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type AccordionCoverProps = {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string | Snippet;
|
|
5
|
+
description?: string;
|
|
6
|
+
open: boolean;
|
|
7
|
+
icon?: string | Snippet;
|
|
8
|
+
iconType?: string;
|
|
9
|
+
topOffset?: string;
|
|
10
|
+
};
|
|
11
|
+
declare const AccordionCover: import("svelte").Component<AccordionCoverProps, {}, "">;
|
|
12
|
+
type AccordionCover = ReturnType<typeof AccordionCover>;
|
|
13
|
+
export default AccordionCover;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from "../../utils/cn";
|
|
3
|
+
import type { Snippet } from "svelte";
|
|
4
|
+
|
|
5
|
+
type AccordionGroupProps = {
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
class?: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
let { children, class: className }: AccordionGroupProps = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<div
|
|
14
|
+
class={cn(
|
|
15
|
+
"prose prose-stone dark:prose-invert mt-0 mb-3 overflow-hidden rounded-xl border border-stone-200/70 dark:border-white/10 [&>details+details]:border-t [&>details+details]:border-t-stone-200/70 dark:[&>details+details]:border-t-white/10 [&>details>summary]:rounded-none [&>details]:mb-0 [&>details]:rounded-none [&>details]:border-0",
|
|
16
|
+
className
|
|
17
|
+
)}
|
|
18
|
+
data-component-part="accordion-group"
|
|
19
|
+
>
|
|
20
|
+
{#if children}
|
|
21
|
+
{@render children()}
|
|
22
|
+
{/if}
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type AccordionGroupProps = {
|
|
3
|
+
children?: Snippet;
|
|
4
|
+
class?: string;
|
|
5
|
+
};
|
|
6
|
+
declare const AccordionGroup: import("svelte").Component<AccordionGroupProps, {}, "">;
|
|
7
|
+
type AccordionGroup = ReturnType<typeof AccordionGroup>;
|
|
8
|
+
export default AccordionGroup;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
declare const CONNECTING_CHARACTER = ":";
|
|
2
|
+
declare const getInitialOpenState: () => (id: string, parentIds: string[]) => boolean;
|
|
3
|
+
declare const updateAndCopyUrl: () => (isOpen: boolean, id: string | undefined, parentIds: string[]) => void;
|
|
4
|
+
export { CONNECTING_CHARACTER, getInitialOpenState, updateAndCopyUrl };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import isEqual from "lodash/isEqual";
|
|
2
|
+
const CONNECTING_CHARACTER = ":";
|
|
3
|
+
const getInitialOpenState = () => {
|
|
4
|
+
return (id, parentIds) => {
|
|
5
|
+
const hash = typeof window !== "undefined" ? window.location.hash.substring(1) : "";
|
|
6
|
+
if (!hash) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
const hashes = hash.split(CONNECTING_CHARACTER);
|
|
10
|
+
if (hashes.length > parentIds.length) {
|
|
11
|
+
return isEqual(parentIds, hashes.slice(0, parentIds.length)) && hashes[parentIds.length] === id;
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
const updateAndCopyUrl = () => {
|
|
17
|
+
const buildHistoryUrl = (idsString) => {
|
|
18
|
+
const url = new URL(window.location.href);
|
|
19
|
+
url.hash = idsString;
|
|
20
|
+
return url.toString();
|
|
21
|
+
};
|
|
22
|
+
const updateAndCopy = (ids) => {
|
|
23
|
+
if (typeof window === "undefined" || typeof document === "undefined" || !document.hasFocus()) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const idsString = ids.join(CONNECTING_CHARACTER);
|
|
27
|
+
const newUrl = buildHistoryUrl(idsString);
|
|
28
|
+
window.history.replaceState({ ...window.history.state, as: newUrl, url: newUrl }, "", newUrl);
|
|
29
|
+
};
|
|
30
|
+
return (isOpen, id, parentIds) => {
|
|
31
|
+
if (isOpen) {
|
|
32
|
+
if (id) {
|
|
33
|
+
updateAndCopy([...parentIds, id]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (parentIds.length > 0) {
|
|
37
|
+
updateAndCopy(parentIds);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
if (typeof window === "undefined" || typeof document === "undefined" || !document.hasFocus()) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const newUrl = buildHistoryUrl("");
|
|
44
|
+
window.history.replaceState({ ...window.history.state, as: newUrl, url: newUrl }, "", newUrl);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export { CONNECTING_CHARACTER, getInitialOpenState, updateAndCopyUrl };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const Accordion: import("svelte").Component<{
|
|
2
|
+
title: string | import("svelte").Snippet;
|
|
3
|
+
description?: string;
|
|
4
|
+
defaultOpen?: boolean | string;
|
|
5
|
+
icon?: string | import("svelte").Snippet;
|
|
6
|
+
iconType?: string;
|
|
7
|
+
children?: import("svelte").Snippet;
|
|
8
|
+
class?: string;
|
|
9
|
+
_disabled?: boolean;
|
|
10
|
+
trackOpen?: (event: {
|
|
11
|
+
title: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
trackClose?: (event: {
|
|
14
|
+
title: string;
|
|
15
|
+
}) => void;
|
|
16
|
+
onMount?: () => void;
|
|
17
|
+
topOffset?: string;
|
|
18
|
+
getInitialOpenFromUrl?: (id: string, parentIds: string[]) => boolean;
|
|
19
|
+
onUrlStateChange?: (isOpen: boolean, id: string | undefined, parentIds: string[]) => void;
|
|
20
|
+
_onKeyDownCapture?: (e: KeyboardEvent) => void;
|
|
21
|
+
}, {}, ""> & {
|
|
22
|
+
Group: import("svelte").Component<{
|
|
23
|
+
children?: import("svelte").Snippet;
|
|
24
|
+
class?: string;
|
|
25
|
+
}, {}, "">;
|
|
26
|
+
};
|
|
27
|
+
export type { default as AccordionProps } from "./Accordion.svelte";
|
|
28
|
+
export type { default as AccordionGroupProps } from "./AccordionGroup.svelte";
|
|
29
|
+
export { getInitialOpenState, updateAndCopyUrl } from "./accordion-url-utils";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import AccordionBase from "./Accordion.svelte";
|
|
2
|
+
import AccordionGroup from "./AccordionGroup.svelte";
|
|
3
|
+
export const Accordion = Object.assign(AccordionBase, {
|
|
4
|
+
Group: AccordionGroup,
|
|
5
|
+
});
|
|
6
|
+
export { getInitialOpenState, updateAndCopyUrl } from "./accordion-url-utils";
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from "../../utils/cn";
|
|
3
|
+
import Icon from "../icon/Icon.svelte";
|
|
4
|
+
import type { IconLibrary, IconType } from "../../utils/icon-utils";
|
|
5
|
+
import type { Snippet } from "svelte";
|
|
6
|
+
|
|
7
|
+
const BADGE_COLORS = ["gray","blue","green","orange","yellow","red","purple","white","surface","white-destructive","surface-destructive"] as const;
|
|
8
|
+
const BADGE_SHAPES = ["rounded","pill"] as const;
|
|
9
|
+
const BADGE_SIZES = ["xs","sm","md","lg"] as const;
|
|
10
|
+
const BADGE_VARIANTS = ["solid","outline"] as const;
|
|
11
|
+
|
|
12
|
+
type BadgeSize = (typeof BADGE_SIZES)[number];
|
|
13
|
+
type BadgeShape = (typeof BADGE_SHAPES)[number];
|
|
14
|
+
type BadgeVariant = (typeof BADGE_VARIANTS)[number];
|
|
15
|
+
type BadgeColor = (typeof BADGE_COLORS)[number];
|
|
16
|
+
|
|
17
|
+
const sizeVariants: Record<BadgeSize, string> = {
|
|
18
|
+
lg: 'gap-1 py-1 pl-2.5 pr-2.5 [&_svg]:size-3.5 text-sm tracking-[-0.1px] data-[shape="rounded"]:rounded-[8px]',
|
|
19
|
+
md: 'gap-1 py-0.5 pl-2 pr-2 [&_svg]:size-3.5 text-sm tracking-[-0.1px] data-[shape="rounded"]:rounded-[8px]',
|
|
20
|
+
sm: 'gap-[3px] py-0.5 pl-1.5 pr-1.5 [&_svg]:size-3 text-xs data-[shape="rounded"]:rounded-[6px]',
|
|
21
|
+
xs: 'gap-0.5 py-0 pl-1 pr-1 [&_svg]:size-2.5 text-xs data-[shape="rounded"]:rounded-[4px]',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const colorVariants: Record<BadgeColor, string> = {
|
|
25
|
+
gray: "[--color-bg:#F5F5F5] dark:[--color-bg:#262727] [--color-text:#78787A] dark:[--color-text:#D7D7D7] [--color-bg-disabled:#F5F5F5] dark:[--color-bg-disabled:#262727] [--color-text-disabled:#E9E9EA] dark:[--color-text-disabled:#3C3C3D]",
|
|
26
|
+
blue: "[--color-bg:#E3EAFD] dark:[--color-bg:#07296A] [--color-text:#133A9A] dark:[--color-text:#7196F4] [--color-bg-disabled:#F0F4FE] dark:[--color-bg-disabled:#03153A] [--color-text-disabled:rgba(51,104,240,0.50)] dark:[--color-text-disabled:rgba(51,104,240,0.30)]",
|
|
27
|
+
green: "[--color-bg:#D1FAE4] dark:[--color-bg:#0F4C2C] [--color-text:#166E3F] dark:[--color-text:#6AE1A1] [--color-bg-disabled:#EDFDF4] dark:[--color-bg-disabled:#072213] [--color-text-disabled:rgba(38,189,108,0.50)] dark:[--color-text-disabled:rgba(38,189,108,0.30)]",
|
|
28
|
+
yellow: "[--color-bg:#FEF9C3] dark:[--color-bg:#713F12] [--color-text:#A16207] dark:[--color-text:#FDE047] [--color-bg-disabled:#FEFCE8] dark:[--color-bg-disabled:#422006] [--color-text-disabled:#FEF08A] dark:[--color-text-disabled:#854D0E]",
|
|
29
|
+
orange: "[--color-bg:#FDEAD8] dark:[--color-bg:#613105] [--color-text:#AE590A] dark:[--color-text:#F8B577] [--color-bg-disabled:#FEF4EC] dark:[--color-bg-disabled:#301903] [--color-text-disabled:rgba(244,142,47,0.50)] dark:[--color-text-disabled:rgba(244,142,47,0.30)]",
|
|
30
|
+
red: "[--color-bg:#FCE5E4] dark:[--color-bg:#64120D] [--color-text:#9A1C13] dark:[--color-text:#F08B85] [--color-bg-disabled:#FDF2F1] dark:[--color-bg-disabled:#360A07] [--color-text-disabled:rgba(230,72,61,0.50)] dark:[--color-text-disabled:rgba(230,72,61,0.30)]",
|
|
31
|
+
purple: "[--color-bg:#ECDFFB] dark:[--color-bg:#3A0F71] [--color-text:#5314A3] dark:[--color-text:#B78AF0] [--color-bg-disabled:#ECDFFB] dark:[--color-bg-disabled:#3A0F71] [--color-text-disabled:rgba(135,61,230,0.50)] dark:[--color-text-disabled:rgba(135,61,230,0.30)]",
|
|
32
|
+
white: "[--color-bg:rgba(255,255,255,0.95)] dark:[--color-bg:rgba(255,255,255,0.95)] [--color-text:rgba(11,12,14,0.60)] dark:[--color-text:rgba(11,12,14,0.60)] [--color-bg-disabled:rgba(255,255,255,0.08)] dark:[--color-bg-disabled:rgba(255,255,255,0.24)] [--color-text-disabled:#E9E9EA] dark:[--color-text-disabled:#3C3C3D]",
|
|
33
|
+
surface: "[--color-bg:rgba(255,255,255,0.95)] dark:[--color-bg:#262727] [--color-text:#78787A] dark:[--color-text:#D7D7D7] [--color-bg-disabled:rgba(255,255,255,0.95)] dark:[--color-bg-disabled:#262727] [--color-text-disabled:#E9E9EA] dark:[--color-text-disabled:#3C3C3D]",
|
|
34
|
+
"white-destructive": "[--color-bg:rgba(255,255,255,0.95)] dark:[--color-bg:rgba(255,255,255,0.95)] [--color-text:#E6483D] dark:[--color-text:#E6483D] [--color-bg-disabled:rgba(255,255,255,0.08)] dark:[--color-bg-disabled:rgba(255,255,255,0.24)] [--color-text-disabled:rgba(230,72,61,0.30)] dark:[--color-text-disabled:rgba(230,72,61,0.40)]",
|
|
35
|
+
"surface-destructive": "[--color-bg:rgba(255,255,255,0.95)] dark:[--color-bg:#262727] [--color-text:#E6483D] dark:[--color-text:#E6483D] [--color-bg-disabled:rgba(255,255,255,0.95)] dark:[--color-bg-disabled:#262727] [--color-text-disabled:rgba(230,72,61,0.30)] dark:[--color-text-disabled:rgba(230,72,61,0.40)]",
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
type BadgeProps = {
|
|
39
|
+
children?: Snippet;
|
|
40
|
+
color?: BadgeColor;
|
|
41
|
+
shape?: BadgeShape;
|
|
42
|
+
size?: BadgeSize;
|
|
43
|
+
variant?: BadgeVariant;
|
|
44
|
+
disabled?: boolean;
|
|
45
|
+
class?: string;
|
|
46
|
+
leadIcon?: string | Snippet;
|
|
47
|
+
tailIcon?: string | Snippet;
|
|
48
|
+
iconType?: IconType;
|
|
49
|
+
iconLibrary?: IconLibrary;
|
|
50
|
+
onClick?: () => void;
|
|
51
|
+
href?: string;
|
|
52
|
+
/** @deprecated Use leadIcon or tailIcon instead — Svelte: kept for 1:1 */
|
|
53
|
+
icon?: string | Snippet;
|
|
54
|
+
/** @deprecated Use variant="outline" instead */
|
|
55
|
+
stroke?: boolean;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
let {
|
|
59
|
+
children,
|
|
60
|
+
color = "gray",
|
|
61
|
+
shape = "rounded",
|
|
62
|
+
variant: variantProp,
|
|
63
|
+
stroke,
|
|
64
|
+
disabled = false,
|
|
65
|
+
size = "md",
|
|
66
|
+
leadIcon,
|
|
67
|
+
tailIcon: tailIconProp,
|
|
68
|
+
icon,
|
|
69
|
+
iconType,
|
|
70
|
+
iconLibrary = "fontawesome",
|
|
71
|
+
onClick,
|
|
72
|
+
href,
|
|
73
|
+
class: className,
|
|
74
|
+
}: BadgeProps = $props();
|
|
75
|
+
|
|
76
|
+
let variant = $derived(variantProp ?? (stroke ? "outline" : "solid"));
|
|
77
|
+
let tailIcon = $derived(tailIconProp ?? icon);
|
|
78
|
+
|
|
79
|
+
let isInteractive = $derived(!!(onClick || href));
|
|
80
|
+
let Component = $derived(href && !disabled ? "a" : onClick && !disabled ? "button" : "span");
|
|
81
|
+
|
|
82
|
+
let commonClass = $derived(
|
|
83
|
+
cn(
|
|
84
|
+
"relative inline-flex w-fit items-center font-medium data-disabled:cursor-not-allowed",
|
|
85
|
+
"data-[shape='pill']:rounded-full",
|
|
86
|
+
"data-[variant='outline']:outline-1 data-[variant='outline']:outline-[rgba(11,12,14,0.08)] data-[variant='outline']:outline-solid data-[variant='outline']:-outline-offset-1 dark:data-[variant='outline']:outline-[rgba(255,255,255,0.14)]",
|
|
87
|
+
"bg-[var(--color-bg)] text-[var(--color-text)] data-disabled:bg-[var(--color-bg-disabled)] data-disabled:text-[var(--color-text-disabled)]",
|
|
88
|
+
'[&_[data-component-part$="-icon"][data-icon-type="string"]_svg]:bg-[var(--color-text)] data-disabled:[&_[data-component-part$="-icon"][data-icon-type="string"]_svg]:bg-[var(--color-text-disabled)]',
|
|
89
|
+
'[&_[data-component-part$="-icon"][data-icon-type="inline"]_svg]:fill-current',
|
|
90
|
+
sizeVariants[size],
|
|
91
|
+
colorVariants[color],
|
|
92
|
+
isInteractive && !disabled && "cursor-pointer transition-opacity hover:opacity-80",
|
|
93
|
+
Component === "button" && "border-0",
|
|
94
|
+
className
|
|
95
|
+
)
|
|
96
|
+
);
|
|
97
|
+
</script>
|
|
98
|
+
|
|
99
|
+
{#snippet renderIcon(iconNode: string | Snippet | undefined, position: "lead" | "tail")}
|
|
100
|
+
{#if iconNode}
|
|
101
|
+
{@const isStringIcon = typeof iconNode === "string"}
|
|
102
|
+
<span data-component-part={`${position}-icon`} data-icon-type={isStringIcon ? "string" : "inline"}>
|
|
103
|
+
{#if isStringIcon}
|
|
104
|
+
<Icon class="shrink-0" icon={iconNode as string} iconLibrary={iconLibrary} iconType={iconType} overrideColor overrideSize />
|
|
105
|
+
{:else}
|
|
106
|
+
{@render (iconNode as Snippet)()}
|
|
107
|
+
{/if}
|
|
108
|
+
</span>
|
|
109
|
+
{/if}
|
|
110
|
+
{/snippet}
|
|
111
|
+
|
|
112
|
+
{#if Component === "a"}
|
|
113
|
+
<a
|
|
114
|
+
data-shape={shape}
|
|
115
|
+
data-variant={variant}
|
|
116
|
+
data-disabled={disabled || undefined}
|
|
117
|
+
class={commonClass}
|
|
118
|
+
data-debug={commonClass}
|
|
119
|
+
href={href}
|
|
120
|
+
onclick={onClick}
|
|
121
|
+
>
|
|
122
|
+
{@render renderIcon(leadIcon, "lead")}
|
|
123
|
+
{#if children}{@render children()}{/if}
|
|
124
|
+
{@render renderIcon(tailIcon, "tail")}
|
|
125
|
+
</a>
|
|
126
|
+
{:else if Component === "button"}
|
|
127
|
+
<button
|
|
128
|
+
data-shape={shape}
|
|
129
|
+
data-variant={variant}
|
|
130
|
+
data-disabled={disabled || undefined}
|
|
131
|
+
class={commonClass}
|
|
132
|
+
data-debug={commonClass}
|
|
133
|
+
onclick={onClick}
|
|
134
|
+
type="button"
|
|
135
|
+
>
|
|
136
|
+
{@render renderIcon(leadIcon, "lead")}
|
|
137
|
+
{#if children}{@render children()}{/if}
|
|
138
|
+
{@render renderIcon(tailIcon, "tail")}
|
|
139
|
+
</button>
|
|
140
|
+
{:else}
|
|
141
|
+
<span
|
|
142
|
+
data-shape={shape}
|
|
143
|
+
data-variant={variant}
|
|
144
|
+
data-disabled={disabled || undefined}
|
|
145
|
+
class={commonClass}
|
|
146
|
+
data-debug={commonClass}
|
|
147
|
+
>
|
|
148
|
+
{@render renderIcon(leadIcon, "lead")}
|
|
149
|
+
{#if children}{@render children()}{/if}
|
|
150
|
+
{@render renderIcon(tailIcon, "tail")}
|
|
151
|
+
</span>
|
|
152
|
+
{/if}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IconLibrary, IconType } from "../../utils/icon-utils";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
declare const Badge: import("svelte").Component<{
|
|
4
|
+
children?: Snippet;
|
|
5
|
+
color?: "gray" | "blue" | "green" | "orange" | "yellow" | "red" | "purple" | "white" | "surface" | "white-destructive" | "surface-destructive";
|
|
6
|
+
shape?: "rounded" | "pill";
|
|
7
|
+
size?: "xs" | "sm" | "md" | "lg";
|
|
8
|
+
variant?: "outline" | "solid";
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
class?: string;
|
|
11
|
+
leadIcon?: string | Snippet;
|
|
12
|
+
tailIcon?: string | Snippet;
|
|
13
|
+
iconType?: IconType;
|
|
14
|
+
iconLibrary?: IconLibrary;
|
|
15
|
+
onClick?: () => void;
|
|
16
|
+
href?: string;
|
|
17
|
+
/** @deprecated Use leadIcon or tailIcon instead — Svelte: kept for 1:1 */
|
|
18
|
+
icon?: string | Snippet;
|
|
19
|
+
/** @deprecated Use variant="outline" instead */
|
|
20
|
+
stroke?: boolean;
|
|
21
|
+
}, {}, "">;
|
|
22
|
+
type Badge = ReturnType<typeof Badge>;
|
|
23
|
+
export default Badge;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Badge } from "./Badge.svelte";
|