@rkosafo/cai.components 0.0.75 → 0.0.78

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 (127) hide show
  1. package/README.md +8 -8
  2. package/dist/baseEditor/index.svelte +32 -32
  3. package/dist/builders/filters/FilterBuilder.svelte +641 -641
  4. package/dist/forms/FormCheckbox/FormCheckbox.svelte +53 -53
  5. package/dist/forms/FormClEditor/ClEdito.svelte +68 -68
  6. package/dist/forms/FormDatepicker/FormDatepicker.svelte +159 -159
  7. package/dist/forms/FormFileUpload/FormFileUplad.svelte +134 -134
  8. package/dist/forms/FormInput/FormInput.svelte +87 -87
  9. package/dist/forms/FormRadio/FormRadio.svelte +53 -53
  10. package/dist/forms/FormSelect/FormSelect.svelte +88 -88
  11. package/dist/forms/FormTextarea/FormTextarea.svelte +78 -78
  12. package/dist/forms/button-toggle/ButtonToggle.svelte +119 -0
  13. package/dist/forms/button-toggle/ButtonToggle.svelte.d.ts +139 -0
  14. package/dist/forms/button-toggle/ButtonToggleGroup.svelte +0 -0
  15. package/dist/forms/button-toggle/ButtonToggleGroup.svelte.d.ts +26 -0
  16. package/dist/forms/button-toggle/CheckIcon.svelte +28 -0
  17. package/dist/forms/button-toggle/CheckIcon.svelte.d.ts +4 -0
  18. package/dist/forms/button-toggle/index.d.ts +4 -0
  19. package/dist/forms/button-toggle/index.js +4 -0
  20. package/dist/forms/button-toggle/theme.d.ts +347 -0
  21. package/dist/forms/button-toggle/theme.js +129 -0
  22. package/dist/forms/checkbox/Checkbox.svelte +82 -82
  23. package/dist/forms/checkbox/CheckboxButton.svelte +92 -92
  24. package/dist/forms/datepicker/Datepicker.svelte +707 -707
  25. package/dist/forms/form/Form.svelte +69 -69
  26. package/dist/forms/input/Input.svelte +363 -363
  27. package/dist/forms/label/Label.svelte +38 -38
  28. package/dist/forms/radio/Radio.svelte +48 -48
  29. package/dist/forms/radio/RadioButton.svelte +22 -22
  30. package/dist/forms/select/Select.svelte +56 -56
  31. package/dist/forms/textarea/Textarea.svelte +165 -165
  32. package/dist/forms/toggle/Toggle.svelte +70 -0
  33. package/dist/forms/toggle/Toggle.svelte.d.ts +3 -0
  34. package/dist/forms/toggle/index.d.ts +2 -0
  35. package/dist/forms/toggle/index.js +2 -0
  36. package/dist/forms/toggle/theme.d.ts +280 -0
  37. package/dist/forms/toggle/theme.js +97 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.js +3 -0
  40. package/dist/layout/Chat/CategorySelector.svelte +52 -52
  41. package/dist/layout/Chat/ChatEntry.svelte +246 -246
  42. package/dist/layout/Chat/ChatEntrySkeleton.svelte +81 -81
  43. package/dist/layout/Chat/ChatHeader.svelte +172 -172
  44. package/dist/layout/Chat/ChatInput.svelte +207 -207
  45. package/dist/layout/Chat/DraggableWindow.svelte +230 -230
  46. package/dist/layout/Chat/PreviewPage.svelte +182 -182
  47. package/dist/layout/Chat/RichText.svelte +216 -216
  48. package/dist/layout/ComponentCanvas/Canvas.svelte +40 -40
  49. package/dist/layout/ComponentCanvas/ComponentRenderer.svelte +85 -85
  50. package/dist/layout/TF/Content/Content.svelte +21 -21
  51. package/dist/layout/TF/Header/Header.svelte +166 -166
  52. package/dist/layout/TF/Sidebar/Sidebar.svelte +148 -148
  53. package/dist/layout/TF/Wrapper/Wrapper.svelte +17 -17
  54. package/dist/layout/mailing/MailPaginator.svelte +36 -36
  55. package/dist/layout/mailing/MailSidebar.svelte +39 -39
  56. package/dist/layout/mailing/MailToolBar.svelte +174 -174
  57. package/dist/layout/mailing/MailingContent.svelte +10 -10
  58. package/dist/layout/mailing/MailingHeader.svelte +55 -55
  59. package/dist/layout/mailing/MailingMessageCard.svelte +112 -112
  60. package/dist/layout/mailing/MailingMessageViewer.svelte +87 -87
  61. package/dist/layout/mailing/MailingModule.svelte +448 -448
  62. package/dist/styles/docs.css +615 -615
  63. package/dist/styles/tf-layout.css +185 -185
  64. package/dist/themes/ThemeProvider.svelte +20 -20
  65. package/dist/themes/themes.d.ts +3 -0
  66. package/dist/themes/themes.js +3 -0
  67. package/dist/types/index.d.ts +57 -1
  68. package/dist/typography/heading/Heading.svelte +35 -35
  69. package/dist/ui/accordion/Accordion.svelte +49 -49
  70. package/dist/ui/accordion/AccordionItem.svelte +173 -173
  71. package/dist/ui/alert/Alert.svelte +83 -83
  72. package/dist/ui/alertDialog/AlertDialog.svelte +40 -40
  73. package/dist/ui/avatar/Avatar.svelte +77 -77
  74. package/dist/ui/box/Box.svelte +28 -28
  75. package/dist/ui/breadcrumb/Breadcrumb.svelte +39 -39
  76. package/dist/ui/buttons/ActionButton.svelte +234 -234
  77. package/dist/ui/buttons/Button.svelte +102 -102
  78. package/dist/ui/buttons/GradientButton.svelte +59 -59
  79. package/dist/ui/datatable/Datatable.svelte +525 -525
  80. package/dist/ui/drawer/Drawer.svelte +300 -300
  81. package/dist/ui/dropdown/Dropdown.svelte +36 -36
  82. package/dist/ui/dropdown/DropdownDivider.svelte +11 -11
  83. package/dist/ui/dropdown/DropdownGroup.svelte +14 -14
  84. package/dist/ui/dropdown/DropdownHeader.svelte +14 -14
  85. package/dist/ui/dropdown/DropdownItem.svelte +52 -52
  86. package/dist/ui/footer/Footer.svelte +15 -15
  87. package/dist/ui/footer/FooterBrand.svelte +37 -37
  88. package/dist/ui/footer/FooterCopyright.svelte +45 -45
  89. package/dist/ui/footer/FooterIcon.svelte +22 -22
  90. package/dist/ui/footer/FooterLink.svelte +33 -33
  91. package/dist/ui/footer/FooterLinkGroup.svelte +13 -13
  92. package/dist/ui/icons/IconifyIcon.svelte +7 -7
  93. package/dist/ui/indicator/Indicator.svelte +42 -42
  94. package/dist/ui/modal/Modal.svelte +265 -265
  95. package/dist/ui/modal/theme.d.ts +26 -26
  96. package/dist/ui/modal/theme.js +25 -25
  97. package/dist/ui/notificationList/NotificationList.svelte +123 -123
  98. package/dist/ui/pageLoader/PageLoader.svelte +14 -14
  99. package/dist/ui/paginate/Paginate.svelte +96 -96
  100. package/dist/ui/speedDial/SpeedDial.svelte +77 -0
  101. package/dist/ui/speedDial/SpeedDial.svelte.d.ts +21 -0
  102. package/dist/ui/speedDial/SpeedDialButton.svelte +75 -0
  103. package/dist/ui/speedDial/SpeedDialButton.svelte.d.ts +20 -0
  104. package/dist/ui/speedDial/SpeedDialTrigger.svelte +79 -0
  105. package/dist/ui/speedDial/SpeedDialTrigger.svelte.d.ts +18 -0
  106. package/dist/ui/speedDial/index.d.ts +4 -0
  107. package/dist/ui/speedDial/index.js +4 -0
  108. package/dist/ui/speedDial/theme.d.ts +75 -0
  109. package/dist/ui/speedDial/theme.js +35 -0
  110. package/dist/ui/tab/Tab.svelte +67 -67
  111. package/dist/ui/table/Table.svelte +396 -396
  112. package/dist/ui/tableLoader/TableLoader.svelte +24 -24
  113. package/dist/ui/toast/Toast.svelte +337 -337
  114. package/dist/ui/toast/Toast.svelte.d.ts +10 -10
  115. package/dist/ui/toast/index.d.ts +1 -2
  116. package/dist/ui/toast/index.js +3 -1
  117. package/dist/ui/toolbar/Toolbar.svelte +59 -59
  118. package/dist/ui/toolbar/ToolbarButton.svelte +56 -56
  119. package/dist/ui/toolbar/ToolbarGroup.svelte +43 -43
  120. package/dist/ui/tooltip/Tooltip.svelte +51 -51
  121. package/dist/utils/Popper.svelte +257 -257
  122. package/dist/utils/closeButton/CloseButton.svelte +88 -88
  123. package/dist/utils/index.d.ts +3 -2
  124. package/dist/utils/index.js +13 -3
  125. package/dist/utils/singleSelection.svelte.js +48 -48
  126. package/dist/youtube/index.svelte +12 -12
  127. package/package.json +2 -1
