FormattingButtons.svelte 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <script>
  2. import { getContext } from 'svelte';
  3. const i18n = getContext('i18n');
  4. export let editor = null;
  5. import Bold from '$lib/components/icons/Bold.svelte';
  6. import CodeBracket from '$lib/components/icons/CodeBracket.svelte';
  7. import H1 from '$lib/components/icons/H1.svelte';
  8. import H2 from '$lib/components/icons/H2.svelte';
  9. import H3 from '$lib/components/icons/H3.svelte';
  10. import Italic from '$lib/components/icons/Italic.svelte';
  11. import ListBullet from '$lib/components/icons/ListBullet.svelte';
  12. import NumberedList from '$lib/components/icons/NumberedList.svelte';
  13. import Strikethrough from '$lib/components/icons/Strikethrough.svelte';
  14. import Underline from '$lib/components/icons/Underline.svelte';
  15. import Tooltip from '../Tooltip.svelte';
  16. import CheckBox from '$lib/components/icons/CheckBox.svelte';
  17. import ArrowLeftTag from '$lib/components/icons/ArrowLeftTag.svelte';
  18. import ArrowRightTag from '$lib/components/icons/ArrowRightTag.svelte';
  19. </script>
  20. <div
  21. class="flex gap-0.5 p-0.5 rounded-lg shadow-lg bg-white text-gray-800 dark:text-white dark:bg-gray-800 min-w-fit"
  22. >
  23. <Tooltip placement="top" content={$i18n.t('H1')}>
  24. <button
  25. on:click={() => editor?.chain().focus().toggleHeading({ level: 1 }).run()}
  26. class="{editor?.isActive('heading', { level: 1 })
  27. ? 'bg-gray-50 dark:bg-gray-700'
  28. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  29. type="button"
  30. >
  31. <H1 />
  32. </button>
  33. </Tooltip>
  34. <Tooltip placement="top" content={$i18n.t('H2')}>
  35. <button
  36. on:click={() => editor?.chain().focus().toggleHeading({ level: 2 }).run()}
  37. class="{editor?.isActive('heading', { level: 2 })
  38. ? 'bg-gray-50 dark:bg-gray-700'
  39. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  40. type="button"
  41. >
  42. <H2 />
  43. </button>
  44. </Tooltip>
  45. <Tooltip placement="top" content={$i18n.t('H3')}>
  46. <button
  47. on:click={() => editor?.chain().focus().toggleHeading({ level: 3 }).run()}
  48. class="{editor?.isActive('heading', { level: 3 })
  49. ? 'bg-gray-50 dark:bg-gray-700'
  50. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  51. type="button"
  52. >
  53. <H3 />
  54. </button>
  55. </Tooltip>
  56. {#if editor?.isActive('bulletList') || editor?.isActive('orderedList') || editor?.isActive('taskList')}
  57. <Tooltip placement="top" content={$i18n.t('Lift List')}>
  58. <button
  59. on:click={() => {
  60. editor?.commands.liftListItem(editor?.isActive('taskList') ? 'taskItem' : 'listItem');
  61. }}
  62. class="hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  63. type="button"
  64. >
  65. <ArrowLeftTag />
  66. </button>
  67. </Tooltip>
  68. <Tooltip placement="top" content={$i18n.t('Sink List')}>
  69. <button
  70. on:click={() =>
  71. editor?.commands.sinkListItem(editor?.isActive('taskList') ? 'taskItem' : 'listItem')}
  72. class="hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  73. type="button"
  74. >
  75. <ArrowRightTag />
  76. </button>
  77. </Tooltip>
  78. {/if}
  79. <Tooltip placement="top" content={$i18n.t('Bullet List')}>
  80. <button
  81. on:click={() => editor?.chain().focus().toggleBulletList().run()}
  82. class="{editor?.isActive('bulletList')
  83. ? 'bg-gray-50 dark:bg-gray-700'
  84. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  85. type="button"
  86. >
  87. <ListBullet />
  88. </button>
  89. </Tooltip>
  90. <Tooltip placement="top" content={$i18n.t('Ordered List')}>
  91. <button
  92. on:click={() => editor?.chain().focus().toggleOrderedList().run()}
  93. class="{editor?.isActive('orderedList')
  94. ? 'bg-gray-50 dark:bg-gray-700'
  95. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  96. type="button"
  97. >
  98. <NumberedList />
  99. </button>
  100. </Tooltip>
  101. <Tooltip placement="top" content={$i18n.t('Task List')}>
  102. <button
  103. on:click={() => editor?.chain().focus().toggleTaskList().run()}
  104. class="{editor?.isActive('taskList')
  105. ? 'bg-gray-50 dark:bg-gray-700'
  106. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  107. type="button"
  108. >
  109. <CheckBox />
  110. </button>
  111. </Tooltip>
  112. <Tooltip placement="top" content={$i18n.t('Bold')}>
  113. <button
  114. on:click={() => editor?.chain().focus().toggleBold().run()}
  115. class="{editor?.isActive('bold')
  116. ? 'bg-gray-50 dark:bg-gray-700'
  117. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  118. type="button"
  119. >
  120. <Bold />
  121. </button>
  122. </Tooltip>
  123. <Tooltip placement="top" content={$i18n.t('Italic')}>
  124. <button
  125. on:click={() => editor?.chain().focus().toggleItalic().run()}
  126. class="{editor?.isActive('italic')
  127. ? 'bg-gray-50 dark:bg-gray-700'
  128. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  129. type="button"
  130. >
  131. <Italic />
  132. </button>
  133. </Tooltip>
  134. <Tooltip placement="top" content={$i18n.t('Underline')}>
  135. <button
  136. on:click={() => editor?.chain().focus().toggleUnderline().run()}
  137. class="{editor?.isActive('underline')
  138. ? 'bg-gray-50 dark:bg-gray-700'
  139. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  140. type="button"
  141. >
  142. <Underline />
  143. </button>
  144. </Tooltip>
  145. <Tooltip placement="top" content={$i18n.t('Strikethrough')}>
  146. <button
  147. on:click={() => editor?.chain().focus().toggleStrike().run()}
  148. class="{editor?.isActive('strike')
  149. ? 'bg-gray-50 dark:bg-gray-700'
  150. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  151. type="button"
  152. >
  153. <Strikethrough />
  154. </button>
  155. </Tooltip>
  156. <Tooltip placement="top" content={$i18n.t('Code Block')}>
  157. <button
  158. on:click={() => editor?.chain().focus().toggleCodeBlock().run()}
  159. class="{editor?.isActive('codeBlock')
  160. ? 'bg-gray-50 dark:bg-gray-700'
  161. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  162. type="button"
  163. >
  164. <CodeBracket />
  165. </button>
  166. </Tooltip>
  167. </div>