svelora 3.0.0 → 3.0.2

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 (109) hide show
  1. package/dist/Accordion/Accordion.svelte +66 -97
  2. package/dist/Alert/Alert.svelte +39 -64
  3. package/dist/Alert/Alert.svelte.d.ts +1 -1
  4. package/dist/Avatar/Avatar.svelte +35 -75
  5. package/dist/AvatarGroup/AvatarGroup.svelte +38 -55
  6. package/dist/Badge/Badge.svelte +28 -50
  7. package/dist/Banner/Banner.svelte +46 -41
  8. package/dist/Banner/Banner.svelte.d.ts +1 -1
  9. package/dist/Breadcrumb/Breadcrumb.svelte +32 -26
  10. package/dist/Button/Button.svelte +70 -138
  11. package/dist/Calendar/Calendar.svelte +94 -157
  12. package/dist/Calendar/Calendar.svelte.d.ts +1 -1
  13. package/dist/Card/Card.svelte +18 -31
  14. package/dist/Carousel/Carousel.svelte +118 -173
  15. package/dist/Checkbox/Checkbox.svelte +52 -97
  16. package/dist/CheckboxGroup/CheckboxGroup.svelte +62 -107
  17. package/dist/CheckboxGroup/CheckboxGroup.svelte.d.ts +1 -1
  18. package/dist/Chip/Chip.svelte +22 -34
  19. package/dist/CodeBlock/CodeBlock.svelte +42 -59
  20. package/dist/Collapsible/Collapsible.svelte +22 -38
  21. package/dist/Collapsible/Collapsible.svelte.d.ts +1 -1
  22. package/dist/Collapsible/CollapsibleTestWrapper.svelte +2 -5
  23. package/dist/Collapsible/CollapsibleTestWrapper.svelte.d.ts +1 -1
  24. package/dist/Command/Command.svelte +40 -77
  25. package/dist/Command/Command.svelte.d.ts +1 -1
  26. package/dist/Command/CommandTestWrapper.svelte +2 -10
  27. package/dist/Command/CommandTestWrapper.svelte.d.ts +1 -1
  28. package/dist/Container/Container.svelte +11 -14
  29. package/dist/ContextMenu/ContextMenu.svelte +51 -114
  30. package/dist/ContextMenu/ContextMenu.svelte.d.ts +1 -1
  31. package/dist/Drawer/Drawer.svelte +72 -110
  32. package/dist/Drawer/DrawerTriggerTestWrapper.svelte +1 -2
  33. package/dist/DropdownMenu/DropdownMenu.svelte +63 -124
  34. package/dist/DropdownMenu/DropdownMenu.svelte.d.ts +1 -1
  35. package/dist/DropdownMenu/DropdownMenuTriggerTestWrapper.svelte +2 -5
  36. package/dist/Editor/Editor.svelte +441 -576
  37. package/dist/Editor/Editor.svelte.d.ts +1 -1
  38. package/dist/Editor/EditorUrlPrompt.svelte +40 -53
  39. package/dist/Editor/SlashPopup.svelte +12 -24
  40. package/dist/Empty/Empty.svelte +32 -63
  41. package/dist/FieldGroup/FieldGroup.svelte +23 -38
  42. package/dist/FileUpload/FileUpload.svelte +242 -320
  43. package/dist/FileUpload/FileUpload.svelte.d.ts +1 -1
  44. package/dist/Fonts/Fonts.svelte +15 -37
  45. package/dist/Form/Form.svelte +112 -170
  46. package/dist/FormField/FormField.svelte +102 -135
  47. package/dist/Icon/Icon.svelte +7 -32
  48. package/dist/Input/Input.svelte +71 -141
  49. package/dist/Input/Input.svelte.d.ts +2 -2
  50. package/dist/Kbd/Kbd.svelte +18 -34
  51. package/dist/Link/Link.svelte +129 -196
  52. package/dist/LocaleButton/LocaleButton.svelte +165 -0
  53. package/dist/LocaleButton/LocaleButton.svelte.d.ts +5 -0
  54. package/dist/LocaleButton/index.d.ts +2 -0
  55. package/dist/LocaleButton/index.js +1 -0
  56. package/dist/LocaleButton/locale-button.types.d.ts +182 -0
  57. package/dist/LocaleButton/locale-button.types.js +1 -0
  58. package/dist/LocaleButton/locale-button.variants.d.ts +61 -0
  59. package/dist/LocaleButton/locale-button.variants.js +34 -0
  60. package/dist/Modal/Modal.svelte +52 -106
  61. package/dist/Modal/ModalTriggerTestWrapper.svelte +1 -2
  62. package/dist/Pagination/Pagination.svelte +48 -92
  63. package/dist/Pagination/pagination.variants.d.ts +1 -1
  64. package/dist/PinInput/PinInput.svelte +57 -111
  65. package/dist/PinInput/PinInput.svelte.d.ts +1 -1
  66. package/dist/Popover/Popover.svelte +28 -61
  67. package/dist/Popover/Popover.svelte.d.ts +1 -1
  68. package/dist/Progress/Progress.svelte +75 -94
  69. package/dist/RadioGroup/RadioGroup.svelte +54 -99
  70. package/dist/RadioGroup/RadioGroup.svelte.d.ts +1 -1
  71. package/dist/Select/Select.svelte +112 -269
  72. package/dist/Select/Select.svelte.d.ts +1 -1
  73. package/dist/SelectMenu/SelectMenu.svelte +211 -409
  74. package/dist/SelectMenu/SelectMenu.svelte.d.ts +1 -1
  75. package/dist/SelectMenu/SelectMenuFormFieldTestWrapper.svelte +3 -6
  76. package/dist/Separator/Separator.svelte +29 -44
  77. package/dist/Skeleton/Skeleton.svelte +11 -23
  78. package/dist/Slideover/Slideover.svelte +52 -106
  79. package/dist/Slideover/SlideoverTriggerTestWrapper.svelte +1 -2
  80. package/dist/Slider/Slider.svelte +48 -84
  81. package/dist/Slider/Slider.svelte.d.ts +1 -1
  82. package/dist/Stepper/Stepper.svelte +139 -132
  83. package/dist/Stepper/Stepper.svelte.d.ts +1 -1
  84. package/dist/Switch/Switch.svelte +62 -98
  85. package/dist/Table/Table.svelte +232 -283
  86. package/dist/Table/table.variants.d.ts +1 -1
  87. package/dist/Tabs/Tabs.svelte +96 -129
  88. package/dist/Tabs/Tabs.svelte.d.ts +1 -1
  89. package/dist/Textarea/Textarea.svelte +90 -173
  90. package/dist/Textarea/Textarea.svelte.d.ts +1 -1
  91. package/dist/ThemeModeButton/ThemeModeButton.svelte +16 -38
  92. package/dist/Timeline/Timeline.svelte +75 -54
  93. package/dist/Toast/Toaster.svelte +8 -25
  94. package/dist/Tooltip/Tooltip.svelte +34 -66
  95. package/dist/Tooltip/Tooltip.svelte.d.ts +1 -1
  96. package/dist/Tooltip/TooltipTestWrapper.svelte +2 -5
  97. package/dist/User/User.svelte +33 -49
  98. package/dist/docs/navigation.d.ts +1 -1
  99. package/dist/docs/navigation.js +8 -1
  100. package/dist/hooks/HookContextProbe.svelte +2 -4
  101. package/dist/hooks/HookContextProvider.svelte +8 -6
  102. package/dist/hooks/HookEmitProbe.svelte +8 -11
  103. package/dist/i18n.d.ts +2 -0
  104. package/dist/i18n.js +19 -0
  105. package/dist/index.d.ts +1 -0
  106. package/dist/index.js +1 -0
  107. package/dist/mcp/svelora-docs.data.json +4 -2
  108. package/dist/theme.css +1 -1
  109. package/package.json +16 -8
