@x33025/sveltely 0.1.1 → 0.1.3

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 (156) hide show
  1. package/dist/components/Library/AnimatedNumber/AnimatedNumber.demo.svelte +1 -1
  2. package/dist/components/Library/AsyncButton/AsyncButton.svelte +42 -16
  3. package/dist/components/Library/Button/Button.demo.svelte +5 -3
  4. package/dist/components/Library/Button/Button.demo.svelte.d.ts +1 -0
  5. package/dist/components/Library/Button/Button.svelte +21 -13
  6. package/dist/components/Library/Calendar/Calendar.demo.svelte +2 -14
  7. package/dist/components/Library/Calendar/Calendar.svelte +69 -65
  8. package/dist/components/Library/Checkbox/Checkbox.svelte +13 -14
  9. package/dist/components/Library/ChipInput/ChipInput.demo.svelte +1 -1
  10. package/dist/components/Library/ChipInput/ChipInput.svelte +7 -4
  11. package/dist/components/Library/Divider/Divider.svelte +10 -0
  12. package/dist/components/Library/Divider/Divider.svelte.d.ts +26 -0
  13. package/dist/components/Library/Divider/index.d.ts +1 -0
  14. package/dist/components/Library/Divider/index.js +1 -0
  15. package/dist/components/Library/Dropdown/Action.svelte +60 -0
  16. package/dist/components/Library/Dropdown/Action.svelte.d.ts +11 -0
  17. package/dist/components/Library/Dropdown/Divider.svelte +5 -0
  18. package/dist/components/Library/Dropdown/Divider.svelte.d.ts +19 -0
  19. package/dist/components/Library/Dropdown/Dropdown.demo.svelte +182 -65
  20. package/dist/components/Library/Dropdown/Dropdown.demo.svelte.d.ts +2 -1
  21. package/dist/components/Library/Dropdown/Dropdown.svelte +95 -250
  22. package/dist/components/Library/Dropdown/Dropdown.svelte.d.ts +17 -16
  23. package/dist/components/Library/Dropdown/Item.svelte +68 -0
  24. package/dist/components/Library/Dropdown/Item.svelte.d.ts +31 -0
  25. package/dist/components/Library/Dropdown/Section.svelte +34 -0
  26. package/dist/components/Library/Dropdown/Section.svelte.d.ts +8 -0
  27. package/dist/components/Library/Dropdown/context.d.ts +34 -0
  28. package/dist/components/Library/Dropdown/context.js +6 -0
  29. package/dist/components/Library/Dropdown/index.d.ts +13 -2
  30. package/dist/components/Library/Dropdown/index.js +11 -1
  31. package/dist/components/Library/Floating/Floating.svelte +44 -7
  32. package/dist/components/Library/ForEach/ForEach.svelte +14 -0
  33. package/dist/components/Library/ForEach/ForEach.svelte.d.ts +28 -0
  34. package/dist/components/Library/ForEach/index.d.ts +1 -0
  35. package/dist/components/Library/ForEach/index.js +1 -0
  36. package/dist/components/Library/Grid/Grid.svelte +74 -0
  37. package/dist/components/Library/Grid/Grid.svelte.d.ts +13 -0
  38. package/dist/components/Library/Grid/index.d.ts +1 -0
  39. package/dist/components/Library/Grid/index.js +1 -0
  40. package/dist/components/Library/GridItem/GridItem.svelte +65 -0
  41. package/dist/components/Library/GridItem/GridItem.svelte.d.ts +14 -0
  42. package/dist/components/Library/GridItem/index.d.ts +1 -0
  43. package/dist/components/Library/GridItem/index.js +1 -0
  44. package/dist/components/Library/HStack/HStack.svelte +45 -0
  45. package/dist/components/Library/HStack/HStack.svelte.d.ts +9 -0
  46. package/dist/components/Library/HStack/index.d.ts +1 -0
  47. package/dist/components/Library/HStack/index.js +1 -0
  48. package/dist/components/Library/Image/Image.demo.svelte +18 -0
  49. package/dist/components/Library/Image/Image.demo.svelte.d.ts +23 -0
  50. package/dist/components/Library/Image/Image.svelte +57 -0
  51. package/dist/components/Library/Image/Image.svelte.d.ts +17 -0
  52. package/dist/components/Library/Image/ImagePlaceholder.svelte +202 -0
  53. package/dist/components/Library/Image/ImagePlaceholder.svelte.d.ts +7 -0
  54. package/dist/components/Library/Image/index.d.ts +1 -0
  55. package/dist/components/Library/Image/index.js +1 -0
  56. package/dist/components/Library/ImageMask/BrushPreview.svelte +119 -0
  57. package/dist/components/Library/ImageMask/BrushPreview.svelte.d.ts +11 -0
  58. package/dist/components/Library/ImageMask/ImageMask.demo.svelte +117 -0
  59. package/dist/components/Library/ImageMask/ImageMask.demo.svelte.d.ts +10 -0
  60. package/dist/components/Library/ImageMask/ImageMask.svelte +46 -0
  61. package/dist/components/Library/ImageMask/ImageMask.svelte.d.ts +20 -0
  62. package/dist/components/Library/ImageMask/MaskLayer.svelte +341 -0
  63. package/dist/components/Library/ImageMask/MaskLayer.svelte.d.ts +12 -0
  64. package/dist/components/Library/ImageMask/contour.d.ts +11 -0
  65. package/dist/components/Library/ImageMask/contour.js +152 -0
  66. package/dist/components/Library/ImageMask/index.d.ts +2 -0
  67. package/dist/components/Library/ImageMask/index.js +1 -0
  68. package/dist/components/Library/ImageMask/marchingAnts.d.ts +8 -0
  69. package/dist/components/Library/ImageMask/marchingAnts.js +29 -0
  70. package/dist/components/Library/ImageMask/maskSurface.d.ts +5 -0
  71. package/dist/components/Library/ImageMask/maskSurface.js +94 -0
  72. package/dist/components/Library/ImageMask/types.d.ts +23 -0
  73. package/dist/components/Library/Label/Label.demo.svelte +28 -0
  74. package/dist/components/Library/Label/Label.demo.svelte.d.ts +9 -0
  75. package/dist/components/Library/Label/Label.svelte +175 -0
  76. package/dist/components/Library/Label/Label.svelte.d.ts +18 -0
  77. package/dist/components/Library/Label/index.d.ts +1 -0
  78. package/dist/components/Library/Label/index.js +1 -0
  79. package/dist/components/Library/NavigationStack/NavigationStack.svelte +17 -7
  80. package/dist/components/Library/NavigationStack/Toolbar.svelte +7 -2
  81. package/dist/components/Library/NumberField/NumberField.demo.svelte +21 -0
  82. package/dist/components/Library/NumberField/NumberField.demo.svelte.d.ts +8 -0
  83. package/dist/components/Library/NumberField/NumberField.svelte +199 -0
  84. package/dist/components/Library/NumberField/NumberField.svelte.d.ts +21 -0
  85. package/dist/components/Library/NumberField/index.d.ts +1 -0
  86. package/dist/components/Library/NumberField/index.js +1 -0
  87. package/dist/components/Library/Pagination/Pagination.svelte +16 -20
  88. package/dist/components/Library/Popover/Popover.demo.svelte +2 -2
  89. package/dist/components/Library/Popover/Popover.svelte +7 -4
  90. package/dist/components/Library/ScrollView/ScrollView.svelte +165 -12
  91. package/dist/components/Library/ScrollView/ScrollView.svelte.d.ts +32 -4
  92. package/dist/components/Library/ScrollView/index.d.ts +1 -0
  93. package/dist/components/Library/{SearchInput/SearchInput.demo.svelte → SearchField/SearchField.demo.svelte} +4 -4
  94. package/dist/components/Library/SearchField/SearchField.demo.svelte.d.ts +8 -0
  95. package/dist/components/Library/{SearchInput/SearchInput.svelte → SearchField/SearchField.svelte} +26 -30
  96. package/dist/components/Library/{SearchInput/SearchInput.svelte.d.ts → SearchField/SearchField.svelte.d.ts} +3 -3
  97. package/dist/components/Library/SearchField/index.d.ts +1 -0
  98. package/dist/components/Library/SearchField/index.js +1 -0
  99. package/dist/components/Library/SegmentedPicker/SegmentedPicker.demo.svelte +1 -1
  100. package/dist/components/Library/SegmentedPicker/SegmentedPicker.svelte +9 -9
  101. package/dist/components/Library/Sheet/Sheet.demo.svelte +1 -1
  102. package/dist/components/Library/Sheet/Sheet.svelte +8 -5
  103. package/dist/components/Library/Slider/Slider.demo.svelte +1 -1
  104. package/dist/components/Library/Slider/Slider.svelte +11 -10
  105. package/dist/components/Library/Spacer/Spacer.svelte +7 -0
  106. package/dist/components/Library/Spacer/Spacer.svelte.d.ts +26 -0
  107. package/dist/components/Library/Spacer/index.d.ts +1 -0
  108. package/dist/components/Library/Spacer/index.js +1 -0
  109. package/dist/components/Library/Spinner/Spinner.demo.svelte +1 -1
  110. package/dist/components/Library/Switch/Switch.svelte +6 -11
  111. package/dist/components/Library/TextField/TextField.demo.svelte +14 -0
  112. package/dist/components/Library/TextField/TextField.demo.svelte.d.ts +8 -0
  113. package/dist/components/Library/TextField/TextField.svelte +154 -0
  114. package/dist/components/Library/TextField/TextField.svelte.d.ts +19 -0
  115. package/dist/components/Library/TextField/index.d.ts +1 -0
  116. package/dist/components/Library/TextField/index.js +1 -0
  117. package/dist/components/Library/{TokenSearchInput/TokenSearchInput.demo.svelte → TokenSearchField/TokenSearchField.demo.svelte} +4 -4
  118. package/dist/components/Library/TokenSearchField/TokenSearchField.demo.svelte.d.ts +9 -0
  119. package/dist/components/Library/{TokenSearchInput/TokenSearchInput.svelte → TokenSearchField/TokenSearchField.svelte} +70 -66
  120. package/dist/components/Library/{TokenSearchInput/TokenSearchInput.svelte.d.ts → TokenSearchField/TokenSearchField.svelte.d.ts} +3 -3
  121. package/dist/components/Library/TokenSearchField/index.d.ts +1 -0
  122. package/dist/components/Library/TokenSearchField/index.js +1 -0
  123. package/dist/components/Library/VStack/VStack.svelte +45 -0
  124. package/dist/components/Library/VStack/VStack.svelte.d.ts +9 -0
  125. package/dist/components/Library/VStack/index.d.ts +1 -0
  126. package/dist/components/Library/VStack/index.js +1 -0
  127. package/dist/components/Library/WheelPicker/WheelColumn.svelte +4 -10
  128. package/dist/components/Library/WheelPicker/WheelPicker.svelte +5 -9
  129. package/dist/components/Local/ComponentGrid.svelte +15 -31
  130. package/dist/components/Local/HeroCard.svelte +30 -38
  131. package/dist/components/Local/HeroCard.svelte.d.ts +0 -2
  132. package/dist/components/Local/StyleControls.svelte +58 -27
  133. package/dist/components/Local/StyleControls.svelte.d.ts +3 -1
  134. package/dist/index.d.ts +26 -2
  135. package/dist/index.js +19 -2
  136. package/dist/style/index.css +35 -20
  137. package/dist/style/label.d.ts +6 -0
  138. package/dist/style/label.js +4 -0
  139. package/dist/style/layout.d.ts +57 -0
  140. package/dist/style/layout.js +128 -0
  141. package/dist/style/media.d.ts +12 -0
  142. package/dist/style/media.js +8 -0
  143. package/dist/style/scroll.d.ts +7 -0
  144. package/dist/style/scroll.js +5 -0
  145. package/dist/style/text-editor.d.ts +34 -0
  146. package/dist/style/text-editor.js +29 -0
  147. package/dist/style.css +112 -58
  148. package/package.json +1 -1
  149. package/dist/components/Library/Dropdown/types.d.ts +0 -27
  150. package/dist/components/Library/SearchInput/SearchInput.demo.svelte.d.ts +0 -8
  151. package/dist/components/Library/SearchInput/index.d.ts +0 -1
  152. package/dist/components/Library/SearchInput/index.js +0 -1
  153. package/dist/components/Library/TokenSearchInput/TokenSearchInput.demo.svelte.d.ts +0 -9
  154. package/dist/components/Library/TokenSearchInput/index.d.ts +0 -1
  155. package/dist/components/Library/TokenSearchInput/index.js +0 -1
  156. /package/dist/components/Library/{Dropdown → ImageMask}/types.js +0 -0
