@widgetic/design-system 0.5.21 → 0.5.23
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/README.md +2 -0
- package/dist/components/CopyableHeader.svelte +260 -448
- package/dist/components/CopyableHeader.svelte.d.ts +8 -5
- package/dist/components/EmptyState.svelte +100 -128
- package/dist/components/EmptyState.svelte.d.ts +16 -19
- package/dist/components/GenerateLoader.svelte +17 -10
- package/dist/components/PasswordInput.svelte +41 -44
- package/dist/components/PasswordInput.svelte.d.ts +2 -0
- package/dist/components/ThumbHashImage.svelte +117 -119
- package/dist/components/WScrollArea.svelte +47 -41
- package/dist/components/chat/ActivityRow.svelte +115 -0
- package/dist/components/chat/ActivityRow.svelte.d.ts +18 -0
- package/dist/components/chat/ChatHeader.svelte +114 -0
- package/dist/components/chat/ChatHeader.svelte.d.ts +26 -0
- package/dist/components/chat/Composer.svelte +172 -0
- package/dist/components/chat/Composer.svelte.d.ts +27 -0
- package/dist/components/chat/Message.svelte +158 -0
- package/dist/components/chat/Message.svelte.d.ts +28 -0
- package/dist/components/chat/OptionRow.svelte +59 -0
- package/dist/components/chat/OptionRow.svelte.d.ts +14 -0
- package/dist/components/chat/PlanCard.svelte +220 -0
- package/dist/components/chat/PlanCard.svelte.d.ts +34 -0
- package/dist/components/chat/QuestionCard.svelte +265 -0
- package/dist/components/chat/QuestionCard.svelte.d.ts +38 -0
- package/dist/components/chat/ScrollToBottom.svelte +51 -0
- package/dist/components/chat/ScrollToBottom.svelte.d.ts +11 -0
- package/dist/components/chat/SuggestionCard.svelte +79 -0
- package/dist/components/chat/SuggestionCard.svelte.d.ts +20 -0
- package/dist/components/chat/TaskRow.svelte +59 -0
- package/dist/components/chat/TaskRow.svelte.d.ts +11 -0
- package/dist/components/chat/composerLogic.d.ts +16 -0
- package/dist/components/chat/composerLogic.js +29 -0
- package/dist/components/chat/index.d.ts +16 -0
- package/dist/components/chat/index.js +16 -0
- package/dist/components/chat/questionCardLogic.d.ts +11 -0
- package/dist/components/chat/questionCardLogic.js +39 -0
- package/dist/components/index.d.ts +10 -1
- package/dist/components/index.js +10 -0
- package/dist/components/modals/ActionModal.svelte +186 -180
- package/dist/components/modals/BaseModal.svelte +404 -395
- package/dist/components/modals/BaseModal.svelte.d.ts +3 -0
- package/dist/components/modals/NewItemDialog.svelte +200 -243
- package/dist/components/modals/Portal.svelte +107 -105
- package/dist/components/modals/README.md +16 -2
- package/dist/components/modals/RenameDialog.svelte +234 -292
- package/dist/components/navigation/Breadcrumbs.svelte +415 -377
- package/dist/components/navigation/Breadcrumbs.svelte.d.ts +3 -2
- package/dist/components/navigation/types.d.ts +2 -0
- package/dist/components/pdf/PDFViewer.svelte +54 -1
- package/dist/components/search-input/SearchInput.svelte +51 -104
- package/dist/components/search-input/SearchInput.svelte.d.ts +9 -27
- package/dist/components/shad-editor/editor.css +1 -1
- package/dist/components/shad-editor/i18n/messages.d.ts +1 -1
- package/dist/components/shad-editor/i18n/messages.js +1 -1
- package/dist/components/shell/AppShell.svelte +52 -0
- package/dist/components/shell/AppShell.svelte.d.ts +13 -0
- package/dist/components/shell/Banner.svelte +90 -0
- package/dist/components/shell/Banner.svelte.d.ts +61 -0
- package/dist/components/shell/ErrorState.svelte +60 -0
- package/dist/components/shell/ErrorState.svelte.d.ts +13 -0
- package/dist/components/shell/Link.svelte +63 -0
- package/dist/components/shell/Link.svelte.d.ts +53 -0
- package/dist/components/shell/NavDrawer.svelte +117 -0
- package/dist/components/shell/NavDrawer.svelte.d.ts +10 -0
- package/dist/components/shell/NavRow.svelte +128 -0
- package/dist/components/shell/NavRow.svelte.d.ts +65 -0
- package/dist/components/shell/NavSectionLabel.svelte +27 -0
- package/dist/components/shell/NavSectionLabel.svelte.d.ts +9 -0
- package/dist/components/shell/NotificationRow.svelte +76 -0
- package/dist/components/shell/NotificationRow.svelte.d.ts +16 -0
- package/dist/components/shell/PageHeader.svelte +42 -0
- package/dist/components/shell/PageHeader.svelte.d.ts +12 -0
- package/dist/components/shell/ProfileRow.svelte +95 -0
- package/dist/components/shell/ProfileRow.svelte.d.ts +54 -0
- package/dist/components/shell/SettingsDialog.svelte +118 -0
- package/dist/components/shell/SettingsDialog.svelte.d.ts +19 -0
- package/dist/components/shell/SettingsNav.svelte +46 -0
- package/dist/components/shell/SettingsNav.svelte.d.ts +11 -0
- package/dist/components/shell/Sidebar.svelte +82 -0
- package/dist/components/shell/Sidebar.svelte.d.ts +25 -0
- package/dist/components/shell/Stat.svelte +63 -0
- package/dist/components/shell/Stat.svelte.d.ts +58 -0
- package/dist/components/shell/TopBar.svelte +37 -0
- package/dist/components/shell/TopBar.svelte.d.ts +11 -0
- package/dist/components/shell/WidgetRow.svelte +126 -0
- package/dist/components/shell/WidgetRow.svelte.d.ts +78 -0
- package/dist/components/shell/error-state-messages.d.ts +7 -0
- package/dist/components/shell/error-state-messages.js +9 -0
- package/dist/components/shell/index.d.ts +22 -0
- package/dist/components/shell/index.js +25 -0
- package/dist/components/shell/link-external.d.ts +2 -0
- package/dist/components/shell/link-external.js +7 -0
- package/dist/components/shell/messages.d.ts +7 -0
- package/dist/components/shell/messages.js +5 -0
- package/dist/components/shell/settings-nav-types.d.ts +12 -0
- package/dist/components/shell/settings-nav-types.js +3 -0
- package/dist/components/shell/shell-utils.d.ts +7 -0
- package/dist/components/shell/shell-utils.js +27 -0
- package/dist/components/shell/stat-tone.d.ts +3 -0
- package/dist/components/shell/stat-tone.js +11 -0
- package/dist/components/toast/ToasterModal.svelte +102 -168
- package/dist/components/toast/ToasterModal.svelte.d.ts +2 -12
- package/dist/components/ui/accordion/accordion-content.svelte +3 -2
- package/dist/components/ui/accordion/accordion-item.svelte +10 -1
- package/dist/components/ui/accordion/accordion-trigger.svelte +4 -3
- package/dist/components/ui/alert/alert-description.svelte +5 -1
- package/dist/components/ui/alert/alert-title.svelte +2 -1
- package/dist/components/ui/alert/index.d.ts +13 -11
- package/dist/components/ui/alert/index.js +4 -4
- package/dist/components/ui/avatar/avatar-utils.d.ts +2 -0
- package/dist/components/ui/avatar/avatar-utils.js +9 -0
- package/dist/components/ui/avatar/avatar.svelte +63 -0
- package/dist/components/ui/avatar/avatar.svelte.d.ts +80 -0
- package/dist/components/ui/avatar/index.d.ts +4 -0
- package/dist/components/ui/avatar/index.js +4 -0
- package/dist/components/ui/badge/badge.svelte +22 -10
- package/dist/components/ui/badge/badge.svelte.d.ts +14 -15
- package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +2 -2
- package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +2 -2
- package/dist/components/ui/button/button-padding.d.ts +9 -0
- package/dist/components/ui/button/button-padding.js +15 -0
- package/dist/components/ui/button/button.svelte +81 -31
- package/dist/components/ui/button/button.svelte.d.ts +48 -29
- package/dist/components/ui/calendar/calendar-cell.svelte +1 -1
- package/dist/components/ui/calendar/calendar-head-cell.svelte +1 -1
- package/dist/components/ui/calendar/calendar-next-button.svelte +2 -2
- package/dist/components/ui/calendar/calendar-prev-button.svelte +2 -2
- package/dist/components/ui/card/card-description.svelte +1 -1
- package/dist/components/ui/card/card-title.svelte +1 -1
- package/dist/components/ui/card/card.svelte +1 -1
- package/dist/components/ui/checkbox/checkbox.svelte +9 -5
- package/dist/components/ui/chip/chip.svelte +48 -0
- package/dist/components/ui/chip/chip.svelte.d.ts +13 -0
- package/dist/components/ui/chip/index.d.ts +2 -0
- package/dist/components/ui/chip/index.js +2 -0
- package/dist/components/ui/command/command-dialog.svelte +1 -1
- package/dist/components/ui/command/command-input.svelte +4 -4
- package/dist/components/ui/command/command-item.svelte +1 -1
- package/dist/components/ui/command/command.svelte +1 -1
- package/dist/components/ui/dialog/dialog-content.svelte +4 -4
- package/dist/components/ui/dialog/dialog-description.svelte +1 -1
- package/dist/components/ui/dialog/dialog-overlay.svelte +1 -1
- package/dist/components/ui/dialog/dialog-title.svelte +1 -1
- package/dist/components/ui/drawer/drawer-content.svelte +1 -1
- package/dist/components/ui/drawer/drawer-overlay.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +5 -5
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +20 -2
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +4 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +5 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +3 -3
- package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +2 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +3 -3
- package/dist/components/ui/field/field-ids.d.ts +7 -0
- package/dist/components/ui/field/field-ids.js +15 -0
- package/dist/components/ui/field/field.svelte +62 -0
- package/dist/components/ui/field/field.svelte.d.ts +21 -0
- package/dist/components/ui/field/index.d.ts +3 -0
- package/dist/components/ui/field/index.js +3 -0
- package/dist/components/ui/hover-card/hover-card-content.svelte +1 -1
- package/dist/components/ui/icon-button/icon-button.svelte +72 -0
- package/dist/components/ui/icon-button/icon-button.svelte.d.ts +90 -0
- package/dist/components/ui/icon-button/index.d.ts +2 -0
- package/dist/components/ui/icon-button/index.js +4 -0
- package/dist/components/ui/input/index.d.ts +1 -0
- package/dist/components/ui/input/input.svelte +11 -4
- package/dist/components/ui/input/input.svelte.d.ts +4 -1
- package/dist/components/ui/input-otp/input-otp-separator.svelte +2 -2
- package/dist/components/ui/input-otp/input-otp-slot.svelte +5 -4
- package/dist/components/ui/input-otp/input-otp-slot.svelte.d.ts +1 -1
- package/dist/components/ui/input-otp/input-otp.svelte +1 -1
- package/dist/components/ui/label/label.svelte +3 -2
- package/dist/components/ui/popover/popover-content.svelte +1 -1
- package/dist/components/ui/progress/progress.svelte +19 -5
- package/dist/components/ui/progress/progress.svelte.d.ts +4 -2
- package/dist/components/ui/radio-group/radio-group-item.svelte +4 -4
- package/dist/components/ui/range-calendar/range-calendar-head-cell.svelte +1 -1
- package/dist/components/ui/range-calendar/range-calendar-next-button.svelte +2 -2
- package/dist/components/ui/range-calendar/range-calendar-prev-button.svelte +2 -2
- package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +4 -1
- package/dist/components/ui/scroll-area/scroll-area.svelte +1 -1
- package/dist/components/ui/select/select-content.svelte +1 -3
- package/dist/components/ui/select/select-item.svelte +5 -4
- package/dist/components/ui/select/select-scroll-down-button.svelte +2 -2
- package/dist/components/ui/select/select-scroll-up-button.svelte +2 -2
- package/dist/components/ui/select/select-trigger.svelte +4 -3
- package/dist/components/ui/skeleton/index.d.ts +2 -0
- package/dist/components/ui/skeleton/index.js +2 -0
- package/dist/components/ui/skeleton/skeleton.svelte +24 -0
- package/dist/components/ui/skeleton/skeleton.svelte.d.ts +8 -0
- package/dist/components/ui/slider/slider.svelte +5 -10
- package/dist/components/ui/sonner/sonner.svelte +19 -13
- package/dist/components/ui/stepper-button/index.d.ts +3 -0
- package/dist/components/ui/stepper-button/index.js +2 -0
- package/dist/components/ui/stepper-button/stepper-button.svelte +37 -0
- package/dist/components/ui/stepper-button/stepper-button.svelte.d.ts +9 -0
- package/dist/components/ui/switch/switch.svelte +8 -3
- package/dist/components/ui/table/table-cell.svelte +1 -1
- package/dist/components/ui/table/table-head.svelte +1 -1
- package/dist/components/ui/table/table-row.svelte +1 -1
- package/dist/components/ui/tabs/tabs-list.svelte +1 -1
- package/dist/components/ui/tabs/tabs-trigger.svelte +1 -1
- package/dist/components/ui/tag/index.d.ts +2 -0
- package/dist/components/ui/tag/index.js +2 -0
- package/dist/components/ui/tag/tag.svelte +42 -0
- package/dist/components/ui/tag/tag.svelte.d.ts +11 -0
- package/dist/components/ui/textarea/textarea.svelte +4 -3
- package/dist/components/ui/textarea/textarea.svelte.d.ts +2 -2
- package/dist/components/ui/toggle/toggle.svelte +9 -9
- package/dist/components/ui/toggle/toggle.svelte.d.ts +14 -21
- package/dist/components/ui/tooltip/tooltip-content.svelte +1 -1
- package/dist/fonts/Inter/Inter-Black.woff2 +0 -0
- package/dist/fonts/Inter/Inter-BlackItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Bold.woff2 +0 -0
- package/dist/fonts/Inter/Inter-BoldItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraBold.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraLight-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ExtraLightItalic-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Italic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Light-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-LightItalic-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Medium.woff2 +0 -0
- package/dist/fonts/Inter/Inter-MediumItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Regular.woff2 +0 -0
- package/dist/fonts/Inter/Inter-SemiBold.woff2 +0 -0
- package/dist/fonts/Inter/Inter-SemiBoldItalic.woff2 +0 -0
- package/dist/fonts/Inter/Inter-Thin-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-ThinItalic-BETA.woff2 +0 -0
- package/dist/fonts/Inter/Inter-italic.var.woff2 +0 -0
- package/dist/fonts/Inter/Inter-upright.var.woff2 +0 -0
- package/dist/fonts/Inter/Inter.var.woff2 +0 -0
- package/dist/fonts/JetBrainsMono/JetBrainsMono-Regular.woff2 +0 -0
- package/dist/i18n/audit/designSystemWords.d.ts +1 -1
- package/dist/i18n/audit/designSystemWords.js +1 -1
- package/dist/styles/fonts.css +18 -14
- package/dist/styles/global.css +7 -19
- package/dist/styles/tokens.css +332 -0
- package/dist/utils.d.ts +27 -0
- package/dist/utils.js +33 -2
- package/package.json +2 -1
- package/tailwind.config.ts +7 -47
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!-- Figma: Chip (component set 65:4, node 65:2). -->
|
|
2
|
+
<script lang="ts">
|
|
3
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
4
|
+
import type { Snippet } from "svelte";
|
|
5
|
+
import IconX from "@tabler/icons-svelte/icons/x";
|
|
6
|
+
import { cn } from "../../../utils.js";
|
|
7
|
+
|
|
8
|
+
let {
|
|
9
|
+
class: className,
|
|
10
|
+
label,
|
|
11
|
+
showRemove = false,
|
|
12
|
+
removeLabel = "Remove",
|
|
13
|
+
disabled = false,
|
|
14
|
+
onRemove = undefined,
|
|
15
|
+
leading,
|
|
16
|
+
}: HTMLAttributes<HTMLDivElement> & {
|
|
17
|
+
label: string;
|
|
18
|
+
showRemove?: boolean;
|
|
19
|
+
removeLabel?: string;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
onRemove?: () => void;
|
|
22
|
+
leading?: Snippet;
|
|
23
|
+
} = $props();
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<div
|
|
27
|
+
class={cn(
|
|
28
|
+
"inline-flex h-7 max-w-full items-center gap-1.5 rounded-lg border border-border bg-transparent px-2 text-label-small text-foreground transition-colors duration-fast",
|
|
29
|
+
disabled ? "pointer-events-none opacity-50" : "hover:bg-accent",
|
|
30
|
+
className
|
|
31
|
+
)}
|
|
32
|
+
>
|
|
33
|
+
{#if leading}
|
|
34
|
+
<span class="flex shrink-0 items-center">{@render leading()}</span>
|
|
35
|
+
{/if}
|
|
36
|
+
<span class="truncate">{label}</span>
|
|
37
|
+
{#if showRemove && onRemove}
|
|
38
|
+
<button
|
|
39
|
+
type="button"
|
|
40
|
+
class="inline-flex size-4 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
|
41
|
+
aria-label={removeLabel}
|
|
42
|
+
{disabled}
|
|
43
|
+
onclick={onRemove}
|
|
44
|
+
>
|
|
45
|
+
<IconX class="size-4 stroke-[1.333]" aria-hidden="true" />
|
|
46
|
+
</button>
|
|
47
|
+
{/if}
|
|
48
|
+
</div>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
|
|
4
|
+
label: string;
|
|
5
|
+
showRemove?: boolean;
|
|
6
|
+
removeLabel?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
onRemove?: () => void;
|
|
9
|
+
leading?: Snippet;
|
|
10
|
+
};
|
|
11
|
+
declare const Chip: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
12
|
+
type Chip = ReturnType<typeof Chip>;
|
|
13
|
+
export default Chip;
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
</script>
|
|
24
24
|
|
|
25
25
|
<Dialog.Root bind:open {...restProps}>
|
|
26
|
-
<Dialog.Content class="overflow-hidden p-0
|
|
26
|
+
<Dialog.Content class="overflow-hidden p-0" {portalProps}>
|
|
27
27
|
<Command
|
|
28
28
|
class="[&_[data-command-group]:not([hidden])_~[data-command-group]]:pt-0 **:data-command-group:px-2 [&_[data-command-input-wrapper]_svg]:h-5 [&_[data-command-input-wrapper]_svg]:w-5 **:data-command-input:h-12 **:data-command-item:px-2 **:data-command-item:py-3 [&_[data-command-item]_svg]:h-5 [&_[data-command-item]_svg]:w-5"
|
|
29
29
|
{...restProps}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
6
|
<script lang="ts">
|
|
7
|
-
|
|
7
|
+
import IconSearch from "@tabler/icons-svelte/icons/search";
|
|
8
8
|
import { cn } from "../../../utils.js";
|
|
9
9
|
|
|
10
10
|
let {
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
}: CommandInputProps = $props();
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
|
-
<div class="flex items-center border-b px-2" data-command-input-wrapper="">
|
|
19
|
-
<
|
|
18
|
+
<div class="border-border flex items-center border-b px-2" data-command-input-wrapper="">
|
|
19
|
+
<IconSearch class="text-muted-foreground me-2 size-4 shrink-0 stroke-[1.333]" />
|
|
20
20
|
<CommandPrimitive.Input
|
|
21
21
|
class={cn(
|
|
22
|
-
"placeholder:text-muted-foreground flex h-
|
|
22
|
+
"text-body placeholder:text-muted-foreground flex h-9 w-full bg-transparent py-2 outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
|
|
23
23
|
className
|
|
24
24
|
)}
|
|
25
25
|
bind:ref
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
<CommandPrimitive.Item
|
|
17
17
|
class={cn(
|
|
18
|
-
"aria-selected:bg-accent aria-selected:text-
|
|
18
|
+
"text-body aria-selected:bg-accent aria-selected:text-foreground relative flex h-8 cursor-default select-none items-center gap-2 rounded-lg px-2 py-1.5 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333]",
|
|
19
19
|
className
|
|
20
20
|
)}
|
|
21
21
|
bind:ref
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
<CommandPrimitive.Root
|
|
18
18
|
class={cn(
|
|
19
|
-
"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-
|
|
19
|
+
"bg-popover text-popover-foreground border-border flex h-full w-full flex-col overflow-hidden rounded-xl border",
|
|
20
20
|
className
|
|
21
21
|
)}
|
|
22
22
|
bind:value
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Dialog as DialogPrimitive, type WithoutChildrenOrChild } from "bits-ui";
|
|
3
|
-
import
|
|
3
|
+
import IconX from "@tabler/icons-svelte/icons/x";
|
|
4
4
|
import type { Snippet } from "svelte";
|
|
5
5
|
import * as Dialog from "./index.js";
|
|
6
6
|
import { cn } from "../../../utils.js";
|
|
@@ -25,16 +25,16 @@
|
|
|
25
25
|
<DialogPrimitive.Content
|
|
26
26
|
bind:ref
|
|
27
27
|
class={cn(
|
|
28
|
-
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0
|
|
28
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 bg-background border-border fixed start-1/2 top-1/2 z-50 grid w-dialog max-w-[calc(100vw-3rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-panel border p-6 duration-base",
|
|
29
29
|
className
|
|
30
30
|
)}
|
|
31
31
|
{...restProps}
|
|
32
32
|
>
|
|
33
33
|
{@render children?.()}
|
|
34
34
|
<DialogPrimitive.Close
|
|
35
|
-
class="
|
|
35
|
+
class="text-foreground hover:bg-accent absolute end-4 top-4 inline-flex size-8 items-center justify-center rounded-lg transition-colors duration-fast focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none"
|
|
36
36
|
>
|
|
37
|
-
<
|
|
37
|
+
<IconX class="size-4 stroke-[1.333]" />
|
|
38
38
|
<span class="sr-only">{closeLabel}</span>
|
|
39
39
|
</DialogPrimitive.Close>
|
|
40
40
|
</DialogPrimitive.Content>
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<DialogPrimitive.Overlay
|
|
17
17
|
bind:ref
|
|
18
18
|
class={cn(
|
|
19
|
-
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0
|
|
19
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm",
|
|
20
20
|
className
|
|
21
21
|
)}
|
|
22
22
|
{...restProps}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<DrawerPrimitive.Content
|
|
20
20
|
bind:ref
|
|
21
21
|
class={cn(
|
|
22
|
-
"bg-background fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-
|
|
22
|
+
"bg-background border-border fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-xl border",
|
|
23
23
|
className
|
|
24
24
|
)}
|
|
25
25
|
{...restProps}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { DropdownMenu as DropdownMenuPrimitive, type WithoutChildrenOrChild } from "bits-ui";
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import IconCheck from "@tabler/icons-svelte/icons/check";
|
|
4
|
+
import IconMinus from "@tabler/icons-svelte/icons/minus";
|
|
5
5
|
import { cn } from "../../../utils.js";
|
|
6
6
|
import type { Snippet } from "svelte";
|
|
7
7
|
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
bind:checked
|
|
23
23
|
bind:indeterminate
|
|
24
24
|
class={cn(
|
|
25
|
-
"data-highlighted:bg-accent data-highlighted:text-
|
|
25
|
+
"text-body data-highlighted:bg-accent data-highlighted:text-foreground relative flex h-8 cursor-default select-none items-center rounded-lg py-1.5 ps-8 pe-2 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
26
26
|
className
|
|
27
27
|
)}
|
|
28
28
|
{...restProps}
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
{#snippet children({ checked, indeterminate })}
|
|
31
31
|
<span class="absolute start-2 flex size-3.5 items-center justify-center">
|
|
32
32
|
{#if indeterminate}
|
|
33
|
-
<
|
|
33
|
+
<IconMinus class="size-4 stroke-[1.333]" />
|
|
34
34
|
{:else}
|
|
35
|
-
<
|
|
35
|
+
<IconCheck class={cn("size-4 stroke-[1.333]", !checked && "text-transparent")} />
|
|
36
36
|
{/if}
|
|
37
37
|
</span>
|
|
38
38
|
{@render childrenProp?.()}
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
{sideOffset}
|
|
25
25
|
dir={$textDirection}
|
|
26
26
|
class={cn(
|
|
27
|
-
"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[
|
|
27
|
+
"bg-popover text-popover-foreground border-border data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-xl border p-1 outline-hidden",
|
|
28
28
|
className
|
|
29
29
|
)}
|
|
30
30
|
{...restProps}
|
|
@@ -6,18 +6,36 @@
|
|
|
6
6
|
ref = $bindable(null),
|
|
7
7
|
class: className,
|
|
8
8
|
inset,
|
|
9
|
+
description,
|
|
10
|
+
label,
|
|
11
|
+
children,
|
|
9
12
|
...restProps
|
|
10
13
|
}: DropdownMenuPrimitive.ItemProps & {
|
|
11
14
|
inset?: boolean;
|
|
15
|
+
/** Second line (Menu Item with description — 48px row). */
|
|
16
|
+
description?: string;
|
|
17
|
+
/** Primary line when `description` is set (icons stay in the default slot). */
|
|
18
|
+
label?: string;
|
|
12
19
|
} = $props();
|
|
13
20
|
</script>
|
|
14
21
|
|
|
15
22
|
<DropdownMenuPrimitive.Item
|
|
16
23
|
bind:ref
|
|
17
24
|
class={cn(
|
|
18
|
-
"data-highlighted:bg-accent data-highlighted:text-
|
|
25
|
+
"text-body data-highlighted:bg-accent data-highlighted:text-foreground relative flex cursor-default select-none items-center gap-2 rounded-lg px-2 py-1.5 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333] data-[variant=destructive]:text-destructive data-highlighted:data-[variant=destructive]:text-destructive",
|
|
26
|
+
description ? "min-h-12" : "min-h-8",
|
|
19
27
|
inset && "ps-8",
|
|
20
28
|
className
|
|
21
29
|
)}
|
|
22
30
|
{...restProps}
|
|
23
|
-
|
|
31
|
+
>
|
|
32
|
+
{#if description && label}
|
|
33
|
+
{@render children?.()}
|
|
34
|
+
<div class="flex min-w-0 flex-1 flex-col gap-0">
|
|
35
|
+
<span class="text-body truncate">{label}</span>
|
|
36
|
+
<span class="text-caption text-muted-foreground truncate">{description}</span>
|
|
37
|
+
</div>
|
|
38
|
+
{:else}
|
|
39
|
+
{@render children?.()}
|
|
40
|
+
{/if}
|
|
41
|
+
</DropdownMenuPrimitive.Item>
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
|
|
2
2
|
type $$ComponentProps = DropdownMenuPrimitive.ItemProps & {
|
|
3
3
|
inset?: boolean;
|
|
4
|
+
/** Second line (Menu Item with description — 48px row). */
|
|
5
|
+
description?: string;
|
|
6
|
+
/** Primary line when `description` is set (icons stay in the default slot). */
|
|
7
|
+
label?: string;
|
|
4
8
|
};
|
|
5
9
|
declare const DropdownMenuItem: import("svelte").Component<$$ComponentProps, {}, "ref">;
|
|
6
10
|
type DropdownMenuItem = ReturnType<typeof DropdownMenuItem>;
|
|
@@ -16,7 +16,11 @@
|
|
|
16
16
|
|
|
17
17
|
<div
|
|
18
18
|
bind:this={ref}
|
|
19
|
-
class={cn(
|
|
19
|
+
class={cn(
|
|
20
|
+
"text-caption-medium text-muted-foreground px-2 pb-1 pt-1.5",
|
|
21
|
+
inset && "ps-8",
|
|
22
|
+
className
|
|
23
|
+
)}
|
|
20
24
|
{...restProps}
|
|
21
25
|
>
|
|
22
26
|
{@render children?.()}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
</script>
|
|
5
5
|
|
|
6
6
|
<script lang="ts">
|
|
7
|
-
|
|
7
|
+
import IconCircleFilled from "@tabler/icons-svelte/icons/circle-filled";
|
|
8
8
|
import { cn } from "../../../utils.js";
|
|
9
9
|
|
|
10
10
|
let {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<DropdownMenuPrimitive.RadioItem
|
|
19
19
|
bind:ref
|
|
20
20
|
class={cn(
|
|
21
|
-
"data-highlighted:bg-accent data-highlighted:text-
|
|
21
|
+
"text-body data-highlighted:bg-accent data-highlighted:text-foreground relative flex h-8 cursor-default select-none items-center rounded-lg py-1.5 ps-8 pe-2 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50",
|
|
22
22
|
className
|
|
23
23
|
)}
|
|
24
24
|
{...restProps}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{#snippet children({ checked })}
|
|
27
27
|
<span class="absolute start-2 flex size-3.5 items-center justify-center">
|
|
28
28
|
{#if checked}
|
|
29
|
-
<
|
|
29
|
+
<IconCircleFilled class="size-2 stroke-[1.333]" />
|
|
30
30
|
{/if}
|
|
31
31
|
</span>
|
|
32
32
|
{@render childrenProp?.({ checked })}
|
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
}: DropdownMenuSeparatorProps = $props();
|
|
14
14
|
</script>
|
|
15
15
|
|
|
16
|
+
<!-- Figma Menu Separator (9px tall): a 1px line with 4px above and below. (py-1 on the line itself drew an 8px band.) -->
|
|
16
17
|
<DropdownMenuPrimitive.Separator
|
|
17
18
|
bind:ref
|
|
18
|
-
class={cn("bg-
|
|
19
|
+
class={cn("bg-border my-1 h-px", className)}
|
|
19
20
|
{...restProps}
|
|
20
21
|
/>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
bind:ref
|
|
23
23
|
dir={$textDirection}
|
|
24
24
|
class={cn(
|
|
25
|
-
"bg-popover text-popover-foreground z-50 min-w-[8rem] rounded-
|
|
25
|
+
"bg-popover text-popover-foreground border-border z-50 min-w-[8rem] rounded-xl border p-1 focus:outline-hidden",
|
|
26
26
|
className
|
|
27
27
|
)}
|
|
28
28
|
{...restProps}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
|
|
3
|
-
import
|
|
3
|
+
import IconChevronRight from "@tabler/icons-svelte/icons/chevron-right";
|
|
4
4
|
import { cn } from "../../../utils.js";
|
|
5
5
|
|
|
6
6
|
let {
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
<DropdownMenuPrimitive.SubTrigger
|
|
18
18
|
bind:ref
|
|
19
19
|
class={cn(
|
|
20
|
-
"data-highlighted:bg-accent data-[state=open]:bg-accent flex cursor-default select-none items-center gap-2 rounded-
|
|
20
|
+
"text-body data-highlighted:bg-accent data-[state=open]:bg-accent flex h-8 cursor-default select-none items-center gap-2 rounded-lg px-2 py-1.5 outline-hidden transition-colors duration-fast [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333]",
|
|
21
21
|
inset && "ps-8",
|
|
22
22
|
className
|
|
23
23
|
)}
|
|
24
24
|
{...restProps}
|
|
25
25
|
>
|
|
26
26
|
{@render children?.()}
|
|
27
|
-
<
|
|
27
|
+
<IconChevronRight class="ms-auto stroke-[1.333] rtl:-scale-x-100" />
|
|
28
28
|
</DropdownMenuPrimitive.SubTrigger>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type FieldIds = {
|
|
2
|
+
controlId: string;
|
|
3
|
+
descriptionId: string;
|
|
4
|
+
errorId: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function createFieldIds(baseId: string): FieldIds;
|
|
7
|
+
export declare function fieldDescribedBy(hasDescription: boolean, hasError: boolean, ids: FieldIds): string | undefined;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function createFieldIds(baseId) {
|
|
2
|
+
return {
|
|
3
|
+
controlId: `${baseId}-control`,
|
|
4
|
+
descriptionId: `${baseId}-description`,
|
|
5
|
+
errorId: `${baseId}-error`,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function fieldDescribedBy(hasDescription, hasError, ids) {
|
|
9
|
+
const parts = [];
|
|
10
|
+
if (hasDescription)
|
|
11
|
+
parts.push(ids.descriptionId);
|
|
12
|
+
if (hasError)
|
|
13
|
+
parts.push(ids.errorId);
|
|
14
|
+
return parts.length > 0 ? parts.join(" ") : undefined;
|
|
15
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<!-- Figma: Field (component set 105:27, node 105:2). -->
|
|
2
|
+
<script lang="ts" module>
|
|
3
|
+
let fieldAutoId = 0;
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import type { Snippet } from "svelte";
|
|
8
|
+
import { cn } from "../../../utils.js";
|
|
9
|
+
import { Label } from "../label/index.js";
|
|
10
|
+
import { createFieldIds, fieldDescribedBy } from "./field-ids.js";
|
|
11
|
+
|
|
12
|
+
let {
|
|
13
|
+
class: className,
|
|
14
|
+
label,
|
|
15
|
+
description = undefined,
|
|
16
|
+
error = undefined,
|
|
17
|
+
required = false,
|
|
18
|
+
id: idProp = undefined,
|
|
19
|
+
control,
|
|
20
|
+
}: {
|
|
21
|
+
class?: string;
|
|
22
|
+
label: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
required?: boolean;
|
|
26
|
+
id?: string;
|
|
27
|
+
control: Snippet<
|
|
28
|
+
[
|
|
29
|
+
{
|
|
30
|
+
id: string;
|
|
31
|
+
describedBy: string | undefined;
|
|
32
|
+
invalid: boolean;
|
|
33
|
+
"aria-describedby": string | undefined;
|
|
34
|
+
"aria-invalid": boolean;
|
|
35
|
+
},
|
|
36
|
+
]
|
|
37
|
+
>;
|
|
38
|
+
} = $props();
|
|
39
|
+
|
|
40
|
+
const resolvedId = idProp ?? `field-${++fieldAutoId}`;
|
|
41
|
+
const ids = createFieldIds(resolvedId);
|
|
42
|
+
const invalid = $derived(Boolean(error));
|
|
43
|
+
const describedBy = $derived(fieldDescribedBy(Boolean(description), invalid, ids));
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<div class={cn("flex w-full flex-col gap-1.5", className)}>
|
|
47
|
+
<Label for={ids.controlId} class="text-body-medium">
|
|
48
|
+
{label}{#if required}<span class="text-destructive" aria-hidden="true"> *</span>{/if}
|
|
49
|
+
</Label>
|
|
50
|
+
{@render control({
|
|
51
|
+
id: ids.controlId,
|
|
52
|
+
describedBy,
|
|
53
|
+
invalid,
|
|
54
|
+
"aria-describedby": describedBy,
|
|
55
|
+
"aria-invalid": invalid,
|
|
56
|
+
})}
|
|
57
|
+
{#if error}
|
|
58
|
+
<p id={ids.errorId} class="text-caption text-destructive" role="alert">{error}</p>
|
|
59
|
+
{:else if description}
|
|
60
|
+
<p id={ids.descriptionId} class="text-caption text-muted-foreground">{description}</p>
|
|
61
|
+
{/if}
|
|
62
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
class?: string;
|
|
4
|
+
label: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
required?: boolean;
|
|
8
|
+
id?: string;
|
|
9
|
+
control: Snippet<[
|
|
10
|
+
{
|
|
11
|
+
id: string;
|
|
12
|
+
describedBy: string | undefined;
|
|
13
|
+
invalid: boolean;
|
|
14
|
+
"aria-describedby": string | undefined;
|
|
15
|
+
"aria-invalid": boolean;
|
|
16
|
+
}
|
|
17
|
+
]>;
|
|
18
|
+
};
|
|
19
|
+
declare const Field: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
20
|
+
type Field = ReturnType<typeof Field>;
|
|
21
|
+
export default Field;
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{sideOffset}
|
|
27
27
|
dir={$textDirection}
|
|
28
28
|
class={cn(
|
|
29
|
-
"bg-popover text-popover-foreground z-50 mt-3 w-64 rounded-
|
|
29
|
+
"bg-popover text-popover-foreground border-border z-50 mt-3 w-64 rounded-xl border p-4 outline-hidden",
|
|
30
30
|
className
|
|
31
31
|
)}
|
|
32
32
|
{...restProps}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Figma: Icon Button (component set 37:3, page Icon Button)
|
|
3
|
+
With bits-ui triggers, use `{#snippet child({ props })}` and spread `props` onto this button.
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts" module>
|
|
6
|
+
import type { WithElementRef } from "bits-ui";
|
|
7
|
+
import type { HTMLButtonAttributes } from "svelte/elements";
|
|
8
|
+
import type { VariantProps } from "tailwind-variants";
|
|
9
|
+
|
|
10
|
+
export const iconButtonVariants = tv({
|
|
11
|
+
base: "inline-flex shrink-0 items-center justify-center transition-colors duration-fast press-feedback focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333]",
|
|
12
|
+
variants: {
|
|
13
|
+
variant: {
|
|
14
|
+
ghost:
|
|
15
|
+
"rounded-lg text-foreground hover:bg-accent hover:text-foreground",
|
|
16
|
+
secondary:
|
|
17
|
+
"rounded-lg bg-secondary text-secondary-foreground hover:bg-accent hover:text-foreground",
|
|
18
|
+
outline:
|
|
19
|
+
"rounded-lg border border-input bg-background text-foreground hover:bg-accent hover:text-foreground",
|
|
20
|
+
primary:
|
|
21
|
+
"rounded-full bg-primary text-primary-foreground hover:bg-primary/90",
|
|
22
|
+
accent:
|
|
23
|
+
"rounded-full bg-brand text-brand-foreground hover:bg-brand/90",
|
|
24
|
+
},
|
|
25
|
+
size: {
|
|
26
|
+
default: "size-8",
|
|
27
|
+
sm: "size-7",
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
defaultVariants: {
|
|
31
|
+
variant: "ghost",
|
|
32
|
+
size: "default",
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export type IconButtonVariant = VariantProps<typeof iconButtonVariants>["variant"];
|
|
37
|
+
export type IconButtonSize = VariantProps<typeof iconButtonVariants>["size"];
|
|
38
|
+
|
|
39
|
+
export type IconButtonProps = WithElementRef<HTMLButtonAttributes> & {
|
|
40
|
+
ref?: HTMLButtonElement | null;
|
|
41
|
+
class?: string;
|
|
42
|
+
variant?: IconButtonVariant;
|
|
43
|
+
size?: IconButtonSize;
|
|
44
|
+
/** Required for accessibility (aria-label). */
|
|
45
|
+
label: string;
|
|
46
|
+
};
|
|
47
|
+
</script>
|
|
48
|
+
|
|
49
|
+
<script lang="ts">
|
|
50
|
+
import { cn, tv } from "../../../utils.js";
|
|
51
|
+
|
|
52
|
+
let {
|
|
53
|
+
class: className,
|
|
54
|
+
variant = "ghost",
|
|
55
|
+
size = "default",
|
|
56
|
+
label,
|
|
57
|
+
ref = $bindable(null),
|
|
58
|
+
type = "button",
|
|
59
|
+
children,
|
|
60
|
+
...restProps
|
|
61
|
+
}: IconButtonProps = $props();
|
|
62
|
+
</script>
|
|
63
|
+
|
|
64
|
+
<button
|
|
65
|
+
bind:this={ref}
|
|
66
|
+
type={type}
|
|
67
|
+
aria-label={label}
|
|
68
|
+
class={cn(iconButtonVariants({ variant, size, className }))}
|
|
69
|
+
{...restProps}
|
|
70
|
+
>
|
|
71
|
+
{@render children?.()}
|
|
72
|
+
</button>
|