@@ -1,246 +1,246 @@
1
- <script lang="ts">
2
- import { IconifyIcon, isExcel, isImage, isPdf, isPPT, isWord } from '../../index.js';
3
- import { type ChatEntryPageProps } from './index.js';
4
- import PreviewPage from './PreviewPage.svelte';
5
-
6
- let { message, time = '', textBorder = true, userId }: ChatEntryPageProps = $props();
7
-
8
- let showImage = $state(false);
9
- let selectedFile = $state('');
10
-
11
- let frame = $state<HTMLIFrameElement | undefined>();
12
- function onItemClick(e: any) {
13
- e.target.requestFullscreen();
14
- e.stopPropagation();
15
- }
16
- </script>
17
-
18
- <div class=" mb-2 {message.mine ? 'flex justify-end' : 'flex justify-start'} ">
19
- <div class="mx-2 flex flex-col">
20
- <div class=" {message.mine ? ' text-right ' : ' text-left'} ">
21
- <span class=" text-sm text-gray-800/70">
22
- {time}
23
- </span>
24
- </div>
25
- <div class="order-1 flex max-w-sm flex-col space-y-2 text-sm" class:items-end={message.mine}>
26
- <div>
27
- <div class="space-y-2">
28
- <div class="flex" class:justify-end={message.mine} class:justify-start={!message.mine}>
29
- <div
30
- class="inline-block bg-gray-200 px-4 py-2 break-normal {message.mine
31
- ? 'rounded-l-md rounded-r-sm border-r-4 border-blue-800 '
32
- : 'rounded-l-sm rounded-r-md border-l-4 border-yellow-400'} "
33
- >
34
- {#if message.message.includes('http' || 'www.')}
35
- <a
36
- class={textBorder ? '' : 'bg-yellow-500 px-px '}
37
- href={message.message}
38
- target="_blank"
39
- >
40
- <p
41
- class="text-blue-500 underline decoration-blue-500 underline-offset-2 hover:text-blue-700"
42
- >
43
- {message.message}
44
- </p>
45
- </a>
46
- {:else}
47
- <p class={`break-normal ${textBorder ? '' : 'bg-yellow-500 px-px'}`}>
48
- {message.message}
49
- </p>
50
- {/if}
51
- </div>
52
- </div>
53
- {#if message.files && message.files.length}
54
- {#each message.files as image}
55
- <div
56
- class:justify-end={message.mine}
57
- class:justify-start={!message.mine}
58
- class:hidden={!isImage(image)}
59
- >
60
- <div
61
- class=" flex rounded-md p-1"
62
- class:justify-end={message.mine}
63
- class:justify-start={!message.mine}
64
- >
65
- <button class="group relative rounded-md bg-gray-200 p-0.5" onclick={onItemClick}>
66
- <img
67
- src={image}
68
- alt="pic"
69
- class="max-h-60 w-40 transform rounded-md transition duration-300 ease-in-out group-hover:scale-95"
70
- />
71
- <!-- <div
72
- class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
73
- /> -->
74
- </button>
75
- </div>
76
- </div>
77
- <div
78
- class:justify-end={message.mine}
79
- class:justify-start={!message.mine}
80
- class:hidden={!isPdf(image)}
81
- >
82
- <div
83
- class=" flex rounded-md p-1"
84
- class:justify-end={message.mine}
85
- class:justify-start={!message.mine}
86
- >
87
- <button
88
- class="group relative rounded-md bg-gray-200 px-0.5 py-2"
89
- onclick={(_) => {
90
- selectedFile = image;
91
- showImage = true;
92
- }}
93
- >
94
- <IconifyIcon
95
- icon="vscode-icons:file-type-pdf2"
96
- style="font-size: 150px;"
97
- class="transform transition duration-300 ease-in-out group-hover:scale-95"
98
- />
99
- <!-- <div
100
- class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
101
- /> -->
102
- </button>
103
- </div>
104
- </div>
105
- <div
106
- class:justify-end={message.mine}
107
- class:justify-start={!message.mine}
108
- class:hidden={!isWord(image)}
109
- >
110
- <div
111
- class=" flex rounded-md p-1"
112
- class:justify-end={message.mine}
113
- class:justify-start={!message.mine}
114
- >
115
- <button
116
- class="group relative rounded-md bg-gray-200 p-0.5"
117
- onclick={(_) => {
118
- selectedFile = image;
119
- showImage = true;
120
- }}
121
- >
122
- <IconifyIcon
123
- icon="vscode-icons:file-type-word"
124
- style="font-size: 150px;"
125
- class="transform transition duration-300 ease-in-out group-hover:scale-95"
126
- />
127
- <!-- <div
128
- class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
129
- /> -->
130
- </button>
131
- </div>
132
- </div>
133
- <div
134
- class:justify-end={message.mine}
135
- class:justify-start={!message.mine}
136
- class:hidden={!isPPT(image)}
137
- >
138
- <div
139
- class=" flex rounded-md p-1"
140
- class:justify-end={message.mine}
141
- class:justify-start={!message.mine}
142
- >
143
- <button
144
- class="group relative rounded-md bg-gray-200 p-0.5"
145
- onclick={(_) => {
146
- selectedFile = image;
147
- showImage = true;
148
- }}
149
- >
150
- <IconifyIcon
151
- icon="vscode-icons:file-type-powerpoint2"
152
- style="font-size: 150px;"
153
- class="transform transition duration-300 ease-in-out group-hover:scale-95"
154
- />
155
- <!-- <div
156
- class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
157
- /> -->
158
- </button>
159
- </div>
160
- </div>
161
- <div
162
- class:justify-end={message.mine}
163
- class:justify-start={!message.mine}
164
- class:hidden={!isExcel(image)}
165
- >
166
- <div
167
- class=" flex rounded-md p-1"
168
- class:justify-end={message.mine}
169
- class:justify-start={!message.mine}
170
- >
171
- <button
172
- class="group relative rounded-md bg-gray-200 p-0.5"
173
- onclick={() => {
174
- selectedFile = image;
175
- showImage = true;
176
- }}
177
- >
178
- <IconifyIcon
179
- icon="vscode-icons:file-type-excel"
180
- style="font-size: 150px;"
181
- class="transform transition duration-300 ease-in-out group-hover:scale-95"
182
- />
183
- <!-- <div
184
- class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
185
- /> -->
186
- </button>
187
- </div>
188
- </div>
189
- <div
190
- class:justify-end={message.mine}
191
- class:justify-start={!message.mine}
192
- class:hidden={isImage(image) ||
193
- isPPT(image) ||
194
- isPdf(image) ||
195
- isWord(image) ||
196
- isExcel(image)}
197
- >
198
- <div
199
- class=" flex rounded-md p-1"
200
- class:justify-end={message.mine}
201
- class:justify-start={!message.mine}
202
- >
203
- <button
204
- class="group relative rounded-md bg-gray-200 p-0.5"
205
- onclick={(_) => {
206
- selectedFile = image;
207
- showImage = true;
208
- }}
209
- >
210
- <IconifyIcon
211
- icon="bxs:file"
212
- style="font-size: 150px;"
213
- class="transform transition duration-300 ease-in-out group-hover:scale-95"
214
- />
215
- <!-- <div
216
- class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
217
- /> -->
218
- </button>
219
- </div>
220
- <iframe src={image} title={image} class="flex-grow" bind:this={frame}></iframe>
221
- </div>
222
- <!-- {/if} -->
223
- {/each}
224
- {/if}
225
- </div>
226
- <!-- {/if} -->
227
- </div>
228
- <div class:hidden={!message.mine}>
229
- <p class:hidden={userId === message.user?.id} class="text-sm text-gray-500 antialiased">
230
- {message.user?.firstName}
231
- {message?.user?.otherNames ?? ''}
232
- {message.user?.surname}
233
- {message.user?.staffNumber ?? ''}
234
- </p>
235
- </div>
236
- </div>
237
- </div>
238
- </div>
239
-
240
- <PreviewPage
241
- title="Attachment Preview"
242
- bind:open={showImage}
243
- showActions={false}
244
- fullImage
245
- src={{ content: selectedFile, name: '', file: '' }}
246
- />
1
+ <script lang="ts">
2
+ import { IconifyIcon, isExcel, isImage, isPdf, isPPT, isWord } from '../../index.js';
3
+ import { type ChatEntryPageProps } from './index.js';
4
+ import PreviewPage from './PreviewPage.svelte';
5
+
6
+ let { message, time = '', textBorder = true, userId }: ChatEntryPageProps = $props();
7
+
8
+ let showImage = $state(false);
9
+ let selectedFile = $state('');
10
+
11
+ let frame = $state<HTMLIFrameElement | undefined>();
12
+ function onItemClick(e: any) {
13
+ e.target.requestFullscreen();
14
+ e.stopPropagation();
15
+ }
16
+ </script>
17
+
18
+ <div class=" mb-2 {message.mine ? 'flex justify-end' : 'flex justify-start'} ">
19
+ <div class="mx-2 flex flex-col">
20
+ <div class=" {message.mine ? ' text-right ' : ' text-left'} ">
21
+ <span class=" text-sm text-gray-800/70">
22
+ {time}
23
+ </span>
24
+ </div>
25
+ <div class="order-1 flex max-w-sm flex-col space-y-2 text-sm" class:items-end={message.mine}>
26
+ <div>
27
+ <div class="space-y-2">
28
+ <div class="flex" class:justify-end={message.mine} class:justify-start={!message.mine}>
29
+ <div
30
+ class="inline-block bg-gray-200 px-4 py-2 break-normal {message.mine
31
+ ? 'rounded-l-md rounded-r-sm border-r-4 border-blue-800 '
32
+ : 'rounded-l-sm rounded-r-md border-l-4 border-yellow-400'} "
33
+ >
34
+ {#if message.message.includes('http' || 'www.')}
35
+ <a
36
+ class={textBorder ? '' : 'bg-yellow-500 px-px '}
37
+ href={message.message}
38
+ target="_blank"
39
+ >
40
+ <p
41
+ class="text-blue-500 underline decoration-blue-500 underline-offset-2 hover:text-blue-700"
42
+ >
43
+ {message.message}
44
+ </p>
45
+ </a>
46
+ {:else}
47
+ <p class={`break-normal ${textBorder ? '' : 'bg-yellow-500 px-px'}`}>
48
+ {message.message}
49
+ </p>
50
+ {/if}
51
+ </div>
52
+ </div>
53
+ {#if message.files && message.files.length}
54
+ {#each message.files as image}
55
+ <div
56
+ class:justify-end={message.mine}
57
+ class:justify-start={!message.mine}
58
+ class:hidden={!isImage(image)}
59
+ >
60
+ <div
61
+ class=" flex rounded-md p-1"
62
+ class:justify-end={message.mine}
63
+ class:justify-start={!message.mine}
64
+ >
65
+ <button class="group relative rounded-md bg-gray-200 p-0.5" onclick={onItemClick}>
66
+ <img
67
+ src={image}
68
+ alt="pic"
69
+ class="max-h-60 w-40 transform rounded-md transition duration-300 ease-in-out group-hover:scale-95"
70
+ />
71
+ <!-- <div
72
+ class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
73
+ /> -->
74
+ </button>
75
+ </div>
76
+ </div>
77
+ <div
78
+ class:justify-end={message.mine}
79
+ class:justify-start={!message.mine}
80
+ class:hidden={!isPdf(image)}
81
+ >
82
+ <div
83
+ class=" flex rounded-md p-1"
84
+ class:justify-end={message.mine}
85
+ class:justify-start={!message.mine}
86
+ >
87
+ <button
88
+ class="group relative rounded-md bg-gray-200 px-0.5 py-2"
89
+ onclick={(_) => {
90
+ selectedFile = image;
91
+ showImage = true;
92
+ }}
93
+ >
94
+ <IconifyIcon
95
+ icon="vscode-icons:file-type-pdf2"
96
+ style="font-size: 150px;"
97
+ class="transform transition duration-300 ease-in-out group-hover:scale-95"
98
+ />
99
+ <!-- <div
100
+ class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
101
+ /> -->
102
+ </button>
103
+ </div>
104
+ </div>
105
+ <div
106
+ class:justify-end={message.mine}
107
+ class:justify-start={!message.mine}
108
+ class:hidden={!isWord(image)}
109
+ >
110
+ <div
111
+ class=" flex rounded-md p-1"
112
+ class:justify-end={message.mine}
113
+ class:justify-start={!message.mine}
114
+ >
115
+ <button
116
+ class="group relative rounded-md bg-gray-200 p-0.5"
117
+ onclick={(_) => {
118
+ selectedFile = image;
119
+ showImage = true;
120
+ }}
121
+ >
122
+ <IconifyIcon
123
+ icon="vscode-icons:file-type-word"
124
+ style="font-size: 150px;"
125
+ class="transform transition duration-300 ease-in-out group-hover:scale-95"
126
+ />
127
+ <!-- <div
128
+ class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
129
+ /> -->
130
+ </button>
131
+ </div>
132
+ </div>
133
+ <div
134
+ class:justify-end={message.mine}
135
+ class:justify-start={!message.mine}
136
+ class:hidden={!isPPT(image)}
137
+ >
138
+ <div
139
+ class=" flex rounded-md p-1"
140
+ class:justify-end={message.mine}
141
+ class:justify-start={!message.mine}
142
+ >
143
+ <button
144
+ class="group relative rounded-md bg-gray-200 p-0.5"
145
+ onclick={(_) => {
146
+ selectedFile = image;
147
+ showImage = true;
148
+ }}
149
+ >
150
+ <IconifyIcon
151
+ icon="vscode-icons:file-type-powerpoint2"
152
+ style="font-size: 150px;"
153
+ class="transform transition duration-300 ease-in-out group-hover:scale-95"
154
+ />
155
+ <!-- <div
156
+ class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
157
+ /> -->
158
+ </button>
159
+ </div>
160
+ </div>
161
+ <div
162
+ class:justify-end={message.mine}
163
+ class:justify-start={!message.mine}
164
+ class:hidden={!isExcel(image)}
165
+ >
166
+ <div
167
+ class=" flex rounded-md p-1"
168
+ class:justify-end={message.mine}
169
+ class:justify-start={!message.mine}
170
+ >
171
+ <button
172
+ class="group relative rounded-md bg-gray-200 p-0.5"
173
+ onclick={() => {
174
+ selectedFile = image;
175
+ showImage = true;
176
+ }}
177
+ >
178
+ <IconifyIcon
179
+ icon="vscode-icons:file-type-excel"
180
+ style="font-size: 150px;"
181
+ class="transform transition duration-300 ease-in-out group-hover:scale-95"
182
+ />
183
+ <!-- <div
184
+ class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
185
+ /> -->
186
+ </button>
187
+ </div>
188
+ </div>
189
+ <div
190
+ class:justify-end={message.mine}
191
+ class:justify-start={!message.mine}
192
+ class:hidden={isImage(image) ||
193
+ isPPT(image) ||
194
+ isPdf(image) ||
195
+ isWord(image) ||
196
+ isExcel(image)}
197
+ >
198
+ <div
199
+ class=" flex rounded-md p-1"
200
+ class:justify-end={message.mine}
201
+ class:justify-start={!message.mine}
202
+ >
203
+ <button
204
+ class="group relative rounded-md bg-gray-200 p-0.5"
205
+ onclick={(_) => {
206
+ selectedFile = image;
207
+ showImage = true;
208
+ }}
209
+ >
210
+ <IconifyIcon
211
+ icon="bxs:file"
212
+ style="font-size: 150px;"
213
+ class="transform transition duration-300 ease-in-out group-hover:scale-95"
214
+ />
215
+ <!-- <div
216
+ class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
217
+ /> -->
218
+ </button>
219
+ </div>
220
+ <iframe src={image} title={image} class="flex-grow" bind:this={frame}></iframe>
221
+ </div>
222
+ <!-- {/if} -->
223
+ {/each}
224
+ {/if}
225
+ </div>
226
+ <!-- {/if} -->
227
+ </div>
228
+ <div class:hidden={!message.mine}>
229
+ <p class:hidden={userId === message.user?.id} class="text-sm text-gray-500 antialiased">
230
+ {message.user?.firstName}
231
+ {message?.user?.otherNames ?? ''}
232
+ {message.user?.surname}
233
+ {message.user?.staffNumber ?? ''}
234
+ </p>
235
+ </div>
236
+ </div>
237
+ </div>
238
+ </div>
239
+
240
+ <PreviewPage
241
+ title="Attachment Preview"
242
+ bind:open={showImage}
243
+ showActions={false}
244
+ fullImage
245
+ src={{ content: selectedFile, name: '', file: '' }}
246
+ />
@@ -1,81 +1,81 @@
1
- <script lang="ts">
2
- import { fade } from 'svelte/transition';
3
- import type { ChatEntrySkeletonProps } from './index.js';
4
-
5
- let { isMobile = false, messageCount = 5 }: ChatEntrySkeletonProps = $props();
6
- </script>
7
-
8
- <div class="flex h-full w-full flex-col overflow-x-hidden overflow-y-auto">
9
- <div
10
- class="chat-list-pane relative isolate flex h-full w-full flex-col overflow-x-hidden overflow-y-auto bg-green-50/40 !bg-contain !bg-center !bg-no-repeat"
11
- >
12
- {#if messageCount === 0}
13
- <div
14
- class="mx-auto flex min-h-full max-w-[12rem] flex-col items-center justify-center gap-1 text-center text-base font-semibold text-gray-400"
15
- >
16
- <div class="h-20 w-20 rounded-full bg-gray-400 opacity-20"></div>
17
- <span class="text-sm"> Select a query to view the conversation </span>
18
- </div>
19
- {:else}
20
- <!-- Received message skeletons -->
21
- {#each Array(Math.ceil(messageCount / 2)) as _, i}
22
- <div transition:fade={{ delay: i * 100 }} class="flex flex-col items-start gap-2 p-4">
23
- <div class="flex items-center gap-2">
24
- <div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
25
- <div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
26
- </div>
27
- <div class="ml-10 flex flex-col gap-1">
28
- <div class="h-4 w-64 animate-pulse rounded-md bg-gray-200"></div>
29
- <div class="h-4 w-48 animate-pulse rounded-md bg-gray-200"></div>
30
- <div class="h-4 w-32 animate-pulse rounded-md bg-gray-200"></div>
31
- </div>
32
- <div class="ml-10 h-3 w-24 animate-pulse rounded-full bg-gray-200"></div>
33
- </div>
34
- {/each}
35
-
36
- <!-- Sent message skeletons -->
37
- {#each Array(Math.floor(messageCount / 2)) as _, i}
38
- <div
39
- transition:fade={{ delay: (i + Math.ceil(messageCount / 2)) * 100 }}
40
- class="flex flex-col items-end gap-2 p-4"
41
- >
42
- <div class="flex gap-1">
43
- <div class="flex flex-col items-end gap-1">
44
- <div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
45
- <div class="h-4 w-56 animate-pulse rounded-md bg-gray-200"></div>
46
- <div class="h-4 w-40 animate-pulse rounded-md bg-gray-200"></div>
47
- <div class="h-3 w-20 animate-pulse rounded-full bg-gray-200"></div>
48
- </div>
49
- <div class="flex items-center gap-2">
50
- <div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
51
- </div>
52
- </div>
53
- </div>
54
- {/each}
55
- {/if}
56
- </div>
57
-
58
- <!-- Input area skeleton -->
59
- <div class={`border-t bg-white p-2 ${isMobile ? 'pb-20' : 'pb-2'}`}>
60
- <div class="flex items-center gap-2">
61
- <div class="h-10 flex-1 animate-pulse rounded-full bg-gray-200"></div>
62
- <div class="h-10 w-10 animate-pulse rounded-full bg-gray-200"></div>
63
- </div>
64
- </div>
65
- </div>
66
-
67
- <style>
68
- .animate-pulse {
69
- animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
70
- }
71
-
72
- @keyframes pulse {
73
- 0%,
74
- 100% {
75
- opacity: 1;
76
- }
77
- 50% {
78
- opacity: 0.5;
79
- }
80
- }
81
- </style>
1
+ <script lang="ts">
2
+ import { fade } from 'svelte/transition';
3
+ import type { ChatEntrySkeletonProps } from './index.js';
4
+
5
+ let { isMobile = false, messageCount = 5 }: ChatEntrySkeletonProps = $props();
6
+ </script>
7
+
8
+ <div class="flex h-full w-full flex-col overflow-x-hidden overflow-y-auto">
9
+ <div
10
+ class="chat-list-pane relative isolate flex h-full w-full flex-col overflow-x-hidden overflow-y-auto bg-green-50/40 !bg-contain !bg-center !bg-no-repeat"
11
+ >
12
+ {#if messageCount === 0}
13
+ <div
14
+ class="mx-auto flex min-h-full max-w-[12rem] flex-col items-center justify-center gap-1 text-center text-base font-semibold text-gray-400"
15
+ >
16
+ <div class="h-20 w-20 rounded-full bg-gray-400 opacity-20"></div>
17
+ <span class="text-sm"> Select a query to view the conversation </span>
18
+ </div>
19
+ {:else}
20
+ <!-- Received message skeletons -->
21
+ {#each Array(Math.ceil(messageCount / 2)) as _, i}
22
+ <div transition:fade={{ delay: i * 100 }} class="flex flex-col items-start gap-2 p-4">
23
+ <div class="flex items-center gap-2">
24
+ <div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
25
+ <div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
26
+ </div>
27
+ <div class="ml-10 flex flex-col gap-1">
28
+ <div class="h-4 w-64 animate-pulse rounded-md bg-gray-200"></div>
29
+ <div class="h-4 w-48 animate-pulse rounded-md bg-gray-200"></div>
30
+ <div class="h-4 w-32 animate-pulse rounded-md bg-gray-200"></div>
31
+ </div>
32
+ <div class="ml-10 h-3 w-24 animate-pulse rounded-full bg-gray-200"></div>
33
+ </div>
34
+ {/each}
35
+
36
+ <!-- Sent message skeletons -->
37
+ {#each Array(Math.floor(messageCount / 2)) as _, i}
38
+ <div
39
+ transition:fade={{ delay: (i + Math.ceil(messageCount / 2)) * 100 }}
40
+ class="flex flex-col items-end gap-2 p-4"
41
+ >
42
+ <div class="flex gap-1">
43
+ <div class="flex flex-col items-end gap-1">
44
+ <div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
45
+ <div class="h-4 w-56 animate-pulse rounded-md bg-gray-200"></div>
46
+ <div class="h-4 w-40 animate-pulse rounded-md bg-gray-200"></div>
47
+ <div class="h-3 w-20 animate-pulse rounded-full bg-gray-200"></div>
48
+ </div>
49
+ <div class="flex items-center gap-2">
50
+ <div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ {/each}
55
+ {/if}
56
+ </div>
57
+
58
+ <!-- Input area skeleton -->
59
+ <div class={`border-t bg-white p-2 ${isMobile ? 'pb-20' : 'pb-2'}`}>
60
+ <div class="flex items-center gap-2">
61
+ <div class="h-10 flex-1 animate-pulse rounded-full bg-gray-200"></div>
62
+ <div class="h-10 w-10 animate-pulse rounded-full bg-gray-200"></div>
63
+ </div>
64
+ </div>
65
+ </div>
66
+
67
+ <style>
68
+ .animate-pulse {
69
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
70
+ }
71
+
72
+ @keyframes pulse {
73
+ 0%,
74
+ 100% {
75
+ opacity: 1;
76
+ }
77
+ 50% {
78
+ opacity: 0.5;
79
+ }
80
+ }
81
+ </style>