@likable-hair/svelte 4.2.5 → 4.3.0

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 (117) hide show
  1. package/dist/components/composed/buttons/ActivableButton.svelte +25 -7
  2. package/dist/components/composed/common/HeadersDrawer.svelte +66 -28
  3. package/dist/components/composed/common/HeadersDrawer.svelte.d.ts +22 -12
  4. package/dist/components/composed/common/MenuOrDrawer.svelte +40 -12
  5. package/dist/components/composed/common/MenuOrDrawerOptions.svelte +51 -27
  6. package/dist/components/composed/common/MenuOrDrawerOptions.svelte.d.ts +15 -10
  7. package/dist/components/composed/common/QuickActions.svelte +59 -23
  8. package/dist/components/composed/common/ToolTip.svelte +51 -32
  9. package/dist/components/composed/dashboard/DashboardShaper.svelte +280 -147
  10. package/dist/components/composed/dashboard/DashboardShaper.svelte.d.ts +54 -45
  11. package/dist/components/composed/forms/AsyncAutocomplete.svelte +81 -30
  12. package/dist/components/composed/forms/AsyncAutocomplete.svelte.d.ts +12 -5
  13. package/dist/components/composed/forms/AvatarDropdown.svelte +146 -70
  14. package/dist/components/composed/forms/AvatarDropdown.svelte.d.ts +27 -22
  15. package/dist/components/composed/forms/ConfirmOrCancelButtons.svelte +65 -19
  16. package/dist/components/composed/forms/CountriesAutocomplete.svelte +33 -4
  17. package/dist/components/composed/forms/DatePickerTextField.svelte +266 -161
  18. package/dist/components/composed/forms/Dropdown.svelte +88 -21
  19. package/dist/components/composed/forms/Dropdown.svelte.d.ts +18 -13
  20. package/dist/components/composed/forms/IconsDropdown.svelte +85 -40
  21. package/dist/components/composed/forms/IconsDropdown.svelte.d.ts +15 -8
  22. package/dist/components/composed/forms/LabelAndSelect.svelte +46 -5
  23. package/dist/components/composed/forms/LabelAndTextField.svelte +56 -3
  24. package/dist/components/composed/forms/PeriodPicker.svelte +38 -18
  25. package/dist/components/composed/forms/PeriodPicker.svelte.d.ts +32 -7
  26. package/dist/components/composed/forms/PeriodSelector.svelte +427 -312
  27. package/dist/components/composed/forms/PeriodSelector.svelte.d.ts +20 -13
  28. package/dist/components/composed/forms/ToggleList.svelte +71 -37
  29. package/dist/components/composed/forms/ToggleList.svelte.d.ts +14 -7
  30. package/dist/components/composed/forms/YearPickerTextField.svelte +154 -82
  31. package/dist/components/composed/list/DynamicTable.svelte +1372 -809
  32. package/dist/components/composed/list/DynamicTable.svelte.d.ts +85 -70
  33. package/dist/components/composed/list/EnhancedPaginatedTable.svelte +75 -32
  34. package/dist/components/composed/list/EnhancedPaginatedTable.svelte.d.ts +16 -6
  35. package/dist/components/composed/list/PaginatedTable.svelte +324 -116
  36. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +26 -22
  37. package/dist/components/composed/progress/HorizontalStackedProgress.svelte +67 -29
  38. package/dist/components/composed/search/DynamicFilters.svelte +126 -91
  39. package/dist/components/composed/search/FilterEditor.svelte +169 -109
  40. package/dist/components/composed/search/Filters.svelte +385 -275
  41. package/dist/components/composed/search/GlobalSearchTextField.svelte +102 -42
  42. package/dist/components/composed/search/GlobalSearchTextField.svelte.d.ts +23 -20
  43. package/dist/components/composed/search/MobileFilterEditor.svelte +174 -120
  44. package/dist/components/composed/search/QuickFilters.svelte +124 -75
  45. package/dist/components/composed/search/SearchBar.svelte +42 -3
  46. package/dist/components/composed/search/SearchResults.svelte +48 -5
  47. package/dist/components/composed/search/SearchResults.svelte.d.ts +17 -17
  48. package/dist/components/layouts/CollapsibleSideBarLayout.svelte +100 -24
  49. package/dist/components/layouts/StableDividedSideBarLayout.svelte +74 -24
  50. package/dist/components/layouts/UnstableDividedSideBarLayout.svelte +140 -57
  51. package/dist/components/simple/buttons/Button.svelte +86 -36
  52. package/dist/components/simple/buttons/LinkButton.svelte +81 -25
  53. package/dist/components/simple/charts/BarChart.svelte +137 -105
  54. package/dist/components/simple/charts/LineChart.svelte +124 -92
  55. package/dist/components/simple/charts/PieChart.svelte +51 -23
  56. package/dist/components/simple/common/CollapsibleDivider.svelte +58 -26
  57. package/dist/components/simple/common/Divider.svelte +2 -1
  58. package/dist/components/simple/common/InfiniteScroll.svelte +60 -34
  59. package/dist/components/simple/common/MediaQuery.svelte +28 -3
  60. package/dist/components/simple/common/Menu.svelte +516 -371
  61. package/dist/components/simple/common/NoData.svelte +18 -4
  62. package/dist/components/simple/common/VerticalDraggableList.svelte +52 -26
  63. package/dist/components/simple/common/VerticalDraggableList.svelte.d.ts +20 -9
  64. package/dist/components/simple/dashboards/DashboardGridShaper.svelte +28 -22
  65. package/dist/components/simple/dates/Calendar.svelte +142 -72
  66. package/dist/components/simple/dates/DatePicker.svelte +138 -71
  67. package/dist/components/simple/dates/MonthSelector.svelte +49 -13
  68. package/dist/components/simple/dates/YearSelector.svelte +73 -30
  69. package/dist/components/simple/dialogs/Dialog.svelte +109 -59
  70. package/dist/components/simple/forms/Autocomplete.svelte +341 -164
  71. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +27 -20
  72. package/dist/components/simple/forms/Checkbox.svelte +57 -29
  73. package/dist/components/simple/forms/FileInput.svelte +103 -58
  74. package/dist/components/simple/forms/FileInputList.svelte +115 -51
  75. package/dist/components/simple/forms/RadioButton.svelte +36 -3
  76. package/dist/components/simple/forms/Select.svelte +30 -3
  77. package/dist/components/simple/forms/SimpleTextField.svelte +94 -4
  78. package/dist/components/simple/forms/Switch.svelte +33 -11
  79. package/dist/components/simple/forms/Textarea.svelte +22 -5
  80. package/dist/components/simple/forms/VerticalSwitch.svelte +19 -2
  81. package/dist/components/simple/forms/VerticalTextSwitch.svelte +35 -3
  82. package/dist/components/simple/lists/BoxList.svelte +42 -11
  83. package/dist/components/simple/lists/ColorInvertedSelector.svelte +83 -25
  84. package/dist/components/simple/lists/HierarchyMenu.svelte +55 -20
  85. package/dist/components/simple/lists/Paginator.svelte +53 -34
  86. package/dist/components/simple/lists/SelectableMenuList.svelte +52 -16
  87. package/dist/components/simple/lists/SelectableVerticalList.svelte +169 -85
  88. package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +21 -14
  89. package/dist/components/simple/lists/SidebarMenuList.svelte +127 -79
  90. package/dist/components/simple/lists/SimpleTable.svelte +442 -245
  91. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +31 -22
  92. package/dist/components/simple/loaders/CircularLoader.css +1 -1
  93. package/dist/components/simple/loaders/CircularLoader.svelte +11 -3
  94. package/dist/components/simple/loaders/Skeleton.svelte +3 -2
  95. package/dist/components/simple/media/Avatar.svelte +35 -15
  96. package/dist/components/simple/media/DescriptiveAvatar.svelte +30 -4
  97. package/dist/components/simple/media/FlagIcon.svelte +13 -3
  98. package/dist/components/simple/media/Icon.svelte +21 -6
  99. package/dist/components/simple/navigation/Breadcrumb.svelte +41 -9
  100. package/dist/components/simple/navigation/Chip.svelte +65 -29
  101. package/dist/components/simple/navigation/Drawer.svelte +132 -71
  102. package/dist/components/simple/navigation/HeaderMenu.svelte +69 -25
  103. package/dist/components/simple/navigation/Navigator.svelte +45 -11
  104. package/dist/components/simple/navigation/TabSwitcher.svelte +60 -19
  105. package/dist/components/simple/notifiers/AlertBanner.svelte +59 -11
  106. package/dist/components/simple/progress/ProgressBar.svelte +26 -10
  107. package/dist/components/simple/timeline/SimpleTimeLine.svelte +52 -5
  108. package/dist/components/simple/timeline/SimpleTimeLine.svelte.d.ts +16 -9
  109. package/dist/components/simple/typography/Code.svelte +41 -12
  110. package/dist/stores/layouts/unstableSidebarOpened.d.ts +1 -1
  111. package/dist/stores/layouts/unstableSidebarOpened.js +1 -1
  112. package/dist/stores/theme.js +2 -2
  113. package/dist/utils/filters/builder.d.ts +2 -2
  114. package/dist/utils/filters/builder.js +7 -7
  115. package/dist/utils/filters/modifiers/where.d.ts +1 -1
  116. package/dist/utils/teleporter.js +4 -4
  117. package/package.json +39 -33
