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.
Files changed (273) hide show
  1. package/dist/COMPONENT_API.md +2 -539
  2. package/dist/components/accordion/Accordion.d.ts +24 -0
  3. package/dist/components/accordion/Accordion.js +4 -0
  4. package/dist/components/accordion/components/Accordion.svelte +2 -8
  5. package/dist/components/accordion/components/AccordionContent.svelte +5 -12
  6. package/dist/components/accordion/components/AccordionItem.svelte +3 -9
  7. package/dist/components/accordion/components/AccordionTrigger.svelte +5 -15
  8. package/dist/components/ai/ChatBubble.svelte +35 -0
  9. package/dist/components/ai/ChatBubble.svelte.d.ts +12 -0
  10. package/dist/components/ai/PromptInput.svelte +58 -0
  11. package/dist/components/ai/PromptInput.svelte.d.ts +13 -0
  12. package/dist/components/ai/StreamText.svelte +41 -0
  13. package/dist/components/ai/StreamText.svelte.d.ts +11 -0
  14. package/dist/components/ai/SuggestionChips.svelte +34 -0
  15. package/dist/components/ai/SuggestionChips.svelte.d.ts +10 -0
  16. package/dist/components/ai/ThinkingLoader.svelte +34 -0
  17. package/dist/components/ai/ThinkingLoader.svelte.d.ts +11 -0
  18. package/dist/components/ai/index.d.ts +5 -0
  19. package/dist/components/ai/index.js +5 -0
  20. package/dist/components/alert/Alert.svelte +47 -0
  21. package/dist/components/alert/Alert.svelte.d.ts +15 -0
  22. package/dist/components/alert/index.d.ts +1 -0
  23. package/dist/components/alert/index.js +1 -0
  24. package/dist/components/avatar/Avatar.svelte +9 -25
  25. package/dist/components/badge/Badge.d.ts +52 -0
  26. package/dist/components/badge/Badge.js +22 -0
  27. package/dist/components/badge/Badge.svelte +22 -0
  28. package/dist/components/badge/Badge.svelte.d.ts +4 -0
  29. package/dist/components/badge/index.d.ts +2 -0
  30. package/dist/components/badge/index.js +1 -0
  31. package/dist/components/brand-logo/BrandLogo.svelte +12 -10
  32. package/dist/components/button/Button.d.ts +2 -2
  33. package/dist/components/button/Button.js +12 -12
  34. package/dist/components/button/Button.svelte +7 -34
  35. package/dist/components/card/Card.d.ts +68 -0
  36. package/dist/components/card/Card.js +28 -0
  37. package/dist/components/card/Card.svelte +33 -0
  38. package/dist/components/card/Card.svelte.d.ts +4 -0
  39. package/dist/components/card/index.d.ts +2 -0
  40. package/dist/components/card/index.js +1 -0
  41. package/dist/components/checkbox/Checkbox.d.ts +25 -4
  42. package/dist/components/checkbox/Checkbox.js +4 -0
  43. package/dist/components/checkbox/Checkbox.svelte +13 -16
  44. package/dist/components/checkbox/Checkbox.svelte.d.ts +2 -2
  45. package/dist/components/combobox/Combobox.d.ts +45 -9
  46. package/dist/components/combobox/Combobox.js +5 -7
  47. package/dist/components/combobox/Combobox.svelte +226 -8
  48. package/dist/components/combobox/Combobox.svelte.d.ts +2 -2
  49. package/dist/components/combobox/index.d.ts +1 -1
  50. package/dist/components/command/components/command-empty.svelte +3 -8
  51. package/dist/components/command/components/command-group.svelte +3 -13
  52. package/dist/components/command/components/command-input.svelte +5 -13
  53. package/dist/components/command/components/command-item.svelte +3 -9
  54. package/dist/components/command/components/command-link-item.svelte +3 -8
  55. package/dist/components/command/components/command-list.svelte +3 -8
  56. package/dist/components/command/components/command-separator.svelte +3 -8
  57. package/dist/components/command/components/command-shortcut.svelte +2 -10
  58. package/dist/components/command/components/command.svelte +29 -42
  59. package/dist/components/date-range-picker/DateRangePicker.svelte +490 -0
  60. package/dist/components/date-range-picker/DateRangePicker.svelte.d.ts +4 -0
  61. package/dist/components/date-range-picker/DateRangePicker.types.d.ts +38 -0
  62. package/dist/components/date-range-picker/DateRangePicker.types.js +1 -0
  63. package/dist/components/date-range-picker/index.d.ts +2 -0
  64. package/dist/components/date-range-picker/index.js +1 -0
  65. package/dist/components/dialog/Dialog.d.ts +43 -121
  66. package/dist/components/dialog/Dialog.js +1 -39
  67. package/dist/components/dialog/Dialog.svelte +103 -113
  68. package/dist/components/dialog/Dialog.svelte.d.ts +1 -2
  69. package/dist/components/dialog/dialog.scss +21 -24
  70. package/dist/components/drawer/Drawer.svelte +63 -0
  71. package/dist/components/drawer/Drawer.svelte.d.ts +16 -0
  72. package/dist/components/drawer/index.d.ts +1 -0
  73. package/dist/components/drawer/index.js +1 -0
  74. package/dist/components/dropdown-menu/DropdownMenu.d.ts +51 -24
  75. package/dist/components/dropdown-menu/DropdownMenu.js +1 -15
  76. package/dist/components/dropdown-menu/components/DropdownMenu.svelte +36 -34
  77. package/dist/components/dropdown-menu/components/DropdownMenu.svelte.d.ts +1 -1
  78. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +8 -12
  79. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte.d.ts +2 -4
  80. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +11 -12
  81. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte.d.ts +2 -4
  82. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +27 -30
  83. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte.d.ts +1 -1
  84. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +9 -11
  85. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte.d.ts +2 -4
  86. package/dist/components/fonts/TeraFontMono.svelte +4 -4
  87. package/dist/components/fonts/TeraFontMono.svelte.d.ts +1 -0
  88. package/dist/components/fonts/TeraFontSansSerif.svelte +4 -4
  89. package/dist/components/fonts/TeraFontSansSerif.svelte.d.ts +1 -1
  90. package/dist/components/header/Header.svelte +6 -9
  91. package/dist/components/header/header.scss +1 -1
  92. package/dist/components/icons/IconArrowBigRightFilled.svelte +3 -7
  93. package/dist/components/icons/IconBook.svelte +3 -6
  94. package/dist/components/icons/IconBookmarkPlus.svelte +3 -6
  95. package/dist/components/icons/IconCalculator.svelte +3 -6
  96. package/dist/components/icons/IconCheck.svelte +3 -6
  97. package/dist/components/icons/IconChevronDown.svelte +3 -6
  98. package/dist/components/icons/IconCoin.svelte +3 -6
  99. package/dist/components/icons/IconCoinConvert.svelte +2 -5
  100. package/dist/components/icons/IconCopy.svelte +3 -6
  101. package/dist/components/icons/IconCopyCheckFilled.svelte +3 -6
  102. package/dist/components/icons/IconHamburger.svelte +3 -6
  103. package/dist/components/icons/IconLanguage.svelte +3 -6
  104. package/dist/components/icons/IconLoader2.svelte +3 -6
  105. package/dist/components/icons/IconLogout.svelte +3 -6
  106. package/dist/components/icons/IconMoon.svelte +3 -6
  107. package/dist/components/icons/IconPointFilled.svelte +3 -6
  108. package/dist/components/icons/IconSearch.svelte +3 -6
  109. package/dist/components/icons/IconSettings.svelte +3 -6
  110. package/dist/components/icons/IconSun.svelte +3 -6
  111. package/dist/components/icons/IconSwitchHorizontal.svelte +3 -6
  112. package/dist/components/icons/IconSwitchVertical.svelte +3 -6
  113. package/dist/components/icons/IconTransform.svelte +3 -6
  114. package/dist/components/icons/IconX.svelte +3 -6
  115. package/dist/components/input/Input.d.ts +2 -2
  116. package/dist/components/input/Input.js +10 -10
  117. package/dist/components/input/Input.svelte +10 -26
  118. package/dist/components/label/Label.d.ts +2 -2
  119. package/dist/components/label/Label.js +2 -2
  120. package/dist/components/label/Label.svelte +4 -12
  121. package/dist/components/language-picker-button/LanguagePickerButton.svelte +23 -42
  122. package/dist/components/light-dark-toggle/LightDarkToggle.svelte +21 -26
  123. package/dist/components/marketing/FeatureCard.svelte +37 -0
  124. package/dist/components/marketing/FeatureCard.svelte.d.ts +13 -0
  125. package/dist/components/marketing/PricingCard.svelte +48 -0
  126. package/dist/components/marketing/PricingCard.svelte.d.ts +15 -0
  127. package/dist/components/marketing/StatBlock.svelte +14 -0
  128. package/dist/components/marketing/StatBlock.svelte.d.ts +10 -0
  129. package/dist/components/marketing/TestimonialCard.svelte +24 -0
  130. package/dist/components/marketing/TestimonialCard.svelte.d.ts +12 -0
  131. package/dist/components/marketing/index.d.ts +4 -0
  132. package/dist/components/marketing/index.js +4 -0
  133. package/dist/components/popover/Popover.d.ts +32 -13
  134. package/dist/components/popover/Popover.js +1 -7
  135. package/dist/components/popover/Popover.svelte +40 -158
  136. package/dist/components/popover/Popover.svelte.d.ts +2 -2
  137. package/dist/components/popover-responsive/PopoverResponsive.d.ts +18 -7
  138. package/dist/components/popover-responsive/PopoverResponsive.js +1 -7
  139. package/dist/components/popover-responsive/PopoverResponsive.svelte +25 -87
  140. package/dist/components/popover-responsive/PopoverResponsive.svelte.d.ts +2 -11
  141. package/dist/components/select/Select.d.ts +60 -23
  142. package/dist/components/select/Select.js +14 -35
  143. package/dist/components/select/Select.svelte +157 -28
  144. package/dist/components/select/Select.svelte.d.ts +2 -3
  145. package/dist/components/select/index.d.ts +1 -1
  146. package/dist/components/side-navigation/SideNavigation.svelte +73 -96
  147. package/dist/components/side-navigation/SideNavigationItem.svelte +2 -2
  148. package/dist/components/side-navigation/SideNavigationLayout.svelte +3 -5
  149. package/dist/components/side-navigation/sidenav.scss +17 -13
  150. package/dist/components/skeleton/Skeleton.svelte +48 -0
  151. package/dist/components/skeleton/Skeleton.svelte.d.ts +12 -0
  152. package/dist/components/skeleton/index.d.ts +1 -0
  153. package/dist/components/skeleton/index.js +1 -0
  154. package/dist/components/slider/Slider.d.ts +25 -15
  155. package/dist/components/slider/Slider.js +1 -7
  156. package/dist/components/slider/Slider.svelte +38 -164
  157. package/dist/components/slider/Slider.svelte.d.ts +1 -1
  158. package/dist/components/spinner/Spinner.svelte +39 -0
  159. package/dist/components/spinner/Spinner.svelte.d.ts +10 -0
  160. package/dist/components/spinner/index.d.ts +1 -0
  161. package/dist/components/spinner/index.js +1 -0
  162. package/dist/components/star-rating/StarRating.svelte +33 -49
  163. package/dist/components/switch/Switch.d.ts +19 -4
  164. package/dist/components/switch/Switch.js +4 -0
  165. package/dist/components/switch/Switch.svelte +13 -17
  166. package/dist/components/switch/Switch.svelte.d.ts +2 -2
  167. package/dist/components/table/Table.svelte +68 -0
  168. package/dist/components/table/Table.svelte.d.ts +40 -0
  169. package/dist/components/table/index.d.ts +1 -0
  170. package/dist/components/table/index.js +1 -0
  171. package/dist/components/tabs/Tabs.svelte.d.ts +45 -16
  172. package/dist/components/tabs/Tabs.svelte.js +8 -18
  173. package/dist/components/tabs/components/Tabs.svelte +27 -33
  174. package/dist/components/tabs/components/Tabs.svelte.d.ts +1 -1
  175. package/dist/components/tabs/components/TabsContent.svelte +13 -36
  176. package/dist/components/tabs/components/TabsContent.svelte.d.ts +2 -5
  177. package/dist/components/tabs/components/TabsItem.svelte +43 -32
  178. package/dist/components/tabs/components/TabsItem.svelte.d.ts +2 -5
  179. package/dist/components/tabs/components/TabsList.svelte +90 -58
  180. package/dist/components/tabs/components/TabsList.svelte.d.ts +2 -4
  181. package/dist/components/tera-ui-context/TeraUiContext.svelte +13 -26
  182. package/dist/components/text-area/TextArea.d.ts +2 -2
  183. package/dist/components/text-area/TextArea.js +9 -9
  184. package/dist/components/text-area/TextArea.svelte +41 -65
  185. package/dist/components/toast/ToastContainer.svelte +50 -0
  186. package/dist/components/toast/ToastContainer.svelte.d.ts +18 -0
  187. package/dist/components/toast/index.d.ts +3 -0
  188. package/dist/components/toast/index.js +2 -0
  189. package/dist/components/toast/toast.svelte.d.ts +22 -0
  190. package/dist/components/toast/toast.svelte.js +18 -0
  191. package/dist/components/tooltip/Tooltip.d.ts +23 -0
  192. package/dist/components/tooltip/Tooltip.js +1 -0
  193. package/dist/components/tooltip/Tooltip.svelte +30 -0
  194. package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
  195. package/dist/components/tooltip/index.d.ts +2 -0
  196. package/dist/components/tooltip/index.js +1 -0
  197. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +48 -69
  198. package/dist/index.d.ts +19 -2
  199. package/dist/index.js +12 -0
  200. package/dist/llms/accordion.md +90 -0
  201. package/dist/llms/ai.md +110 -0
  202. package/dist/llms/alert.md +29 -0
  203. package/dist/llms/avatar.md +34 -0
  204. package/dist/llms/badge.md +31 -0
  205. package/dist/llms/brand-logo.md +30 -0
  206. package/dist/llms/button.md +37 -0
  207. package/dist/llms/card.md +32 -0
  208. package/dist/llms/checkbox.md +35 -0
  209. package/dist/llms/colors.md +161 -0
  210. package/dist/llms/combobox.md +40 -0
  211. package/dist/llms/command.md +7 -0
  212. package/dist/llms/date-range-picker.md +36 -0
  213. package/dist/llms/dialog.md +45 -0
  214. package/dist/llms/drawer.md +30 -0
  215. package/dist/llms/dropdown-menu.md +112 -0
  216. package/dist/llms/fonts.md +7 -0
  217. package/dist/llms/header.md +26 -0
  218. package/dist/llms/icons.md +43 -0
  219. package/dist/llms/index.md +65 -0
  220. package/dist/llms/input.md +37 -0
  221. package/dist/llms/label.md +30 -0
  222. package/dist/llms/language-picker-button.md +30 -0
  223. package/dist/llms/light-dark-toggle.md +26 -0
  224. package/dist/llms/marketing.md +95 -0
  225. package/dist/llms/popover-responsive.md +32 -0
  226. package/dist/llms/popover.md +40 -0
  227. package/dist/llms/select.md +44 -0
  228. package/dist/llms/side-navigation.md +30 -0
  229. package/dist/llms/skeleton.md +28 -0
  230. package/dist/llms/slider.md +36 -0
  231. package/dist/llms/spinner.md +25 -0
  232. package/dist/llms/star-rating.md +31 -0
  233. package/dist/llms/switch.md +33 -0
  234. package/dist/llms/table.md +30 -0
  235. package/dist/llms/tabs.md +92 -0
  236. package/dist/llms/tera-ui-context.md +30 -0
  237. package/dist/llms/text-area.md +39 -0
  238. package/dist/llms/toast.md +7 -0
  239. package/dist/llms/tooltip.md +32 -0
  240. package/dist/llms/user-avatar-with-menu.md +28 -0
  241. package/dist/paraglide/README.md +72 -3
  242. package/dist/paraglide/messages/text_account_settings.d.ts +14 -2
  243. package/dist/paraglide/messages/text_account_settings.js +53 -58
  244. package/dist/paraglide/messages/text_calces_documentation.d.ts +14 -2
  245. package/dist/paraglide/messages/text_calces_documentation.js +53 -58
  246. package/dist/paraglide/messages/text_calces_scientific_calculator.d.ts +14 -2
  247. package/dist/paraglide/messages/text_calces_scientific_calculator.js +53 -58
  248. package/dist/paraglide/messages/text_currency_converter.d.ts +14 -2
  249. package/dist/paraglide/messages/text_currency_converter.js +53 -58
  250. package/dist/paraglide/messages/text_logout.d.ts +14 -2
  251. package/dist/paraglide/messages/text_logout.js +53 -58
  252. package/dist/paraglide/messages/text_select_language.d.ts +14 -2
  253. package/dist/paraglide/messages/text_select_language.js +53 -58
  254. package/dist/paraglide/messages/text_unit_converter.d.ts +14 -2
  255. package/dist/paraglide/messages/text_unit_converter.js +53 -58
  256. package/dist/paraglide/registry.d.ts +13 -0
  257. package/dist/paraglide/registry.js +15 -0
  258. package/dist/paraglide/runtime.d.ts +243 -126
  259. package/dist/paraglide/runtime.js +473 -148
  260. package/dist/paraglide/server.d.ts +13 -20
  261. package/dist/paraglide/server.js +92 -40
  262. package/dist/stories/ComponentOverview.stories.svelte +533 -0
  263. package/dist/stories/ComponentOverview.stories.svelte.d.ts +6 -0
  264. package/dist/themes/tera-ui-base.css +242 -77
  265. package/dist/themes/theme-ai.css +100 -0
  266. package/dist/themes/theme-marketing.css +91 -0
  267. package/dist/themes/theme-professional.css +41 -0
  268. package/package.json +35 -29
  269. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/.meta.json +0 -3
  270. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/README.md +0 -103
  271. package/dist/tera-i18n/projects/tera-system-ui/project.inlang/project_id +0 -1
  272. package/dist/themes/tw-preset.cjs +0 -160
  273. package/dist/themes/tw-preset.d.cts +0 -157
