@ouraihub/aether-ui 0.0.0-stage → 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 (179) hide show
  1. package/LICENSE +789 -0
  2. package/fixtures/model-classify.json +42 -0
  3. package/fixtures/pricing-cost.json +56 -0
  4. package/fixtures/reasoning-infer.json +44 -0
  5. package/fixtures/sse/anthropic-messages/chinese.sse +24 -0
  6. package/fixtures/sse/anthropic-messages/multi-tool.sse +33 -0
  7. package/fixtures/sse/anthropic-messages/single-tool.sse +39 -0
  8. package/fixtures/sse/anthropic-messages/text.sse +27 -0
  9. package/fixtures/sse/anthropic-messages/truncated.sse +21 -0
  10. package/fixtures/sse/anthropic-messages/upstream-error.sse +12 -0
  11. package/fixtures/sse/expect.json +20 -0
  12. package/fixtures/sse/openai-chat/chinese.sse +14 -0
  13. package/fixtures/sse/openai-chat/multi-tool.sse +18 -0
  14. package/fixtures/sse/openai-chat/single-tool.sse +22 -0
  15. package/fixtures/sse/openai-chat/text.sse +14 -0
  16. package/fixtures/sse/openai-chat/truncated.sse +12 -0
  17. package/fixtures/sse/openai-chat/upstream-error.sse +6 -0
  18. package/fixtures/sse/openai-responses/chinese.sse +33 -0
  19. package/fixtures/sse/openai-responses/multi-tool.sse +36 -0
  20. package/fixtures/sse/openai-responses/single-tool.sse +27 -0
  21. package/fixtures/sse/openai-responses/text.sse +33 -0
  22. package/fixtures/sse/openai-responses/truncated.sse +30 -0
  23. package/fixtures/sse/openai-responses/upstream-error.sse +9 -0
  24. package/package.json +71 -3
  25. package/src/CopyInput.svelte +33 -0
  26. package/src/KitNotifier.svelte +33 -0
  27. package/src/chat/ApprovalCard.svelte +23 -0
  28. package/src/chat/ChatPanel.svelte +2097 -0
  29. package/src/chat/MessageItem.svelte +583 -0
  30. package/src/chat/SkillPicker.svelte +126 -0
  31. package/src/chat/ToolCallItem.svelte +23 -0
  32. package/src/chat/UsageDetails.svelte +138 -0
  33. package/src/chat/index.ts +2 -0
  34. package/src/chat/run-session.svelte.ts +556 -0
  35. package/src/components/ui/alert/alert-action.svelte +20 -0
  36. package/src/components/ui/alert/alert-description.svelte +23 -0
  37. package/src/components/ui/alert/alert-title.svelte +23 -0
  38. package/src/components/ui/alert/alert.svelte +43 -0
  39. package/src/components/ui/alert/index.ts +17 -0
  40. package/src/components/ui/alert-dialog/alert-dialog-action.svelte +27 -0
  41. package/src/components/ui/alert-dialog/alert-dialog-cancel.svelte +27 -0
  42. package/src/components/ui/alert-dialog/alert-dialog-content.svelte +32 -0
  43. package/src/components/ui/alert-dialog/alert-dialog-description.svelte +17 -0
  44. package/src/components/ui/alert-dialog/alert-dialog-footer.svelte +23 -0
  45. package/src/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
  46. package/src/components/ui/alert-dialog/alert-dialog-media.svelte +20 -0
  47. package/src/components/ui/alert-dialog/alert-dialog-overlay.svelte +17 -0
  48. package/src/components/ui/alert-dialog/alert-dialog-portal.svelte +7 -0
  49. package/src/components/ui/alert-dialog/alert-dialog-title.svelte +17 -0
  50. package/src/components/ui/alert-dialog/alert-dialog-trigger.svelte +7 -0
  51. package/src/components/ui/alert-dialog/alert-dialog.svelte +7 -0
  52. package/src/components/ui/alert-dialog/index.ts +40 -0
  53. package/src/components/ui/button/button.svelte +81 -0
  54. package/src/components/ui/button/index.ts +17 -0
  55. package/src/components/ui/dialog/dialog-close.svelte +11 -0
  56. package/src/components/ui/dialog/dialog-content.svelte +48 -0
  57. package/src/components/ui/dialog/dialog-description.svelte +17 -0
  58. package/src/components/ui/dialog/dialog-footer.svelte +32 -0
  59. package/src/components/ui/dialog/dialog-header.svelte +20 -0
  60. package/src/components/ui/dialog/dialog-overlay.svelte +17 -0
  61. package/src/components/ui/dialog/dialog-portal.svelte +7 -0
  62. package/src/components/ui/dialog/dialog-title.svelte +17 -0
  63. package/src/components/ui/dialog/dialog-trigger.svelte +11 -0
  64. package/src/components/ui/dialog/dialog.svelte +7 -0
  65. package/src/components/ui/dialog/index.ts +34 -0
  66. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  67. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  68. package/src/components/ui/dropdown-menu/dropdown-menu-content.svelte +31 -0
  69. package/src/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  70. package/src/components/ui/dropdown-menu/dropdown-menu-group.svelte +7 -0
  71. package/src/components/ui/dropdown-menu/dropdown-menu-item.svelte +27 -0
  72. package/src/components/ui/dropdown-menu/dropdown-menu-label.svelte +24 -0
  73. package/src/components/ui/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  74. package/src/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +17 -0
  75. package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  76. package/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  77. package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
  78. package/src/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  79. package/src/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  80. package/src/components/ui/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  81. package/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  82. package/src/components/ui/dropdown-menu/dropdown-menu.svelte +7 -0
  83. package/src/components/ui/dropdown-menu/index.ts +54 -0
  84. package/src/components/ui/empty/empty-content.svelte +23 -0
  85. package/src/components/ui/empty/empty-description.svelte +23 -0
  86. package/src/components/ui/empty/empty-header.svelte +20 -0
  87. package/src/components/ui/empty/empty-media.svelte +41 -0
  88. package/src/components/ui/empty/empty-title.svelte +20 -0
  89. package/src/components/ui/empty/empty.svelte +23 -0
  90. package/src/components/ui/empty/index.ts +22 -0
  91. package/src/components/ui/field/field-content.svelte +20 -0
  92. package/src/components/ui/field/field-description.svelte +25 -0
  93. package/src/components/ui/field/field-error.svelte +58 -0
  94. package/src/components/ui/field/field-group.svelte +23 -0
  95. package/src/components/ui/field/field-label.svelte +25 -0
  96. package/src/components/ui/field/field-legend.svelte +24 -0
  97. package/src/components/ui/field/field-separator.svelte +35 -0
  98. package/src/components/ui/field/field-set.svelte +20 -0
  99. package/src/components/ui/field/field-title.svelte +20 -0
  100. package/src/components/ui/field/field.svelte +47 -0
  101. package/src/components/ui/field/index.ts +33 -0
  102. package/src/components/ui/input/index.ts +7 -0
  103. package/src/components/ui/input/input.svelte +48 -0
  104. package/src/components/ui/label/index.ts +7 -0
  105. package/src/components/ui/label/label.svelte +20 -0
  106. package/src/components/ui/select/index.ts +40 -0
  107. package/src/components/ui/select/select-content.svelte +45 -0
  108. package/src/components/ui/select/select-group-heading.svelte +21 -0
  109. package/src/components/ui/select/select-group.svelte +17 -0
  110. package/src/components/ui/select/select-item.svelte +43 -0
  111. package/src/components/ui/select/select-label.svelte +20 -0
  112. package/src/components/ui/select/select-portal.svelte +7 -0
  113. package/src/components/ui/select/select-scroll-down-button.svelte +20 -0
  114. package/src/components/ui/select/select-scroll-up-button.svelte +20 -0
  115. package/src/components/ui/select/select-separator.svelte +18 -0
  116. package/src/components/ui/select/select-trigger.svelte +29 -0
  117. package/src/components/ui/select/select-value.svelte +7 -0
  118. package/src/components/ui/select/select.svelte +11 -0
  119. package/src/components/ui/separator/index.ts +7 -0
  120. package/src/components/ui/separator/separator.svelte +21 -0
  121. package/src/components/ui/sonner/index.ts +1 -0
  122. package/src/components/ui/sonner/sonner.svelte +40 -0
  123. package/src/components/ui/switch/index.ts +7 -0
  124. package/src/components/ui/switch/switch.svelte +34 -0
  125. package/src/components/ui/textarea/index.ts +7 -0
  126. package/src/components/ui/textarea/textarea.svelte +22 -0
  127. package/src/context.ts +34 -0
  128. package/src/dev/Demo.svelte +45 -0
  129. package/src/dev/main.ts +7 -0
  130. package/src/i18n/en.ts +617 -0
  131. package/src/i18n/index.ts +23 -0
  132. package/src/i18n/zh-CN.ts +599 -0
  133. package/src/index.ts +10 -0
  134. package/src/logs/LogPanel.svelte +97 -0
  135. package/src/logs/LogSettings.svelte +56 -0
  136. package/src/logs/index.ts +5 -0
  137. package/src/logs/logger.ts +96 -0
  138. package/src/markdown.ts +8 -0
  139. package/src/mcp/McpClientSettings.svelte +491 -0
  140. package/src/mcp/McpServerSettings.svelte +327 -0
  141. package/src/mcp/config.ts +26 -0
  142. package/src/mcp/index.ts +3 -0
  143. package/src/mcp/input.ts +73 -0
  144. package/src/notify.svelte.ts +43 -0
  145. package/src/ports/contract.ts +165 -0
  146. package/src/ports/fake.ts +484 -0
  147. package/src/ports/index.ts +7 -0
  148. package/src/ports/search.ts +47 -0
  149. package/src/ports/skill-sources.ts +45 -0
  150. package/src/providers/EndpointKeysDialog.svelte +343 -0
  151. package/src/providers/EndpointPanel.svelte +491 -0
  152. package/src/providers/ModelPickerDialog.svelte +187 -0
  153. package/src/providers/ModelSelect.svelte +434 -0
  154. package/src/providers/ModelSettingsDialog.svelte +453 -0
  155. package/src/providers/ProvidersSettings.svelte +631 -0
  156. package/src/providers/RequestConfigDialog.svelte +250 -0
  157. package/src/providers/SecretInput.svelte +276 -0
  158. package/src/providers/draft.ts +329 -0
  159. package/src/providers/edit-session.ts +146 -0
  160. package/src/providers/index.ts +5 -0
  161. package/src/providers/reasoning.ts +41 -0
  162. package/src/providers/revision.svelte.ts +4 -0
  163. package/src/search/SearchSettings.svelte +703 -0
  164. package/src/search/index.ts +13 -0
  165. package/src/search/settings-flow.ts +62 -0
  166. package/src/session.ts +20 -0
  167. package/src/skills/SkillAdd.svelte +347 -0
  168. package/src/skills/SkillAuthoring.svelte +381 -0
  169. package/src/skills/SkillEditor.svelte +94 -0
  170. package/src/skills/SkillPreviewDialog.svelte +122 -0
  171. package/src/skills/SkillsSettings.svelte +140 -0
  172. package/src/skills/error.ts +32 -0
  173. package/src/skills/index.ts +4 -0
  174. package/src/styles/kit.css +137 -0
  175. package/src/styles/tokens.css +22 -0
  176. package/src/tauri/index.ts +282 -0
  177. package/src/utils.ts +22 -0
  178. package/src/web/index.ts +376 -0
  179. package/README.md +0 -3
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+ import ChevronDownIcon from '@lucide/svelte/icons/chevron-down';
4
+ import { cn, type WithoutChild } from "#lib/utils.js";
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ children,
10
+ size = "default",
11
+ ...restProps
12
+ }: WithoutChild<SelectPrimitive.TriggerProps> & {
13
+ size?: "sm" | "default";
14
+ } = $props();
15
+ </script>
16
+
17
+ <SelectPrimitive.Trigger
18
+ bind:ref
19
+ data-slot="select-trigger"
20
+ data-size={size}
21
+ class={cn(
22
+ "border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-kit border bg-transparent py-2 pr-2 pl-2.5 text-kit-base transition-colors select-none focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-kit-control data-[size=sm]:h-kit-control-sm data-[size=sm]:rounded-kit-sm *:data-[slot=select-value]:flex *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
23
+ className
24
+ )}
25
+ {...restProps}
26
+ >
27
+ {@render children?.()}
28
+ <ChevronDownIcon class="text-muted-foreground size-4 pointer-events-none" />
29
+ </SelectPrimitive.Trigger>
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+
4
+ let { ref = $bindable(null), ...restProps }: SelectPrimitive.ValueProps = $props();
5
+ </script>
6
+
7
+ <SelectPrimitive.Value bind:ref data-slot="select-value" {...restProps} />
@@ -0,0 +1,11 @@
1
+ <script lang="ts">
2
+ import { Select as SelectPrimitive } from "bits-ui";
3
+
4
+ let {
5
+ open = $bindable(false),
6
+ value = $bindable(),
7
+ ...restProps
8
+ }: SelectPrimitive.RootProps = $props();
9
+ </script>
10
+
11
+ <SelectPrimitive.Root bind:open bind:value={value as never} {...restProps} />
@@ -0,0 +1,7 @@
1
+ import Root from "./separator.svelte";
2
+
3
+ export {
4
+ Root,
5
+ //
6
+ Root as Separator,
7
+ };
@@ -0,0 +1,21 @@
1
+ <script lang="ts">
2
+ import { Separator as SeparatorPrimitive } from "bits-ui";
3
+ import { cn } from "#lib/utils.js";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ "data-slot": dataSlot = "separator",
9
+ ...restProps
10
+ }: SeparatorPrimitive.RootProps = $props();
11
+ </script>
12
+
13
+ <SeparatorPrimitive.Root
14
+ bind:ref
15
+ data-slot={dataSlot}
16
+ class={cn(
17
+ "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
18
+ className
19
+ )}
20
+ {...restProps}
21
+ />
@@ -0,0 +1 @@
1
+ export { default as Toaster } from "./sonner.svelte";
@@ -0,0 +1,40 @@
1
+ <!-- Local change: `theme` falls back to "system" before mode-watcher resolves, as exactOptionalPropertyTypes rejects `undefined` (docs/04 §4). -->
2
+ <script lang="ts">
3
+ import { mode } from "mode-watcher";
4
+ import { Toaster as Sonner, type ToasterProps as SonnerProps } from "svelte-sonner";
5
+ import Loader2Icon from '@lucide/svelte/icons/loader-2';
6
+ import CircleCheckIcon from '@lucide/svelte/icons/circle-check';
7
+ import OctagonXIcon from '@lucide/svelte/icons/octagon-x';
8
+ import InfoIcon from '@lucide/svelte/icons/info';
9
+ import TriangleAlertIcon from '@lucide/svelte/icons/triangle-alert';
10
+
11
+ let { ...restProps }: SonnerProps = $props();
12
+ </script>
13
+
14
+ <Sonner
15
+ theme={mode.current ?? "system"}
16
+ class="toaster group"
17
+ style="--normal-bg: var(--color-popover); --normal-text: var(--color-popover-foreground); --normal-border: var(--color-border);"
18
+ toastOptions={{
19
+ classes: {
20
+ toast: "cn-toast",
21
+ },
22
+ }}
23
+ {...restProps}
24
+ >
25
+ {#snippet loadingIcon()}
26
+ <Loader2Icon class="size-4 animate-spin" />
27
+ {/snippet}
28
+ {#snippet successIcon()}
29
+ <CircleCheckIcon class="size-4" />
30
+ {/snippet}
31
+ {#snippet errorIcon()}
32
+ <OctagonXIcon class="size-4" />
33
+ {/snippet}
34
+ {#snippet infoIcon()}
35
+ <InfoIcon class="size-4" />
36
+ {/snippet}
37
+ {#snippet warningIcon()}
38
+ <TriangleAlertIcon class="size-4" />
39
+ {/snippet}
40
+ </Sonner>
@@ -0,0 +1,7 @@
1
+ import Root from "./switch.svelte";
2
+
3
+ export {
4
+ Root,
5
+ //
6
+ Root as Switch,
7
+ };
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import { Switch as SwitchPrimitive } from "bits-ui";
3
+ import { cn, type WithoutChildrenOrChild } from "#lib/utils.js";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ checked = $bindable(false),
9
+ size = "default",
10
+ ...restProps
11
+ }: WithoutChildrenOrChild<SwitchPrimitive.RootProps> & {
12
+ size?: "sm" | "default";
13
+ } = $props();
14
+ </script>
15
+
16
+ <SwitchPrimitive.Root
17
+ bind:ref
18
+ bind:checked
19
+ data-slot="switch"
20
+ data-size={size}
21
+ class={cn(
22
+ "data-[state=checked]:bg-primary data-[state=unchecked]:bg-muted-foreground/35 focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 shrink-0 rounded-full p-0.5 focus-visible:ring-3 aria-invalid:ring-3 group-has-[:focus-visible]/field-label:ring-0 data-[size=default]:h-5 data-[size=default]:w-[34px] data-[size=sm]:h-4 data-[size=sm]:w-7 peer group/switch relative inline-flex items-center transition-colors outline-none after:absolute after:-inset-x-3 after:-inset-y-2 data-disabled:cursor-not-allowed data-disabled:opacity-45",
23
+ className
24
+ )}
25
+ {...restProps}
26
+ >
27
+ <SwitchPrimitive.Thumb
28
+ data-slot="switch-thumb"
29
+ class={cn(
30
+ "bg-white rounded-full shadow-sm group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:group-data-[state=checked]/switch:translate-x-[14px] group-data-[size=sm]/switch:group-data-[state=checked]/switch:translate-x-3 pointer-events-none block ring-0 transition-transform",
31
+ "rtl:group-data-[state=checked]/switch:-translate-x-[14px]"
32
+ )}
33
+ />
34
+ </SwitchPrimitive.Root>
@@ -0,0 +1,7 @@
1
+ import Root from "./textarea.svelte";
2
+
3
+ export {
4
+ Root,
5
+ //
6
+ Root as Textarea,
7
+ };
@@ -0,0 +1,22 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef, type WithoutChildren } from "#lib/utils.js";
3
+ import type { HTMLTextareaAttributes } from "svelte/elements";
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ value = $bindable(),
8
+ class: className,
9
+ "data-slot": dataSlot = "textarea",
10
+ ...restProps
11
+ }: WithoutChildren<WithElementRef<HTMLTextareaAttributes>> = $props();
12
+ </script>
13
+
14
+ <textarea
15
+ bind:this={ref}
16
+ data-slot={dataSlot}
17
+ class={cn(
18
+ "border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 rounded-kit border bg-transparent px-2.5 py-2 text-base transition-colors focus-visible:ring-3 aria-invalid:ring-3 md:text-kit-base flex field-sizing-content min-h-16 w-full outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
19
+ className
20
+ )}
21
+ bind:value
22
+ {...restProps}></textarea>
package/src/context.ts ADDED
@@ -0,0 +1,34 @@
1
+ // Host-injected dependencies of kit containers (docs/16 §3, docs/04 §5 "依赖注入走 context").
2
+ import { createContext } from 'svelte'
3
+ import type { KitI18n } from './i18n'
4
+ import type { KitPorts } from './ports'
5
+
6
+ export type LogFields = Record<string, string | number | boolean>
7
+
8
+ export interface KitLogger {
9
+ debug(event: string, fields?: LogFields): void
10
+ info(event: string, fields?: LogFields): void
11
+ warn(event: string, fields?: LogFields): void
12
+ error(event: string, fields?: LogFields): void
13
+ }
14
+
15
+ export interface ConfirmOptions {
16
+ title: string
17
+ body: string
18
+ danger?: boolean
19
+ }
20
+
21
+ export interface KitNotify {
22
+ toast(kind: 'info' | 'success' | 'error', text: string): void
23
+ confirm(options: ConfirmOptions): Promise<boolean>
24
+ }
25
+
26
+ export interface KitContext {
27
+ ports: KitPorts
28
+ i18n: KitI18n
29
+ notify: KitNotify
30
+ logger: KitLogger
31
+ }
32
+
33
+ /** The host root component calls `setKitContext` once; kit containers call `getKitContext`. */
34
+ export const [getKitContext, setKitContext] = createContext<KitContext>()
@@ -0,0 +1,45 @@
1
+ <script lang="ts">
2
+ // Component playground (`pnpm -F @ouraihub/aether-ui dev`) and the overlay test fixture (docs/16 §6, 陷阱 2).
3
+ import { Button } from '#lib/components/ui/button/index.js'
4
+ import * as Dialog from '#lib/components/ui/dialog/index.js'
5
+ import * as Field from '#lib/components/ui/field/index.js'
6
+ import { Input } from '#lib/components/ui/input/index.js'
7
+ import { createI18n } from '../i18n'
8
+ import KitNotifier from '../KitNotifier.svelte'
9
+ import { createDefaultNotify } from '../notify.svelte'
10
+
11
+ const notify = createDefaultNotify()
12
+ const i18n = createI18n('zh-CN')
13
+ let clicks = $state(0)
14
+ let answer = $state('none')
15
+
16
+ async function ask() {
17
+ answer = String(await notify.confirm({ title: 'Delete?', body: 'This cannot be undone.', danger: true }))
18
+ }
19
+ </script>
20
+
21
+ <main class="flex flex-col items-start gap-4 p-6">
22
+ <Dialog.Root>
23
+ <Dialog.Trigger>
24
+ {#snippet child({ props })}
25
+ <Button {...props}>Open dialog</Button>
26
+ {/snippet}
27
+ </Dialog.Trigger>
28
+ <Dialog.Content>
29
+ <Dialog.Header>
30
+ <Dialog.Title>Settings</Dialog.Title>
31
+ <Dialog.Description>Overlay must unmount on close.</Dialog.Description>
32
+ </Dialog.Header>
33
+ <Field.Group>
34
+ <Field.Field>
35
+ <Field.Label for="demo-name">Name</Field.Label>
36
+ <Input id="demo-name" />
37
+ </Field.Field>
38
+ </Field.Group>
39
+ </Dialog.Content>
40
+ </Dialog.Root>
41
+ <Button variant="outline" onclick={() => void ask()}>Confirm</Button>
42
+ <Button variant="secondary" onclick={() => clicks++}>Background clicks: {clicks}</Button>
43
+ <p class="text-muted-foreground">Answer: {answer}</p>
44
+ </main>
45
+ <KitNotifier {notify} {i18n} />
@@ -0,0 +1,7 @@
1
+ import { mount } from 'svelte'
2
+ import '../styles/kit.css'
3
+ import Demo from './Demo.svelte'
4
+
5
+ const target = document.getElementById('app')
6
+ if (!target) throw new Error('#app missing')
7
+ mount(Demo, { target })