@@ -1,8 +1,25 @@
1
- <script lang="ts">import '../../../css/main.css';
2
- import './Textarea.css';
3
- import { createId } from '@paralleldrive/cuid2';
4
- ;
5
- let { label, id = createId(), value = $bindable(), class: clazz, ...rest } = $props();
1
+ <script lang="ts">
2
+ import '../../../css/main.css'
3
+ import './Textarea.css'
4
+ import { createId } from '@paralleldrive/cuid2';
5
+ import type { HTMLTextareaAttributes } from 'svelte/elements';
6
+
7
+ interface Props extends HTMLTextareaAttributes {
8
+ label?: string;
9
+ class?: {
10
+ container?: string;
11
+ label?: string;
12
+ textarea?: string;
13
+ }
14
+ };
15
+
16
+ let {
17
+ label,
18
+ id = createId(),
19
+ value = $bindable(),
20
+ class: clazz,
21
+ ...rest
22
+ }: Props = $props();
6
23
  </script>
7
24
 
8
25
  <div class={clazz?.container}>
@@ -1,5 +1,22 @@
1
- <script lang="ts">import './VerticalSwitch.css';
2
- let { value = $bindable(), rounded = false, onchange, falseOptionSnippet, trueOptionSnippet, } = $props();
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import './VerticalSwitch.css'
4
+
5
+ interface Props {
6
+ value?: boolean;
7
+ rounded?: boolean;
8
+ onchange?: () => void
9
+ falseOptionSnippet?: Snippet<[]>
10
+ trueOptionSnippet?: Snippet<[]>
11
+ }
12
+
13
+ let {
14
+ value = $bindable(),
15
+ rounded = false,
16
+ onchange,
17
+ falseOptionSnippet,
18
+ trueOptionSnippet,
19
+ }: Props = $props();
3
20
  </script>