@@ -0,0 +1,60 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { getDropdownContext, type DropdownActionState } from './context';
4
+
5
+ type Props = {
6
+ disabled?: boolean;
7
+ closeOnSelect?: boolean;
8
+ children?: Snippet<[DropdownActionState]>;
9
+ onclick?: (event: MouseEvent) => void;
10
+ };
11
+
12
+ let { disabled = false, closeOnSelect, children, onclick }: Props = $props();
13
+
14
+ const dropdown = getDropdownContext();
15
+ const resolvedDisabled = $derived(dropdown.disabled || disabled);
16
+ const resolvedCloseOnSelect = $derived(closeOnSelect ?? dropdown.closeOnSelect);
17
+
18
+ function handleClick(event: MouseEvent) {
19
+ if (resolvedDisabled) return;
20
+ onclick?.(event);
21
+ if (!event.defaultPrevented && resolvedCloseOnSelect) dropdown.close();
22
+ }
23
+ </script>
24
+
25
+ <button
26
+ type="button"
27
+ class="dropdown-action inline-flex items-center text-left"
28
+ data-popover-radius-source
29
+ disabled={resolvedDisabled}
30
+ onclick={handleClick}
31
+ >
32
+ {#if children}
33
+ {@render children({
34
+ disabled: resolvedDisabled,
35
+ close: dropdown.close
36
+ })}
37
+ {/if}
38
+ </button>
39
+
40
+ <style>
41
+ .dropdown-action {
42
+ width: 100%;
43
+ gap: calc(var(--sveltely-inset) * 2);
44
+ border-radius: var(--dropdown-item-radius, var(--sveltely-border-radius-nested));
45
+ padding: var(--dropdown-item-padding-y) var(--dropdown-item-padding-x);
46
+ }
47
+
48
+ .dropdown-action :global(*) {
49
+ border-radius: inherit;
50
+ }
51
+
52
+ .dropdown-action:hover {
53
+ background: var(--sveltely-hover-color);
54
+ }
55
+
56
+ .dropdown-action:disabled {
57
+ cursor: not-allowed;
58
+ opacity: 0.5;
59
+ }
60
+ </style>
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { type DropdownActionState } from './context';
3
+ type Props = {
4
+ disabled?: boolean;
5
+ closeOnSelect?: boolean;
6
+ children?: Snippet<[DropdownActionState]>;
7
+ onclick?: (event: MouseEvent) => void;
8
+ };
9
+ declare const Action: import("svelte").Component<Props, {}, "">;
10
+ type Action = ReturnType<typeof Action>;
11
+ export default Action;
@@ -0,0 +1,5 @@
1
+ <script lang="ts">
2
+ import Divider from '../Divider';
3
+ </script>
4
+
5
+ <Divider />
@@ -0,0 +1,19 @@
1
+ import Divider from '../Divider';
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const Divider: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
16
+ [evt: string]: CustomEvent<any>;
17
+ }, {}, {}, string>;
18
+ type Divider = InstanceType<typeof Divider>;
19
+ export default Divider;
@@ -1,82 +1,199 @@
1
1
  <script module lang="ts">