@@ -1,62 +1,83 @@
1
- <script lang="ts" module>import type { TimelineProps } from './timeline.types.js';
2
- export type Props = TimelineProps;
1
+ <script lang="ts" module>export {};
3
2
  </script>
4
3
 
5
- <script lang="ts">import type { ClassNameValue } from 'tailwind-merge';
6
- import Avatar from '../Avatar/Avatar.svelte';
7
- import { getComponentConfig } from '../config.js';
8
- import Icon from '../Icon/Icon.svelte';
9
- import type { TimelineItemState } from './timeline.types.js';
10
- import { timelineDefaults, timelineVariants } from './timeline.variants.js';
11
-
12
- const config = getComponentConfig('timeline', timelineDefaults);
13
- let { ref = $bindable(null), as = 'div', items = [], size = config.defaultVariants.size, color = config.defaultVariants.color, orientation = config.defaultVariants.orientation, reverse = config.defaultVariants.reverse, value, class: className, ui, indicator, dateSlot, titleSlot, descriptionSlot, content, ...restProps }: Props = $props();
14
- type ItemUi = Partial<Record<string, ClassNameValue>>;
4
+ <script lang="ts">import Avatar from "../Avatar/Avatar.svelte";
5
+ import { getComponentConfig } from "../config.js";
6
+ import Icon from "../Icon/Icon.svelte";
7
+ import { timelineDefaults, timelineVariants } from "./timeline.variants.js";
8
+ const config = getComponentConfig("timeline", timelineDefaults);
9
+ let { ref = $bindable(null), as = "div", items = [], size = config.defaultVariants.size, color = config.defaultVariants.color, orientation = config.defaultVariants.orientation, reverse = config.defaultVariants.reverse, value, class: className, ui, indicator, dateSlot, titleSlot, descriptionSlot, content, ...restProps } = $props();
15
10
  const classes = $derived.by(() => {
16
- const slots = timelineVariants({ orientation, color, size, reverse });
17
- const c = config.slots;
18
- // Pre-compute defaults — reused for all items without per-item ui
19
- const _item = slots.item({ class: [c.item, ui?.item] });
20
- const _container = slots.container({ class: [c.container, ui?.container] });
21
- const _indicator = slots.indicator({ class: [c.indicator, ui?.indicator] });
22
- const _separator = slots.separator({ class: [c.separator, ui?.separator] });
23
- const _wrapper = slots.wrapper({ class: [c.wrapper, ui?.wrapper] });
24
- const _date = slots.date({ class: [c.date, ui?.date] });
25
- const _title = slots.title({ class: [c.title, ui?.title] });
26
- const _description = slots.description({ class: [c.description, ui?.description] });
27
- return {
28
- root: slots.root({ class: [c.root, className, ui?.root] }),
29
- item: (itemClass: ClassNameValue | undefined, itemUi: ItemUi | undefined) => itemClass || itemUi
30
- ? slots.item({ class: [c.item, ui?.item, itemUi?.item, itemClass] })
31
- : _item,
32
- container: (itemUi: ItemUi | undefined) => itemUi
33
- ? slots.container({ class: [c.container, ui?.container, itemUi.container] })
34
- : _container,
35
- indicator: (itemUi: ItemUi | undefined) => itemUi
36
- ? slots.indicator({ class: [c.indicator, ui?.indicator, itemUi.indicator] })
37
- : _indicator,
38
- separator: (itemUi: ItemUi | undefined) => itemUi
39
- ? slots.separator({ class: [c.separator, ui?.separator, itemUi.separator] })
40
- : _separator,
41
- wrapper: (itemUi: ItemUi | undefined) => itemUi
42
- ? slots.wrapper({ class: [c.wrapper, ui?.wrapper, itemUi.wrapper] })
43
- : _wrapper,
44
- date: (itemUi: ItemUi | undefined) => itemUi?.date ? slots.date({ class: [c.date, ui?.date, itemUi.date] }) : _date,
45
- title: (itemUi: ItemUi | undefined) => itemUi?.title ? slots.title({ class: [c.title, ui?.title, itemUi.title] }) : _title,
46
- description: (itemUi: ItemUi | undefined) => itemUi?.description
47
- ? slots.description({
48
- class: [c.description, ui?.description, itemUi.description]
49
- })
50
- : _description
51
- };
11
+ const slots = timelineVariants({
12
+ orientation,
13
+ color,
14
+ size,
15
+ reverse
16
+ });
17
+ const c = config.slots;
18
+ // Pre-compute defaults reused for all items without per-item ui
19
+ const _item = slots.item({ class: [c.item, ui?.item] });
20
+ const _container = slots.container({ class: [c.container, ui?.container] });
21
+ const _indicator = slots.indicator({ class: [c.indicator, ui?.indicator] });
22
+ const _separator = slots.separator({ class: [c.separator, ui?.separator] });
23
+ const _wrapper = slots.wrapper({ class: [c.wrapper, ui?.wrapper] });
24
+ const _date = slots.date({ class: [c.date, ui?.date] });
25
+ const _title = slots.title({ class: [c.title, ui?.title] });
26
+ const _description = slots.description({ class: [c.description, ui?.description] });
27
+ return {
28
+ root: slots.root({ class: [
29
+ c.root,
30
+ className,
31
+ ui?.root
32
+ ] }),
33
+ item: (itemClass, itemUi) => itemClass || itemUi ? slots.item({ class: [
34
+ c.item,
35
+ ui?.item,
36
+ itemUi?.item,
37
+ itemClass
38
+ ] }) : _item,
39
+ container: (itemUi) => itemUi ? slots.container({ class: [
40
+ c.container,
41
+ ui?.container,
42
+ itemUi.container
43
+ ] }) : _container,
44
+ indicator: (itemUi) => itemUi ? slots.indicator({ class: [
45
+ c.indicator,
46
+ ui?.indicator,
47
+ itemUi.indicator
48
+ ] }) : _indicator,
49
+ separator: (itemUi) => itemUi ? slots.separator({ class: [
50
+ c.separator,
51
+ ui?.separator,
52
+ itemUi.separator
53
+ ] }) : _separator,
54
+ wrapper: (itemUi) => itemUi ? slots.wrapper({ class: [
55
+ c.wrapper,
56
+ ui?.wrapper,
57
+ itemUi.wrapper
58
+ ] }) : _wrapper,
59
+ date: (itemUi) => itemUi?.date ? slots.date({ class: [
60
+ c.date,
61
+ ui?.date,
62
+ itemUi.date
63
+ ] }) : _date,
64
+ title: (itemUi) => itemUi?.title ? slots.title({ class: [
65
+ c.title,
66
+ ui?.title,
67
+ itemUi.title
68
+ ] }) : _title,
69
+ description: (itemUi) => itemUi?.description ? slots.description({ class: [
70
+ c.description,
71
+ ui?.description,
72
+ itemUi.description
73
+ ] }) : _description
74
+ };
52
75
  });