4
21
 
5
22
  <div
@@ -1,6 +1,38 @@
1
- <script lang="ts">import { fly } from "svelte/transition";
2
- let { value = $bindable(), height = "100%", width = "100%", backgroundColor, firstColor, secondColor = firstColor, fontSize = "12px", hoverBackgroundColor, hoverBoxShadow, animationDuration = 200, falseOptionSnippet, trueOptionSnippet, } = $props();
3
- let optionHeight = $state(undefined);
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import { fly } from "svelte/transition";
4
+
5
+ interface Props {
6
+ value?: boolean;
7
+ height?: string;
8
+ width?: string;
9
+ backgroundColor?: string;
10
+ firstColor?: string;
11
+ secondColor?: string;
12
+ fontSize?: string;
13
+ hoverBackgroundColor?: string;
14
+ hoverBoxShadow?: string;
15
+ animationDuration?: number;
16
+ trueOptionSnippet: Snippet<[]>
17
+ falseOptionSnippet: Snippet<[]>
18
+ }
19
+
20
+ let {
21
+ value = $bindable(),
22
+ height = "100%",
23
+ width = "100%",
24
+ backgroundColor,
25
+ firstColor,
26
+ secondColor = firstColor,
27
+ fontSize = "12px",
28
+ hoverBackgroundColor,
29
+ hoverBoxShadow,
30
+ animationDuration = 200,
31
+ falseOptionSnippet,
32
+ trueOptionSnippet,
33
+ }: Props = $props();
34
+
35
+ let optionHeight: number | undefined = $state(undefined);
4
36
  </script>