2
2
  export const demo = {
3
3
  name: 'Dropdown',
4
- description: 'Structured dropdown menu with grouped items and automatic close on selection.'
4
+ description: 'Composable dropdown menu with declarative items, sections, and actions.',
5
+ columnSpan: 2
5
6
  };
6
7
  </script>
7
8
 
8
9
  <script lang="ts">
9
- import Dropdown from './Dropdown.svelte';
10
+ import { CheckIcon, ChevronDownIcon, PlusIcon, UserRoundXIcon } from '@lucide/svelte';
11
+ import SearchField from '../SearchField';
12
+ import ScrollView, { type ScrollGeometry } from '../ScrollView';
13
+ import Dropdown from './index';
10
14
 
11
- const allItems = [
12
- {
13
- type: 'group' as const,
14
- label: 'Publishing',
15
- items: [
16
- { label: 'Draft', value: 'draft' },
17
- { label: 'Scheduled', value: 'scheduled' },
18
- {
19
- type: 'submenu' as const,
20
- label: 'Advanced',
21
- items: [
22
- { label: 'Review queue', value: 'review' },
23
- {
24
- type: 'action' as const,
25
- label: 'Open workflow',
26
- onSelect: () => {
27
- console.log('Open workflow');
28
- }
29
- }
30
- ]
31
- },
32
- {
33
- type: 'action' as const,
34
- label: 'Create new status',
35
- onSelect: () => {
36
- console.log('Create new status');
37
- }
38
- }
39
- ]
40
- },
41
- {
42
- type: 'group' as const,
43
- label: 'Visibility',
44
- items: [
45
- { label: 'Public', value: 'public' },
46
- { label: 'Private', value: 'private', disabled: true }
47
- ]
48
- }
15
+ type Website = {
16
+ id: string;
17
+ name: string;
18
+ domain: string | null;
19
+ };
20
+
21
+ const statusLabels: Record<string, string> = {
22
+ draft: 'Draft',
23
+ scheduled: 'Scheduled',
24
+ public: 'Public',
25
+ private: 'Private'
26
+ };
27
+
28
+ const websites: Website[] = [
29
+ { id: 'sveltely', name: 'Sveltely', domain: 'sveltely.dev' },
30
+ { id: 'northstar', name: 'Northstar Studio', domain: 'northstar.example' },
31
+ { id: 'atlas', name: 'Atlas Analytics', domain: 'atlas.example' },
32
+ { id: 'folio', name: 'Folio', domain: null },
33
+ { id: 'harbor', name: 'Harbor CMS', domain: 'harbor.example' },
34
+ { id: 'beam', name: 'Beam Commerce', domain: 'beam.example' },
35
+ { id: 'signal', name: 'Signal CRM', domain: 'signal.example' },
36
+ { id: 'lumen', name: 'Lumen Health', domain: 'lumen.example' },
37
+ { id: 'orbit', name: 'Orbit Travel', domain: 'orbit.example' },
38
+ { id: 'canvas', name: 'Canvas Studio', domain: 'canvas.example' },
39
+ { id: 'ledger', name: 'Ledger Works', domain: 'ledger.example' },
40
+ { id: 'summit', name: 'Summit Labs', domain: 'summit.example' },
41
+ { id: 'keystone', name: 'Keystone Legal', domain: 'keystone.example' },
42
+ { id: 'prairie', name: 'Prairie Supply', domain: 'prairie.example' },
43
+ { id: 'fieldnote', name: 'Fieldnote', domain: null },
44
+ { id: 'vertex', name: 'Vertex Systems', domain: 'vertex.example' }
49
45
  ];
50
46
 
51
- const filterEntries = (entries: typeof allItems, query: string): typeof allItems => {
52
- const normalizedQuery = query.trim().toLowerCase();
53
- if (!normalizedQuery) return allItems;
47
+ let status = $state<string | null>('draft');
48
+ let selectedWebsiteId = $state<string | null>('sveltely');
49
+ let websiteQuery = $state('');
50
+ let visibleWebsiteCount = $state(6);
51
+ let actionCount = $state(0);
52
+ let lastWebsiteQuery = '';
53
+ const websiteBatchSize = 4;
54
54
 
55
- return entries.flatMap((entry) => {
56
- if (entry.type === 'group') {
57
- const nextItems = filterEntries(entry.items, normalizedQuery);
58
- return nextItems.length > 0 ? [{ ...entry, items: nextItems }] : [];
59
- }
55
+ const selectedStatusLabel = $derived(status ? statusLabels[status] : null);
56
+ const selectedWebsite = $derived(
57
+ websites.find((website) => website.id === selectedWebsiteId) ?? null
58
+ );
59
+ const filteredWebsites = $derived.by(() => {
60
+ const query = websiteQuery.trim().toLowerCase();
61
+ if (!query) return websites;
62
+ return websites.filter((website) =>
63
+ [website.name, website.domain ?? ''].some((value) => value.toLowerCase().includes(query))
64
+ );
65
+ });
66
+ const visibleWebsites = $derived(filteredWebsites.slice(0, visibleWebsiteCount));
60
67
 
61
- if (entry.type === 'submenu') {
62
- const nextItems = filterEntries(entry.items, normalizedQuery);
63
- const matches = entry.label.toLowerCase().includes(normalizedQuery);
64
- if (!matches && nextItems.length === 0) {
65
- return [];
66
- }
67
- return [{ ...entry, items: matches ? entry.items : nextItems }];
68
- }
68
+ function createWebsite() {
69
+ actionCount += 1;
70
+ }
69
71
 
70
- return entry.label.toLowerCase().includes(normalizedQuery) ? [entry] : [];
71
- });
72
- };
72
+ function loadMoreWebsites() {
73
+ visibleWebsiteCount = Math.min(filteredWebsites.length, visibleWebsiteCount + websiteBatchSize);
74
+ }
73
75
 
74
- let items = $state(allItems);
75
- let value = $state<string | null>('draft');
76
+ function handleWebsiteScroll(geometry: ScrollGeometry) {
77
+ if (visibleWebsiteCount >= filteredWebsites.length) return;
78
+ if (geometry.progress.y < 0.8) return;
79
+ loadMoreWebsites();
80
+ }
76
81
 
77
- const handleSearch = async (query: string) => {
78
- items = filterEntries(allItems, query);
79
- };
82
+ $effect(() => {
83
+ const nextQuery = websiteQuery.trim().toLowerCase();
84
+ if (nextQuery === lastWebsiteQuery) return;
85
+ lastWebsiteQuery = nextQuery;
86
+ visibleWebsiteCount = 6;
87
+ });
80
88
  </script>
81
89
 
82
- <Dropdown {items} bind:value placeholder="Choose status" onSearch={handleSearch} />
90
+ <div class="grid w-full gap-4 md:grid-cols-2">
91
+ <div class="vstack gap-2">
92
+ <p class="text-sm font-medium text-[var(--sveltely-primary-color)]">Default trigger</p>
93
+ <Dropdown bind:value={status} placeholder="Choose status" selectedLabel={selectedStatusLabel}>
94
+ <Dropdown.Section label="Publishing">
95
+ <Dropdown.Item value="draft">Draft</Dropdown.Item>
96
+ <Dropdown.Item value="scheduled">Scheduled</Dropdown.Item>
97
+ <Dropdown.Divider />
98
+ <Dropdown.Action onclick={() => (actionCount += 1)}>Open workflow</Dropdown.Action>
99
+ <Dropdown.Action onclick={() => (actionCount += 1)}>Create new status</Dropdown.Action>
100
+ </Dropdown.Section>
101
+ <Dropdown.Section label="Visibility">
102
+ <Dropdown.Item value="public">Public</Dropdown.Item>
103
+ <Dropdown.Item value="private" disabled>Private</Dropdown.Item>
104
+ </Dropdown.Section>
105
+ </Dropdown>
106
+ <p class="text-xs text-[var(--sveltely-secondary-color)]">
107
+ Selected: {selectedStatusLabel ?? 'none'}
108
+ </p>
109
+ </div>
110
+
111
+ <div class="vstack gap-2">
112
+ <p class="text-sm font-medium text-[var(--sveltely-primary-color)]">
113
+ Custom trigger and rich rows
114
+ </p>
115
+ <Dropdown
116
+ bind:value={selectedWebsiteId}
117
+ selectedLabel={selectedWebsite?.name ?? null}
118
+ showCheck={false}
119
+ >
120
+ {#snippet trigger(dropdown)}
121
+ <button
122
+ use:dropdown.useTrigger
123
+ type="button"
124
+ class="hstack w-full items-center gap-2 rounded-full border px-3 py-2 pr-2 text-left text-sm"
125
+ style="border-color: var(--sveltely-border-color); background: var(--sveltely-background-color);"
126
+ aria-expanded={dropdown.open}
127
+ aria-haspopup="dialog"
128
+ onclick={dropdown.toggle}
129
+ >
130
+ {#if selectedWebsite}
131
+ <span class="min-w-0 flex-1 truncate text-[var(--sveltely-primary-color)]"
132
+ >{selectedWebsite.name}</span
133
+ >
134
+ {#if selectedWebsite.domain}
135
+ <span class="max-w-32 truncate text-xs text-[var(--sveltely-secondary-color)]"
136
+ >{selectedWebsite.domain}</span
137
+ >
138
+ {/if}
139
+ {:else}
140
+ <span class="min-w-0 flex-1 text-[var(--sveltely-secondary-color)]">Select website</span
141
+ >
142
+ {/if}
143
+ <ChevronDownIcon size={14} class="shrink-0 text-[var(--sveltely-secondary-color)]" />
144
+ </button>
145
+ {/snippet}
146
+
147
+ <SearchField bind:value={websiteQuery} placeholder="Search websites..." />
148
+ <Dropdown.Action onclick={createWebsite}>
149
+ <PlusIcon size={14} />
150
+ <span>Create website</span>
151
+ </Dropdown.Action>
152
+ <Dropdown.Divider />
153
+ <Dropdown.Item value={null}>
154
+ <UserRoundXIcon size={14} />
155
+ <span>No website</span>
156
+ </Dropdown.Item>
157
+ <Dropdown.Section label="Websites">
158
+ {#if filteredWebsites.length === 0}
159
+ <div class="px-2 py-1 text-sm text-[var(--sveltely-secondary-color)]">
160
+ No websites found.
161
+ </div>
162
+ {:else}
163
+ <div class="h-36">
164
+ <ScrollView
165
+ contentStyles={{ paddingX: 0, paddingY: 0 }}
166
+ borderRadius="var(--sveltely-border-radius-nested)"
167
+ background="white"
168
+ onScroll={handleWebsiteScroll}
169
+ >
170
+ <div class="vstack gap-1">
171
+ {#each visibleWebsites as website (website.id)}
172
+ <Dropdown.Item value={website.id}>
173
+ {#snippet children({ selected })}
174
+ <div class="vstack min-w-0 gap-0.5">
175
+ <span class="truncate">{website.name}</span>
176
+ {#if website.domain}
177
+ <span class="truncate text-xs text-[var(--sveltely-secondary-color)]"
178
+ >{website.domain}</span
179
+ >
180
+ {/if}
181
+ </div>
182
+ {#if selected}
183
+ <CheckIcon
184
+ size={14}
185
+ class="shrink-0 text-[var(--sveltely-primary-color)]"
186
+ />
187
+ {/if}
188
+ {/snippet}
189
+ </Dropdown.Item>
190
+ {/each}
191
+ </div>
192
+ </ScrollView>
193
+ </div>
194
+ {/if}
195
+ </Dropdown.Section>
196
+ </Dropdown>
197
+ <p class="text-xs text-[var(--sveltely-secondary-color)]">Actions clicked: {actionCount}</p>
198
+ </div>
199
+ </div>
@@ -1,8 +1,9 @@
1
1
  export declare const demo: {
2
2
  name: string;
3
3
  description: string;
4
+ columnSpan: number;
4
5
  };
5
- import Dropdown from './Dropdown.svelte';
6
+ import Dropdown from './index';
6
7
  declare const Dropdown: import("svelte").Component<Record<string, never>, {}, "">;
7
8
  type Dropdown = ReturnType<typeof Dropdown>;
8
9
  export default Dropdown;