53
76
  const activeIndex = $derived(value !== undefined ? items.findIndex((item) => item.value === value) : -1);
54
- function getState(index: number): TimelineItemState {
55
- if (activeIndex === -1)
56
- return 'pending';
57
- if (index === activeIndex)
58
- return 'active';
59
- return index < activeIndex ? 'completed' : 'pending';
77
+ function getState(index) {
78
+ if (activeIndex === -1) return "pending";
79
+ if (index === activeIndex) return "active";
80
+ return index < activeIndex ? "completed" : "pending";
60
81
  }
61
82
  </script>
62
83
 
@@ -1,30 +1,13 @@
1
- <script lang="ts" module>
2
- import type { ToasterProps } from './toast.types.js'
3
-
4
- export type Props = ToasterProps
1
+ <script lang="ts" module>export {};
5
2
  </script>
6
3
 
7
- <script lang="ts">
8
- // biome-ignore lint/correctness/noUnusedImports: used in template below
9
- import { Toaster as SonnerToaster } from 'svelte-sonner'
10
- import { getComponentConfig } from '../config.js'
11
- import { toastDefaults } from './toast.variants.js'
12
-
13
- const config = getComponentConfig('toast', toastDefaults)
14
-
15
- let {
16
- variant = config.defaultVariants.variant,
17
- position = 'bottom-right',
18
- visibleToasts = 3,
19
- duration = 5000,
20
- closeButton = true,
21
- expand = false,
22
- gap = 14,
23
- class: className,
24
- ...restProps
25
- }: Props = $props()
26
-
27
- const toasterClass = $derived([`ps-toast-${variant}`, className].filter(Boolean).join(' '))
4
+ <script lang="ts">// biome-ignore lint/correctness/noUnusedImports: used in template below
5
+ import { Toaster as SonnerToaster } from "svelte-sonner";
6
+ import { getComponentConfig } from "../config.js";
7
+ import { toastDefaults } from "./toast.variants.js";
8
+ const config = getComponentConfig("toast", toastDefaults);
9
+ let { variant = config.defaultVariants.variant, position = "bottom-right", visibleToasts = 3, duration = 5e3, closeButton = true, expand = false, gap = 14, class: className, ...restProps } = $props();
10
+ const toasterClass = $derived([`ps-toast-${variant}`, className].filter(Boolean).join(" "));
28
11
  </script>
29
12
 
30
13
  <SonnerToaster
@@ -1,71 +1,39 @@
1
- <script lang="ts" module>
2
- import type { TooltipProps } from './tooltip.types.js'
3
-
4
- export type Props = TooltipProps
1
+ <script lang="ts" module>export {};
5
2
  </script>
6
3
 
7
- <script lang="ts">
8
- import { Tooltip } from 'bits-ui'
9
- import { getComponentConfig } from '../config.js'
10
- import Kbd from '../Kbd/Kbd.svelte'
11
- import { tooltipDefaults, tooltipVariants } from './tooltip.variants.js'
12
-
13
- const config = getComponentConfig('tooltip', tooltipDefaults)
14
-
15
- let {
16
- ref = $bindable(null),
17
- open = $bindable(false),
18
- onOpenChange,
19
- delayDuration,
20
- disableHoverableContent,
21
- disableCloseOnTriggerClick,
22
- ignoreNonKeyboardFocus,
23
- disabled = false,
24
- side = 'bottom',
25
- sideOffset = 8,
26
- align = 'center',
27
- alignOffset = 0,
28
- avoidCollisions = true,
29
- collisionBoundary,
30
- collisionPadding = 8,
31
- sticky = 'partial',
32
- hideWhenDetached = false,
33
- onEscapeKeydown,
34
- forceMount,
35
- text,
36
- kbds,
37
- arrow = false,
38
- transition = config.defaultVariants.transition ?? true,
39
- portal = true,
40
- ui,
41
- class: className,
42
- children,
43
- content: contentSlot,
44
- ...restProps
45
- }: Props = $props()
46
-
47
- // Pre-compute booleans
48
- const hasText = $derived(!!text)
49
- const hasKbds = $derived(!!kbds?.length)
50
- const hasContent = $derived(hasText || hasKbds || !!contentSlot)
51
-
52
- // Compute variant classes
53
- const variantSlots = $derived(tooltipVariants({ transition }))
54
- const kbdsSize = (config.slots.kbdsSize ?? 'sm') as 'sm' | 'md' | 'lg'
55
- const classes = $derived({
56
- content: variantSlots.content({ class: [config.slots.content, ui?.content] }),
57
- arrow: variantSlots.arrow({ class: [config.slots.arrow, ui?.arrow] }),
58
- text: variantSlots.text({ class: [config.slots.text, ui?.text] }),
59
- kbds: variantSlots.kbds({ class: [config.slots.kbds, ui?.kbds] })
60
- })
61
-
62
- // Arrow props
63
- const arrowProps = $derived.by(() => {
64
- if (typeof arrow === 'object') {
65
- return { width: 12, height: 6, ...arrow }
66
- }
67
- return { width: 12, height: 6 }
68
- })
4
+ <script lang="ts">import { Tooltip } from "bits-ui";
5
+ import { getComponentConfig } from "../config.js";
6
+ import Kbd from "../Kbd/Kbd.svelte";
7
+ import { tooltipDefaults, tooltipVariants } from "./tooltip.variants.js";
8
+ const config = getComponentConfig("tooltip", tooltipDefaults);
9
+ let { ref = $bindable(null), open = $bindable(false), onOpenChange, delayDuration, disableHoverableContent, disableCloseOnTriggerClick, ignoreNonKeyboardFocus, disabled = false, side = "bottom", sideOffset = 8, align = "center", alignOffset = 0, avoidCollisions = true, collisionBoundary, collisionPadding = 8, sticky = "partial", hideWhenDetached = false, onEscapeKeydown, forceMount, text, kbds, arrow = false, transition = config.defaultVariants.transition ?? true, portal = true, ui, class: className, children, content: contentSlot, ...restProps } = $props();
10
+ // Pre-compute booleans
11
+ const hasText = $derived(!!text);
12
+ const hasKbds = $derived(!!kbds?.length);
13
+ const hasContent = $derived(hasText || hasKbds || !!contentSlot);
14
+ // Compute variant classes
15
+ const variantSlots = $derived(tooltipVariants({ transition }));
16
+ const kbdsSize = config.slots.kbdsSize ?? "sm";
17
+ const classes = $derived({
18
+ content: variantSlots.content({ class: [config.slots.content, ui?.content] }),
19
+ arrow: variantSlots.arrow({ class: [config.slots.arrow, ui?.arrow] }),
20
+ text: variantSlots.text({ class: [config.slots.text, ui?.text] }),
21
+ kbds: variantSlots.kbds({ class: [config.slots.kbds, ui?.kbds] })
22
+ });
23
+ // Arrow props
24
+ const arrowProps = $derived.by(() => {
25
+ if (typeof arrow === "object") {
26
+ return {
27
+ width: 12,
28
+ height: 6,
29
+ ...arrow
30
+ };
31
+ }
32
+ return {
33
+ width: 12,
34
+ height: 6
35
+ };
36
+ });
69
37
  </script>
70
38
 
71
39
  {#snippet tooltipContent()}
@@ -1,6 +1,6 @@
1
1
  import type { TooltipProps } from './tooltip.types.js';
2
2
  export type Props = TooltipProps;
3
3
  import { Tooltip } from 'bits-ui';
4
- declare const Tooltip: import("svelte").Component<TooltipProps, {}, "ref" | "open">;
4
+ declare const Tooltip: import("svelte").Component<TooltipProps, {}, "open" | "ref">;
5
5
  type Tooltip = ReturnType<typeof Tooltip>;
6
6
  export default Tooltip;
@@ -1,8 +1,5 @@
1
- <script lang="ts">
2
- import Tooltip from './Tooltip.svelte'
3
- import type { TooltipProps } from './tooltip.types.js'
4
-
5
- let props: TooltipProps = $props()
1
+ <script lang="ts">import Tooltip from "./Tooltip.svelte";
2
+ let props = $props();
6
3
  </script>
7
4
 
8
5
  <Tooltip {...props} />
@@ -1,54 +1,38 @@
1
- <script lang="ts" module>
2
- import type { UserProps } from './user.types.js'
3
-
4
- export type Props = UserProps
1
+ <script lang="ts" module>export {};
5
2
  </script>
6
3
 
7
- <script lang="ts">
8
- import Avatar from '../Avatar/Avatar.svelte'
9
- import Chip from '../Chip/Chip.svelte'
10
- import { getComponentConfig } from '../config.js'
11
- import Link from '../Link/Link.svelte'
12
- import { userDefaults, userVariants } from './user.variants.js'
13
-
14
- const config = getComponentConfig('user', userDefaults)
15
-
16
- let {
17
- ref = $bindable(null),
18
- as = 'div',
19
- ui,
20
- name,
21
- description,
22
- avatar,
23
- chip,
24
- size = config.defaultVariants.size,
25
- orientation = config.defaultVariants.orientation,
26
- href,
27
- class: className,
28
- avatarSlot,
29
- nameSlot,
30
- descriptionSlot,
31
- ...restProps
32
- }: Props = $props()
33
-
34
- const isClickable = $derived(!!href || !!restProps.onclick)
35
-
36
- const classes = $derived.by(() => {
37
- const slots = userVariants({ size, orientation, clickable: isClickable })
38
- return {
39
- root: slots.root({ class: [config.slots.root, className, ui?.root] }),
40
- wrapper: slots.wrapper({ class: [config.slots.wrapper, ui?.wrapper] }),
41
- name: slots.name({ class: [config.slots.name, ui?.name] }),
42
- description: slots.description({ class: [config.slots.description, ui?.description] }),
43
- avatar: slots.avatar({ class: [config.slots.avatar, ui?.avatar] })
44
- }
45
- })
46
-
47
- const mergedAvatarProps = $derived(
48
- avatar ? { alt: name, size: size as typeof avatar.size, ...avatar } : undefined
49
- )
50
-
51
- const chipProps = $derived(chip && avatar ? (chip === true ? {} : chip) : null)
4
+ <script lang="ts">import Avatar from "../Avatar/Avatar.svelte";
5
+ import Chip from "../Chip/Chip.svelte";
6
+ import { getComponentConfig } from "../config.js";
7
+ import Link from "../Link/Link.svelte";
8
+ import { userDefaults, userVariants } from "./user.variants.js";
9
+ const config = getComponentConfig("user", userDefaults);
10
+ let { ref = $bindable(null), as = "div", ui, name, description, avatar, chip, size = config.defaultVariants.size, orientation = config.defaultVariants.orientation, href, class: className, avatarSlot, nameSlot, descriptionSlot, ...restProps } = $props();
11
+ const isClickable = $derived(!!href || !!restProps.onclick);
12
+ const classes = $derived.by(() => {
13
+ const slots = userVariants({
14
+ size,
15
+ orientation,
16
+ clickable: isClickable
17
+ });
18
+ return {
19
+ root: slots.root({ class: [
20
+ config.slots.root,
21
+ className,
22
+ ui?.root
23
+ ] }),
24
+ wrapper: slots.wrapper({ class: [config.slots.wrapper, ui?.wrapper] }),
25
+ name: slots.name({ class: [config.slots.name, ui?.name] }),
26
+ description: slots.description({ class: [config.slots.description, ui?.description] }),
27
+ avatar: slots.avatar({ class: [config.slots.avatar, ui?.avatar] })
28
+ };
29
+ });
30
+ const mergedAvatarProps = $derived(avatar ? {
31
+ alt: name,
32
+ size,
33
+ ...avatar
34
+ } : undefined);
35
+ const chipProps = $derived(chip && avatar ? chip === true ? {} : chip : null);
52
36
  </script>
53
37
 
54
38
  {#snippet userContent()}
@@ -11,7 +11,7 @@ export type DocsGroup = {
11
11
  };
12
12
  export declare const docsMeta: {
13
13
  readonly name: "Svelora";
14
- readonly version: "v2.2.0";
14
+ readonly version: `v${string}`;
15
15
  readonly npmCommand: "npm install svelora";
16
16
  readonly githubHref: "https://github.com/asphum/svelora";
17
17
  };
@@ -1,6 +1,7 @@
1
+ import packageJson from '../../../package.json' with { type: 'json' };
1
2
  export const docsMeta = {
2
3
  name: 'Svelora',
3
- version: 'v2.2.0',
4
+ version: `v${packageJson.version}`,
4
5
  npmCommand: 'npm install svelora',
5
6
  githubHref: 'https://github.com/asphum/svelora'
6
7
  };
@@ -97,6 +98,12 @@ export const docsComponentGroups = [
97
98
  legacyHref: '/link',
98
99
  icon: 'lucide:link'
99
100
  },
101
+ {
102
+ title: 'LocaleButton',
103
+ href: '/docs/components/locale-button',
104
+ legacyHref: '/locale-button',
105
+ icon: 'lucide:languages'
106
+ },
100
107
  {
101
108
  title: 'Kbd',
102
109
  href: '/docs/components/kbd',
@@ -1,7 +1,5 @@
1
- <script lang="ts">
2
- import { useFormField } from './useFormField.svelte.js'
3
-
4
- const ctx = useFormField()
1
+ <script lang="ts">import { useFormField } from "./useFormField.svelte.js";
2
+ const ctx = useFormField();
5
3
  </script>
6
4
 
7
5
  <div data-name={ctx?.name ?? 'none'} data-has={String(!!ctx)}>probe</div>
@@ -1,9 +1,11 @@
1
- <script lang="ts">
2
- import { setContext } from 'svelte'
3
- import HookContextProbe from './HookContextProbe.svelte'
4
- import { FORM_FIELD_CONTEXT_KEY } from './useFormField.svelte.js'
5
-
6
- setContext(FORM_FIELD_CONTEXT_KEY, { name: 'email', size: 'md', ariaId: 'ff' })
1
+ <script lang="ts">import { setContext } from "svelte";
2
+ import HookContextProbe from "./HookContextProbe.svelte";
3
+ import { FORM_FIELD_CONTEXT_KEY } from "./useFormField.svelte.js";
4
+ setContext(FORM_FIELD_CONTEXT_KEY, {
5
+ name: "email",
6
+ size: "md",
7
+ ariaId: "ff"
8
+ });
7
9
  </script>
8
10
 
9
11
  <HookContextProbe />
@@ -1,14 +1,11 @@
1
- <script lang="ts">
2
- import { useFormFieldEmit } from './useFormField.svelte.js'
3
-
4
- const emit = useFormFieldEmit()
5
-
6
- function fireAll() {
7
- emit.onBlur()
8
- emit.onFocus()
9
- emit.onChange()
10
- emit.onInput()
11
- }
1
+ <script lang="ts">import { useFormFieldEmit } from "./useFormField.svelte.js";
2
+ const emit = useFormFieldEmit();
3
+ function fireAll() {
4
+ emit.onBlur();
5
+ emit.onFocus();
6
+ emit.onChange();
7
+ emit.onInput();
8
+ }
12
9
  </script>
13
10
 
14
11
  <button data-testid="fire" onclick={fireAll}>fire</button>
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { LocaleButtonLocale } from './LocaleButton/index.js';
2
+ export declare function buildLocaleOptions(): LocaleButtonLocale[];
package/dist/i18n.js ADDED
@@ -0,0 +1,19 @@
1
+ import { locales } from './paraglide/runtime.js';
2
+ const localeMeta = {
3
+ en: {
4
+ label: 'English',
5
+ shortLabel: 'EN'
6
+ },
7
+ th: {
8
+ label: 'Thai',
9
+ shortLabel: 'TH'
10
+ }
11
+ };
12
+ export function buildLocaleOptions() {
13
+ return locales.map((locale) => ({
14
+ code: locale,
15
+ label: localeMeta[locale].label,
16
+ shortLabel: localeMeta[locale].shortLabel,
17
+ hreflang: locale
18
+ }));
19
+ }
package/dist/index.d.ts CHANGED
@@ -34,6 +34,7 @@ export * from './Icon/index.js';
34
34
  export * from './Input/index.js';
35
35
  export * from './Kbd/index.js';
36
36
  export * from './Link/index.js';
37
+ export * from './LocaleButton/index.js';
37
38
  export * from './Modal/index.js';
38
39
  export * from './Pagination/index.js';
39
40
  export * from './PinInput/index.js';
package/dist/index.js CHANGED
@@ -35,6 +35,7 @@ export * from './Icon/index.js';
35
35
  export * from './Input/index.js';
36
36
  export * from './Kbd/index.js';
37
37
  export * from './Link/index.js';
38
+ export * from './LocaleButton/index.js';
38
39
  export * from './Modal/index.js';
39
40
  export * from './Pagination/index.js';
40
41
  export * from './PinInput/index.js';