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,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";
@@ -0,0 +1,2 @@
1
+ // @ts-ignore - Svelte component default export
2
+ export { default as Badge } from "./Badge.svelte";