@happyvertical/smrt-messages 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/AGENTS.md +31 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +103 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/collections/AccountCollection.d.ts +42 -0
  8. package/dist/collections/AccountCollection.d.ts.map +1 -0
  9. package/dist/collections/AttachmentCollection.d.ts +67 -0
  10. package/dist/collections/AttachmentCollection.d.ts.map +1 -0
  11. package/dist/collections/BlacklistCollection.d.ts +14 -0
  12. package/dist/collections/BlacklistCollection.d.ts.map +1 -0
  13. package/dist/collections/EmailAccountCollection.d.ts +74 -0
  14. package/dist/collections/EmailAccountCollection.d.ts.map +1 -0
  15. package/dist/collections/EmailAttachmentCollection.d.ts +38 -0
  16. package/dist/collections/EmailAttachmentCollection.d.ts.map +1 -0
  17. package/dist/collections/EmailCollection.d.ts +81 -0
  18. package/dist/collections/EmailCollection.d.ts.map +1 -0
  19. package/dist/collections/EmailFolderCollection.d.ts +85 -0
  20. package/dist/collections/EmailFolderCollection.d.ts.map +1 -0
  21. package/dist/collections/MessageCollection.d.ts +74 -0
  22. package/dist/collections/MessageCollection.d.ts.map +1 -0
  23. package/dist/collections/WhitelistCollection.d.ts +18 -0
  24. package/dist/collections/WhitelistCollection.d.ts.map +1 -0
  25. package/dist/index.d.ts +27 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +3068 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/manifest.json +10576 -0
  30. package/dist/models/Account.d.ts +47 -0
  31. package/dist/models/Account.d.ts.map +1 -0
  32. package/dist/models/Attachment.d.ts +48 -0
  33. package/dist/models/Attachment.d.ts.map +1 -0
  34. package/dist/models/Blacklist.d.ts +21 -0
  35. package/dist/models/Blacklist.d.ts.map +1 -0
  36. package/dist/models/Email.d.ts +98 -0
  37. package/dist/models/Email.d.ts.map +1 -0
  38. package/dist/models/EmailAccount.d.ts +65 -0
  39. package/dist/models/EmailAccount.d.ts.map +1 -0
  40. package/dist/models/EmailAttachment.d.ts +19 -0
  41. package/dist/models/EmailAttachment.d.ts.map +1 -0
  42. package/dist/models/EmailFolder.d.ts +65 -0
  43. package/dist/models/EmailFolder.d.ts.map +1 -0
  44. package/dist/models/Message.d.ts +105 -0
  45. package/dist/models/Message.d.ts.map +1 -0
  46. package/dist/models/SlackAccount.d.ts +13 -0
  47. package/dist/models/SlackAccount.d.ts.map +1 -0
  48. package/dist/models/SlackMessage.d.ts +34 -0
  49. package/dist/models/SlackMessage.d.ts.map +1 -0
  50. package/dist/models/Tweet.d.ts +31 -0
  51. package/dist/models/Tweet.d.ts.map +1 -0
  52. package/dist/models/TwitterAccount.d.ts +12 -0
  53. package/dist/models/TwitterAccount.d.ts.map +1 -0
  54. package/dist/models/Whitelist.d.ts +21 -0
  55. package/dist/models/Whitelist.d.ts.map +1 -0
  56. package/dist/playground.d.ts +2 -0
  57. package/dist/playground.d.ts.map +1 -0
  58. package/dist/playground.js +176 -0
  59. package/dist/playground.js.map +1 -0
  60. package/dist/senders/EmailSender.d.ts +13 -0
  61. package/dist/senders/EmailSender.d.ts.map +1 -0
  62. package/dist/senders/SlackSender.d.ts +11 -0
  63. package/dist/senders/SlackSender.d.ts.map +1 -0
  64. package/dist/senders/TweetSender.d.ts +11 -0
  65. package/dist/senders/TweetSender.d.ts.map +1 -0
  66. package/dist/smrt-knowledge.json +4234 -0
  67. package/dist/svelte/components/AccountAvatar.svelte +107 -0
  68. package/dist/svelte/components/AccountAvatar.svelte.d.ts +12 -0
  69. package/dist/svelte/components/AccountAvatar.svelte.d.ts.map +1 -0
  70. package/dist/svelte/components/AccountCard.svelte +173 -0
  71. package/dist/svelte/components/AccountCard.svelte.d.ts +12 -0
  72. package/dist/svelte/components/AccountCard.svelte.d.ts.map +1 -0
  73. package/dist/svelte/components/AccountList.svelte +90 -0
  74. package/dist/svelte/components/AccountList.svelte.d.ts +12 -0
  75. package/dist/svelte/components/AccountList.svelte.d.ts.map +1 -0
  76. package/dist/svelte/components/AttachmentChip.svelte +99 -0
  77. package/dist/svelte/components/AttachmentChip.svelte.d.ts +12 -0
  78. package/dist/svelte/components/AttachmentChip.svelte.d.ts.map +1 -0
  79. package/dist/svelte/components/AttachmentUpload.svelte +160 -0
  80. package/dist/svelte/components/AttachmentUpload.svelte.d.ts +11 -0
  81. package/dist/svelte/components/AttachmentUpload.svelte.d.ts.map +1 -0
  82. package/dist/svelte/components/ComposeForm.svelte +387 -0
  83. package/dist/svelte/components/ComposeForm.svelte.d.ts +13 -0
  84. package/dist/svelte/components/ComposeForm.svelte.d.ts.map +1 -0
  85. package/dist/svelte/components/EmailAccountManager.svelte +690 -0
  86. package/dist/svelte/components/EmailAccountManager.svelte.d.ts +15 -0
  87. package/dist/svelte/components/EmailAccountManager.svelte.d.ts.map +1 -0
  88. package/dist/svelte/components/EmailFilterManager.svelte +687 -0
  89. package/dist/svelte/components/EmailFilterManager.svelte.d.ts +14 -0
  90. package/dist/svelte/components/EmailFilterManager.svelte.d.ts.map +1 -0
  91. package/dist/svelte/components/FolderNav.svelte +171 -0
  92. package/dist/svelte/components/FolderNav.svelte.d.ts +11 -0
  93. package/dist/svelte/components/FolderNav.svelte.d.ts.map +1 -0
  94. package/dist/svelte/components/ForwardForm.svelte +166 -0
  95. package/dist/svelte/components/ForwardForm.svelte.d.ts +10 -0
  96. package/dist/svelte/components/ForwardForm.svelte.d.ts.map +1 -0
  97. package/dist/svelte/components/MessageCard.svelte +336 -0
  98. package/dist/svelte/components/MessageCard.svelte.d.ts +20 -0
  99. package/dist/svelte/components/MessageCard.svelte.d.ts.map +1 -0
  100. package/dist/svelte/components/MessageDetail.svelte +309 -0
  101. package/dist/svelte/components/MessageDetail.svelte.d.ts +18 -0
  102. package/dist/svelte/components/MessageDetail.svelte.d.ts.map +1 -0
  103. package/dist/svelte/components/MessageFilters.svelte +228 -0
  104. package/dist/svelte/components/MessageFilters.svelte.d.ts +13 -0
  105. package/dist/svelte/components/MessageFilters.svelte.d.ts.map +1 -0
  106. package/dist/svelte/components/MessageList.svelte +101 -0
  107. package/dist/svelte/components/MessageList.svelte.d.ts +23 -0
  108. package/dist/svelte/components/MessageList.svelte.d.ts.map +1 -0
  109. package/dist/svelte/components/MessageStatusIndicator.svelte +82 -0
  110. package/dist/svelte/components/MessageStatusIndicator.svelte.d.ts +11 -0
  111. package/dist/svelte/components/MessageStatusIndicator.svelte.d.ts.map +1 -0
  112. package/dist/svelte/components/MessageToolbar.svelte +131 -0
  113. package/dist/svelte/components/MessageToolbar.svelte.d.ts +14 -0
  114. package/dist/svelte/components/MessageToolbar.svelte.d.ts.map +1 -0
  115. package/dist/svelte/components/MessageTypeBadge.svelte +59 -0
  116. package/dist/svelte/components/MessageTypeBadge.svelte.d.ts +9 -0
  117. package/dist/svelte/components/MessageTypeBadge.svelte.d.ts.map +1 -0
  118. package/dist/svelte/components/RecipientInput.svelte +150 -0
  119. package/dist/svelte/components/RecipientInput.svelte.d.ts +11 -0
  120. package/dist/svelte/components/RecipientInput.svelte.d.ts.map +1 -0
  121. package/dist/svelte/components/ReplyForm.svelte +159 -0
  122. package/dist/svelte/components/ReplyForm.svelte.d.ts +11 -0
  123. package/dist/svelte/components/ReplyForm.svelte.d.ts.map +1 -0
  124. package/dist/svelte/components/SendStatusBadge.svelte +64 -0
  125. package/dist/svelte/components/SendStatusBadge.svelte.d.ts +8 -0
  126. package/dist/svelte/components/SendStatusBadge.svelte.d.ts.map +1 -0
  127. package/dist/svelte/components/ThreadView.svelte +240 -0
  128. package/dist/svelte/components/ThreadView.svelte.d.ts +12 -0
  129. package/dist/svelte/components/ThreadView.svelte.d.ts.map +1 -0
  130. package/dist/svelte/i18n.d.ts +42 -0
  131. package/dist/svelte/i18n.d.ts.map +1 -0
  132. package/dist/svelte/i18n.js +60 -0
  133. package/dist/svelte/i18n.messages.d.ts +32 -0
  134. package/dist/svelte/i18n.messages.d.ts.map +1 -0
  135. package/dist/svelte/i18n.messages.js +46 -0
  136. package/dist/svelte/index.d.ts +54 -0
  137. package/dist/svelte/index.d.ts.map +1 -0
  138. package/dist/svelte/index.js +44 -0
  139. package/dist/svelte/playground.d.ts +341 -0
  140. package/dist/svelte/playground.d.ts.map +1 -0
  141. package/dist/svelte/playground.js +171 -0
  142. package/dist/svelte/types.d.ts +195 -0
  143. package/dist/svelte/types.d.ts.map +1 -0
  144. package/dist/svelte/types.js +6 -0
  145. package/dist/types.d.ts +316 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +2 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/ui.d.ts +4 -0
  150. package/dist/ui.d.ts.map +1 -0
  151. package/dist/ui.js +103 -0
  152. package/dist/ui.js.map +1 -0
  153. package/package.json +104 -0