@@ -0,0 +1,4 @@
1
+ export { default as FeatureCard } from './FeatureCard.svelte';
2
+ export { default as StatBlock } from './StatBlock.svelte';
3
+ export { default as PricingCard } from './PricingCard.svelte';
4
+ export { default as TestimonialCard } from './TestimonialCard.svelte';
@@ -1,18 +1,37 @@
1
- import { type VariantProps } from "tailwind-variants";
1
+ /**
2
+ * @component Popover - Floating panel anchored to a trigger element.
3
+ * Built on BitsUI Popover primitive with portal rendering.
4
+ */
2
5
  import type { Snippet } from "svelte";
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 PopoverVariants = VariantProps<typeof styles>;
6
- export interface PopoverProps extends HTMLAttributes<HTMLDivElement>, PopoverVariants {
6
+ export interface PopoverProps {
7
7
  children?: Snippet;
8
+ /** Snippet used as the clickable trigger that opens the popover. */
9
+ trigger?: Snippet;
10
+ /** Additional CSS classes for the popover content panel. */
8
11
  class?: string;
9
- triggerRef: HTMLElement | null;
10
- offset?: number;
11
- padding?: number;
12
+ /** Whether the popover is open. Bindable. */
12
13
  open?: boolean;
13
- focusTriggerAfterClose?: boolean;
14
- flip?: boolean;
15
- autoTrigger?: boolean;
16
- ref?: HTMLDivElement | null;
14
+ /** Which side of the trigger the popover appears on. */
15
+ side?: 'top' | 'bottom' | 'left' | 'right';
16
+ /** Distance in pixels between the trigger and popover panel. */
17
+ sideOffset?: number;
18
+ /** Alignment of the popover relative to the trigger. */
19
+ align?: 'start' | 'center' | 'end';
20
+ /** Additional offset in pixels along the alignment axis. */
21
+ alignOffset?: number;
22
+ /** Whether clicking outside the popover closes it. */
23
+ closeOnClickOutside?: boolean;
24
+ /** Whether pressing Escape closes the popover. Defaults to true. */
25
+ closeOnEscape?: boolean;
26
+ /** Whether focus is trapped inside the popover content while open. */
27
+ trapFocus?: boolean;
28
+ /** Prevent the page from scrolling while the popover is open. */
29
+ preventScroll?: boolean;
30
+ /** Called when the user interacts outside the popover boundaries. */
31
+ onInteractOutside?: () => void;
32
+ /** ARIA role for the popover content element. */
33
+ role?: string;
34
+ /** Bindable reference to the popover content element. */
35
+ ref?: HTMLElement | null;
36
+ [key: string]: unknown;
17
37
  }
18
- export {};
@@ -1,7 +1 @@
1
- import { tv } from "tailwind-variants";
2
- export const styles = tv({
3
- base: '',
4
- variants: {},
5
- compoundVariants: [],
6
- defaultVariants: {},
7
- });
1
+ export {};
@@ -1,158 +1,40 @@
1
- <script lang="ts">
2
- import {type PopoverProps} from "./Popover";
3
- import {arrow, autoUpdate, computePosition, flip, offset, shift, size} from "@floating-ui/dom";
4
- import {cn} from "../../utils/utils";
5
-
6
- import {clickOutside} from "../../actions/clickOutside"
7
- import {onDestroy, onMount} from "svelte";
8
- import {circInOut} from "svelte/easing";
9
-
10
- let {
11
- children,
12
- triggerRef,
13
- class: className,
14
- open = $bindable(),
15
- offset: offsetAmount = 3,
16
- padding: paddingAmount = 12,
17
- focusTriggerAfterClose = true,
18
- flip: enableFlip = false,
19
- autoTrigger = true,
20
- ...props
21
- }: PopoverProps = $props();
22
-
23
- let hasOpenedYet = $state(false)
24
-
25
- function togglePopover() {
26
- open = !open;
27
- }
28
-
29
-
30
- function handleClickOutside(e) {
31
- open = false
32
- }
33
-
34
- let popover = $state();
35
- let arrowElement = $state();
36
-
37
-
38
- function updatePosition() {
39
- computePosition(triggerRef, popover, {
40
- placement: 'bottom',
41
- middleware: [
42
- offset(offsetAmount),
43
- size({
44
- apply({rects, elements}) {
45
- Object.assign(elements.floating.style, {
46
- minWidth: `${rects.reference.width}px`,
47
- maxWidth: `${window.innerWidth - 16}px`,
48
- });
49
- },
50
- }),
51
- enableFlip ? flip() : undefined,
52
- shift({padding: paddingAmount}),
53
- arrow({element: arrowElement}),
54
- ],
55
- }).then(({x, y, placement, middlewareData}) => {
56
- Object.assign(popover.style, {
57
- left: `${x}px`,
58
- top: `${y}px`,
59
- });
60
- //
61
- // // Accessing the data
62
- // const {x: arrowX, y: arrowY} = middlewareData.arrow;
63
- //
64
- // const staticSide = {
65
- // top: 'bottom',
66
- // right: 'left',
67
- // bottom: 'top',
68
- // left: 'right',
69
- // }[placement.split('-')[0]];
70
- //
71
- // Object.assign(arrowElement.style, {
72
- // left: arrowX != null ? `${arrowX}px` : '',
73
- // top: arrowY != null ? `${arrowY}px` : '',
74
- // right: '',
75
- // bottom: '',
76
- // [staticSide]: '-4px',
77
- // });
78
- });
79
- }
80
-
81
- onMount(() => {
82
- if (autoTrigger)
83
- triggerRef?.addEventListener("click", togglePopover);
84
-
85
- })
86
-
87
- onDestroy(() => {
88
- if (autoTrigger)
89
- triggerRef?.removeEventListener("click", togglePopover);
90
-
91
- })
92
-
93
- $effect(() => {
94
- let cleanup: any
95
-
96
- if (open) {
97
- hasOpenedYet = true
98
- updatePosition()
99
-
100
- // Start auto updates.
101
- cleanup = autoUpdate(
102
- triggerRef,
103
- popover,
104
- updatePosition,
105
- );
106
- } else {
107
- cleanup?.()
108
- if (focusTriggerAfterClose && hasOpenedYet) {
109
- try {
110
- triggerRef.focus()
111
- } catch (e) {
112
- console.warn('Trigger element focus after close Popover error', e)
113
- }
114
- }
115
- }
116
-
117
- return () => {
118
- cleanup?.()
119
- }
120
- })
121
-
122
-
123
- function spin(node, {duration}) {
124
- return {
125
- duration,
126
- css: (t) => {
127
- const eased = circInOut(t);
128
- return `
129
- transform-origin: 0% 0%;
130
- transform: translateY(${eased * 10 - 10}px) scaleY(${eased * 0.05 + 0.95});
131
- opacity: ${eased};
132
- `
133
-
134
- }
135
- };
136
- }
137
-
138
-
139
- </script>
140
-
141
- <!-- Popover Content -->
142
- {#if open}
143
- <div bind:this={popover}
144
- data-open={open}
145
- class={cn("overflow-hidden absolute z-10 bg-neutral-token-1 shadow-2xl rounded-container border border-neutral-token-5", className)}
146
- use:clickOutside={{exceptElement: triggerRef}}
147
- onclick_outside={handleClickOutside}
148
-
149
- in:spin={{ duration: 200 }}
150
- out:spin={{ duration: 200 }}
151
- {...props}
152
- >
153
- <!-- <div bind:this={arrowElement} class="size-2 absolute rotate-45 bg-inherit"></div>-->
154
- {@render children?.()}
155
- </div>
156
- {/if}
157
-
158
-
1
+ <script lang="ts">import { Popover as PopoverPrimitive } from 'bits-ui';
2
+ import { cn } from '../../utils/utils.js';
3
+ let { children, trigger, class: className, open = $bindable(false), side = 'bottom', sideOffset = 4, align = 'start', alignOffset, closeOnClickOutside = true, closeOnEscape = true, trapFocus, preventScroll, onInteractOutside, ref = $bindable(null), ...props } = $props();
4
+ </script>
5
+
6
+ <PopoverPrimitive.Root bind:open>
7
+ {#if trigger}
8
+ <PopoverPrimitive.Trigger>
9
+ {#snippet child({ props: triggerProps })}
10
+ <span {...triggerProps} class="inline-flex">
11
+ {@render trigger()}
12
+ </span>
13
+ {/snippet}
14
+ </PopoverPrimitive.Trigger>
15
+ {/if}
16
+
17
+ <PopoverPrimitive.Portal>
18
+ <PopoverPrimitive.Content
19
+ bind:ref
20
+ {side}
21
+ {sideOffset}
22
+ {align}
23
+ {alignOffset}
24
+ {trapFocus}
25
+ {preventScroll}
26
+ interactOutsideBehavior={closeOnClickOutside ? 'close' : 'ignore'}
27
+ escapeKeydownBehavior={closeOnEscape ? 'close' : 'ignore'}
28
+ onInteractOutside={() => onInteractOutside?.()}
29
+ class={cn(
30
+ 'z-50 overflow-hidden bg-surface rounded-container border border-border-default shadow-lg',
31
+ 'animate-in fade-in zoom-in-95 duration-150',
32
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95',
33
+ className
34
+ )}
35
+ {...props}
36
+ >
37
+ {@render children?.()}
38
+ </PopoverPrimitive.Content>
39
+ </PopoverPrimitive.Portal>
40
+ </PopoverPrimitive.Root>
@@ -1,4 +1,4 @@
1
- import { type PopoverProps } from "./Popover";
2
- declare const Popover: import("svelte").Component<PopoverProps, {}, "open">;
1
+ import type { PopoverProps } from './Popover.js';
2
+ declare const Popover: import("svelte").Component<PopoverProps, {}, "ref" | "open">;
3
3
  type Popover = ReturnType<typeof Popover>;
4
4
  export default Popover;
@@ -1,11 +1,22 @@
1
- import { type VariantProps } from "tailwind-variants";
1
+ /**
2
+ * @component PopoverResponsive - Shows a Popover on desktop and a Dialog on mobile.
3
+ * Automatically switches at the 640 px breakpoint.
4
+ */
2
5
  import type { Snippet } from "svelte";
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 PopoverResponsiveVariants = VariantProps<typeof styles>;
6
- export interface PopoverResponsiveProps extends HTMLAttributes<HTMLDivElement>, PopoverResponsiveVariants {
6
+ export interface PopoverResponsiveProps {
7
+ /** Content rendered inside the popover/dialog panel. */
7
8
  children?: Snippet;
9
+ /** Snippet used as the clickable trigger. */
10
+ trigger?: Snippet;
11
+ /** Additional CSS classes for the content panel. */
8
12
  class?: string;
9
- ref?: HTMLDivElement | null;
13
+ /** Whether the panel is open. Bindable. */
14
+ open?: boolean;
15
+ /** Which side of the trigger the desktop popover appears on. */
16
+ side?: 'top' | 'bottom' | 'left' | 'right';
17
+ /** Distance in pixels between the trigger and popover (desktop only). */
18
+ sideOffset?: number;
19
+ /** Alignment of the popover relative to the trigger (desktop only). */
20
+ align?: 'start' | 'center' | 'end';
21
+ [key: string]: unknown;
10
22
  }
11
- export {};
@@ -1,7 +1 @@
1
- import { tv } from "tailwind-variants";
2
- export const styles = tv({
3
- base: '',
4
- variants: {},
5
- compoundVariants: [],
6
- defaultVariants: {},
7
- });
1
+ export {};
@@ -1,87 +1,25 @@
1
- <script lang="ts">
2
- import {type PopoverResponsiveProps} from "./PopoverResponsive";
3
- import {Dialog} from "../dialog";
4
- import {Popover} from "../popover";
5
- import {onMount} from "svelte";
6
- import {getScreenWidth, SCREEN_BREAK_POINTS} from "../side-navigation/SideNavigation";
7
-
8
- let {
9
- children,
10
- triggerRef,
11
- class: className,
12
- open = $bindable(),
13
- offset = 3,
14
- popoverPadding = 12,
15
- focusTriggerAfterClose = true,
16
- flip = false,
17
- ...props
18
- }: PopoverResponsiveProps & {
19
- dialogPadding?: string,
20
- popoverPadding?: number,
21
- offset?: number,
22
- open?: boolean,
23
- focusTriggerAfterClose?: boolean,
24
- flip?: boolean,
25
- triggerRef?: HTMLElement,
26
- } = $props();
27
-
28
- let openPopover = $state(false)
29
- let openDialog = $state(false)
30
-
31
- $effect(() => {
32
- open = openPopover || openDialog
33
- })
34
-
35
- $effect(() => {
36
- toggleOpen(open)
37
- })
38
-
39
- function toggleOpen(open?: boolean) {
40
- if (getScreenWidth() >= SCREEN_BREAK_POINTS.sm) {
41
- if (open === undefined) {
42
- openPopover = !(openDialog || openPopover)
43
- } else {
44
- openPopover = open
45
- }
46
- openDialog = false
47
- } else {
48
- if (open === undefined) {
49
- openDialog = !(openDialog || openPopover)
50
- } else {
51
- openDialog = open
52
- }
53
- openPopover = false
54
- }
55
- }
56
-
57
- onMount(() => {
58
- triggerRef?.addEventListener('click', (e) => {
59
- e.stopPropagation()
60
- toggleOpen()
61
- })
62
- })
63
- </script>
64
-
65
-
66
- <Popover bind:open={openPopover}
67
- triggerRef={triggerRef}
68
- autoTrigger={false}
69
- padding={popoverPadding}
70
- focusTriggerAfterClose={focusTriggerAfterClose}
71
- offset={offset}
72
- flip={flip}
73
- class={className}
74
- {...props}
75
- >
76
- {@render children?.()}
77
- </Popover>
78
-
79
- <Dialog bind:open={openDialog}
80
- position="top"
81
- padding="none"
82
- class={className}
83
- triggerRef={triggerRef}
84
- focusTriggerAfterClose={focusTriggerAfterClose}
85
- >
86
- {@render children?.()}
87
- </Dialog>
1
+ <script lang="ts">import { innerWidth } from 'svelte/reactivity/window';
2
+ import { Dialog } from '../dialog/index.js';
3
+ import { Popover } from '../popover/index.js';
4
+ let { children, trigger, class: className, open = $bindable(false), side = 'bottom', sideOffset = 4, align = 'start', ...props } = $props();
5
+ const isDesktop = $derived((innerWidth.current ?? 640) >= 640);
6
+ </script>
7
+
8
+ {#if isDesktop}
9
+ <!-- Desktop: bind open directly so both internal and external close work -->
10
+ <Popover bind:open {side} {sideOffset} {align} {trigger} class={className} {...props}>
11
+ {@render children?.()}
12
+ </Popover>
13
+ {:else}
14
+ <!-- Mobile: bind open directly to Dialog, toggle via wrapper button -->
15
+ <button
16
+ type="button"
17
+ class="inline-flex appearance-none bg-transparent p-0 border-0 cursor-pointer"
18
+ onclick={() => open = !open}
19
+ >
20
+ {@render trigger?.()}
21
+ </button>
22
+ <Dialog bind:open position="top" padding="none" class={className}>
23
+ {@render children?.()}
24
+ </Dialog>
25
+ {/if}
@@ -1,13 +1,4 @@
1
- import { type PopoverResponsiveProps } from "./PopoverResponsive";
2
- type $$ComponentProps = PopoverResponsiveProps & {
3
- dialogPadding?: string;
4
- popoverPadding?: number;
5
- offset?: number;
6
- open?: boolean;
7
- focusTriggerAfterClose?: boolean;
8
- flip?: boolean;
9
- triggerRef?: HTMLElement;
10
- };
11
- declare const PopoverResponsive: import("svelte").Component<$$ComponentProps, {}, "open">;
1
+ import type { PopoverResponsiveProps } from './PopoverResponsive.js';
2
+ declare const PopoverResponsive: import("svelte").Component<PopoverResponsiveProps, {}, "open">;
12
3
  type PopoverResponsive = ReturnType<typeof PopoverResponsive>;
13
4
  export default PopoverResponsive;
@@ -1,40 +1,54 @@
1
- import { type VariantProps } from "tailwind-variants";
2
- import type { Snippet } from "svelte";
3
- import type { HTMLSelectAttributes } from "svelte/elements";
4
- export declare const styles: import("tailwind-variants").TVReturnType<{
1
+ /**
2
+ * @component Select - Dropdown select with flat or grouped options, keyboard navigation, and style variants.
3
+ * Built on BitsUI Select primitive.
4
+ */
5
+ import type { VariantProps } from "tailwind-variants";
6
+ export interface SelectOption {
7
+ /** Unique value submitted or passed to onchange. */
8
+ value: string;
9
+ /** Human-readable label shown in the list and trigger. */
10
+ label: string;
11
+ /** Prevents selecting this option. */
12
+ disabled?: boolean;
13
+ }
14
+ export interface SelectGroup {
15
+ /** Heading label displayed above the group's options. */
16
+ label: string;
17
+ /** Options belonging to this group. */
18
+ options: SelectOption[];
19
+ }
20
+ export declare const triggerStyles: import("tailwind-variants").TVReturnType<{
5
21
  variant: {
6
22
  outlined: string;
7
23
  filled: string;
8
24
  borderless: string;
9
25
  };
10
- disabled: {
11
- true: string;
12
- false: string;
13
- };
14
26
  size: {
15
27
  sm: string;
16
28
  md: string;
17
29
  lg: string;
18
30
  };
31
+ disabled: {
32
+ true: string;
33
+ };
19
34
  status: {
20
35
  error: string;
21
36
  warning: string;
22
37
  };
23
- }, undefined, "w-full inline-flex items-center justify-center rounded-md outline-none font-normal text-neutral-token-13 appearance-none bg-[url('data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27currentColor%27 stroke-width=%272%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cpolyline points=%276 9 12 15 18 9%27/%3E%3C/svg%3E)] bg-[length:16px] bg-[right_0.75rem_center] bg-no-repeat", {
38
+ }, undefined, "w-full inline-flex items-center justify-between gap-2 rounded-md outline-none font-normal text-left transition-[border-color,box-shadow,background-color] ease-ui duration-150", {
24
39
  variant: {
25
40
  outlined: string;
26
41
  filled: string;
27
42
  borderless: string;
28
43
  };
29
- disabled: {
30
- true: string;
31
- false: string;
32
- };
33
44
  size: {
34
45
  sm: string;
35
46
  md: string;
36
47
  lg: string;
37
48
  };
49
+ disabled: {
50
+ true: string;
51
+ };
38
52
  status: {
39
53
  error: string;
40
54
  warning: string;
@@ -45,25 +59,48 @@ export declare const styles: import("tailwind-variants").TVReturnType<{
45
59
  filled: string;
46
60
  borderless: string;
47
61
  };
48
- disabled: {
49
- true: string;
50
- false: string;
51
- };
52
62
  size: {
53
63
  sm: string;
54
64
  md: string;
55
65
  lg: string;
56
66
  };
67
+ disabled: {
68
+ true: string;
69
+ };
57
70
  status: {
58
71
  error: string;
59
72
  warning: string;
60
73
  };
61
- }, undefined, "w-full inline-flex items-center justify-center rounded-md outline-none font-normal text-neutral-token-13 appearance-none bg-[url('data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27currentColor%27 stroke-width=%272%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cpolyline points=%276 9 12 15 18 9%27/%3E%3C/svg%3E)] bg-[length:16px] bg-[right_0.75rem_center] bg-no-repeat", unknown, unknown, undefined>>;
62
- type SelectVariants = VariantProps<typeof styles>;
63
- export interface SelectProps extends Omit<HTMLSelectAttributes, 'disabled' | 'size' | 'value'>, SelectVariants {
64
- children?: Snippet;
74
+ }, undefined, "w-full inline-flex items-center justify-between gap-2 rounded-md outline-none font-normal text-left transition-[border-color,box-shadow,background-color] ease-ui duration-150", unknown, unknown, undefined>>;
75
+ type TriggerVariants = VariantProps<typeof triggerStyles>;
76
+ export interface SelectProps extends TriggerVariants {
77
+ /** Selection mode. Use 'multiple' to allow picking several options. */
78
+ type?: 'single' | 'multiple';
79
+ /** Flat list of options. Use `groups` instead for grouped options. */
80
+ options?: SelectOption[];
81
+ /** Grouped options — renders labeled sections. Takes precedence over `options`. */
82
+ groups?: SelectGroup[];
83
+ /**
84
+ * Currently selected value(s). Bindable.
85
+ * A string for type='single', a string[] for type='multiple'.
86
+ */
87
+ value?: string | string[];
88
+ /** Text shown in the trigger when nothing is selected. */
89
+ placeholder?: string;
90
+ /** Prevents all interaction. */
91
+ disabled?: boolean;
92
+ /** Whether keyboard navigation wraps from the last item to the first. */
93
+ loop?: boolean;
94
+ /** Allow deselecting the current value by clicking it again (single mode only). */
95
+ allowDeselect?: boolean;
96
+ /** Whether the select is required for form submission. */
97
+ required?: boolean;
98
+ /** Name attribute used when submitting within a form. */
99
+ name?: string;
100
+ /** Additional CSS classes for the trigger button. */
65
101
  class?: string;
66
- value?: string;
67
- ref?: HTMLSelectElement | null;
102
+ /** Called when the selected value changes. */
103
+ onchange?: (value: string | string[]) => void;
104
+ [key: string]: unknown;
68
105
  }
69
106
  export {};
@@ -1,45 +1,24 @@
1
1
  import { tv } from "tailwind-variants";
2
- export const styles = tv({
3
- base: 'w-full inline-flex items-center justify-center rounded-md outline-none font-normal text-neutral-token-13 appearance-none bg-[url(\'data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27currentColor%27 stroke-width=%272%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3E%3Cpolyline points=%276 9 12 15 18 9%27/%3E%3C/svg%3E)] bg-[length:16px] bg-[right_0.75rem_center] bg-no-repeat',
2
+ export const triggerStyles = tv({
3
+ base: 'w-full inline-flex items-center justify-between gap-2 rounded-md outline-none font-normal text-left transition-[border-color,box-shadow,background-color] ease-ui duration-150',
4
4
  variants: {
5
5
  variant: {
6
- outlined: 'border border-neutral-token-5 bg-neutral-token-1 hover:border-primary-500 focus:border-primary-600 focus:shadow-[0_0_0_2px_rgba(59,130,246,0.1)] transition-all duration-200',
7
- filled: 'bg-neutral-token-3 border border-transparent hover:bg-neutral-token-4 focus:bg-neutral-token-1 focus:border-primary-600 focus:shadow-[0_0_0_2px_rgba(59,130,246,0.1)] transition-all duration-200',
8
- borderless: 'bg-transparent border-0 hover:bg-neutral-token-2 focus:bg-neutral-token-2 transition-all duration-200',
9
- },
10
- disabled: {
11
- true: 'cursor-not-allowed bg-neutral-token-3 text-neutral-token-7 border-neutral-token-5',
12
- false: 'cursor-pointer',
6
+ outlined: 'border border-border-default bg-surface-control hover:border-interactive data-[state=open]:border-interactive-hover data-[state=open]:shadow-focus',
7
+ filled: 'bg-surface-sunken border border-transparent hover:bg-surface-hover data-[state=open]:bg-surface data-[state=open]:border-interactive-hover data-[state=open]:shadow-focus',
8
+ borderless: 'bg-transparent border-0 hover:bg-surface-raised',
13
9
  },
14
10
  size: {
15
- sm: 'h-6 px-3 pr-8 text-sm',
16
- md: 'h-8 px-3 pr-8 text-sm',
17
- lg: 'h-10 px-3 pr-10 text-base',
18
- },
19
- status: {
20
- error: 'border-error-500 hover:border-error-400 focus:border-error-500 focus:shadow-[0_0_0_2px_rgba(239,68,68,0.1)]',
21
- warning: 'border-warning-500 hover:border-warning-400 focus:border-warning-500 focus:shadow-[0_0_0_2px_rgba(249,115,22,0.1)]',
11
+ sm: 'h-6 px-3 text-sm',
12
+ md: 'h-9 px-3 text-sm',
13
+ lg: 'h-10 px-3 text-base',
22
14
  },
23
- },
24
- compoundVariants: [
25
- {
26
- variant: 'outlined',
27
- disabled: true,
28
- class: 'hover:border-neutral-token-5'
15
+ disabled: {
16
+ true: 'cursor-not-allowed bg-surface-sunken text-text-disabled border-border-default pointer-events-none',
29
17
  },
30
- {
31
- variant: 'filled',
32
- disabled: true,
33
- class: 'hover:bg-neutral-token-3'
18
+ status: {
19
+ error: 'border-error-default hover:border-error-hover data-[state=open]:border-error-default data-[state=open]:shadow-focus-error',
20
+ warning: 'border-warning-default hover:border-warning-hover data-[state=open]:border-warning-default data-[state=open]:shadow-focus-warning',
34
21
  },
35
- {
36
- variant: 'borderless',
37
- disabled: true,
38
- class: 'hover:bg-transparent'
39
- }
40
- ],
41
- defaultVariants: {
42
- variant: 'outlined',
43
- size: 'md'
44
22
  },
23
+ defaultVariants: { variant: 'outlined', size: 'md' },
45
24
  });