@joewinke/jatui 0.1.25 → 0.1.27

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 (242) hide show
  1. package/dist/actions/collapse.d.ts +80 -0
  2. package/dist/actions/collapse.js +134 -0
  3. package/dist/actions/railNav.d.ts +167 -0
  4. package/dist/actions/railNav.js +351 -0
  5. package/dist/components/AnnotationLayer.svelte +108 -0
  6. package/dist/components/AnnotationLayer.svelte.d.ts +12 -0
  7. package/dist/components/AnnotationPanel.svelte +319 -0
  8. package/dist/components/AnnotationPanel.svelte.d.ts +13 -0
  9. package/dist/components/AudioWaveform.svelte +701 -0
  10. package/dist/components/AudioWaveform.svelte.d.ts +19 -0
  11. package/dist/components/AvailabilityModal.svelte +177 -0
  12. package/dist/components/AvailabilityModal.svelte.d.ts +14 -0
  13. package/dist/components/AvatarUpload.svelte +234 -0
  14. package/dist/components/AvatarUpload.svelte.d.ts +23 -0
  15. package/dist/components/Badge.svelte +38 -0
  16. package/dist/components/Badge.svelte.d.ts +14 -0
  17. package/dist/components/BookingForm.svelte +278 -0
  18. package/dist/components/BookingForm.svelte.d.ts +37 -0
  19. package/dist/components/BurndownChart.svelte +778 -0
  20. package/dist/components/BurndownChart.svelte.d.ts +17 -0
  21. package/dist/components/Button.svelte +81 -0
  22. package/dist/components/Button.svelte.d.ts +21 -0
  23. package/dist/components/CalendarPicker.svelte +284 -0
  24. package/dist/components/CalendarPicker.svelte.d.ts +22 -0
  25. package/dist/components/Card.svelte +67 -0
  26. package/dist/components/Card.svelte.d.ts +17 -0
  27. package/dist/components/CharacterCounter.svelte +82 -0
  28. package/dist/components/CharacterCounter.svelte.d.ts +10 -0
  29. package/dist/components/ChipInput.svelte +609 -0
  30. package/dist/components/ChipInput.svelte.d.ts +55 -0
  31. package/dist/components/Collapse.svelte +91 -0
  32. package/dist/components/Collapse.svelte.d.ts +18 -0
  33. package/dist/components/ColorSelector.svelte +167 -0
  34. package/dist/components/ColorSelector.svelte.d.ts +9 -0
  35. package/dist/components/CommentThread.svelte +773 -0
  36. package/dist/components/CommentThread.svelte.d.ts +32 -0
  37. package/dist/components/ConfirmDialog.svelte +348 -0
  38. package/dist/components/ConfirmDialog.svelte.d.ts +3 -0
  39. package/dist/components/ConfirmModal.svelte +142 -0
  40. package/dist/components/ConfirmModal.svelte.d.ts +15 -0
  41. package/dist/components/ContextMenu.svelte +188 -0
  42. package/dist/components/ContextMenu.svelte.d.ts +31 -0
  43. package/dist/components/CountdownTimer.svelte +94 -0
  44. package/dist/components/CountdownTimer.svelte.d.ts +10 -0
  45. package/dist/components/DateRangePicker.svelte +194 -0
  46. package/dist/components/DateRangePicker.svelte.d.ts +10 -0
  47. package/dist/components/Drawer.svelte +143 -0
  48. package/dist/components/Drawer.svelte.d.ts +33 -0
  49. package/dist/components/EmojiPicker.svelte +159 -0
  50. package/dist/components/EmojiPicker.svelte.d.ts +8 -0
  51. package/dist/components/EntityPreviewCard.svelte +104 -0
  52. package/dist/components/EntityPreviewCard.svelte.d.ts +9 -0
  53. package/dist/components/FileDropzone.svelte +493 -0
  54. package/dist/components/FileDropzone.svelte.d.ts +40 -0
  55. package/dist/components/FilePicker.svelte +488 -0
  56. package/dist/components/FilePicker.svelte.d.ts +20 -0
  57. package/dist/components/FileThumbnail.svelte +80 -0
  58. package/dist/components/FileThumbnail.svelte.d.ts +12 -0
  59. package/dist/components/FilterDropdown.svelte +203 -0
  60. package/dist/components/FilterDropdown.svelte.d.ts +48 -0
  61. package/dist/components/FloatingActionBar.svelte +354 -0
  62. package/dist/components/FloatingActionBar.svelte.d.ts +51 -0
  63. package/dist/components/GPSTracker.svelte +202 -0
  64. package/dist/components/GPSTracker.svelte.d.ts +34 -0
  65. package/dist/components/HunkDiffView.svelte +348 -0
  66. package/dist/components/HunkDiffView.svelte.d.ts +9 -0
  67. package/dist/components/ImageLightbox.svelte +274 -0
  68. package/dist/components/ImageLightbox.svelte.d.ts +25 -0
  69. package/dist/components/ImageUpload.svelte +147 -0
  70. package/dist/components/ImageUpload.svelte.d.ts +10 -0
  71. package/dist/components/InlineEdit.svelte +291 -0
  72. package/dist/components/InlineEdit.svelte.d.ts +45 -0
  73. package/dist/components/InputDialog.svelte +327 -0
  74. package/dist/components/InputDialog.svelte.d.ts +3 -0
  75. package/dist/components/KeyboardShortcutsOverlay.svelte +296 -0
  76. package/dist/components/KeyboardShortcutsOverlay.svelte.d.ts +42 -0
  77. package/dist/components/LazyImage.svelte +123 -0
  78. package/dist/components/LazyImage.svelte.d.ts +14 -0
  79. package/dist/components/LinkShortener.svelte +274 -0
  80. package/dist/components/LinkShortener.svelte.d.ts +27 -0
  81. package/dist/components/LoadingSpinner.svelte +106 -0
  82. package/dist/components/LoadingSpinner.svelte.d.ts +21 -0
  83. package/dist/components/LocationMap.svelte +186 -0
  84. package/dist/components/LocationMap.svelte.d.ts +11 -0
  85. package/dist/components/MapView.svelte +341 -0
  86. package/dist/components/MapView.svelte.d.ts +20 -0
  87. package/dist/components/MarkupEditor.svelte +485 -0
  88. package/dist/components/MarkupEditor.svelte.d.ts +10 -0
  89. package/dist/components/MarkupOverlay.svelte +55 -0
  90. package/dist/components/MarkupOverlay.svelte.d.ts +8 -0
  91. package/dist/components/MediaWorkbench.svelte +871 -0
  92. package/dist/components/MediaWorkbench.svelte.d.ts +9 -0
  93. package/dist/components/MilestoneCard.svelte +98 -0
  94. package/dist/components/MilestoneCard.svelte.d.ts +16 -0
  95. package/dist/components/MilestoneTimeline.svelte +91 -0
  96. package/dist/components/MilestoneTimeline.svelte.d.ts +15 -0
  97. package/dist/components/Modal.svelte +244 -0
  98. package/dist/components/Modal.svelte.d.ts +35 -0
  99. package/dist/components/PDFViewer.svelte +105 -0
  100. package/dist/components/PDFViewer.svelte.d.ts +9 -0
  101. package/dist/components/PdfThumbnail.svelte +63 -0
  102. package/dist/components/PdfThumbnail.svelte.d.ts +9 -0
  103. package/dist/components/PhoneInput.svelte +212 -0
  104. package/dist/components/PhoneInput.svelte.d.ts +25 -0
  105. package/dist/components/ResizableDivider.svelte +307 -0
  106. package/dist/components/ResizableDivider.svelte.d.ts +26 -0
  107. package/dist/components/ResizablePanel.svelte +305 -0
  108. package/dist/components/ResizablePanel.svelte.d.ts +18 -0
  109. package/dist/components/SearchDropdown.svelte +686 -0
  110. package/dist/components/SearchDropdown.svelte.d.ts +40 -0
  111. package/dist/components/SelectInput.svelte +237 -0
  112. package/dist/components/SelectInput.svelte.d.ts +26 -0
  113. package/dist/components/SidebarUserFooter.svelte +34 -0
  114. package/dist/components/SidebarUserFooter.svelte.d.ts +16 -0
  115. package/dist/components/SignaturePad.svelte +175 -0
  116. package/dist/components/SignaturePad.svelte.d.ts +17 -0
  117. package/dist/components/SmartImageEditor.svelte +720 -0
  118. package/dist/components/SmartImageEditor.svelte.d.ts +24 -0
  119. package/dist/components/SortDropdown.svelte +156 -0
  120. package/dist/components/SortDropdown.svelte.d.ts +40 -0
  121. package/dist/components/Sparkline.svelte +116 -0
  122. package/dist/components/Sparkline.svelte.d.ts +12 -0
  123. package/dist/components/SpeechForm.svelte +114 -0
  124. package/dist/components/SpeechForm.svelte.d.ts +17 -0
  125. package/dist/components/StatusBadge.svelte +157 -0
  126. package/dist/components/StatusBadge.svelte.d.ts +24 -0
  127. package/dist/components/TaskTypeIcon.svelte +54 -0
  128. package/dist/components/TaskTypeIcon.svelte.d.ts +17 -0
  129. package/dist/components/TextArea.svelte +162 -0
  130. package/dist/components/TextArea.svelte.d.ts +30 -0
  131. package/dist/components/TextInput.svelte +131 -0
  132. package/dist/components/TextInput.svelte.d.ts +29 -0
  133. package/dist/components/ThemeSelector.svelte +206 -0
  134. package/dist/components/ThemeSelector.svelte.d.ts +14 -0
  135. package/dist/components/TimeSlotPicker.svelte +162 -0
  136. package/dist/components/TimeSlotPicker.svelte.d.ts +18 -0
  137. package/dist/components/UserAvatar.svelte +72 -0
  138. package/dist/components/UserAvatar.svelte.d.ts +11 -0
  139. package/dist/components/VariablePicker.svelte +170 -0
  140. package/dist/components/VariablePicker.svelte.d.ts +40 -0
  141. package/dist/components/VoicePlayer.svelte +422 -0
  142. package/dist/components/VoicePlayer.svelte.d.ts +18 -0
  143. package/dist/components/linked-columns/LinkedColumns.svelte +526 -0
  144. package/dist/components/linked-columns/LinkedColumns.svelte.d.ts +130 -0
  145. package/dist/components/markup.d.ts +47 -0
  146. package/dist/components/markup.js +201 -0
  147. package/dist/components/messaging/Avatar.svelte +81 -0
  148. package/dist/components/messaging/Avatar.svelte.d.ts +11 -0
  149. package/dist/components/messaging/ChannelInfoModal.svelte +163 -0
  150. package/dist/components/messaging/ChannelInfoModal.svelte.d.ts +18 -0
  151. package/dist/components/messaging/ChannelList.svelte +107 -0
  152. package/dist/components/messaging/ChannelList.svelte.d.ts +11 -0
  153. package/dist/components/messaging/ChannelMemberAvatarStack.svelte +69 -0
  154. package/dist/components/messaging/ChannelMemberAvatarStack.svelte.d.ts +11 -0
  155. package/dist/components/messaging/ChannelMembersModal.svelte +182 -0
  156. package/dist/components/messaging/ChannelMembersModal.svelte.d.ts +16 -0
  157. package/dist/components/messaging/CreateChannelModal.svelte +190 -0
  158. package/dist/components/messaging/CreateChannelModal.svelte.d.ts +14 -0
  159. package/dist/components/messaging/DirectMessageList.svelte +145 -0
  160. package/dist/components/messaging/DirectMessageList.svelte.d.ts +12 -0
  161. package/dist/components/messaging/EmojiSelector.svelte +261 -0
  162. package/dist/components/messaging/EmojiSelector.svelte.d.ts +19 -0
  163. package/dist/components/messaging/MentionAutocomplete.svelte +193 -0
  164. package/dist/components/messaging/MentionAutocomplete.svelte.d.ts +17 -0
  165. package/dist/components/messaging/MessageAttachment.svelte +273 -0
  166. package/dist/components/messaging/MessageAttachment.svelte.d.ts +13 -0
  167. package/dist/components/messaging/MessageAttachmentUpload.svelte +243 -0
  168. package/dist/components/messaging/MessageAttachmentUpload.svelte.d.ts +19 -0
  169. package/dist/components/messaging/MessageInput.svelte +452 -0
  170. package/dist/components/messaging/MessageInput.svelte.d.ts +28 -0
  171. package/dist/components/messaging/MessageItem.svelte +341 -0
  172. package/dist/components/messaging/MessageItem.svelte.d.ts +41 -0
  173. package/dist/components/messaging/MessageThread.svelte +306 -0
  174. package/dist/components/messaging/MessageThread.svelte.d.ts +30 -0
  175. package/dist/components/messaging/NotificationSettingsModal.svelte +234 -0
  176. package/dist/components/messaging/NotificationSettingsModal.svelte.d.ts +13 -0
  177. package/dist/components/messaging/QuotedMessageDisplay.svelte +123 -0
  178. package/dist/components/messaging/QuotedMessageDisplay.svelte.d.ts +10 -0
  179. package/dist/components/messaging/StartDMModal.svelte +100 -0
  180. package/dist/components/messaging/StartDMModal.svelte.d.ts +14 -0
  181. package/dist/components/messaging/ThreadPanel.svelte +153 -0
  182. package/dist/components/messaging/ThreadPanel.svelte.d.ts +16 -0
  183. package/dist/components/pipeline/DESIGN.md +361 -0
  184. package/dist/components/pipeline/Pipeline.svelte +391 -0
  185. package/dist/components/pipeline/Pipeline.svelte.d.ts +28 -0
  186. package/dist/components/pipeline/PipelineCard.svelte +94 -0
  187. package/dist/components/pipeline/PipelineCard.svelte.d.ts +13 -0
  188. package/dist/components/pipeline/PipelineColumn.svelte +163 -0
  189. package/dist/components/pipeline/PipelineColumn.svelte.d.ts +30 -0
  190. package/dist/components/replay/ChapterTimeline.svelte +326 -0
  191. package/dist/components/replay/ChapterTimeline.svelte.d.ts +39 -0
  192. package/dist/components/session-nav/transcriptModel.d.ts +132 -0
  193. package/dist/components/session-nav/transcriptModel.js +285 -0
  194. package/dist/data/emojis.d.ts +18 -0
  195. package/dist/data/emojis.js +1196 -0
  196. package/dist/index.d.ts +142 -0
  197. package/dist/index.js +142 -0
  198. package/dist/stores/confirmDialog.svelte.d.ts +21 -0
  199. package/dist/stores/confirmDialog.svelte.js +31 -0
  200. package/dist/stores/inputDialog.svelte.d.ts +24 -0
  201. package/dist/stores/inputDialog.svelte.js +32 -0
  202. package/dist/styles/rail.css +63 -0
  203. package/dist/types/annotation.d.ts +32 -0
  204. package/dist/types/annotation.js +3 -0
  205. package/dist/types/booking.d.ts +115 -0
  206. package/dist/types/booking.js +24 -0
  207. package/dist/types/comments.d.ts +65 -0
  208. package/dist/types/comments.js +22 -0
  209. package/dist/types/entityPreview.d.ts +42 -0
  210. package/dist/types/entityPreview.js +10 -0
  211. package/dist/types/filePicker.d.ts +15 -0
  212. package/dist/types/filePicker.js +1 -0
  213. package/dist/types/googleMaps.d.ts +51 -0
  214. package/dist/types/maps.d.ts +43 -0
  215. package/dist/types/maps.js +4 -0
  216. package/dist/types/messaging.d.ts +282 -0
  217. package/dist/types/messaging.js +100 -0
  218. package/dist/types/milestone.d.ts +20 -0
  219. package/dist/types/milestone.js +7 -0
  220. package/dist/types/pipeline.d.ts +115 -0
  221. package/dist/types/pipeline.js +15 -0
  222. package/dist/types/smartImageEditor.d.ts +42 -0
  223. package/dist/types/smartImageEditor.js +1 -0
  224. package/dist/types/templateVars.d.ts +34 -0
  225. package/dist/types/templateVars.js +12 -0
  226. package/dist/utils/currency.d.ts +8 -0
  227. package/dist/utils/currency.js +17 -0
  228. package/dist/utils/daisyuiColors.d.ts +37 -0
  229. package/dist/utils/daisyuiColors.js +152 -0
  230. package/dist/utils/dateFormatters.d.ts +69 -0
  231. package/dist/utils/dateFormatters.js +199 -0
  232. package/dist/utils/googleMapsLoader.d.ts +19 -0
  233. package/dist/utils/googleMapsLoader.js +121 -0
  234. package/dist/utils/mentionParser.d.ts +67 -0
  235. package/dist/utils/mentionParser.js +132 -0
  236. package/dist/utils/phone.d.ts +13 -0
  237. package/dist/utils/phone.js +67 -0
  238. package/dist/utils/phoneFormat.d.ts +26 -0
  239. package/dist/utils/phoneFormat.js +69 -0
  240. package/dist/utils/taskUtils.d.ts +37 -0
  241. package/dist/utils/taskUtils.js +71 -0
  242. package/package.json +3 -2
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Drawer Component
3
+ *
4
+ * Sliding panel overlay with backdrop, escape key, and header actions.
5
+ */
6
+ import type { Snippet } from 'svelte';
7
+ interface Props {
8
+ open?: boolean;
9
+ title?: string;
10
+ position?: 'left' | 'right';
11
+ size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full';
12
+ showCloseButton?: boolean;
13
+ contentClass?: string;
14
+ /**
15
+ * When true (default), keydown events fired inside the drawer panel are
16
+ * stopped from propagating to window — preventing page-level list/keyboard
17
+ * navigation handlers (listNav-style) from receiving arrow keys, j/k, vim
18
+ * chords, digit counts, etc. while the drawer is open.
19
+ *
20
+ * Free-text fields (INPUT, TEXTAREA, contentEditable) are intentionally
21
+ * excluded so normal typing still works. Set to false only when the
22
+ * consumer needs custom window-level key handling even while the drawer
23
+ * is open.
24
+ */
25
+ trapKeys?: boolean;
26
+ onclose?: () => void;
27
+ class?: string;
28
+ headerActions?: Snippet;
29
+ children?: Snippet;
30
+ }
31
+ declare const Drawer: import("svelte").Component<Props, {}, "open">;
32
+ type Drawer = ReturnType<typeof Drawer>;
33
+ export default Drawer;
@@ -0,0 +1,159 @@
1
+ <script lang="ts">
2
+ /**
3
+ * EmojiPicker — Full Unicode emoji selector with search-by-name.
4
+ * Shows a small trigger button with the current emoji, opens a categorized grid dropdown.
5
+ * For assigning emoji icons to items (bases, channels, categories, etc.).
6
+ */
7
+ import { EMOJI_DATA, searchEmojis } from '../data/emojis';
8
+
9
+ let {
10
+ selected = null,
11
+ onSelect,
12
+ size = 'sm',
13
+ }: {
14
+ selected: string | null;
15
+ onSelect: (emoji: string | null) => void;
16
+ size?: 'sm' | 'md';
17
+ } = $props();
18
+
19
+ let open = $state(false);
20
+ let searchQuery = $state('');
21
+ let triggerEl: HTMLButtonElement | undefined = $state(undefined);
22
+ let searchInputEl: HTMLInputElement | undefined = $state(undefined);
23
+
24
+ const searchResults = $derived.by(() => {
25
+ if (!searchQuery.trim()) return null;
26
+ return searchEmojis(searchQuery);
27
+ });
28
+
29
+ function handleSelect(emoji: string) {
30
+ onSelect(emoji);
31
+ open = false;
32
+ searchQuery = '';
33
+ }
34
+
35
+ function handleClear(e: MouseEvent) {
36
+ e.stopPropagation();
37
+ onSelect(null);
38
+ open = false;
39
+ }
40
+
41
+ function handleClickOutside(e: MouseEvent) {
42
+ if (triggerEl && !triggerEl.contains(e.target as Node)) {
43
+ const dropdown = document.querySelector('.emoji-picker-dropdown');
44
+ if (dropdown && !dropdown.contains(e.target as Node)) {
45
+ open = false;
46
+ searchQuery = '';
47
+ }
48
+ }
49
+ }
50
+
51
+ function handleToggle(e: MouseEvent) {
52
+ e.stopPropagation();
53
+ open = !open;
54
+ if (!open) {
55
+ searchQuery = '';
56
+ } else {
57
+ requestAnimationFrame(() => searchInputEl?.focus());
58
+ }
59
+ }
60
+
61
+ const btnSize = $derived(size === 'sm' ? 'w-6 h-6 text-sm' : 'w-8 h-8 text-base');
62
+ </script>
63
+
64
+ <svelte:window onclick={handleClickOutside} />
65
+
66
+ <div class="relative inline-flex">
67
+ <button
68
+ bind:this={triggerEl}
69
+ class="emoji-trigger {btnSize} flex items-center justify-center rounded transition-all duration-100 cursor-pointer"
70
+ style="background: {selected ? 'oklch(0.25 0.02 250)' : 'oklch(0.20 0.01 250)'}; border: 1px solid {open ? 'oklch(0.45 0.10 240)' : 'oklch(0.28 0.02 250)'};"
71
+ onclick={handleToggle}
72
+ title={selected ? `Icon: ${selected} (click to change)` : 'Set icon'}
73
+ >
74
+ {#if selected}
75
+ <span>{selected}</span>
76
+ {:else}
77
+ <span style="color: oklch(0.40 0.02 250); font-size: 0.65em;">+</span>
78
+ {/if}
79
+ </button>
80
+
81
+ {#if open}
82
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
83
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
84
+ <div
85
+ class="emoji-picker-dropdown absolute left-0 top-full mt-1 z-50 rounded-lg overflow-hidden"
86
+ style="background: oklch(0.18 0.02 250); border: 1px solid oklch(0.30 0.02 250); box-shadow: 0 8px 32px oklch(0 0 0 / 0.5); width: 280px;"
87
+ onclick={(e) => e.stopPropagation()}
88
+ >
89
+ <!-- Search -->
90
+ <div class="px-2 py-1.5" style="border-bottom: 1px solid oklch(0.24 0.01 250);">
91
+ <input
92
+ bind:this={searchInputEl}
93
+ type="text"
94
+ placeholder="Search emojis..."
95
+ bind:value={searchQuery}
96
+ class="w-full px-2 py-1 rounded text-xs border-0 outline-none"
97
+ style="background: oklch(0.22 0.01 250); color: oklch(0.85 0.01 250);"
98
+ />
99
+ </div>
100
+
101
+ <!-- Emoji grid -->
102
+ <div class="max-h-64 overflow-y-auto px-1.5 py-1.5">
103
+ {#if searchResults}
104
+ {#if searchResults.length === 0}
105
+ <div class="text-center py-4 text-xs" style="color: oklch(0.45 0.02 250);">
106
+ No emojis found
107
+ </div>
108
+ {:else}
109
+ <div class="grid grid-cols-8 gap-0.5">
110
+ {#each searchResults as entry}
111
+ <button
112
+ class="w-7 h-7 flex items-center justify-center rounded text-sm cursor-pointer transition-all duration-75 hover:scale-110"
113
+ style="background: {selected === entry.char ? 'oklch(0.45 0.12 240 / 0.3)' : 'transparent'};"
114
+ onclick={() => handleSelect(entry.char)}
115
+ title={entry.name}
116
+ >
117
+ {entry.char}
118
+ </button>
119
+ {/each}
120
+ </div>
121
+ {/if}
122
+ {:else}
123
+ {#each EMOJI_DATA as group}
124
+ <div class="mb-1.5">
125
+ <div class="text-[9px] font-mono uppercase tracking-wider px-1 py-0.5 sticky top-0" style="color: oklch(0.45 0.02 250); background: oklch(0.18 0.02 250);">
126
+ {group.label}
127
+ </div>
128
+ <div class="grid grid-cols-8 gap-0.5">
129
+ {#each group.emojis as entry}
130
+ <button
131
+ class="w-7 h-7 flex items-center justify-center rounded text-sm cursor-pointer transition-all duration-75 hover:scale-110"
132
+ style="background: {selected === entry.char ? 'oklch(0.45 0.12 240 / 0.3)' : 'transparent'};"
133
+ onclick={() => handleSelect(entry.char)}
134
+ title={entry.name}
135
+ >
136
+ {entry.char}
137
+ </button>
138
+ {/each}
139
+ </div>
140
+ </div>
141
+ {/each}
142
+ {/if}
143
+ </div>
144
+
145
+ <!-- Clear button -->
146
+ {#if selected}
147
+ <div class="px-2 py-1.5" style="border-top: 1px solid oklch(0.24 0.01 250);">
148
+ <button
149
+ class="w-full text-center text-[10px] py-1 rounded cursor-pointer transition-colors duration-100"
150
+ style="color: oklch(0.55 0.02 250); background: transparent;"
151
+ onclick={handleClear}
152
+ >
153
+ Clear icon
154
+ </button>
155
+ </div>
156
+ {/if}
157
+ </div>
158
+ {/if}
159
+ </div>
@@ -0,0 +1,8 @@
1
+ type $$ComponentProps = {
2
+ selected: string | null;
3
+ onSelect: (emoji: string | null) => void;
4
+ size?: 'sm' | 'md';
5
+ };
6
+ declare const EmojiPicker: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type EmojiPicker = ReturnType<typeof EmojiPicker>;
8
+ export default EmojiPicker;
@@ -0,0 +1,104 @@
1
+ <script lang="ts">
2
+ import type { EntityPreviewData, EntityPreviewBadge } from "../types/entityPreview"
3
+
4
+ let {
5
+ data,
6
+ loading = false,
7
+ error = false,
8
+ }: {
9
+ data: EntityPreviewData | null
10
+ loading?: boolean
11
+ error?: boolean
12
+ } = $props()
13
+
14
+ // First letter monogram fallback when there's no image.
15
+ const monogram = $derived((data?.title ?? "?").trim().charAt(0).toUpperCase() || "?")
16
+
17
+ function toneClass(tone: EntityPreviewBadge["tone"]): string {
18
+ switch (tone) {
19
+ case "primary":
20
+ return "badge-primary"
21
+ case "info":
22
+ return "badge-info"
23
+ case "success":
24
+ return "badge-success"
25
+ case "warning":
26
+ return "badge-warning"
27
+ case "error":
28
+ return "badge-error"
29
+ default:
30
+ return "badge-ghost"
31
+ }
32
+ }
33
+ </script>
34
+
35
+ <div
36
+ class="bg-base-100 border-base-content/10 rounded-box w-72 overflow-hidden border text-left"
37
+ >
38
+ {#if loading}
39
+ <div class="space-y-2 p-4">
40
+ <div class="bg-base-300 h-3 w-20 animate-pulse rounded"></div>
41
+ <div class="bg-base-300 h-4 w-40 animate-pulse rounded"></div>
42
+ <div class="bg-base-300 h-3 w-full animate-pulse rounded"></div>
43
+ </div>
44
+ {:else if error || !data}
45
+ <div class="text-base-content/50 p-4 text-sm">Preview unavailable.</div>
46
+ {:else}
47
+ {#if data.imageUrl}
48
+ <div class="bg-base-200 aspect-[16/9] w-full overflow-hidden">
49
+ <img src={data.imageUrl} alt={data.title} class="size-full object-cover" />
50
+ </div>
51
+ {/if}
52
+
53
+ <div class="space-y-2 p-4">
54
+ <div class="flex items-start gap-3">
55
+ {#if !data.imageUrl}
56
+ <div
57
+ class="bg-primary/10 text-primary rounded-box flex size-9 shrink-0 items-center justify-center text-sm font-bold"
58
+ aria-hidden="true"
59
+ >
60
+ {monogram}
61
+ </div>
62
+ {/if}
63
+ <div class="min-w-0 flex-1">
64
+ <div class="text-base-content/45 text-[10px] font-medium uppercase tracking-wide">
65
+ {data.typeLabel}
66
+ </div>
67
+ <div class="truncate text-sm font-semibold leading-tight">
68
+ {#if data.href}
69
+ <a href={data.href} class="hover:underline">{data.title}</a>
70
+ {:else}
71
+ {data.title}
72
+ {/if}
73
+ </div>
74
+ {#if data.subtitle}
75
+ <div class="text-base-content/55 truncate text-xs">{data.subtitle}</div>
76
+ {/if}
77
+ </div>
78
+ </div>
79
+
80
+ {#if data.summary}
81
+ <p class="text-base-content/70 line-clamp-2 text-xs">{data.summary}</p>
82
+ {/if}
83
+
84
+ {#if data.badges && data.badges.length > 0}
85
+ <div class="flex flex-wrap gap-1">
86
+ {#each data.badges as badge}
87
+ <span class="badge {toneClass(badge.tone)} badge-sm capitalize">{badge.label}</span>
88
+ {/each}
89
+ </div>
90
+ {/if}
91
+
92
+ {#if data.stats && data.stats.length > 0}
93
+ <div class="border-base-content/10 grid grid-cols-2 gap-x-4 gap-y-1 border-t pt-2">
94
+ {#each data.stats.slice(0, 4) as stat}
95
+ <div>
96
+ <div class="text-base-content/45 text-[10px] uppercase tracking-wide">{stat.label}</div>
97
+ <div class="text-xs font-semibold tabular-nums">{stat.value}</div>
98
+ </div>
99
+ {/each}
100
+ </div>
101
+ {/if}
102
+ </div>
103
+ {/if}
104
+ </div>
@@ -0,0 +1,9 @@
1
+ import type { EntityPreviewData } from "../types/entityPreview";
2
+ type $$ComponentProps = {
3
+ data: EntityPreviewData | null;
4
+ loading?: boolean;
5
+ error?: boolean;
6
+ };
7
+ declare const EntityPreviewCard: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type EntityPreviewCard = ReturnType<typeof EntityPreviewCard>;
9
+ export default EntityPreviewCard;