5
37
 
6
38
  <div
@@ -1,17 +1,48 @@
1
- <script lang="ts" module>export {};
1
+ <script lang="ts" module>
2
+ export type Box = {
3
+ name: string
4
+ label: string
5
+ href?: string
6
+ style?: {
7
+ width?: string
8
+ maxWidth?: string
9
+ minWidth?: string
10
+ }
11
+ };
2
12
  </script>
3
13
 
4
- <script lang="ts">import { Icon } from "../../..";
5
- let { boxes, gap = '15px', onboxClick, boxSnippet, } = $props();
6
- function handleBoxClick(event, box) {
7
- if (onboxClick) {
8
- onboxClick({
9
- detail: {
10
- box
11
- }
12
- });
14
+ <script lang="ts">
15
+ import { Icon } from "../../..";
16
+ import type { Snippet } from "svelte";
17
+
18
+ interface Props {
19
+ boxes: Box[];
20
+ gap?: string;
21
+ onboxClick?: (event: {
22
+ detail: {
23
+ box: Box
24
+ }
25
+ }) => void
26
+ boxSnippet?: Snippet<[{
27
+ box: Box
28
+ }]>
29
+ }
30
+
31
+ let { boxes,
32
+ gap = '15px',
33
+ onboxClick,
34
+ boxSnippet,
35
+ }: Props = $props();
36
+
37
+ function handleBoxClick(event: MouseEvent, box: Box) {
38
+ if(onboxClick) {
39
+ onboxClick({
40
+ detail: {
41
+ box
42
+ }
43
+ })
13
44
  }
14
- }
45
+ }
15
46
  </script>
16
47
 
17
48
  <ul style:gap class="box-list" role="listbox">
@@ -1,32 +1,90 @@
1
- <script lang="ts" module>export {};
1
+ <script lang="ts" module>
2
+ export type Option = {
3
+ label: string,
4
+ name: string,
5
+ icon?: string
6
+ };
2
7
  </script>
3
8
 
4
- <script lang="ts">import '../../../css/main.css';
5
- import './ColorInvertedSelector.css';
6
- import Icon from '../media/Icon.svelte';
7
- let { options, selectedIndex = $bindable(undefined), deletable = true, class: clazz = {}, ondelete, onselect, appendSnippet, optionSnippet, prependSnippet, } = $props();
8
- function handleOptionClick(option, index, e) {
9
- if (onselect) {
10
- onselect({
11
- detail: {
12
- option,
13
- selectedIndex,
14
- native: e
15
- }
16
- });
9
+ <script lang="ts">
10
+ import '../../../css/main.css'
11
+ import './ColorInvertedSelector.css'
12
+ import Icon from '../media/Icon.svelte'
13
+ import type { Snippet } from 'svelte';
14
+
15
+ interface Props {
16
+ options: Option[];
17
+ selectedIndex?: number;
18
+ deletable?: boolean;
19
+ class?: {
20
+ container?: string,
21
+ element?: string,
22
+ selected?: string,
17
23
  }
18
- selectedIndex = index;
19
- }
20
- function handleClickClose(option, index) {
21
- if (ondelete) {
22
- ondelete({
23
- detail: {
24
- option,
25
- index
26
- }
27
- });
24
+ onselect?: (event: {
25
+ detail: {
26
+ option: Option,
27
+ selectedIndex: number | undefined,
28
+ native: Event
29
+ }
30
+ }) => void
31
+ ondelete?: (event: {
32
+ detail: {
33
+ option: Option,
34
+ index: number
35
+ }
36
+ }) => void
37
+ prependSnippet?: Snippet<[{
38
+ option: Option,
39
+ index: number,
40
+ handleClickClose: (option: Option, index: number) => void
41
+ }]>
42
+ optionSnippet?: Snippet<[{
43
+ option: Option,
44
+ }]>
45
+ appendSnippet?: Snippet<[{
46
+ option: Option,
47
+ handleClickClose: (option: Option, index: number) => void
48
+ }]>
49
+ }
50
+
51
+ let {
52
+ options,
53
+ selectedIndex = $bindable(undefined),
54
+ deletable = true,
55
+ class: clazz = {},
56
+ ondelete,
57
+ onselect,
58
+ appendSnippet,
59
+ optionSnippet,
60
+ prependSnippet,
61
+ }: Props = $props();
62
+
63
+
64
+ function handleOptionClick(option: Option, index: number, e: Event) {
65
+ if(onselect){
66
+ onselect({
67
+ detail: {
68
+ option,
69
+ selectedIndex,
70
+ native: e
71
+ }
72
+ })
28
73
  }
29
- }
74
+
75
+ selectedIndex = index
76
+ }
77
+
78
+ function handleClickClose(option: Option, index: number) {
79
+ if(ondelete){
80
+ ondelete({
81
+ detail: {
82
+ option,
83
+ index
84
+ }
85
+ })
86
+ }
87
+ }
30
88
  </script>
31
89
 
32
90
  <ul
@@ -1,28 +1,63 @@
1
- <script lang="ts" module>export {};
1
+ <script lang="ts" module>
2
+ export type Option = {
3
+ label: string;
4
+ name: string;
5
+ icon?: string;
6
+ href?: string;
7
+ options?: Omit<Option, "options">[];
8
+ };
2
9
  </script>
3
10
 
4
- <script lang="ts">import "../../../css/main.css";
5
- import "./HierarchyMenu.css";
6
- import { Icon } from "../../..";
7
- import { slide } from "svelte/transition";
8
- import { sineIn } from "svelte/easing";
9
- let { options, selected = $bindable(undefined), expanded = [], iconsOnly = false, onoptionClick, appendSnippet, optionSnippet, prependSnippet, } = $props();
10
- function handleOptionClick(option) {
11
+ <script lang="ts">
12
+ import "../../../css/main.css";
13
+ import "./HierarchyMenu.css";
14
+ import { Icon } from "../../..";
15
+ import { slide } from "svelte/transition";
16
+ import { sineIn } from "svelte/easing";
17
+ import type { Snippet } from "svelte";
18
+
19
+ interface Props {
20
+ options: Option[];
21
+ selected?: string;
22
+ expanded?: string[];
23
+ iconsOnly?: boolean;
24
+ onoptionClick?: (event: {
25
+ detail: {
26
+ option: Option
27
+ }
28
+ }) => void
29
+ prependSnippet?: Snippet<[{ option: Option }]>
30
+ optionSnippet?: Snippet<[{ option: Option }]>
31
+ appendSnippet?: Snippet<[{ option: Option }]>
32
+ }
33
+
34
+ let {
35
+ options,
36
+ selected = $bindable(undefined),
37
+ expanded = [],
38
+ iconsOnly = false,
39
+ onoptionClick,
40
+ appendSnippet,
41
+ optionSnippet,
42
+ prependSnippet,
43
+ }: Props = $props();
44
+
45
+ function handleOptionClick(option: Option) {
11
46
  selected = option.name;
12
- if (onoptionClick) {
13
- onoptionClick({
14
- detail: {
15
- option
16
- }
17
- });
47
+ if(onoptionClick) {
48
+ onoptionClick({
49
+ detail: {
50
+ option
51
+ }
52
+ })
18
53
  }
19
- }
20
- function handleExpandOptionClick(option) {
54
+ }
55
+
56
+ function handleExpandOptionClick(option: Option) {
21
57
  if (expanded.includes(option.name))
22
- expanded = expanded.filter((e) => e !== option.name);
23
- else
24
- expanded = [...expanded, option.name];
25
- }
58
+ expanded = expanded.filter((e) => e !== option.name);
59
+ else expanded = [...expanded, option.name];
60
+ }
26
61
  </script>
27
62
 
28
63
  <div class="hierarchy-container">
@@ -1,48 +1,67 @@
1
- <script lang="ts">import "../../../css/main.css";
2
- import "./Paginator.css";
3
- import Icon from "../media/Icon.svelte";
4
- let { page = $bindable(1), maxPage = undefined, onchange, } = $props();
5
- function goToPage(p) {
6
- if (p <= 0 || (!!maxPage && p > maxPage))
7
- return;
1
+ <script lang="ts">
2
+ import "../../../css/main.css";
3
+ import "./Paginator.css";
4
+ import Icon from "../media/Icon.svelte";
5
+
6
+ interface Props {
7
+ page?: number;
8
+ maxPage?: number;
9
+ onchange?: (event: {
10
+ detail: {
11
+ page: number
12
+ }
13
+ }) => void
14
+ }
15
+
16
+ let {
17
+ page = $bindable(1),
18
+ maxPage = undefined,
19
+ onchange,
20
+ }: Props = $props();
21
+
22
+ function goToPage(p: number) {
23
+ if (p <= 0 || (!!maxPage && p > maxPage)) return;
8
24
  page = p;
9
25
  emitChange();
10
- }
11
- function previousPage() {
12
- if (page == 1)
13
- return;
26
+ }
27
+
28
+ function previousPage() {
29
+ if (page == 1) return;
14
30
  page -= 1;
15
31
  emitChange();
16
- }
17
- function hardPrevious() {
32
+ }
33
+
34
+ function hardPrevious() {
18
35
  page = 1;
19
36
  emitChange();
20
- }
21
- function nextPage() {
22
- if (!!maxPage && page >= maxPage)
23
- return;
37
+ }
38
+
39
+ function nextPage() {
40
+ if (!!maxPage && page >= maxPage) return;
24
41
  page += 1;
25
42
  emitChange();
26
- }
27
- function hardNext() {
28
- if (!maxPage)
29
- return;
43
+ }
44
+
45
+ function hardNext() {
46
+ if (!maxPage) return;
30
47
  page = maxPage;
31
48
  emitChange();
32
- }
33
- function emitChange() {
34
- if (onchange) {
35
- onchange({
36
- detail: {
37
- page
38
- }
39
- });
49
+ }
50
+
51
+ function emitChange() {
52
+ if(onchange) {
53
+ onchange({
54
+ detail: {
55
+ page
56
+ }
57
+ })
40
58
  }
41
- }
42
- $effect(() => {
43
- if (!!maxPage && page > maxPage)
44
- page = maxPage;
45
- });
59
+ }
60
+
61
+ $effect(() => {
62
+ if (!!maxPage && page > maxPage)
63
+ page = maxPage;
64
+ })
46
65
  </script>
47
66
 
48
67
  <div class="paginator-container">
@@ -1,22 +1,58 @@
1
- <script lang="ts" module>export {};
1
+ <script lang="ts" module>
2
+ type Divider = {
3
+ divider: true,
4
+ marginTop?: string,
5
+ marginBottom?: string,
6
+ marginRight?: string,
7
+ marginLeft?: string
8
+ }
9
+
10
+ type Item = {
11
+ name: string | number,
12
+ label: string,
13
+ icon: string,
14
+ disabled?: boolean,
15
+ divider?: undefined | false
16
+ }
17
+
18
+ export type MenuItem = Divider | Item;
2
19
  </script>
3
20
 
4
- <script lang="ts">import '../../../css/main.css';
5
- import './SelectableMenuList.css';
6
- import Icon from "../media/Icon.svelte";
7
- let { collapsed = $bindable(false), items = [], selected = $bindable(undefined), onselect, } = $props();
8
- function handleItemClick(item) {
9
- if (item.disabled)
10
- return;
11
- selected = item.name;
12
- if (onselect) {
13
- onselect({
14
- detail: {
15
- item
16
- }
17
- });
21
+ <script lang="ts">
22
+ import '../../../css/main.css'
23
+ import './SelectableMenuList.css'
24
+ import Icon from "../media/Icon.svelte";
25
+
26
+ interface Props {
27
+ collapsed?: boolean;
28
+ items?: MenuItem[];
29
+ selected?: string | number;
30
+ onselect?: (event: {
31
+ detail: {
32
+ item: Item
33
+ }
34
+ }) => void
35
+ }
36
+
37
+ let {
38
+ collapsed = $bindable(false),
39
+ items = [],
40
+ selected = $bindable(undefined),
41
+ onselect,
42
+ }: Props = $props();
43
+
44
+ function handleItemClick(item: Item) {
45
+ if(item.disabled) return
46
+
47
+ selected = item.name
48
+ if(onselect) {
49
+ onselect({
50
+ detail: {
51
+ item
52
+ }
53
+ })
18
54
  }
19
- }
55
+ }
20
56
  </script>
21
57
 
22
58
  <div