@@ -0,0 +1,11 @@
1
+ import type { AttachmentData } from '../types.js';
2
+ export interface Props {
3
+ attachments: AttachmentData[];
4
+ onattach?: (files: File[]) => void;
5
+ onremove?: (index: number) => void;
6
+ maxSize?: number;
7
+ }
8
+ declare const AttachmentUpload: import("svelte").Component<Props, {}, "">;
9
+ type AttachmentUpload = ReturnType<typeof AttachmentUpload>;
10
+ export default AttachmentUpload;
11
+ //# sourceMappingURL=AttachmentUpload.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentUpload.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/AttachmentUpload.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,KAAK;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA6ED,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,387 @@
1
+ <script lang="ts" module>
2
+ import type {
3
+ AccountData,
4
+ AttachmentData,
5
+ ComposeState,
6
+ RecipientEntry,
7
+ } from '../types.js';
8
+
9
+ export interface Props {
10
+ type?: 'email' | 'slack' | 'tweet';
11
+ accounts?: AccountData[];
12
+ initialState?: Partial<ComposeState>;
13
+ onsend?: (state: ComposeState) => void;
14
+ onsavedraft?: (state: ComposeState) => void;
15
+ ondiscard?: () => void;
16
+ }
17
+ </script>
18
+
19
+ <script lang="ts">
20
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
21
+ import { M } from '../i18n.js';
22
+ import RecipientInput from './RecipientInput.svelte';
23
+ import AttachmentUpload from './AttachmentUpload.svelte';
24
+
25
+ const { t } = useI18n();
26
+
27
+ let {
28
+ type = 'email',
29
+ accounts = [],
30
+ initialState,
31
+ onsend,
32
+ onsavedraft,
33
+ ondiscard,
34
+ }: Props = $props();
35
+
36
+ function createComposeState(
37
+ nextInitialState: Partial<ComposeState> | undefined,
38
+ nextAccounts: AccountData[],
39
+ ): ComposeState {
40
+ return {
41
+ accountId: nextInitialState?.accountId ?? nextAccounts[0]?.id ?? '',
42
+ to: nextInitialState?.to ?? [],
43
+ cc: nextInitialState?.cc ?? [],
44
+ bcc: nextInitialState?.bcc ?? [],
45
+ subject: nextInitialState?.subject ?? '',
46
+ body: nextInitialState?.body ?? '',
47
+ attachments: nextInitialState?.attachments ?? [],
48
+ channelId: nextInitialState?.channelId ?? '',
49
+ isDirty: false,
50
+ isSending: false,
51
+ };
52
+ }
53
+
54
+ let accountId = $state('');
55
+ let toRecipients = $state([] as RecipientEntry[]);
56
+ let ccRecipients = $state([] as RecipientEntry[]);
57
+ let bccRecipients = $state([] as RecipientEntry[]);
58
+ let subject = $state('');
59
+ let body = $state('');
60
+ let attachments = $state([] as AttachmentData[]);
61
+ let channelId = $state('');
62
+ let isDirty = $state(false);
63
+ let isSending = $state(false);
64
+ let showCc = $state(false);
65
+ let showBcc = $state(false);
66
+ let appliedInitialState: Partial<ComposeState> | undefined;
67
+ let appliedAccounts: AccountData[] | undefined;
68
+
69
+ $effect(() => {
70
+ if (
71
+ appliedInitialState === initialState &&
72
+ appliedAccounts === accounts
73
+ ) {
74
+ return;
75
+ }
76
+
77
+ appliedInitialState = initialState;
78
+ appliedAccounts = accounts;
79
+ const nextState = createComposeState(initialState, accounts);
80
+
81
+ accountId = nextState.accountId;
82
+ toRecipients = nextState.to;
83
+ ccRecipients = nextState.cc;
84
+ bccRecipients = nextState.bcc;
85
+ subject = nextState.subject;
86
+ body = nextState.body;
87
+ attachments = nextState.attachments;
88
+ channelId = nextState.channelId ?? '';
89
+ isDirty = nextState.isDirty;
90
+ isSending = nextState.isSending;
91
+ showCc = ccRecipients.length > 0;
92
+ showBcc = bccRecipients.length > 0;
93
+ });
94
+
95
+ function getCurrentState(): ComposeState {
96
+ return {
97
+ accountId,
98
+ to: toRecipients,
99
+ cc: ccRecipients,
100
+ bcc: bccRecipients,
101
+ subject,
102
+ body,
103
+ attachments,
104
+ channelId,
105
+ isDirty,
106
+ isSending,
107
+ };
108
+ }
109
+
110
+ const charCount = $derived(body.length);
111
+ const isOverLimit = $derived(type === 'tweet' && charCount > 280);
112
+
113
+ function markDirty() {
114
+ isDirty = true;
115
+ }
116
+
117
+ function handleSend() {
118
+ if (isSending) return;
119
+
120
+ isSending = true;
121
+ onsend?.(getCurrentState());
122
+ }
123
+
124
+ function handleSaveDraft() {
125
+ onsavedraft?.(getCurrentState());
126
+ }
127
+ </script>
128
+
129
+ <form class="compose-form" onsubmit={(e) => { e.preventDefault(); handleSend(); }}>
130
+ {#if accounts.length > 1}
131
+ <div class="field">
132
+ <label class="field-label" for="compose-account">From</label>
133
+ <select
134
+ id="compose-account"
135
+ class="select"
136
+ bind:value={accountId}
137
+ onchange={markDirty}
138
+ >
139
+ {#each accounts as account}
140
+ <option value={account.id}>
141
+ {account.name}{account.email ? ` <${account.email}>` : ''}
142
+ </option>
143
+ {/each}
144
+ </select>
145
+ </div>
146
+ {/if}
147
+
148
+ {#if type === 'email'}
149
+ <RecipientInput
150
+ label="To"
151
+ recipients={toRecipients}
152
+ onchange={(r) => { toRecipients = r; markDirty(); }}
153
+ />
154
+
155
+ {#if showCc}
156
+ <RecipientInput
157
+ label="Cc"
158
+ recipients={ccRecipients}
159
+ onchange={(r) => { ccRecipients = r; markDirty(); }}
160
+ />
161
+ {/if}
162
+
163
+ {#if showBcc}
164
+ <RecipientInput
165
+ label="Bcc"
166
+ recipients={bccRecipients}
167
+ onchange={(r) => { bccRecipients = r; markDirty(); }}
168
+ />
169
+ {/if}
170
+
171
+ {#if !showCc || !showBcc}
172
+ <div class="cc-toggles">
173
+ {#if !showCc}
174
+ <button type="button" class="link-btn" onclick={() => showCc = true}>Cc</button>
175
+ {/if}
176
+ {#if !showBcc}
177
+ <button type="button" class="link-btn" onclick={() => showBcc = true}>Bcc</button>
178
+ {/if}
179
+ </div>
180
+ {/if}
181
+
182
+ <div class="field">
183
+ <label class="field-label" for="compose-subject">Subject</label>
184
+ <input
185
+ id="compose-subject"
186
+ type="text"
187
+ class="text-input"
188
+ bind:value={subject}
189
+ oninput={markDirty}
190
+ placeholder={t(M['messages.compose_form.subject_placeholder'])}
191
+ />
192
+ </div>
193
+ {:else if type === 'slack'}
194
+ <div class="field">
195
+ <label class="field-label" for="compose-channel">Channel</label>
196
+ <input
197
+ id="compose-channel"
198
+ type="text"
199
+ class="text-input"
200
+ bind:value={channelId}
201
+ oninput={markDirty}
202
+ placeholder={t(M['messages.compose_form.channel_id_placeholder'])}
203
+ />
204
+ </div>
205
+ {/if}
206
+
207
+ <div class="body-field">
208
+ <textarea
209
+ class="body-input"
210
+ bind:value={body}
211
+ oninput={markDirty}
212
+ placeholder={type === 'tweet' ? "What's happening?" : 'Write your message...'}
213
+ rows={type === 'tweet' ? 4 : 10}
214
+ ></textarea>
215
+ {#if type === 'tweet'}
216
+ <div class="char-count" class:over-limit={isOverLimit}>
217
+ {charCount}/280
218
+ </div>
219
+ {/if}
220
+ </div>
221
+
222
+ {#if type === 'email'}
223
+ <AttachmentUpload
224
+ {attachments}
225
+ onattach={(files: File[]) => {
226
+ const newAttachments: AttachmentData[] = files.map((f) => ({
227
+ id: crypto.randomUUID(),
228
+ filename: f.name,
229
+ contentType: f.type,
230
+ size: f.size,
231
+ }));
232
+ attachments = [...attachments, ...newAttachments];
233
+ markDirty();
234
+ }}
235
+ onremove={(i: number) => {
236
+ attachments = attachments.filter(
237
+ (_attachment, attachmentIndex: number) => attachmentIndex !== i,
238
+ );
239
+ markDirty();
240
+ }}
241
+ />
242
+ {/if}
243
+
244
+ <div class="actions">
245
+ <button
246
+ type="submit"
247
+ class="btn-primary"
248
+ disabled={isSending || isOverLimit}
249
+ >
250
+ {isSending ? 'Sending...' : 'Send'}
251
+ </button>
252
+ <button type="button" class="btn-secondary" onclick={handleSaveDraft}>
253
+ {t(M['messages.compose_form.save_draft'])}
254
+ </button>
255
+ <button type="button" class="btn-text" onclick={() => ondiscard?.()}>
256
+ Discard
257
+ </button>
258
+ </div>
259
+ </form>
260
+
261
+ <style>
262
+ .compose-form {
263
+ display: flex;
264
+ flex-direction: column;
265
+ gap: var(--smrt-spacing-2, 8px);
266
+ padding: var(--smrt-spacing-4, 16px);
267
+ font-family: var(--smrt-font-family, system-ui);
268
+ }
269
+
270
+ .field {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: var(--smrt-spacing-2, 8px);
274
+ padding: var(--smrt-spacing-1, 4px) 0;
275
+ border-bottom: 1px solid var(--smrt-color-outline-variant, #cac4d0);
276
+ }
277
+
278
+ .field-label {
279
+ font-size: var(--smrt-typography-label-large-size, 14px);
280
+ color: var(--smrt-color-on-surface-variant, #49454f);
281
+ min-width: 56px;
282
+ }
283
+
284
+ .select,
285
+ .text-input {
286
+ flex: 1;
287
+ border: none;
288
+ outline: none;
289
+ font-family: inherit;
290
+ font-size: var(--smrt-typography-body-medium-size, 14px);
291
+ padding: var(--smrt-spacing-2, 8px) 0;
292
+ background: transparent;
293
+ color: var(--smrt-color-on-surface, #1c1b1f);
294
+ }
295
+
296
+ .cc-toggles {
297
+ display: flex;
298
+ gap: var(--smrt-spacing-2, 8px);
299
+ justify-content: flex-end;
300
+ }
301
+
302
+ .link-btn {
303
+ background: none;
304
+ border: none;
305
+ cursor: pointer;
306
+ color: var(--smrt-color-primary, #6750a4);
307
+ font-size: var(--smrt-typography-label-large-size, 13px);
308
+ text-decoration: underline;
309
+ }
310
+
311
+ .body-field {
312
+ position: relative;
313
+ }
314
+
315
+ .body-input {
316
+ width: 100%;
317
+ border: 1px solid var(--smrt-color-outline-variant, #cac4d0);
318
+ border-radius: var(--smrt-radius-md, 12px);
319
+ padding: var(--smrt-spacing-3, 12px);
320
+ font-family: var(--smrt-font-family, system-ui);
321
+ font-size: var(--smrt-typography-body-medium-size, 14px);
322
+ resize: vertical;
323
+ background: var(--smrt-color-surface, #fffbfe);
324
+ color: var(--smrt-color-on-surface, #1c1b1f);
325
+ box-sizing: border-box;
326
+ }
327
+
328
+ .body-input:focus {
329
+ outline: 2px solid var(--smrt-color-primary, #6750a4);
330
+ outline-offset: -1px;
331
+ }
332
+
333
+ .char-count {
334
+ text-align: right;
335
+ font-size: var(--smrt-typography-label-medium-size, 12px);
336
+ color: var(--smrt-color-outline, #79747e);
337
+ padding-top: var(--smrt-spacing-1, 4px);
338
+ }
339
+
340
+ .char-count.over-limit {
341
+ color: var(--smrt-color-error, #ba1a1a);
342
+ font-weight: var(--smrt-typography-weight-semibold, 600);
343
+ }
344
+
345
+ .actions {
346
+ display: flex;
347
+ gap: var(--smrt-spacing-2, 8px);
348
+ padding-top: var(--smrt-spacing-2, 8px);
349
+ }
350
+
351
+ .btn-primary {
352
+ padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-6, 24px);
353
+ border-radius: var(--smrt-radius-full, 20px);
354
+ border: none;
355
+ background: var(--smrt-color-primary, #6750a4);
356
+ color: var(--smrt-color-on-primary, #fff);
357
+ font-family: var(--smrt-font-family, system-ui);
358
+ font-size: var(--smrt-typography-label-large-size, 14px);
359
+ cursor: pointer;
360
+ }
361
+
362
+ .btn-primary:disabled {
363
+ opacity: 0.6;
364
+ cursor: not-allowed;
365
+ }
366
+
367
+ .btn-secondary {
368
+ padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-4, 16px);
369
+ border-radius: var(--smrt-radius-full, 20px);
370
+ border: 1px solid var(--smrt-color-outline, #79747e);
371
+ background: transparent;
372
+ color: var(--smrt-color-primary, #6750a4);
373
+ font-family: var(--smrt-font-family, system-ui);
374
+ font-size: var(--smrt-typography-label-large-size, 14px);
375
+ cursor: pointer;
376
+ }
377
+
378
+ .btn-text {
379
+ padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-4, 16px);
380
+ border: none;
381
+ background: transparent;
382
+ color: var(--smrt-color-on-surface-variant, #49454f);
383
+ font-family: var(--smrt-font-family, system-ui);
384
+ font-size: var(--smrt-typography-label-large-size, 14px);
385
+ cursor: pointer;
386
+ }
387
+ </style>
@@ -0,0 +1,13 @@
1
+ import type { AccountData, ComposeState } from '../types.js';
2
+ export interface Props {
3
+ type?: 'email' | 'slack' | 'tweet';
4
+ accounts?: AccountData[];
5
+ initialState?: Partial<ComposeState>;
6
+ onsend?: (state: ComposeState) => void;
7
+ onsavedraft?: (state: ComposeState) => void;
8
+ ondiscard?: () => void;
9
+ }
10
+ declare const ComposeForm: import("svelte").Component<Props, {}, "">;
11
+ type ComposeForm = ReturnType<typeof ComposeForm>;
12
+ export default ComposeForm;
13
+ //# sourceMappingURL=ComposeForm.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposeForm.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ComposeForm.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EAEX,YAAY,EAEb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAmND,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}