twintrinsic 0.0.1

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 (212) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +150 -0
  3. package/dist/App/App.svelte +54 -0
  4. package/dist/App/App.svelte.d.ts +65 -0
  5. package/dist/Section.svelte +25 -0
  6. package/dist/Section.svelte.d.ts +34 -0
  7. package/dist/actions/clickOutside.d.ts +9 -0
  8. package/dist/actions/clickOutside.js +19 -0
  9. package/dist/actions/index.d.ts +1 -0
  10. package/dist/actions/index.js +1 -0
  11. package/dist/components/Accordion/Accordion.svelte +75 -0
  12. package/dist/components/Accordion/Accordion.svelte.d.ts +39 -0
  13. package/dist/components/Accordion/AccordionItem.svelte +150 -0
  14. package/dist/components/Accordion/AccordionItem.svelte.d.ts +30 -0
  15. package/dist/components/App/App.story.md +8 -0
  16. package/dist/components/App/App.story.svelte +170 -0
  17. package/dist/components/App/App.story.svelte.d.ts +22 -0
  18. package/dist/components/App/App.svelte +77 -0
  19. package/dist/components/App/App.svelte.d.ts +66 -0
  20. package/dist/components/App/Split.svelte +346 -0
  21. package/dist/components/App/Split.svelte.d.ts +54 -0
  22. package/dist/components/App/index.d.ts +2 -0
  23. package/dist/components/App/index.js +3 -0
  24. package/dist/components/AppHeader/AppHeader.svelte +439 -0
  25. package/dist/components/AppHeader/AppHeader.svelte.d.ts +24 -0
  26. package/dist/components/Avatar/Avatar.svelte +300 -0
  27. package/dist/components/Avatar/Avatar.svelte.d.ts +48 -0
  28. package/dist/components/Avatar/AvatarGroup.svelte +185 -0
  29. package/dist/components/Avatar/AvatarGroup.svelte.d.ts +46 -0
  30. package/dist/components/Badge/Badge.svelte +186 -0
  31. package/dist/components/Badge/Badge.svelte.d.ts +51 -0
  32. package/dist/components/BottomBar/BottomBar.svelte +146 -0
  33. package/dist/components/BottomBar/BottomBar.svelte.d.ts +38 -0
  34. package/dist/components/Breadcrumb/Breadcrumb.svelte +77 -0
  35. package/dist/components/Breadcrumb/Breadcrumb.svelte.d.ts +42 -0
  36. package/dist/components/Breadcrumb/BreadcrumbItem.svelte +171 -0
  37. package/dist/components/Breadcrumb/BreadcrumbItem.svelte.d.ts +38 -0
  38. package/dist/components/Button/Button.svelte +252 -0
  39. package/dist/components/Button/Button.svelte.d.ts +80 -0
  40. package/dist/components/Button/ButtonGroup.svelte +127 -0
  41. package/dist/components/Button/ButtonGroup.svelte.d.ts +44 -0
  42. package/dist/components/Card/Card.svelte +152 -0
  43. package/dist/components/Card/Card.svelte.d.ts +55 -0
  44. package/dist/components/Carousel/Carousel.svelte +461 -0
  45. package/dist/components/Carousel/Carousel.svelte.d.ts +79 -0
  46. package/dist/components/Carousel/CarouselItem.svelte +149 -0
  47. package/dist/components/Carousel/CarouselItem.svelte.d.ts +35 -0
  48. package/dist/components/Chip/Chip.svelte +288 -0
  49. package/dist/components/Chip/Chip.svelte.d.ts +71 -0
  50. package/dist/components/Chip/ChipGroup.svelte +190 -0
  51. package/dist/components/Chip/ChipGroup.svelte.d.ts +71 -0
  52. package/dist/components/CodeBlock/CodeBlock.svelte +356 -0
  53. package/dist/components/CodeBlock/CodeBlock.svelte.d.ts +44 -0
  54. package/dist/components/CodeBlock/index.d.ts +1 -0
  55. package/dist/components/CodeBlock/index.js +1 -0
  56. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte +145 -0
  57. package/dist/components/CodeBlockSpeed/CodeBlockSpeed.svelte.d.ts +44 -0
  58. package/dist/components/CodeEditor/CodeEditor.svelte +229 -0
  59. package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +23 -0
  60. package/dist/components/Combobox/Combobox.svelte +279 -0
  61. package/dist/components/Combobox/Combobox.svelte.d.ts +34 -0
  62. package/dist/components/Container/Container.svelte +45 -0
  63. package/dist/components/Container/Container.svelte.d.ts +36 -0
  64. package/dist/components/DataTable/DataTable.svelte +879 -0
  65. package/dist/components/DataTable/DataTable.svelte.d.ts +102 -0
  66. package/dist/components/Form/AutoComplete.svelte +357 -0
  67. package/dist/components/Form/AutoComplete.svelte.d.ts +73 -0
  68. package/dist/components/Form/Calendar.svelte +429 -0
  69. package/dist/components/Form/Calendar.svelte.d.ts +53 -0
  70. package/dist/components/Form/Checkbox.svelte +196 -0
  71. package/dist/components/Form/Checkbox.svelte.d.ts +50 -0
  72. package/dist/components/Form/ColorPicker.svelte +396 -0
  73. package/dist/components/Form/ColorPicker.svelte.d.ts +43 -0
  74. package/dist/components/Form/Combobox.svelte +645 -0
  75. package/dist/components/Form/Combobox.svelte.d.ts +93 -0
  76. package/dist/components/Form/Dropdown.svelte +773 -0
  77. package/dist/components/Form/Dropdown.svelte.d.ts +81 -0
  78. package/dist/components/Form/FileUpload.svelte +796 -0
  79. package/dist/components/Form/FileUpload.svelte.d.ts +78 -0
  80. package/dist/components/Form/FloatLabel.svelte +245 -0
  81. package/dist/components/Form/FloatLabel.svelte.d.ts +44 -0
  82. package/dist/components/Form/Form.svelte +281 -0
  83. package/dist/components/Form/Form.svelte.d.ts +54 -0
  84. package/dist/components/Form/FormField.svelte +218 -0
  85. package/dist/components/Form/FormField.svelte.d.ts +47 -0
  86. package/dist/components/Form/Input.svelte +340 -0
  87. package/dist/components/Form/Input.svelte.d.ts +79 -0
  88. package/dist/components/Form/InputSwitch.svelte +189 -0
  89. package/dist/components/Form/InputSwitch.svelte.d.ts +46 -0
  90. package/dist/components/Form/InvalidState.svelte +97 -0
  91. package/dist/components/Form/InvalidState.svelte.d.ts +37 -0
  92. package/dist/components/Form/Knob.svelte +537 -0
  93. package/dist/components/Form/Knob.svelte.d.ts +78 -0
  94. package/dist/components/Form/ListInput.svelte +469 -0
  95. package/dist/components/Form/ListInput.svelte.d.ts +70 -0
  96. package/dist/components/Form/Listbox.svelte +513 -0
  97. package/dist/components/Form/Listbox.svelte.d.ts +74 -0
  98. package/dist/components/Form/NumberInput.svelte +452 -0
  99. package/dist/components/Form/NumberInput.svelte.d.ts +82 -0
  100. package/dist/components/Form/Radio.svelte +192 -0
  101. package/dist/components/Form/Radio.svelte.d.ts +53 -0
  102. package/dist/components/Form/RadioGroup.svelte +155 -0
  103. package/dist/components/Form/RadioGroup.svelte.d.ts +48 -0
  104. package/dist/components/Form/Rating.svelte +380 -0
  105. package/dist/components/Form/Rating.svelte.d.ts +64 -0
  106. package/dist/components/Form/Select.svelte +436 -0
  107. package/dist/components/Form/Select.svelte.d.ts +49 -0
  108. package/dist/components/Form/SelectGroup.svelte +34 -0
  109. package/dist/components/Form/SelectGroup.svelte.d.ts +33 -0
  110. package/dist/components/Form/Slider.svelte +622 -0
  111. package/dist/components/Form/Slider.svelte.d.ts +73 -0
  112. package/dist/components/Form/Switch.svelte +192 -0
  113. package/dist/components/Form/Switch.svelte.d.ts +46 -0
  114. package/dist/components/Form/TextInput.svelte +274 -0
  115. package/dist/components/Form/TextInput.svelte.d.ts +74 -0
  116. package/dist/components/Form/Textarea.svelte +207 -0
  117. package/dist/components/Form/Textarea.svelte.d.ts +62 -0
  118. package/dist/components/Icon/Icon.svelte +140 -0
  119. package/dist/components/Icon/Icon.svelte.d.ts +25 -0
  120. package/dist/components/Icon/index.d.ts +1 -0
  121. package/dist/components/Icon/index.js +1 -0
  122. package/dist/components/Lazy/Lazy.svelte +158 -0
  123. package/dist/components/Lazy/Lazy.svelte.d.ts +42 -0
  124. package/dist/components/Masonry/Masonry.svelte +299 -0
  125. package/dist/components/Masonry/Masonry.svelte.d.ts +55 -0
  126. package/dist/components/Menu/Menu/Menu.svelte +65 -0
  127. package/dist/components/Menu/Menu/Menu.svelte.d.ts +17 -0
  128. package/dist/components/Menu/Menu/MenuItem.svelte +90 -0
  129. package/dist/components/Menu/Menu/MenuItem.svelte.d.ts +27 -0
  130. package/dist/components/Modal/Modal.svelte +334 -0
  131. package/dist/components/Modal/Modal.svelte.d.ts +55 -0
  132. package/dist/components/Panel/Card.svelte +141 -0
  133. package/dist/components/Panel/Card.svelte.d.ts +52 -0
  134. package/dist/components/Panel/Hero/Hero.story.md +9 -0
  135. package/dist/components/Panel/Hero/Hero.story.svelte +49 -0
  136. package/dist/components/Panel/Hero/Hero.story.svelte.d.ts +21 -0
  137. package/dist/components/Panel/Hero/Hero.svelte +24 -0
  138. package/dist/components/Panel/Hero/Hero.svelte.d.ts +32 -0
  139. package/dist/components/Panel/LazyPanel.svelte +110 -0
  140. package/dist/components/Panel/LazyPanel.svelte.d.ts +46 -0
  141. package/dist/components/Panel/Panel.svelte +205 -0
  142. package/dist/components/Panel/Panel.svelte.d.ts +23 -0
  143. package/dist/components/Progress/Progress.svelte +220 -0
  144. package/dist/components/Progress/Progress.svelte.d.ts +61 -0
  145. package/dist/components/Separator/Separator.svelte +109 -0
  146. package/dist/components/Separator/Separator.svelte.d.ts +35 -0
  147. package/dist/components/Sidebar/Sidebar.svelte +213 -0
  148. package/dist/components/Sidebar/Sidebar.svelte.d.ts +60 -0
  149. package/dist/components/Skeleton/Skeleton.svelte +170 -0
  150. package/dist/components/Skeleton/Skeleton.svelte.d.ts +48 -0
  151. package/dist/components/Stepper/Stepper.svelte +111 -0
  152. package/dist/components/Stepper/Stepper.svelte.d.ts +54 -0
  153. package/dist/components/Stepper/StepperStep.svelte +369 -0
  154. package/dist/components/Stepper/StepperStep.svelte.d.ts +63 -0
  155. package/dist/components/Table/Table.svelte +167 -0
  156. package/dist/components/Table/Table.svelte.d.ts +56 -0
  157. package/dist/components/Table/TableBody.svelte +41 -0
  158. package/dist/components/Table/TableBody.svelte.d.ts +33 -0
  159. package/dist/components/Table/TableCell.svelte +76 -0
  160. package/dist/components/Table/TableCell.svelte.d.ts +36 -0
  161. package/dist/components/Table/TableHead.svelte +41 -0
  162. package/dist/components/Table/TableHead.svelte.d.ts +32 -0
  163. package/dist/components/Table/TableHeader.svelte +148 -0
  164. package/dist/components/Table/TableHeader.svelte.d.ts +42 -0
  165. package/dist/components/Table/TableRow.svelte +99 -0
  166. package/dist/components/Table/TableRow.svelte.d.ts +40 -0
  167. package/dist/components/Tabs/Tab.svelte +145 -0
  168. package/dist/components/Tabs/Tab.svelte.d.ts +36 -0
  169. package/dist/components/Tabs/TabList.svelte +60 -0
  170. package/dist/components/Tabs/TabList.svelte.d.ts +32 -0
  171. package/dist/components/Tabs/TabPanel.svelte +118 -0
  172. package/dist/components/Tabs/TabPanel.svelte.d.ts +38 -0
  173. package/dist/components/Tabs/Tabs.svelte +287 -0
  174. package/dist/components/Tabs/Tabs.svelte.d.ts +50 -0
  175. package/dist/components/Tag/Tag.svelte +260 -0
  176. package/dist/components/Tag/Tag.svelte.d.ts +54 -0
  177. package/dist/components/Tag/TagGroup.svelte +147 -0
  178. package/dist/components/Tag/TagGroup.svelte.d.ts +62 -0
  179. package/dist/components/ThemeToggle/ThemeToggle.svelte +93 -0
  180. package/dist/components/ThemeToggle/ThemeToggle.svelte.d.ts +12 -0
  181. package/dist/components/Timeline/Timeline.svelte +144 -0
  182. package/dist/components/Timeline/Timeline.svelte.d.ts +48 -0
  183. package/dist/components/Timeline/TimelineItem.svelte +391 -0
  184. package/dist/components/Timeline/TimelineItem.svelte.d.ts +63 -0
  185. package/dist/components/Toast/Toast.svelte +313 -0
  186. package/dist/components/Toast/Toast.svelte.d.ts +44 -0
  187. package/dist/components/Toast/toastStore.d.ts +40 -0
  188. package/dist/components/Toast/toastStore.js +293 -0
  189. package/dist/components/Tooltip/Tooltip.svelte +282 -0
  190. package/dist/components/Tooltip/Tooltip.svelte.d.ts +55 -0
  191. package/dist/components/Tree/Tree.svelte +129 -0
  192. package/dist/components/Tree/Tree.svelte.d.ts +61 -0
  193. package/dist/components/Tree/TreeNode.svelte +332 -0
  194. package/dist/components/Tree/TreeNode.svelte.d.ts +55 -0
  195. package/dist/components/icons/TwintrinsicLogo.svelte +73 -0
  196. package/dist/components/icons/TwintrinsicLogo.svelte.d.ts +17 -0
  197. package/dist/components/icons/twintrinsic-source.svg +73 -0
  198. package/dist/components/icons/twintrinsic.svg +38 -0
  199. package/dist/docs/EventsTable.svelte +86 -0
  200. package/dist/docs/EventsTable.svelte.d.ts +27 -0
  201. package/dist/docs/PropsTable.svelte +103 -0
  202. package/dist/docs/PropsTable.svelte.d.ts +28 -0
  203. package/dist/docs/index.d.ts +2 -0
  204. package/dist/docs/index.js +2 -0
  205. package/dist/helpers/detectLanguage.d.ts +6 -0
  206. package/dist/helpers/detectLanguage.js +60 -0
  207. package/dist/helpers/index.d.ts +1 -0
  208. package/dist/helpers/index.js +1 -0
  209. package/dist/index.d.ts +86 -0
  210. package/dist/index.js +94 -0
  211. package/dist/twintrinsic.css +347 -0
  212. package/package.json +98 -0
