tera-system-ui 0.1.64 → 0.1.66
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/dist/COMPONENT_API.md +2 -539
- package/dist/components/accordion/Accordion.d.ts +24 -0
- package/dist/components/accordion/Accordion.js +4 -0
- package/dist/components/accordion/components/Accordion.svelte +2 -8
- package/dist/components/accordion/components/AccordionContent.svelte +5 -12
- package/dist/components/accordion/components/AccordionItem.svelte +3 -9
- package/dist/components/accordion/components/AccordionTrigger.svelte +5 -15
- package/dist/components/ai/ChatBubble.svelte +35 -0
- package/dist/components/ai/ChatBubble.svelte.d.ts +12 -0
- package/dist/components/ai/PromptInput.svelte +58 -0
- package/dist/components/ai/PromptInput.svelte.d.ts +13 -0
- package/dist/components/ai/StreamText.svelte +41 -0
- package/dist/components/ai/StreamText.svelte.d.ts +11 -0
- package/dist/components/ai/SuggestionChips.svelte +34 -0
- package/dist/components/ai/SuggestionChips.svelte.d.ts +10 -0
- package/dist/components/ai/ThinkingLoader.svelte +34 -0
- package/dist/components/ai/ThinkingLoader.svelte.d.ts +11 -0
- package/dist/components/ai/index.d.ts +5 -0
- package/dist/components/ai/index.js +5 -0
- package/dist/components/alert/Alert.svelte +47 -0
- package/dist/components/alert/Alert.svelte.d.ts +15 -0
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/alert/index.js +1 -0
- package/dist/components/avatar/Avatar.svelte +9 -25
- package/dist/components/badge/Badge.d.ts +52 -0
- package/dist/components/badge/Badge.js +22 -0
- package/dist/components/badge/Badge.svelte +22 -0
- package/dist/components/badge/Badge.svelte.d.ts +4 -0
- package/dist/components/badge/index.d.ts +2 -0
- package/dist/components/badge/index.js +1 -0
- package/dist/components/brand-logo/BrandLogo.svelte +12 -10
- package/dist/components/button/Button.d.ts +2 -2
- package/dist/components/button/Button.js +12 -12
- package/dist/components/button/Button.svelte +7 -34
- package/dist/components/card/Card.d.ts +68 -0
- package/dist/components/card/Card.js +28 -0
- package/dist/components/card/Card.svelte +33 -0
- package/dist/components/card/Card.svelte.d.ts +4 -0
- package/dist/components/card/index.d.ts +2 -0
- package/dist/components/card/index.js +1 -0
- package/dist/components/checkbox/Checkbox.d.ts +25 -4
- package/dist/components/checkbox/Checkbox.js +4 -0
- package/dist/components/checkbox/Checkbox.svelte +13 -16
- package/dist/components/checkbox/Checkbox.svelte.d.ts +2 -2
- package/dist/components/combobox/Combobox.d.ts +45 -9
- package/dist/components/combobox/Combobox.js +5 -7
- package/dist/components/combobox/Combobox.svelte +226 -8
- package/dist/components/combobox/Combobox.svelte.d.ts +2 -2
- package/dist/components/combobox/index.d.ts +1 -1
- package/dist/components/command/components/command-empty.svelte +3 -8
- package/dist/components/command/components/command-group.svelte +3 -13
- package/dist/components/command/components/command-input.svelte +5 -13
- package/dist/components/command/components/command-item.svelte +3 -9
- package/dist/components/command/components/command-link-item.svelte +3 -8
- package/dist/components/command/components/command-list.svelte +3 -8
- package/dist/components/command/components/command-separator.svelte +3 -8
- package/dist/components/command/components/command-shortcut.svelte +2 -10
- package/dist/components/command/components/command.svelte +29 -42
- package/dist/components/date-range-picker/DateRangePicker.svelte +490 -0
- package/dist/components/date-range-picker/DateRangePicker.svelte.d.ts +4 -0
- package/dist/components/date-range-picker/DateRangePicker.types.d.ts +38 -0
- package/dist/components/date-range-picker/DateRangePicker.types.js +1 -0
- package/dist/components/date-range-picker/index.d.ts +2 -0
- package/dist/components/date-range-picker/index.js +1 -0
- package/dist/components/dialog/Dialog.d.ts +43 -121
- package/dist/components/dialog/Dialog.js +1 -39
- package/dist/components/dialog/Dialog.svelte +103 -113
- package/dist/components/dialog/Dialog.svelte.d.ts +1 -2
- package/dist/components/dialog/dialog.scss +21 -24
- package/dist/components/drawer/Drawer.svelte +63 -0
- package/dist/components/drawer/Drawer.svelte.d.ts +16 -0
- package/dist/components/drawer/index.d.ts +1 -0
- package/dist/components/drawer/index.js +1 -0
- package/dist/components/dropdown-menu/DropdownMenu.d.ts +51 -24
- package/dist/components/dropdown-menu/DropdownMenu.js +1 -15
- package/dist/components/dropdown-menu/components/DropdownMenu.svelte +36 -34
- package/dist/components/dropdown-menu/components/DropdownMenu.svelte.d.ts +1 -1
- package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +8 -12
- package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte.d.ts +2 -4
- package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +11 -12
- package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte.d.ts +2 -4
- package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +27 -30
- package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte.d.ts +1 -1
- package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +9 -11
- package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte.d.ts +2 -4
- package/dist/components/fonts/TeraFontMono.svelte +4 -4
- package/dist/components/fonts/TeraFontMono.svelte.d.ts +1 -0
- package/dist/components/fonts/TeraFontSansSerif.svelte +4 -4
- package/dist/components/fonts/TeraFontSansSerif.svelte.d.ts +1 -1
- package/dist/components/header/Header.svelte +6 -9
- package/dist/components/header/header.scss +1 -1
- package/dist/components/icons/IconArrowBigRightFilled.svelte +3 -7
- package/dist/components/icons/IconBook.svelte +3 -6
- package/dist/components/icons/IconBookmarkPlus.svelte +3 -6
- package/dist/components/icons/IconCalculator.svelte +3 -6
- package/dist/components/icons/IconCheck.svelte +3 -6
- package/dist/components/icons/IconChevronDown.svelte +3 -6
- package/dist/components/icons/IconCoin.svelte +3 -6
- package/dist/components/icons/IconCoinConvert.svelte +2 -5
- package/dist/components/icons/IconCopy.svelte +3 -6
- package/dist/components/icons/IconCopyCheckFilled.svelte +3 -6
- package/dist/components/icons/IconHamburger.svelte +3 -6
- package/dist/components/icons/IconLanguage.svelte +3 -6
- package/dist/components/icons/IconLoader2.svelte +3 -6
- package/dist/components/icons/IconLogout.svelte +3 -6
- package/dist/components/icons/IconMoon.svelte +3 -6
- package/dist/components/icons/IconPointFilled.svelte +3 -6
- package/dist/components/icons/IconSearch.svelte +3 -6
- package/dist/components/icons/IconSettings.svelte +3 -6
- package/dist/components/icons/IconSun.svelte +3 -6
- package/dist/components/icons/IconSwitchHorizontal.svelte +3 -6
- package/dist/components/icons/IconSwitchVertical.svelte +3 -6
- package/dist/components/icons/IconTransform.svelte +3 -6
- package/dist/components/icons/IconX.svelte +3 -6
- package/dist/components/input/Input.d.ts +2 -2
- package/dist/components/input/Input.js +10 -10
- package/dist/components/input/Input.svelte +10 -26
- package/dist/components/label/Label.d.ts +2 -2
- package/dist/components/label/Label.js +2 -2
- package/dist/components/label/Label.svelte +4 -12
- package/dist/components/language-picker-button/LanguagePickerButton.svelte +23 -42
- package/dist/components/light-dark-toggle/LightDarkToggle.svelte +21 -26
- package/dist/components/marketing/FeatureCard.svelte +37 -0
- package/dist/components/marketing/FeatureCard.svelte.d.ts +13 -0
- package/dist/components/marketing/PricingCard.svelte +48 -0
- package/dist/components/marketing/PricingCard.svelte.d.ts +15 -0
- package/dist/components/marketing/StatBlock.svelte +14 -0
- package/dist/components/marketing/StatBlock.svelte.d.ts +10 -0
- package/dist/components/marketing/TestimonialCard.svelte +24 -0
- package/dist/components/marketing/TestimonialCard.svelte.d.ts +12 -0
- package/dist/components/marketing/index.d.ts +4 -0
- package/dist/components/marketing/index.js +4 -0
- package/dist/components/popover/Popover.d.ts +32 -13
- package/dist/components/popover/Popover.js +1 -7
- package/dist/components/popover/Popover.svelte +40 -158
- package/dist/components/popover/Popover.svelte.d.ts +2 -2
- package/dist/components/popover-responsive/PopoverResponsive.d.ts +18 -7
- package/dist/components/popover-responsive/PopoverResponsive.js +1 -7
- package/dist/components/popover-responsive/PopoverResponsive.svelte +25 -87
- package/dist/components/popover-responsive/PopoverResponsive.svelte.d.ts +2 -11
- package/dist/components/select/Select.d.ts +60 -23
- package/dist/components/select/Select.js +14 -35
- package/dist/components/select/Select.svelte +157 -28
- package/dist/components/select/Select.svelte.d.ts +2 -3
- package/dist/components/select/index.d.ts +1 -1
- package/dist/components/side-navigation/SideNavigation.svelte +73 -96
- package/dist/components/side-navigation/SideNavigationItem.svelte +2 -2
- package/dist/components/side-navigation/SideNavigationLayout.svelte +3 -5
- package/dist/components/side-navigation/sidenav.scss +17 -13
- package/dist/components/skeleton/Skeleton.svelte +48 -0
- package/dist/components/skeleton/Skeleton.svelte.d.ts +12 -0
- package/dist/components/skeleton/index.d.ts +1 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/slider/Slider.d.ts +25 -15
- package/dist/components/slider/Slider.js +1 -7
- package/dist/components/slider/Slider.svelte +38 -164
- package/dist/components/slider/Slider.svelte.d.ts +1 -1
- package/dist/components/spinner/Spinner.svelte +39 -0
- package/dist/components/spinner/Spinner.svelte.d.ts +10 -0
- package/dist/components/spinner/index.d.ts +1 -0
- package/dist/components/spinner/index.js +1 -0
- package/dist/components/star-rating/StarRating.svelte +33 -49
- package/dist/components/switch/Switch.d.ts +19 -4
- package/dist/components/switch/Switch.js +4 -0
- package/dist/components/switch/Switch.svelte +13 -17
- package/dist/components/switch/Switch.svelte.d.ts +2 -2
- package/dist/components/table/Table.svelte +68 -0
- package/dist/components/table/Table.svelte.d.ts +40 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.js +1 -0
- package/dist/components/tabs/Tabs.svelte.d.ts +45 -16
- package/dist/components/tabs/Tabs.svelte.js +8 -18
- package/dist/components/tabs/components/Tabs.svelte +27 -33
- package/dist/components/tabs/components/Tabs.svelte.d.ts +1 -1
- package/dist/components/tabs/components/TabsContent.svelte +13 -36
- package/dist/components/tabs/components/TabsContent.svelte.d.ts +2 -5
- package/dist/components/tabs/components/TabsItem.svelte +43 -32
- package/dist/components/tabs/components/TabsItem.svelte.d.ts +2 -5
- package/dist/components/tabs/components/TabsList.svelte +90 -58
- package/dist/components/tabs/components/TabsList.svelte.d.ts +2 -4
- package/dist/components/tera-ui-context/TeraUiContext.svelte +13 -26
- package/dist/components/text-area/TextArea.d.ts +2 -2
- package/dist/components/text-area/TextArea.js +9 -9
- package/dist/components/text-area/TextArea.svelte +41 -65
- package/dist/components/toast/ToastContainer.svelte +50 -0
- package/dist/components/toast/ToastContainer.svelte.d.ts +18 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.js +2 -0
- package/dist/components/toast/toast.svelte.d.ts +22 -0
- package/dist/components/toast/toast.svelte.js +18 -0
- package/dist/components/tooltip/Tooltip.d.ts +23 -0
- package/dist/components/tooltip/Tooltip.js +1 -0
- package/dist/components/tooltip/Tooltip.svelte +30 -0
- package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +1 -0
- package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +48 -69
- package/dist/index.d.ts +19 -2
- package/dist/index.js +12 -0
- package/dist/llms/accordion.md +90 -0
- package/dist/llms/ai.md +110 -0
- package/dist/llms/alert.md +29 -0
- package/dist/llms/avatar.md +34 -0
- package/dist/llms/badge.md +31 -0
- package/dist/llms/brand-logo.md +30 -0
- package/dist/llms/button.md +37 -0
- package/dist/llms/card.md +32 -0
- package/dist/llms/checkbox.md +35 -0
- package/dist/llms/colors.md +161 -0
- package/dist/llms/combobox.md +40 -0
- package/dist/llms/command.md +7 -0
- package/dist/llms/date-range-picker.md +36 -0
- package/dist/llms/dialog.md +45 -0
- package/dist/llms/drawer.md +30 -0
- package/dist/llms/dropdown-menu.md +112 -0
- package/dist/llms/fonts.md +7 -0
- package/dist/llms/header.md +26 -0
- package/dist/llms/icons.md +43 -0
- package/dist/llms/index.md +65 -0
- package/dist/llms/input.md +37 -0
- package/dist/llms/label.md +30 -0
- package/dist/llms/language-picker-button.md +30 -0
- package/dist/llms/light-dark-toggle.md +26 -0
- package/dist/llms/marketing.md +95 -0
- package/dist/llms/popover-responsive.md +32 -0
- package/dist/llms/popover.md +40 -0
- package/dist/llms/select.md +44 -0
- package/dist/llms/side-navigation.md +30 -0
- package/dist/llms/skeleton.md +28 -0
- package/dist/llms/slider.md +36 -0
- package/dist/llms/spinner.md +25 -0
- package/dist/llms/star-rating.md +31 -0
- package/dist/llms/switch.md +33 -0
- package/dist/llms/table.md +30 -0
- package/dist/llms/tabs.md +92 -0
- package/dist/llms/tera-ui-context.md +30 -0
- package/dist/llms/text-area.md +39 -0
- package/dist/llms/toast.md +7 -0
- package/dist/llms/tooltip.md +32 -0
- package/dist/llms/user-avatar-with-menu.md +28 -0
- package/dist/paraglide/README.md +72 -3
- package/dist/paraglide/messages/text_account_settings.d.ts +14 -2
- package/dist/paraglide/messages/text_account_settings.js +53 -58
- package/dist/paraglide/messages/text_calces_documentation.d.ts +14 -2
- package/dist/paraglide/messages/text_calces_documentation.js +53 -58
- package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +14 -2
- package/dist/paraglide/messages/text_calces_scientific_calculator.js +53 -58
- package/dist/paraglide/messages/text_currency_converter.d.ts +14 -2
- package/dist/paraglide/messages/text_currency_converter.js +53 -58
- package/dist/paraglide/messages/text_logout.d.ts +14 -2
- package/dist/paraglide/messages/text_logout.js +53 -58
- package/dist/paraglide/messages/text_select_language.d.ts +14 -2
- package/dist/paraglide/messages/text_select_language.js +53 -58
- package/dist/paraglide/messages/text_unit_converter.d.ts +14 -2
- package/dist/paraglide/messages/text_unit_converter.js +53 -58
- package/dist/paraglide/registry.d.ts +13 -0
- package/dist/paraglide/registry.js +15 -0
- package/dist/paraglide/runtime.d.ts +243 -126
- package/dist/paraglide/runtime.js +473 -148
- package/dist/paraglide/server.d.ts +13 -20
- package/dist/paraglide/server.js +92 -40
- package/dist/stories/ComponentOverview.stories.svelte +533 -0
- package/dist/stories/ComponentOverview.stories.svelte.d.ts +6 -0
- package/dist/themes/tera-ui-base.css +242 -77
- package/dist/themes/theme-ai.css +100 -0
- package/dist/themes/theme-marketing.css +91 -0
- package/dist/themes/theme-professional.css +41 -0
- package/package.json +35 -29
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/.meta.json +0 -3
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/README.md +0 -103
- package/dist/tera-i18n/projects/tera-system-ui/project.inlang/project_id +0 -1
- package/dist/themes/tw-preset.cjs +0 -160
- package/dist/themes/tw-preset.d.cts +0 -157
|
@@ -1,28 +1,157 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
>
|
|
27
|
-
|
|
28
|
-
|
|
1
|
+
<script lang="ts">import { Select as SelectPrimitive } from 'bits-ui';
|
|
2
|
+
import { triggerStyles } from './Select.js';
|
|
3
|
+
import { IconCheck, IconChevronDown } from '../icons/index.js';
|
|
4
|
+
import IconChevronsUp from '@tabler/icons-svelte/icons/chevrons-up';
|
|
5
|
+
import IconChevronsDown from '@tabler/icons-svelte/icons/chevrons-down';
|
|
6
|
+
let { type = 'single', options = [], groups, value = $bindable(), placeholder = 'Select…', variant, size, disabled, status, loop, allowDeselect, required, name, class: className, onchange, } = $props();
|
|
7
|
+
// All options flat — used for label lookup in multiple mode
|
|
8
|
+
const allOptions = $derived(groups ? groups.flatMap(g => g.options) : options);
|
|
9
|
+
// Single mode: selected label
|
|
10
|
+
const selectedLabel = $derived.by(() => {
|
|
11
|
+
const v = value;
|
|
12
|
+
if (typeof v !== 'string' || !v)
|
|
13
|
+
return '';
|
|
14
|
+
return allOptions.find(o => o.value === v)?.label ?? v;
|
|
15
|
+
});
|
|
16
|
+
// Multiple mode: selected chips
|
|
17
|
+
const selectedChips = $derived(Array.isArray(value)
|
|
18
|
+
? value.map(v => ({ value: v, label: allOptions.find(o => o.value === v)?.label ?? v }))
|
|
19
|
+
: []);
|
|
20
|
+
const triggerClass = $derived(triggerStyles({ variant, size, disabled, status, className }));
|
|
21
|
+
const minHeight = "21rem";
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
{#snippet itemList()}
|
|
25
|
+
<SelectPrimitive.Viewport class="p-2 flex-1 min-h-0 overflow-y-auto">
|
|
26
|
+
{#if groups && groups.length > 0}
|
|
27
|
+
{#each groups as group (group.label)}
|
|
28
|
+
<SelectPrimitive.Group>
|
|
29
|
+
<SelectPrimitive.GroupHeading
|
|
30
|
+
class="px-2 py-1.5 text-xs font-semibold text-text-tertiary uppercase tracking-wide"
|
|
31
|
+
>
|
|
32
|
+
{group.label}
|
|
33
|
+
</SelectPrimitive.GroupHeading>
|
|
34
|
+
{#each group.options as option (option.value)}
|
|
35
|
+
{@render renderItem(option)}
|
|
36
|
+
{/each}
|
|
37
|
+
</SelectPrimitive.Group>
|
|
38
|
+
{/each}
|
|
39
|
+
{:else}
|
|
40
|
+
{#each options as option (option.value)}
|
|
41
|
+
{@render renderItem(option)}
|
|
42
|
+
{/each}
|
|
43
|
+
{/if}
|
|
44
|
+
</SelectPrimitive.Viewport>
|
|
45
|
+
{/snippet}
|
|
46
|
+
|
|
47
|
+
{#if type === 'multiple'}
|
|
48
|
+
<SelectPrimitive.Root
|
|
49
|
+
type="multiple"
|
|
50
|
+
bind:value={value as string[] | undefined}
|
|
51
|
+
onValueChange={(v) => onchange?.(v)}
|
|
52
|
+
{disabled}
|
|
53
|
+
{loop}
|
|
54
|
+
{required}
|
|
55
|
+
{name}
|
|
56
|
+
>
|
|
57
|
+
<!--
|
|
58
|
+
Multiple-mode trigger: chip tags displayed in the button, individual × spans
|
|
59
|
+
are non-interactive (no onclick) to avoid button-in-button nesting.
|
|
60
|
+
Managing selection is done exclusively through the dropdown items.
|
|
61
|
+
-->
|
|
62
|
+
<SelectPrimitive.Trigger class={triggerStyles({ variant, size, disabled, status, className: `h-auto min-h-9 flex-wrap py-1.5 ${className ?? ''}` })}>
|
|
63
|
+
{#if selectedChips.length > 0}
|
|
64
|
+
{#each selectedChips as chip (chip.value)}
|
|
65
|
+
<!-- Plain span tag — no interactive elements inside <button> -->
|
|
66
|
+
<span class="inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs bg-interactive-subtle text-interactive-text border border-interactive-border">
|
|
67
|
+
{chip.label}
|
|
68
|
+
<!-- Use span with role for the remove hint; actual removal happens via re-clicking in dropdown -->
|
|
69
|
+
<!-- <span class="flex items-center opacity-60" aria-hidden="true"><IconX class="size-3" /></span>-->
|
|
70
|
+
</span>
|
|
71
|
+
{/each}
|
|
72
|
+
{:else}
|
|
73
|
+
<span class="text-text-tertiary flex-1">{placeholder}</span>
|
|
74
|
+
{/if}
|
|
75
|
+
<IconChevronDown class="size-4 shrink-0 text-text-tertiary ml-auto transition-transform ease-ui duration-150 data-[state=open]:rotate-180" />
|
|
76
|
+
</SelectPrimitive.Trigger>
|
|
77
|
+
|
|
78
|
+
<SelectPrimitive.Portal>
|
|
79
|
+
<SelectPrimitive.Content
|
|
80
|
+
sideOffset={4}
|
|
81
|
+
class="z-50 min-w-[var(--bits-select-anchor-width)] flex flex-col overflow-hidden
|
|
82
|
+
bg-surface rounded-container border border-border-default shadow-lg
|
|
83
|
+
animate-in fade-in zoom-in-95 duration-150
|
|
84
|
+
data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95"
|
|
85
|
+
style="max-height: min({minHeight}, var(--bits-select-content-available-height))"
|
|
86
|
+
>
|
|
87
|
+
<SelectPrimitive.ScrollUpButton class="flex w-full items-center justify-center pt-1 text-text-tertiary cursor-default hover:text-text-primary transition-colors">
|
|
88
|
+
<IconChevronsUp class="size-3.5" />
|
|
89
|
+
</SelectPrimitive.ScrollUpButton>
|
|
90
|
+
{@render itemList()}
|
|
91
|
+
<SelectPrimitive.ScrollDownButton class="flex w-full items-center justify-center pb-1 text-text-tertiary cursor-default hover:text-text-primary transition-colors">
|
|
92
|
+
<IconChevronsDown class="size-3.5" />
|
|
93
|
+
</SelectPrimitive.ScrollDownButton>
|
|
94
|
+
</SelectPrimitive.Content>
|
|
95
|
+
</SelectPrimitive.Portal>
|
|
96
|
+
</SelectPrimitive.Root>
|
|
97
|
+
|
|
98
|
+
{:else}
|
|
99
|
+
<SelectPrimitive.Root
|
|
100
|
+
type="single"
|
|
101
|
+
bind:value={value as string | undefined}
|
|
102
|
+
onValueChange={(v) => onchange?.(v)}
|
|
103
|
+
{disabled}
|
|
104
|
+
{loop}
|
|
105
|
+
{allowDeselect}
|
|
106
|
+
{required}
|
|
107
|
+
{name}
|
|
108
|
+
>
|
|
109
|
+
<SelectPrimitive.Trigger class={triggerClass}>
|
|
110
|
+
<span class={!value ? 'text-text-tertiary' : 'text-text-primary'}>
|
|
111
|
+
{value ? selectedLabel : placeholder}
|
|
112
|
+
</span>
|
|
113
|
+
<IconChevronDown
|
|
114
|
+
class="size-4 shrink-0 text-text-tertiary transition-transform ease-ui duration-150 data-[state=open]:rotate-180"
|
|
115
|
+
/>
|
|
116
|
+
</SelectPrimitive.Trigger>
|
|
117
|
+
|
|
118
|
+
<SelectPrimitive.Portal>
|
|
119
|
+
<SelectPrimitive.Content
|
|
120
|
+
sideOffset={6}
|
|
121
|
+
class="z-50 min-w-[var(--bits-select-anchor-width)] flex flex-col overflow-hidden
|
|
122
|
+
bg-surface rounded-container border border-border-default shadow-lg
|
|
123
|
+
animate-in fade-in zoom-in-95 duration-150
|
|
124
|
+
data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95"
|
|
125
|
+
style="max-height: min({minHeight}, var(--bits-select-content-available-height))"
|
|
126
|
+
>
|
|
127
|
+
<SelectPrimitive.ScrollUpButton class="flex w-full items-center justify-center pt-1 text-text-tertiary cursor-default hover:text-text-primary transition-colors">
|
|
128
|
+
<IconChevronsUp class="size-3.5" />
|
|
129
|
+
</SelectPrimitive.ScrollUpButton>
|
|
130
|
+
{@render itemList()}
|
|
131
|
+
<SelectPrimitive.ScrollDownButton class="flex w-full items-center justify-center pb-1 text-text-tertiary cursor-default hover:text-text-primary transition-colors">
|
|
132
|
+
<IconChevronsDown class="size-3.5" />
|
|
133
|
+
</SelectPrimitive.ScrollDownButton>
|
|
134
|
+
</SelectPrimitive.Content>
|
|
135
|
+
</SelectPrimitive.Portal>
|
|
136
|
+
</SelectPrimitive.Root>
|
|
137
|
+
{/if}
|
|
138
|
+
|
|
139
|
+
{#snippet renderItem(option: { value: string; label: string; disabled?: boolean })}
|
|
140
|
+
<SelectPrimitive.Item
|
|
141
|
+
value={option.value}
|
|
142
|
+
label={option.label}
|
|
143
|
+
disabled={option.disabled}
|
|
144
|
+
class="relative flex w-full cursor-pointer select-none items-center rounded px-2 py-2 text-sm text-text-primary outline-none
|
|
145
|
+
transition-colors ease-ui duration-100
|
|
146
|
+
data-[highlighted]:bg-surface-hover
|
|
147
|
+
data-[selected]:font-medium data-[selected]:text-interactive
|
|
148
|
+
data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50"
|
|
149
|
+
>
|
|
150
|
+
{#snippet children({selected})}
|
|
151
|
+
<span class="flex-1">{option.label}</span>
|
|
152
|
+
{#if selected}
|
|
153
|
+
<IconCheck class="size-4 text-interactive shrink-0"/>
|
|
154
|
+
{/if}
|
|
155
|
+
{/snippet}
|
|
156
|
+
</SelectPrimitive.Item>
|
|
157
|
+
{/snippet}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import './
|
|
2
|
-
|
|
3
|
-
declare const Select: import("svelte").Component<SelectProps, {}, "value" | "ref">;
|
|
1
|
+
import { type SelectProps } from './Select.js';
|
|
2
|
+
declare const Select: import("svelte").Component<SelectProps, {}, "value">;
|
|
4
3
|
type Select = ReturnType<typeof Select>;
|
|
5
4
|
export default Select;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { default as Select } from './Select.svelte';
|
|
2
|
-
export type { SelectProps } from './Select';
|
|
2
|
+
export type { SelectProps, SelectOption } from './Select.js';
|
|
@@ -1,98 +1,75 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
let
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
exactHref: '/convert',
|
|
74
|
-
icon: IconTransform,
|
|
75
|
-
title: m.text_unit_converter(),
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
href: `/convert${langPathForConverter}/currency`,
|
|
79
|
-
exactHref: '/convert/currency',
|
|
80
|
-
icon: IconCoinConvert,
|
|
81
|
-
title: m.text_currency_converter(),
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
href: '/docs/calculator-usages/calces',
|
|
85
|
-
icon: IconBook,
|
|
86
|
-
title: m.text_calces_documentation(),
|
|
87
|
-
},
|
|
88
|
-
]
|
|
89
|
-
|
|
90
|
-
let selectedIndex = (() => {
|
|
91
|
-
return NAV_ITEM.findIndex((item, index) => {
|
|
92
|
-
return (item.exactHref ?? item.href) === sideNavHref;
|
|
93
|
-
})
|
|
94
|
-
})();
|
|
95
|
-
|
|
1
|
+
<script lang="ts">import { SCREEN_BREAK_POINTS, mainLayout, setSideNavState, toggleSideNavigation, getSideNavState } from "./SideNavigation";
|
|
2
|
+
import { clickOutside } from "../../actions/clickOutside";
|
|
3
|
+
import { Button } from "../button";
|
|
4
|
+
import { IconCoinConvert, IconHamburger } from "../icons";
|
|
5
|
+
import { BrandLogo } from "../brand-logo";
|
|
6
|
+
import SideNavItem from "./SideNavigationItem.svelte";
|
|
7
|
+
import IconBook from "../icons/IconBook.svelte";
|
|
8
|
+
import IconTransform from "../icons/IconTransform.svelte";
|
|
9
|
+
import IconCalculator from "../icons/IconCalculator.svelte";
|
|
10
|
+
import { m } from '../../paraglide/messages.js';
|
|
11
|
+
import { getGlobalContext } from "../tera-ui-context/global-context";
|
|
12
|
+
import { SupportedLanguage as CalculatorSupportedLanguage } from "../../tera-i18n/projects/tera-calculator/supported-language";
|
|
13
|
+
import { SupportedLanguage as ConverterSupportedLanguage } from "../../tera-i18n/projects/tera-converter/supported-language";
|
|
14
|
+
let { children, sideNavHref, language, items, bottomChildren, ...props } = $props();
|
|
15
|
+
function handleClickOutside() {
|
|
16
|
+
let screenWidth = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);
|
|
17
|
+
if (screenWidth < SCREEN_BREAK_POINTS.md) {
|
|
18
|
+
setSideNavState(undefined);
|
|
19
|
+
}
|
|
20
|
+
else if (screenWidth >= SCREEN_BREAK_POINTS.md && screenWidth < SCREEN_BREAK_POINTS.xl) {
|
|
21
|
+
setSideNavState(undefined);
|
|
22
|
+
}
|
|
23
|
+
else if (screenWidth >= SCREEN_BREAK_POINTS.xl) {
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function handleHover(isHover) {
|
|
27
|
+
let temporaryExpand = isHover ? true : undefined;
|
|
28
|
+
if (temporaryExpand) {
|
|
29
|
+
mainLayout()?.setAttribute('data-side-nav-temporary-expand', temporaryExpand.toString());
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
mainLayout()?.removeAttribute('data-side-nav-temporary-expand');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
let globalContext = getGlobalContext();
|
|
36
|
+
const resolvedSideNavHref = $derived(sideNavHref || globalContext?.sideNavHref);
|
|
37
|
+
const resolvedLanguage = $derived(language || globalContext?.language || 'en');
|
|
38
|
+
const langPath = $derived((resolvedLanguage === 'en') ? '' : `/${resolvedLanguage}`);
|
|
39
|
+
const langForCalculator = $derived((resolvedLanguage && CalculatorSupportedLanguage.includes(resolvedLanguage)) ? resolvedLanguage : 'en');
|
|
40
|
+
const langPathForCalculator = $derived((langForCalculator === 'en') ? '' : `/${langForCalculator}`);
|
|
41
|
+
const langForConverter = $derived((resolvedLanguage && ConverterSupportedLanguage.includes(resolvedLanguage)) ? resolvedLanguage : 'en');
|
|
42
|
+
const langPathForConverter = $derived((langForConverter === 'en') ? '' : `/${langForConverter}`);
|
|
43
|
+
const NAV_ITEM = $derived(items ?? [
|
|
44
|
+
{
|
|
45
|
+
href: `/calculator${langPathForCalculator}`,
|
|
46
|
+
exactHref: '/calculator',
|
|
47
|
+
icon: IconCalculator,
|
|
48
|
+
title: m.text_calces_scientific_calculator(),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
href: `/convert${langPathForConverter}`,
|
|
52
|
+
exactHref: '/convert',
|
|
53
|
+
icon: IconTransform,
|
|
54
|
+
title: m.text_unit_converter(),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
href: `/convert${langPathForConverter}/currency`,
|
|
58
|
+
exactHref: '/convert/currency',
|
|
59
|
+
icon: IconCoinConvert,
|
|
60
|
+
title: m.text_currency_converter(),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
href: '/docs/calculator-usages/calces',
|
|
64
|
+
icon: IconBook,
|
|
65
|
+
title: m.text_calces_documentation(),
|
|
66
|
+
},
|
|
67
|
+
]);
|
|
68
|
+
let selectedIndex = (() => {
|
|
69
|
+
return NAV_ITEM.findIndex((item) => {
|
|
70
|
+
return (item.exactHref ?? item.href) === resolvedSideNavHref;
|
|
71
|
+
});
|
|
72
|
+
})();
|
|
96
73
|
</script>
|
|
97
74
|
|
|
98
75
|
<nav class="side-nav_main-side-bar grid grid-rows-[auto_1fr_auto]"
|
|
@@ -118,7 +95,7 @@
|
|
|
118
95
|
handleHover(false)
|
|
119
96
|
}}
|
|
120
97
|
>
|
|
121
|
-
{#each NAV_ITEM as item, index}
|
|
98
|
+
{#each NAV_ITEM as item, index (item.href)}
|
|
122
99
|
<SideNavItem href={item.href} class={selectedIndex === index ? 'selected' : ''}>
|
|
123
100
|
{#snippet icon()}
|
|
124
101
|
<item.icon/>
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
let {children, language, items, bottomChildren} = $props()
|
|
1
|
+
<script lang="ts">import { SideNavigation } from "./";
|
|
2
|
+
import './sidenav.scss';
|
|
3
|
+
let { children, language, items, bottomChildren } = $props();
|
|
6
4
|
</script>
|
|
7
5
|
|
|
8
6
|
<main
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
@media (min-width:
|
|
88
|
+
@media (min-width: 48rem) {
|
|
89
89
|
:root {
|
|
90
90
|
--sidebar-main-margin-left: 3rem;
|
|
91
91
|
--sidebar-border-width: 1px;
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
@media (min-width:
|
|
96
|
+
@media (min-width: 80rem) {
|
|
97
97
|
:root {
|
|
98
98
|
--sidebar-main-margin-left: var(--sidebar-width);
|
|
99
99
|
--sidebar-width: 16.5rem;
|
|
@@ -121,6 +121,8 @@
|
|
|
121
121
|
|
|
122
122
|
.side-nav_item {
|
|
123
123
|
color: var(--color-neutral-token-13);
|
|
124
|
+
position: relative;
|
|
125
|
+
transition: background-color 150ms var(--ease-ui);
|
|
124
126
|
|
|
125
127
|
a {
|
|
126
128
|
display: flex;
|
|
@@ -139,23 +141,25 @@
|
|
|
139
141
|
}
|
|
140
142
|
}
|
|
141
143
|
|
|
142
|
-
|
|
143
|
-
color: var(--color-neutral-token-1);
|
|
144
|
-
}
|
|
145
|
-
|
|
144
|
+
/* Active item: 3px left accent bar */
|
|
146
145
|
&.selected {
|
|
147
|
-
a
|
|
146
|
+
a {
|
|
147
|
+
color: var(--color-text-primary);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
&::before {
|
|
148
151
|
content: '';
|
|
149
152
|
position: absolute;
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
153
|
+
left: 0;
|
|
154
|
+
top: 0.25rem;
|
|
155
|
+
bottom: 0.25rem;
|
|
156
|
+
width: 3px;
|
|
157
|
+
background: var(--color-interactive);
|
|
158
|
+
border-radius: 0 2px 2px 0;
|
|
155
159
|
}
|
|
156
160
|
}
|
|
157
161
|
|
|
158
162
|
&:hover {
|
|
159
|
-
background-color: var(--color-
|
|
163
|
+
background-color: var(--color-surface-hover);
|
|
160
164
|
}
|
|
161
165
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script lang="ts">"use strict";
|
|
2
|
+
let { variant = 'line', width, height, lines = 1, animate = true, class: className = '', } = $props();
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<div
|
|
6
|
+
aria-label="Loading..."
|
|
7
|
+
aria-busy="true"
|
|
8
|
+
class={className}
|
|
9
|
+
>
|
|
10
|
+
{#if variant === 'circle'}
|
|
11
|
+
<div
|
|
12
|
+
class="rounded-full {animate ? 'skeleton-shimmer' : 'bg-surface-hover'}"
|
|
13
|
+
style="width:{width ?? '48px'};height:{height ?? width ?? '48px'}"
|
|
14
|
+
></div>
|
|
15
|
+
{:else if variant === 'rect'}
|
|
16
|
+
<div
|
|
17
|
+
class="rounded {animate ? 'skeleton-shimmer' : 'bg-surface-hover'}"
|
|
18
|
+
style="width:{width ?? '100%'};height:{height ?? '120px'}"
|
|
19
|
+
></div>
|
|
20
|
+
{:else}
|
|
21
|
+
<div class="flex flex-col gap-2" style="width:{width ?? '100%'}">
|
|
22
|
+
{#each Array(lines) as _, i (i)}
|
|
23
|
+
<div
|
|
24
|
+
class="h-3 rounded-full {animate ? 'skeleton-shimmer' : 'bg-surface-hover'}"
|
|
25
|
+
style={i === lines - 1 && lines > 1 ? 'width:70%' : 'width:100%'}
|
|
26
|
+
></div>
|
|
27
|
+
{/each}
|
|
28
|
+
</div>
|
|
29
|
+
{/if}
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<style>
|
|
33
|
+
.skeleton-shimmer {
|
|
34
|
+
background: linear-gradient(
|
|
35
|
+
90deg,
|
|
36
|
+
var(--color-surface-hover) 25%,
|
|
37
|
+
var(--color-surface-sunken) 50%,
|
|
38
|
+
var(--color-surface-hover) 75%
|
|
39
|
+
);
|
|
40
|
+
background-size: 200% 100%;
|
|
41
|
+
animation: shimmer 1.5s infinite;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@keyframes shimmer {
|
|
45
|
+
0% { background-position: 200% 0; }
|
|
46
|
+
100% { background-position: -200% 0; }
|
|
47
|
+
}
|
|
48
|
+
</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type SkeletonVariant = 'line' | 'circle' | 'rect';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
variant?: SkeletonVariant;
|
|
4
|
+
width?: string;
|
|
5
|
+
height?: string;
|
|
6
|
+
lines?: number;
|
|
7
|
+
animate?: boolean;
|
|
8
|
+
class?: string;
|
|
9
|
+
};
|
|
10
|
+
declare const Skeleton: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
11
|
+
type Skeleton = ReturnType<typeof Skeleton>;
|
|
12
|
+
export default Skeleton;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Skeleton } from './Skeleton.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as Skeleton } from './Skeleton.svelte';
|
|
@@ -1,18 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import type { HTMLAttributes } from "svelte/elements";
|
|
4
|
-
export declare const styles: import("tailwind-variants").TVReturnType<{}, undefined, "", {}, undefined, import("tailwind-variants").TVReturnType<{}, undefined, "", unknown, unknown, undefined>>;
|
|
5
|
-
type SliderVariants = VariantProps<typeof styles>;
|
|
6
|
-
export interface SliderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onchange'>, SliderVariants {
|
|
7
|
-
children?: Snippet;
|
|
1
|
+
export interface SliderProps {
|
|
2
|
+
/** Additional CSS classes for the root element. */
|
|
8
3
|
class?: string;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
/** Minimum value of the slider range. */
|
|
5
|
+
min?: number;
|
|
6
|
+
/** Maximum value of the slider range. */
|
|
7
|
+
max?: number;
|
|
8
|
+
/** Step interval between selectable values. */
|
|
9
|
+
step?: number;
|
|
10
|
+
/** Current value. Bindable. */
|
|
11
|
+
value?: number;
|
|
12
|
+
/** Prevents all interaction and dims the control. */
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Layout orientation of the slider track and thumb.
|
|
16
|
+
* When 'vertical', the parent must have an explicit height.
|
|
17
|
+
*/
|
|
18
|
+
orientation?: 'horizontal' | 'vertical';
|
|
19
|
+
/** Fires continuously as the thumb moves during drag. */
|
|
14
20
|
onchange?: (value: number) => void;
|
|
15
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Fires once when the user finishes dragging and releases the thumb.
|
|
23
|
+
* Prefer this over `onchange` when the handler triggers expensive work.
|
|
24
|
+
*/
|
|
25
|
+
onValueCommit?: (value: number) => void;
|
|
26
|
+
/** Bindable reference to the root span element. */
|
|
27
|
+
ref?: HTMLElement | null;
|
|
16
28
|
}
|
|
17
|
-
export type SliderContextProps = {};
|
|
18
|
-
export {};
|