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
@@ -1,131 +1,53 @@
1
- import { type VariantProps } from "tailwind-variants";
1
+ /**
2
+ * @component Dialog - Modal dialog with header/footer snippet slots, size variants, and focus management.
3
+ * Built on BitsUI Dialog primitive.
4
+ */
2
5
  import type { Snippet } from "svelte";
3
- import type { HTMLDialogAttributes } from "svelte/elements";
4
- export declare const styles: import("tailwind-variants").TVReturnType<{
5
- size: {
6
- xs: {
7
- dialog: string;
8
- };
9
- sm: {
10
- dialog: string;
11
- };
12
- md: {
13
- dialog: string;
14
- };
15
- lg: {
16
- dialog: string;
17
- };
18
- full: {
19
- dialog: string;
20
- };
21
- auto: {
22
- dialog: string;
23
- };
24
- };
25
- padding: {
26
- none: {
27
- dialogContainer: string;
28
- body: string;
29
- };
30
- };
31
- }, {
32
- base: string;
33
- dialog: string;
34
- dialogContainer: string;
35
- header: string;
36
- body: string;
37
- footer: string;
38
- }, undefined, {
39
- size: {
40
- xs: {
41
- dialog: string;
42
- };
43
- sm: {
44
- dialog: string;
45
- };
46
- md: {
47
- dialog: string;
48
- };
49
- lg: {
50
- dialog: string;
51
- };
52
- full: {
53
- dialog: string;
54
- };
55
- auto: {
56
- dialog: string;
57
- };
58
- };
59
- padding: {
60
- none: {
61
- dialogContainer: string;
62
- body: string;
63
- };
64
- };
65
- }, {
66
- base: string;
67
- dialog: string;
68
- dialogContainer: string;
69
- header: string;
70
- body: string;
71
- footer: string;
72
- }, import("tailwind-variants").TVReturnType<{
73
- size: {
74
- xs: {
75
- dialog: string;
76
- };
77
- sm: {
78
- dialog: string;
79
- };
80
- md: {
81
- dialog: string;
82
- };
83
- lg: {
84
- dialog: string;
85
- };
86
- full: {
87
- dialog: string;
88
- };
89
- auto: {
90
- dialog: string;
91
- };
92
- };
93
- padding: {
94
- none: {
95
- dialogContainer: string;
96
- body: string;
97
- };
98
- };
99
- }, {
100
- base: string;
101
- dialog: string;
102
- dialogContainer: string;
103
- header: string;
104
- body: string;
105
- footer: string;
106
- }, undefined, unknown, unknown, undefined>>;
107
- type DialogVariants = VariantProps<typeof styles>;
108
- type DialogPropsCommon = {
6
+ export type DialogProps = {
7
+ children?: Snippet;
8
+ /** Snippet rendered in the dialog header area. */
9
+ header?: Snippet;
10
+ /** Snippet rendered in the dialog footer area. */
11
+ footer?: Snippet;
12
+ /** Whether the dialog is open. Bindable. */
13
+ open?: boolean;
14
+ /** Additional CSS classes for the dialog content panel. */
109
15
  class?: string;
110
- id?: string;
16
+ /** Controls the maximum width of the dialog panel. */
17
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'full' | 'auto';
18
+ /** Vertical alignment of the dialog on screen. */
19
+ position?: 'top' | 'center';
20
+ /** Set to 'none' to remove internal padding. */
21
+ padding?: 'none' | undefined;
22
+ /** Whether clicking the backdrop closes the dialog. */
111
23
  closeOnClickOutside?: boolean;
24
+ /** Whether to render a close (×) button in the header. */
112
25
  closeButton?: boolean;
113
- position?: 'top' | 'center';
26
+ /**
27
+ * When true the dialog DOM is kept alive after close — children preserve
28
+ * internal state between open/close cycles.
29
+ */
30
+ staticRender?: boolean;
31
+ /** Prevent the page from scrolling while the dialog is open. */
32
+ preventScroll?: boolean;
33
+ /** Called after the open or close animation has fully completed.
34
+ * Note: This callback only fires when the internal component mutates the open state, not when the state is changed by outside)
35
+ */
36
+ onOpenChangeComplete?: (open: boolean) => void;
37
+ /** Element to return focus to when the dialog closes. */
38
+ triggerRef?: HTMLElement | null;
39
+ /** Focus triggerRef after close (default true when triggerRef is provided). */
114
40
  focusTriggerAfterClose?: boolean;
115
- padding?: 'none' | undefined;
41
+ /** Additional classes applied to the outer container div. */
116
42
  containerClass?: string;
43
+ /** Additional classes applied to the header region. */
117
44
  headerClass?: string;
45
+ /** Additional classes applied to the body/content region. */
118
46
  bodyClass?: string;
47
+ /** Additional classes applied to the footer region. */
119
48
  footerClass?: string;
49
+ /** Bindable reference to the dialog content element. */
50
+ ref?: HTMLElement | null;
51
+ [key: string]: unknown;
120
52
  };
121
- export type DialogProps = Omit<HTMLDialogAttributes, 'open'> & DialogVariants & DialogPropsCommon & {
122
- children?: Snippet;
123
- header?: Snippet;
124
- footer?: Snippet;
125
- open?: boolean;
126
- staticRender?: boolean;
127
- triggerRef?: HTMLElement | null;
128
- ref?: HTMLDialogElement | null;
129
- };
130
- export type DialogPropsAstro = DialogVariants & DialogPropsCommon & {};
131
- export {};
53
+ export type DialogPropsAstro = Omit<DialogProps, 'children' | 'open' | 'ref'>;
@@ -1,39 +1 @@
1
- import { tv } from "tailwind-variants";
2
- export const styles = tv({
3
- slots: {
4
- base: '',
5
- dialog: 'bg-transparent text-inherit',
6
- dialogContainer: 'py-4 rounded-container',
7
- header: 'font-bold px-4 mb-2',
8
- body: 'px-4',
9
- footer: 'mt-3 px-4 flex items-center justify-end gap-2.5'
10
- },
11
- variants: {
12
- size: {
13
- xs: {
14
- dialog: ''
15
- },
16
- sm: {
17
- dialog: ''
18
- },
19
- md: {
20
- dialog: ''
21
- },
22
- lg: {
23
- dialog: ''
24
- },
25
- full: {
26
- dialog: ''
27
- },
28
- auto: {
29
- dialog: ''
30
- }
31
- },
32
- padding: {
33
- none: {
34
- dialogContainer: 'py-0',
35
- body: 'px-0',
36
- }
37
- }
38
- }
39
- });
1
+ export {};
@@ -1,113 +1,103 @@
1
- <script lang="ts">
2
- import {type DialogProps, styles} from "./Dialog";
3
- import IconX from "../icons/IconX.svelte";
4
- import {Button} from "../button";
5
- import './dialog.scss'
6
- import {sleep} from "../../internal/helpers/sleep";
7
- import {cn} from "../../utils";
8
-
9
- let {
10
- children, open = $bindable(),
11
- ref = $bindable(),
12
- closeOnClickOutside = true,
13
- closeButton = true,
14
- size = 'sm',
15
- header,
16
- footer,
17
- class: className,
18
- position = 'center',
19
- padding,
20
- staticRender = false,
21
- triggerRef,
22
- focusTriggerAfterClose,
23
- containerClass,
24
- headerClass,
25
- bodyClass,
26
- footerClass,
27
- ...props
28
- }: DialogProps = $props();
29
-
30
- let hasOpened = $state(false);
31
-
32
- // Watch for prop changes to open/close the dialog
33
- $effect(() => {
34
- if (open) {
35
- stillAnimating = open
36
- ref?.showModal();
37
-
38
- if (!hasOpened)
39
- hasOpened = true
40
- } else {
41
- ref?.close()
42
- sleep(200).then(() => {
43
- stillAnimating = open
44
- })
45
-
46
- if (focusTriggerAfterClose && hasOpened && triggerRef) {
47
- triggerRef.focus()
48
- }
49
- }
50
- })
51
-
52
- // Close dialog on clicking outside (optional)
53
- function handleClickOutside(e) {
54
- if (closeOnClickOutside && e.target === ref) {
55
- ref?.close();
56
- }
57
- }
58
-
59
- // Emit close event when dialog is closed
60
- function handleClose() {
61
- open = false;
62
- }
63
-
64
- // onmousedown={closeOnClickOutside ? 'event.target==this && this.close()' : ''}
65
-
66
- const {base, dialog: dialogStyle, dialogContainer, header: headerStyle, body, footer: footerStyle} = styles({
67
- size,
68
- padding
69
- })
70
-
71
- let stillAnimating = $state()
72
-
73
- </script>
74
-
75
- {#if staticRender || (!staticRender && (open || stillAnimating))}
76
- <dialog class={dialogStyle() + ` ${className}`}
77
- data-position={position}
78
- bind:this={ref}
79
- onclose={handleClose}
80
- onmousedown={handleClickOutside}
81
- size={size}
82
-
83
- {...props}
84
- >
85
- <button class=""></button>
86
- {#if (closeButton)}
87
- <form method="dialog">
88
- <Button class="!absolute right-1 top-1 [&>svg]:opacity-45 [&>svg]:hover:opacity-90 z-10" icon
89
- variant="ghost"
90
- size="md">
91
- <IconX/>
92
- </Button>
93
- </form>
94
- {/if}
95
-
96
- <div class={"dialog-box " + dialogContainer({className: containerClass})}>
97
- {#if header}
98
- <header class={cn(headerStyle(), headerClass)}>
99
- {@render header?.()}
100
- </header>
101
- {/if}
102
-
103
- <main class={cn(body(), bodyClass)}>
104
- {@render children?.()}
105
- </main>
106
- {#if footer}
107
- <footer class={cn(footerStyle(), footerClass)}>
108
- {@render footer?.()}
109
- </footer>
110
- {/if}
111
- </div>
112
- </dialog>
113
- {/if}
1
+ <script lang="ts">import { Dialog as DialogPrimitive } from 'bits-ui';
2
+ import IconX from '../icons/IconX.svelte';
3
+ import { cn } from '../../utils/index.js';
4
+ let { children, open = $bindable(false), ref = $bindable(null), closeOnClickOutside = true, closeButton = true, size = 'sm', header, footer, class: className, position = 'center', padding, staticRender = false, preventScroll, onOpenChangeComplete, triggerRef, focusTriggerAfterClose = true, containerClass, headerClass, bodyClass, footerClass, ...props } = $props();
5
+ const sizeClass = {
6
+ xs: 'max-w-[24rem]',
7
+ sm: 'max-w-[30rem]',
8
+ md: 'max-w-[40rem]',
9
+ lg: 'max-w-[50rem]',
10
+ full: 'max-w-full w-screen rounded-none',
11
+ auto: 'w-fit',
12
+ };
13
+ const isFull = $derived(size === 'full');
14
+ const paddingClass = $derived(padding === 'none'
15
+ ? { container: 'py-0', body: 'px-0' }
16
+ : { container: 'py-4', body: 'px-4' });
17
+ function handleCloseAutoFocus(e) {
18
+ if (triggerRef && focusTriggerAfterClose) {
19
+ e.preventDefault();
20
+ triggerRef.focus();
21
+ }
22
+ }
23
+ </script>
24
+
25
+ <DialogPrimitive.Root bind:open onOpenChangeComplete={onOpenChangeComplete}>
26
+ <DialogPrimitive.Portal>
27
+ <!-- Backdrop -->
28
+ <DialogPrimitive.Overlay
29
+ class="fixed inset-0 z-50 bg-overlay backdrop-blur-[4px]
30
+ animate-in fade-in duration-200
31
+ data-[state=closed]:animate-out data-[state=closed]:fade-out
32
+ data-[state=closed]:hidden"
33
+ />
34
+
35
+ <!--
36
+ We use the `child` snippet (bits-ui "asChild" pattern) so that bits-ui gates its
37
+ internal <ScrollLock> on `open.current`. Without this, the `children` branch renders
38
+ <ScrollLock> unconditionally — with forceMount the lock never releases, leaving
39
+ `document.body { pointer-events:none; overflow:hidden }` active even when closed.
40
+ -->
41
+ <DialogPrimitive.Content
42
+ bind:ref
43
+ forceMount={staticRender || undefined}
44
+ interactOutsideBehavior={closeOnClickOutside ? 'close' : 'ignore'}
45
+ preventScroll={preventScroll}
46
+ onCloseAutoFocus={handleCloseAutoFocus}
47
+ {...props}
48
+ >
49
+ {#snippet child({ props: contentProps })}
50
+ <div
51
+ {...contentProps}
52
+ inert={staticRender && !open ? true : undefined}
53
+ class={cn(
54
+ contentProps.class,
55
+ 'fixed z-50 w-full bg-surface shadow-lg border-border-default',
56
+ 'flex flex-col overflow-hidden',
57
+ isFull
58
+ ? 'inset-0 h-screen border-0'
59
+ : [
60
+ 'rounded-container',
61
+ 'max-h-[min(calc(100svh-2rem),55rem)]',
62
+ position === 'top'
63
+ ? 'top-4 left-1/2 -translate-x-1/2'
64
+ : 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',
65
+ ].join(' '),
66
+ sizeClass[size ?? 'sm'],
67
+ 'animate-in fade-in zoom-in-95 duration-[250ms] ease-spring',
68
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out data-[state=closed]:zoom-out-95 data-[state=closed]:duration-200',
69
+ staticRender && 'data-[state=closed]:hidden',
70
+ className
71
+ )}
72
+ >
73
+ {#if closeButton}
74
+ <DialogPrimitive.Close
75
+ class="absolute right-2 top-2 z-10 size-8 flex items-center justify-center rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors"
76
+ aria-label="Close"
77
+ >
78
+ <IconX class="size-4"/>
79
+ </DialogPrimitive.Close>
80
+ {/if}
81
+
82
+ <div class={cn(paddingClass.container, 'grid grid-rows-[auto_1fr_auto] h-full overflow-hidden', containerClass)}>
83
+ {#if header}
84
+ <header class={cn('font-bold px-4 mb-2', headerClass)}>
85
+ {@render header()}
86
+ </header>
87
+ {/if}
88
+
89
+ <main class={cn('overflow-auto', paddingClass.body, bodyClass)}>
90
+ {@render children?.()}
91
+ </main>
92
+
93
+ {#if footer}
94
+ <footer class={cn('mt-3 px-4 flex items-center justify-end gap-2.5', footerClass)}>
95
+ {@render footer()}
96
+ </footer>
97
+ {/if}
98
+ </div>
99
+ </div>
100
+ {/snippet}
101
+ </DialogPrimitive.Content>
102
+ </DialogPrimitive.Portal>
103
+ </DialogPrimitive.Root>
@@ -1,5 +1,4 @@
1
- import { type DialogProps } from "./Dialog";
2
- import './dialog.scss';
1
+ import type { DialogProps } from './Dialog.js';
3
2
  declare const Dialog: import("svelte").Component<DialogProps, {}, "ref" | "open">;
4
3
  type Dialog = ReturnType<typeof Dialog>;
5
4
  export default Dialog;
@@ -8,7 +8,8 @@
8
8
  display: grid;
9
9
  grid-template-rows: auto 1fr auto;
10
10
  width: 100%;
11
- background: var(--color-neutral-token-1);
11
+ background: var(--color-surface);
12
+ border-radius: var(--border-radius-container);
12
13
  position: relative;
13
14
  top: 0;
14
15
  left: 0;
@@ -62,10 +63,12 @@ dialog[open] {
62
63
  }
63
64
 
64
65
  dialog {
65
- --transition-duration: 0.2s;
66
+ --transition-duration: 0.25s;
67
+ --transition-easing: var(--ease-spring);
66
68
  transform: translateY(0px);
67
69
  margin: auto;
68
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
70
+ box-shadow: var(--shadow-lg);
71
+ border-radius: var(--border-radius-container);
69
72
 
70
73
  &[data-position="top"] {
71
74
  position: fixed;
@@ -76,11 +79,11 @@ dialog {
76
79
  }
77
80
 
78
81
  &, &::backdrop {
79
- transition: opacity var(--transition-duration) ease-out,
80
- transform var(--transition-duration) ease-out,
82
+ transition: opacity var(--transition-duration) var(--transition-easing),
83
+ transform var(--transition-duration) var(--transition-easing),
81
84
  display var(--transition-duration) allow-discrete,
82
85
  overlay var(--transition-duration) allow-discrete,
83
- box-shadow var(--transition-duration) ease-out;
86
+ box-shadow var(--transition-duration) var(--transition-easing);
84
87
 
85
88
  opacity: 0;
86
89
 
@@ -91,58 +94,52 @@ dialog {
91
94
 
92
95
 
93
96
  &[open] {
94
- animation: slide-in var(--transition-duration) ease-out;
97
+ animation: dialog-enter var(--transition-duration) var(--transition-easing);
95
98
  opacity: 1;
96
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.24), 0 8px 16px rgba(0, 0, 0, 0.12); /* Ant Design-inspired shadow */
99
+ box-shadow: var(--shadow-lg);
97
100
  &::backdrop {
98
101
  opacity: 1;
99
102
  }
100
103
 
101
104
  &[data-position="top"] {
102
- animation: slide-in-top var(--transition-duration) ease-out;
105
+ animation: slide-in-top var(--transition-duration) var(--transition-easing);
103
106
  }
104
107
  }
105
108
 
106
109
  &:not([open]) {
107
- animation: slide-out var(--transition-duration) ease-out;
110
+ animation: dialog-exit var(--transition-duration) var(--ease-ui);
108
111
  opacity: 0;
109
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); /* Subtle shadow for hidden state */
112
+ box-shadow: var(--shadow-sm);
110
113
  &::backdrop {
111
114
  opacity: 0;
112
115
  }
113
116
 
114
117
  &[data-position="top"] {
115
- animation: slide-out-top var(--transition-duration) ease-out;
118
+ animation: slide-out-top var(--transition-duration) var(--ease-ui);
116
119
  }
117
120
  }
118
121
 
119
122
  }
120
123
 
121
- @keyframes slide-in {
124
+ @keyframes dialog-enter {
122
125
  from {
123
- transform: translateY(-40px);
126
+ transform: scale(0.95);
124
127
  opacity: 0;
125
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
126
-
127
128
  }
128
129
  to {
129
- transform: translateY(0);
130
+ transform: scale(1);
130
131
  opacity: 1;
131
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.24), 0 8px 16px rgba(0, 0, 0, 0.12);
132
-
133
132
  }
134
133
  }
135
134
 
136
- @keyframes slide-out {
135
+ @keyframes dialog-exit {
137
136
  from {
138
- transform: translateY(0);
137
+ transform: scale(1);
139
138
  opacity: 1;
140
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.24), 0 8px 16px rgba(0, 0, 0, 0.12);
141
139
  }
142
140
  to {
143
- transform: translateY(-40px);
141
+ transform: scale(0.95);
144
142
  opacity: 0;
145
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
146
143
  }
147
144
  }
148
145
 
@@ -0,0 +1,63 @@
1
+ <script lang="ts">let { open = $bindable(false), side = 'right', size = 'md', closeOnClickOutside = true, header, footer, children, onclose, } = $props();
2
+ const sizeMap = {
3
+ sm: '320px', md: '480px', lg: '640px', full: '100%',
4
+ };
5
+ const slideFrom = {
6
+ left: 'translate-x-[-100%]',
7
+ right: 'translate-x-[100%]',
8
+ bottom: 'translate-y-[100%]',
9
+ };
10
+ const drawerClass = $derived(side === 'bottom'
11
+ ? `fixed bottom-0 left-0 right-0 max-h-[85vh] rounded-t-[20px]`
12
+ : side === 'left'
13
+ ? `fixed left-0 top-0 bottom-0 w-[${sizeMap[size]}] max-w-full`
14
+ : `fixed right-0 top-0 bottom-0 w-[${sizeMap[size]}] max-w-full`);
15
+ function close() {
16
+ open = false;
17
+ onclose?.();
18
+ }
19
+ export {};
20
+ </script>
21
+
22
+ {#if open}
23
+ <!-- Backdrop -->
24
+ <div
25
+ role="presentation"
26
+ class="fixed inset-0 z-40 bg-overlay backdrop-blur-[4px] animate-in fade-in duration-200"
27
+ onclick={() => closeOnClickOutside && close()}
28
+ onkeydown={(e) => e.key === 'Escape' && closeOnClickOutside && close()}
29
+ ></div>
30
+
31
+ <!-- Drawer panel -->
32
+ <div
33
+ class="{drawerClass} z-50 flex flex-col bg-surface shadow-lg border border-border-default animate-in duration-300 ease-spring {side === 'bottom' ? 'slide-in-from-bottom' : side === 'left' ? 'slide-in-from-left' : 'slide-in-from-right'}"
34
+ role="dialog"
35
+ aria-modal="true"
36
+ >
37
+ {#if header}
38
+ <header class="flex items-center justify-between px-5 py-4 border-b border-border-default shrink-0">
39
+ {@render header()}
40
+ <button
41
+ type="button"
42
+ onclick={close}
43
+ class="text-text-tertiary hover:text-text-primary transition-colors ml-auto"
44
+ aria-label="Close drawer"
45
+ >
46
+ <svg class="size-4" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5">
47
+ <path d="M4 4l8 8M12 4l-8 8"/>
48
+ </svg>
49
+ </button>
50
+ </header>
51
+ {/if}
52
+
53
+ <main class="flex-1 overflow-y-auto p-5">
54
+ {@render children?.()}
55
+ </main>
56
+
57
+ {#if footer}
58
+ <footer class="px-5 py-4 border-t border-border-default shrink-0">
59
+ {@render footer()}
60
+ </footer>
61
+ {/if}
62
+ </div>
63
+ {/if}
@@ -0,0 +1,16 @@
1
+ import type { Snippet } from 'svelte';
2
+ type DrawerSide = 'left' | 'right' | 'bottom';
3
+ type DrawerSize = 'sm' | 'md' | 'lg' | 'full';
4
+ type $$ComponentProps = {
5
+ open?: boolean;
6
+ side?: DrawerSide;
7
+ size?: DrawerSize;
8
+ closeOnClickOutside?: boolean;
9
+ header?: Snippet;
10
+ footer?: Snippet;
11
+ children?: Snippet;
12
+ onclose?: () => void;
13
+ };
14
+ declare const Drawer: import("svelte").Component<$$ComponentProps, {}, "open">;
15
+ type Drawer = ReturnType<typeof Drawer>;
16
+ export default Drawer;
@@ -0,0 +1 @@
1
+ export { default as Drawer } from './Drawer.svelte';
@@ -0,0 +1 @@
1
+ export { default as Drawer } from './Drawer.svelte';