@@ -0,0 +1,102 @@
1
+ export default DataTable;
2
+ type DataTable = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * DataTable - A component for displaying tabular data with advanced features.
8
+ * Provides sorting, filtering, pagination, and selection capabilities with proper accessibility.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <DataTable
13
+ * data={users}
14
+ * columns={[
15
+ * { field: 'id', header: 'ID' },
16
+ * { field: 'name', header: 'Name' },
17
+ * { field: 'email', header: 'Email' }
18
+ * ]}
19
+ * />
20
+ *
21
+ * <DataTable
22
+ * data={products}
23
+ * columns={columns}
24
+ * sortable
25
+ * filterable
26
+ * pageable
27
+ * selectable
28
+ * onsort={handleSort}
29
+ * onfilter={handleFilter}
30
+ * onpage={handlePage}
31
+ * onselect={handleSelect}
32
+ * />
33
+ * ```
34
+ */
35
+ declare const DataTable: import("svelte").Component<{
36
+ class?: string;
37
+ id?: any;
38
+ data?: any[];
39
+ columns?: any[];
40
+ sortable?: boolean;
41
+ filterable?: boolean;
42
+ pageable?: boolean;
43
+ selectable?: boolean;
44
+ multiSelect?: boolean;
45
+ selected?: any[];
46
+ keyField?: string;
47
+ page?: number;
48
+ pageSize?: number;
49
+ pageSizeOptions?: any[];
50
+ sortField: any;
51
+ sortOrder?: string;
52
+ filters?: Record<string, any>;
53
+ loading?: boolean;
54
+ emptyMessage?: string;
55
+ ariaLabel?: string;
56
+ rowClass: any;
57
+ cellFormatter: any;
58
+ responsive?: boolean;
59
+ striped?: boolean;
60
+ hoverable?: boolean;
61
+ bordered?: boolean;
62
+ stickyHeader?: boolean;
63
+ compact?: boolean;
64
+ onsort: any;
65
+ onfilter: any;
66
+ onpage: any;
67
+ onselect: any;
68
+ }, {}, "">;
69
+ type $$ComponentProps = {
70
+ class?: string;
71
+ id?: any;
72
+ data?: any[];
73
+ columns?: any[];
74
+ sortable?: boolean;
75
+ filterable?: boolean;
76
+ pageable?: boolean;
77
+ selectable?: boolean;
78
+ multiSelect?: boolean;
79
+ selected?: any[];
80
+ keyField?: string;
81
+ page?: number;
82
+ pageSize?: number;
83
+ pageSizeOptions?: any[];
84
+ sortField: any;
85
+ sortOrder?: string;
86
+ filters?: Record<string, any>;
87
+ loading?: boolean;
88
+ emptyMessage?: string;
89
+ ariaLabel?: string;
90
+ rowClass: any;
91
+ cellFormatter: any;
92
+ responsive?: boolean;
93
+ striped?: boolean;
94
+ hoverable?: boolean;
95
+ bordered?: boolean;
96
+ stickyHeader?: boolean;
97
+ compact?: boolean;
98
+ onsort: any;
99
+ onfilter: any;
100
+ onpage: any;
101
+ onselect: any;
102
+ };
@@ -0,0 +1,357 @@
1
+ <!--
2
+ @component
3
+ AutoComplete - An input component that provides suggestions as you type.
4
+ Built on top of the base Input component with additional dropdown functionality.
5
+
6
+ Usage:
7
+ ```svelte
8
+ <AutoComplete
9
+ label="Country"
10
+ items={countries}
11
+ onselect={handleSelect}
12
+ />
13
+
14
+ <AutoComplete
15
+ label="Search Users"
16
+ items={users}
17
+ itemTemplate={UserTemplate}
18
+ minLength={2}
19
+ delay={300}
20
+ multiple
21
+ />
22
+ ```
23
+ -->
24
+ <script>
25
+ import { slide } from "svelte/transition"
26
+ import { clickOutside } from "../../actions"
27
+ import Input from "./Input.svelte"
28
+
29
+ const {
30
+ /** @type {string} - Input label */
31
+ label,
32
+ /** @type {Array<any>} - Array of items to search through */
33
+ items = [],
34
+ /** @type {string} - Field to use for item labels */
35
+ labelField = "label",
36
+ /** @type {string} - Field to use for item values */
37
+ valueField = "value",
38
+ /** @type {string | Array<string>} - Selected value(s) */
39
+ value = "",
40
+ /** @type {number} - Minimum characters before showing suggestions */
41
+ minLength = 1,
42
+ /** @type {number} - Delay in ms before searching */
43
+ delay = 150,
44
+ /** @type {boolean} - Whether to allow multiple selections */
45
+ multiple = false,
46
+ /** @type {boolean} - Whether to highlight matching text */
47
+ highlight = true,
48
+ /** @type {boolean} - Whether to force selection from suggestions */
49
+ forceSelection = false,
50
+ /** @type {number} - Maximum number of suggestions to show */
51
+ maxItems = 10,
52
+ /** @type {string} - Additional CSS classes */
53
+ class: className = "",
54
+ /** @type {function} - Custom filter function */
55
+ filter = null,
56
+ /** @type {function} - Custom item template */
57
+ itemTemplate = null,
58
+ /** @type {string} - No results message */
59
+ emptyMessage = "No results found",
60
+ /** @type {string} - Loading message */
61
+ loadingMessage = "Loading...",
62
+ /** @type {boolean} - Whether suggestions are loading */
63
+ loading = false,
64
+ /** @type {string} - Placeholder text */
65
+ placeholder = "",
66
+ /** @type {boolean} - Whether the input is disabled */
67
+ disabled = false,
68
+ /** @type {(event: CustomEvent) => void} - Select event handler */
69
+ onselect,
70
+ /** @type {(event: CustomEvent) => void} - Remove event handler */
71
+ onremove,
72
+ } = $props()
73
+
74
+ let inputValue = $state("")
75
+ let suggestions = $state([])
76
+ let selectedItems = $state(multiple ? [] : null)
77
+ let focused = $state(false)
78
+ let showSuggestions = $state(false)
79
+ let highlightedIndex = $state(-1)
80
+ let searchTimeout = $state()
81
+
82
+ // Initialize selected items
83
+ $effect(() => {
84
+ if (value) {
85
+ selectedItems = multiple ? (Array.isArray(value) ? value : [value]) : value
86
+ inputValue = multiple ? "" : getItemLabel(value)
87
+ }
88
+ })
89
+
90
+ // Handle input changes
91
+ function handleInput(event) {
92
+ const query = event.detail.value
93
+ inputValue = query
94
+
95
+ if (searchTimeout) {
96
+ clearTimeout(searchTimeout)
97
+ }
98
+
99
+ if (query.length >= minLength) {
100
+ searchTimeout = setTimeout(() => {
101
+ search(query)
102
+ }, delay)
103
+ } else {
104
+ suggestions = []
105
+ showSuggestions = false
106
+ }
107
+ }
108
+
109
+ // Search for suggestions
110
+ function search(query) {
111
+ if (filter) {
112
+ suggestions = filter(items, query)
113
+ } else {
114
+ suggestions = items.filter((item) => {
115
+ const label = getItemLabel(item).toLowerCase()
116
+ return label.includes(query.toLowerCase())
117
+ })
118
+ }
119
+
120
+ suggestions = suggestions.slice(0, maxItems)
121
+ showSuggestions = true
122
+ highlightedIndex = -1
123
+ }
124
+
125
+ // Get label for an item
126
+ function getItemLabel(item) {
127
+ if (!item) return ""
128
+ return typeof item === "object" ? item[labelField] : item
129
+ }
130
+
131
+ // Get value for an item
132
+ function getItemValue(item) {
133
+ if (!item) return ""
134
+ return typeof item === "object" ? item[valueField] : item
135
+ }
136
+
137
+ // Handle item selection
138
+ function selectItem(item) {
139
+ if (multiple) {
140
+ const value = getItemValue(item)
141
+ const exists = selectedItems.some((i) => getItemValue(i) === value)
142
+
143
+ if (!exists) {
144
+ selectedItems = [...selectedItems, item]
145
+ onselect?.(new CustomEvent("select", { detail: { items: selectedItems } }))
146
+ }
147
+
148
+ inputValue = ""
149
+ } else {
150
+ selectedItems = item
151
+ inputValue = getItemLabel(item)
152
+ onselect?.(new CustomEvent("select", { detail: { item } }))
153
+ }
154
+
155
+ showSuggestions = false
156
+ }
157
+
158
+ // Remove selected item (multiple mode)
159
+ function removeItem(item) {
160
+ if (!multiple) return
161
+
162
+ const value = getItemValue(item)
163
+ selectedItems = selectedItems.filter((i) => getItemValue(i) !== value)
164
+ onremove?.(new CustomEvent("remove", { detail: { item } }))
165
+ onselect?.(new CustomEvent("select", { detail: { items: selectedItems } }))
166
+ }
167
+
168
+ // Handle keyboard navigation
169
+ function handleKeydown(event) {
170
+ if (!showSuggestions) return
171
+
172
+ switch (event.key) {
173
+ case "ArrowDown":
174
+ event.preventDefault()
175
+ highlightedIndex = Math.min(highlightedIndex + 1, suggestions.length - 1)
176
+ break
177
+
178
+ case "ArrowUp":
179
+ event.preventDefault()
180
+ highlightedIndex = Math.max(highlightedIndex - 1, -1)
181
+ break
182
+
183
+ case "Enter":
184
+ event.preventDefault()
185
+ if (highlightedIndex >= 0) {
186
+ selectItem(suggestions[highlightedIndex])
187
+ } else if (!forceSelection && inputValue) {
188
+ selectItem(inputValue)
189
+ }
190
+ break
191
+
192
+ case "Escape":
193
+ event.preventDefault()
194
+ showSuggestions = false
195
+ break
196
+ }
197
+ }
198
+
199
+ // Handle focus events
200
+ function handleFocus() {
201
+ focused = true
202
+ if (inputValue.length >= minLength) {
203
+ showSuggestions = true
204
+ }
205
+ }
206
+
207
+ function handleBlur() {
208
+ focused = false
209
+ // Delay hiding suggestions to allow click events
210
+ setTimeout(() => {
211
+ if (!focused) {
212
+ showSuggestions = false
213
+ if (forceSelection && !selectedItems) {
214
+ inputValue = ""
215
+ }
216
+ }
217
+ }, 200)
218
+ }
219
+
220
+ // Highlight matching text
221
+ function highlightText(text, query) {
222
+ if (!highlight || !query) return text
223
+
224
+ const regex = new RegExp(`(${query})`, "gi")
225
+ return text.replace(regex, "<mark>$1</mark>")
226
+ }
227
+ </script>
228
+
229
+ <div
230
+ class="autocomplete {className}"
231
+ use:clickOutside
232
+ onclickOutside={() => showSuggestions = false}
233
+ >
234
+ <Input
235
+ {label}
236
+ {placeholder}
237
+ {disabled}
238
+ value={inputValue}
239
+ oninput={handleInput}
240
+ onfocus={handleFocus}
241
+ onblur={handleBlur}
242
+ onkeydown={handleKeydown}
243
+ />
244
+
245
+ {#if multiple && selectedItems.length > 0}
246
+ <div class="autocomplete-chips" aria-label="Selected items">
247
+ {#each selectedItems as item}
248
+ <div class="autocomplete-chip">
249
+ <span>{getItemLabel(item)}</span>
250
+ <button
251
+ type="button"
252
+ class="autocomplete-chip-remove"
253
+ onclick={() => removeItem(item)}
254
+ aria-label="Remove {getItemLabel(item)}"
255
+ >
256
+ <svg class="w-4 h-4" viewBox="0 0 20 20" fill="currentColor">
257
+ <path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z" />
258
+ </svg>
259
+ </button>
260
+ </div>
261
+ {/each}
262
+ </div>
263
+ {/if}
264
+
265
+ {#if showSuggestions && (suggestions.length > 0 || loading)}
266
+ <div
267
+ class="autocomplete-suggestions"
268
+ role="listbox"
269
+ transition:slide={{ duration: 150 }}
270
+ >
271
+ {#if loading}
272
+ <div class="autocomplete-message" role="status">
273
+ {loadingMessage}
274
+ </div>
275
+ {:else}
276
+ {#each suggestions as item, index}
277
+ <div
278
+ class="autocomplete-item"
279
+ class:autocomplete-item-highlighted={index === highlightedIndex}
280
+ role="option"
281
+ aria-selected={index === highlightedIndex}
282
+ onmouseenter={() => highlightedIndex = index}
283
+ onclick={() => selectItem(item)}
284
+ >
285
+ {#if itemTemplate}
286
+ <svelte:component this={itemTemplate} {item} />
287
+ {:else}
288
+ {@html highlightText(getItemLabel(item), inputValue)}
289
+ {/if}
290
+ </div>
291
+ {/each}
292
+ {/if}
293
+ </div>
294
+ {:else if showSuggestions && suggestions.length === 0 && !loading}
295
+ <div
296
+ class="autocomplete-suggestions"
297
+ role="status"
298
+ transition:slide={{ duration: 150 }}
299
+ >
300
+ <div class="autocomplete-message">
301
+ {emptyMessage}
302
+ </div>
303
+ </div>
304
+ {/if}
305
+ </div>
306
+
307
+ <style>
308
+ @reference "../../twintrinsic.css";
309
+
310
+ .autocomplete {
311
+ @apply relative w-full;
312
+ }
313
+
314
+ /* Suggestions dropdown */
315
+ .autocomplete-suggestions {
316
+ @apply absolute z-50 w-full mt-1;
317
+ @apply bg-surface border border-border rounded-md shadow-lg;
318
+ @apply max-h-60 overflow-auto;
319
+ }
320
+
321
+ /* Suggestion items */
322
+ .autocomplete-item {
323
+ @apply px-4 py-2 text-sm cursor-pointer;
324
+ @apply hover:bg-hover focus:bg-hover;
325
+ }
326
+
327
+ .autocomplete-item-highlighted {
328
+ @apply bg-hover;
329
+ }
330
+
331
+ /* Highlighted text */
332
+ :global(.autocomplete-item mark) {
333
+ @apply bg-primary-100 dark:bg-primary-900;
334
+ @apply text-primary-900 dark:text-primary-100;
335
+ @apply rounded px-0.5;
336
+ }
337
+
338
+ /* Message styles */
339
+ .autocomplete-message {
340
+ @apply px-4 py-3 text-sm text-muted text-center;
341
+ }
342
+
343
+ /* Selected chips (multiple mode) */
344
+ .autocomplete-chips {
345
+ @apply flex flex-wrap gap-2 mt-2;
346
+ }
347
+
348
+ .autocomplete-chip {
349
+ @apply flex items-center gap-1 px-2 py-1 text-sm;
350
+ @apply bg-surface border border-border rounded-full;
351
+ }
352
+
353
+ .autocomplete-chip-remove {
354
+ @apply p-0.5 hover:text-error focus:outline-none;
355
+ @apply focus:text-error transition-colors;
356
+ }
357
+ </style>
@@ -0,0 +1,73 @@
1
+ export default AutoComplete;
2
+ type AutoComplete = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ /**
7
+ * AutoComplete - An input component that provides suggestions as you type.
8
+ * Built on top of the base Input component with additional dropdown functionality.
9
+ *
10
+ * Usage:
11
+ * ```svelte
12
+ * <AutoComplete
13
+ * label="Country"
14
+ * items={countries}
15
+ * onselect={handleSelect}
16
+ * />
17
+ *
18
+ * <AutoComplete
19
+ * label="Search Users"
20
+ * items={users}
21
+ * itemTemplate={UserTemplate}
22
+ * minLength={2}
23
+ * delay={300}
24
+ * multiple
25
+ * />
26
+ * ```
27
+ */
28
+ declare const AutoComplete: import("svelte").Component<{
29
+ label: any;
30
+ items?: any[];
31
+ labelField?: string;
32
+ valueField?: string;
33
+ value?: string;
34
+ minLength?: number;
35
+ delay?: number;
36
+ multiple?: boolean;
37
+ highlight?: boolean;
38
+ forceSelection?: boolean;
39
+ maxItems?: number;
40
+ class?: string;
41
+ filter?: any;
42
+ itemTemplate?: any;
43
+ emptyMessage?: string;
44
+ loadingMessage?: string;
45
+ loading?: boolean;
46
+ placeholder?: string;
47
+ disabled?: boolean;
48
+ onselect: any;
49
+ onremove: any;
50
+ }, {}, "">;
51
+ type $$ComponentProps = {
52
+ label: any;
53
+ items?: any[];
54
+ labelField?: string;
55
+ valueField?: string;
56
+ value?: string;
57
+ minLength?: number;
58
+ delay?: number;
59
+ multiple?: boolean;
60
+ highlight?: boolean;
61
+ forceSelection?: boolean;
62
+ maxItems?: number;
63
+ class?: string;
64
+ filter?: any;
65
+ itemTemplate?: any;
66
+ emptyMessage?: string;
67
+ loadingMessage?: string;
68
+ loading?: boolean;
69
+ placeholder?: string;
70
+ disabled?: boolean;
71
+ onselect: any;
72
+ onremove: any;
73
+ };