@joewinke/jatui 0.1.24 → 0.1.26

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 +421 -0
  110. package/dist/components/SearchDropdown.svelte.d.ts +24 -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,91 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Collapse — batteries-included tall-content collapser.
4
+ *
5
+ * Wraps children in a region that caps at `threshold` px with a fade-out
6
+ * gradient and renders a "Show more / Show less" toggle that self-hides when
7
+ * the content is shorter than the threshold. Uses the `collapse` action for
8
+ * measurement (ResizeObserver-backed, so streaming / {@html} content works).
9
+ *
10
+ * <Collapse>
11
+ * {@html renderedMarkdown}
12
+ * </Collapse>
13
+ *
14
+ * For existing elements you don't want to wrap (a bare `<p>` inside an
15
+ * `{#each}`, a `<pre>`), use the `collapse` action directly instead.
16
+ */
17
+ import { collapse } from '../actions/collapse';
18
+
19
+ interface Props {
20
+ /** Max collapsed height in px. Default 120. */
21
+ threshold?: number;
22
+ /** Where the fade begins, as a %. Default 55. */
23
+ fadeStart?: number;
24
+ /** Start expanded. Default false. */
25
+ expanded?: boolean;
26
+ /** Toggle label when collapsed. Default 'Show more ↓'. */
27
+ moreLabel?: string;
28
+ /** Toggle label when expanded. Default 'Show less ↑'. */
29
+ lessLabel?: string;
30
+ /** Extra classes on the content region. */
31
+ class?: string;
32
+ children?: import('svelte').Snippet;
33
+ }
34
+
35
+ let {
36
+ threshold = 120,
37
+ fadeStart = 55,
38
+ expanded = $bindable(false),
39
+ moreLabel = 'Show more ↓',
40
+ lessLabel = 'Show less ↑',
41
+ class: className = '',
42
+ children,
43
+ }: Props = $props();
44
+
45
+ let collapsible = $state(false);
46
+ const instanceId = $props.id();
47
+ const bodyId = `jatui-collapse-${instanceId}`;
48
+ </script>
49
+
50
+ <div
51
+ id={bodyId}
52
+ class={`jatui-collapse-body ${className}`.trim()}
53
+ use:collapse={{ threshold, fadeStart, expanded, onCollapsible: (c) => (collapsible = c) }}
54
+ >
55
+ {#if children}
56
+ {@render children()}
57
+ {/if}
58
+ </div>
59
+ {#if collapsible}
60
+ <button
61
+ type="button"
62
+ class="jatui-collapse-toggle"
63
+ aria-expanded={expanded}
64
+ aria-controls={bodyId}
65
+ onclick={() => (expanded = !expanded)}
66
+ >
67
+ {expanded ? lessLabel : moreLabel}
68
+ </button>
69
+ {/if}
70
+
71
+ <style>
72
+ .jatui-collapse-body {
73
+ position: relative;
74
+ }
75
+ .jatui-collapse-toggle {
76
+ display: block;
77
+ margin-top: 4px;
78
+ padding: 2px 0;
79
+ font-size: 11px;
80
+ color: var(--color-primary, oklch(0.65 0.12 250));
81
+ background: none;
82
+ border: none;
83
+ cursor: pointer;
84
+ opacity: 0.75;
85
+ transition: opacity 0.1s;
86
+ }
87
+ .jatui-collapse-toggle:hover {
88
+ opacity: 1;
89
+ text-decoration: underline;
90
+ }
91
+ </style>
@@ -0,0 +1,18 @@
1
+ interface Props {
2
+ /** Max collapsed height in px. Default 120. */
3
+ threshold?: number;
4
+ /** Where the fade begins, as a %. Default 55. */
5
+ fadeStart?: number;
6
+ /** Start expanded. Default false. */
7
+ expanded?: boolean;
8
+ /** Toggle label when collapsed. Default 'Show more ↓'. */
9
+ moreLabel?: string;
10
+ /** Toggle label when expanded. Default 'Show less ↑'. */
11
+ lessLabel?: string;
12
+ /** Extra classes on the content region. */
13
+ class?: string;
14
+ children?: import('svelte').Snippet;
15
+ }
16
+ declare const Collapse: import("svelte").Component<Props, {}, "expanded">;
17
+ type Collapse = ReturnType<typeof Collapse>;
18
+ export default Collapse;
@@ -0,0 +1,167 @@
1
+ <script lang="ts">
2
+ import { slide } from "svelte/transition"
3
+
4
+ let {
5
+ selectedColor = null,
6
+ onSelect = (color: string | null) => {},
7
+ colorLabel = "Collection Color",
8
+ compact = false,
9
+ } = $props<{
10
+ selectedColor: string | null
11
+ onSelect?: (color: string | null) => void
12
+ colorLabel?: string
13
+ compact?: boolean
14
+ }>()
15
+
16
+ let showSelector = $state(false)
17
+ // svelte-ignore state_referenced_locally
18
+ let lastSelectedColor = $state(selectedColor)
19
+ let selectionAnimating = $state(false)
20
+
21
+ const colorOptions = [
22
+ { name: "Primary", value: "primary", bgClass: "bg-primary", textClass: "text-primary-content" },
23
+ { name: "Secondary", value: "secondary", bgClass: "bg-secondary", textClass: "text-secondary-content" },
24
+ { name: "Accent", value: "accent", bgClass: "bg-accent", textClass: "text-accent-content" },
25
+ { name: "Neutral", value: "neutral", bgClass: "bg-neutral", textClass: "text-neutral-content" },
26
+ { name: "Info", value: "info", bgClass: "bg-info", textClass: "text-info-content" },
27
+ { name: "Success", value: "success", bgClass: "bg-success", textClass: "text-success-content" },
28
+ { name: "Warning", value: "warning", bgClass: "bg-warning", textClass: "text-warning-content" },
29
+ { name: "Error", value: "error", bgClass: "bg-error", textClass: "text-error-content" },
30
+ ]
31
+
32
+ function isSelected(colorValue: string): boolean {
33
+ if (!selectedColor) return false
34
+ return selectedColor === colorValue
35
+ }
36
+
37
+ function handleColorSelect(colorValue: string) {
38
+ if (colorValue !== selectedColor) {
39
+ lastSelectedColor = colorValue
40
+ selectionAnimating = true
41
+ onSelect(colorValue)
42
+
43
+ setTimeout(() => {
44
+ selectionAnimating = false
45
+ if (compact) {
46
+ setTimeout(() => { showSelector = false }, 800)
47
+ }
48
+ }, 500)
49
+ } else {
50
+ onSelect(colorValue)
51
+ }
52
+ }
53
+ </script>
54
+
55
+ <div class="form-control">
56
+ <button
57
+ type="button"
58
+ class="flex w-full items-center justify-between px-2 py-3 hover:bg-base-200 rounded-lg transition-colors"
59
+ onclick={() => (showSelector = !showSelector)}
60
+ >
61
+ <div class="label flex items-center gap-2 cursor-pointer">
62
+ <span class="label-text font-medium">{colorLabel}</span>
63
+ {#if selectedColor}
64
+ <div class="ml-4">
65
+ <div class="color-preview {selectedColor}"></div>
66
+ </div>
67
+ {/if}
68
+ </div>
69
+ <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="transition-transform duration-300 {showSelector ? 'rotate-180' : ''}">
70
+ <polyline points="6 9 12 15 18 9"></polyline>
71
+ </svg>
72
+ </button>
73
+
74
+ {#if showSelector}
75
+ <div class="color-selector-wrapper" transition:slide={{ duration: 200 }}>
76
+ <div class="grid grid-cols-4 gap-3 p-4 bg-base-200 rounded-lg">
77
+ {#each colorOptions as option}
78
+ <button
79
+ type="button"
80
+ class="tooltip tooltip-top color-btn {option.bgClass} border-2 border-base-300
81
+ {isSelected(option.value) ? 'selected' : ''}
82
+ {selectionAnimating && lastSelectedColor === option.value ? 'selecting' : ''}"
83
+ data-tip={option.name}
84
+ onclick={() => handleColorSelect(option.value)}
85
+ aria-label="Select {option.name} color"
86
+ >
87
+ {#if isSelected(option.value) || (selectionAnimating && lastSelectedColor === option.value)}
88
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" class="{option.textClass} {selectionAnimating && lastSelectedColor === option.value ? 'animate-checkmark' : ''}">
89
+ <polyline points="20 6 9 17 4 12"></polyline>
90
+ </svg>
91
+ {/if}
92
+ </button>
93
+ {/each}
94
+ </div>
95
+
96
+ {#if selectedColor}
97
+ <div class="flex justify-end mt-2">
98
+ <button
99
+ class="text-xs text-base-content/60 hover:text-base-content transition-colors px-2 py-1 rounded hover:bg-base-200"
100
+ onclick={() => onSelect(null)}
101
+ >
102
+ Clear color
103
+ </button>
104
+ </div>
105
+ {/if}
106
+ </div>
107
+ {/if}
108
+ </div>
109
+
110
+ <style>
111
+ .color-selector-wrapper { padding-top: 0.5rem; }
112
+
113
+ .color-btn {
114
+ width: 100%;
115
+ aspect-ratio: 1;
116
+ border-radius: 0.75rem;
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ transition: transform 0.15s cubic-bezier(0.25, 0.46, 0.45, 0.94);
121
+ cursor: pointer;
122
+ }
123
+
124
+ .color-btn:hover {
125
+ transform: scale(1.05);
126
+ }
127
+
128
+ .color-btn.selected {
129
+ border-color: color-mix(in oklch, var(--color-base-100) 90%, transparent);
130
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-base-content) 25%, transparent);
131
+ }
132
+
133
+ .color-btn.selecting {
134
+ transform: scale(1.12);
135
+ border-color: color-mix(in oklch, var(--color-base-100) 90%, transparent);
136
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-base-content) 35%, transparent);
137
+ animation: pulse 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
138
+ }
139
+
140
+ @media (prefers-reduced-motion: reduce) {
141
+ .color-btn { transition: none; }
142
+ .color-btn:hover { transform: none; }
143
+ .color-btn.selecting { transform: none; animation: none; }
144
+ }
145
+
146
+ .color-preview {
147
+ width: 15px;
148
+ height: 15px;
149
+ border-radius: 50%;
150
+ border: 1px solid color-mix(in oklch, var(--color-base-content) 20%, transparent);
151
+ }
152
+
153
+ @keyframes pulse {
154
+ 0% { transform: scale(1); }
155
+ 50% { transform: scale(1.15); }
156
+ 100% { transform: scale(1.1); }
157
+ }
158
+
159
+ .animate-checkmark {
160
+ animation: zoom-in 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
161
+ }
162
+
163
+ @keyframes zoom-in {
164
+ 0% { transform: scale(0); opacity: 0; }
165
+ 100% { transform: scale(1); opacity: 1; }
166
+ }
167
+ </style>
@@ -0,0 +1,9 @@
1
+ type $$ComponentProps = {
2
+ selectedColor: string | null;
3
+ onSelect?: (color: string | null) => void;
4
+ colorLabel?: string;
5
+ compact?: boolean;
6
+ };
7
+ declare const ColorSelector: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type ColorSelector = ReturnType<typeof ColorSelector>;
9
+ export default ColorSelector;