FormattingButtons.svelte 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 QueueList from '$lib/components/icons/QueueList.svelte';
  14. import Strikethrough from '$lib/components/icons/Strikethrough.svelte';
  15. import Underline from '$lib/components/icons/Underline.svelte';
  16. import Tooltip from '../Tooltip.svelte';
  17. </script>
  18. <div
  19. 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"
  20. >
  21. <Tooltip placement="top" content={$i18n.t('H1')}>
  22. <button
  23. on:click={() => editor?.chain().focus().toggleHeading({ level: 1 }).run()}
  24. class="{editor?.isActive('heading', { level: 1 })
  25. ? 'bg-gray-50 dark:bg-gray-700'
  26. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  27. type="button"
  28. >
  29. <H1 />
  30. </button>
  31. </Tooltip>
  32. <Tooltip placement="top" content={$i18n.t('H2')}>
  33. <button
  34. on:click={() => editor?.chain().focus().toggleHeading({ level: 2 }).run()}
  35. class="{editor?.isActive('heading', { level: 2 })
  36. ? 'bg-gray-50 dark:bg-gray-700'
  37. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  38. type="button"
  39. >
  40. <H2 />
  41. </button>
  42. </Tooltip>
  43. <Tooltip placement="top" content={$i18n.t('H3')}>
  44. <button
  45. on:click={() => editor?.chain().focus().toggleHeading({ level: 3 }).run()}
  46. class="{editor?.isActive('heading', { level: 3 })
  47. ? 'bg-gray-50 dark:bg-gray-700'
  48. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  49. type="button"
  50. >
  51. <H3 />
  52. </button>
  53. </Tooltip>
  54. <Tooltip placement="top" content={$i18n.t('Bullet List')}>
  55. <button
  56. on:click={() => editor?.chain().focus().toggleBulletList().run()}
  57. class="{editor?.isActive('bulletList')
  58. ? 'bg-gray-50 dark:bg-gray-700'
  59. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  60. type="button"
  61. >
  62. <ListBullet />
  63. </button>
  64. </Tooltip>
  65. <Tooltip placement="top" content={$i18n.t('Ordered List')}>
  66. <button
  67. on:click={() => editor?.chain().focus().toggleOrderedList().run()}
  68. class="{editor?.isActive('orderedList')
  69. ? 'bg-gray-50 dark:bg-gray-700'
  70. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  71. type="button"
  72. >
  73. <NumberedList />
  74. </button>
  75. </Tooltip>
  76. <Tooltip placement="top" content={$i18n.t('Task List')}>
  77. <button
  78. on:click={() => editor?.chain().focus().toggleTaskList().run()}
  79. class="{editor?.isActive('taskList')
  80. ? 'bg-gray-50 dark:bg-gray-700'
  81. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  82. type="button"
  83. >
  84. <QueueList />
  85. </button>
  86. </Tooltip>
  87. <Tooltip placement="top" content={$i18n.t('Bold')}>
  88. <button
  89. on:click={() => editor?.chain().focus().toggleBold().run()}
  90. class="{editor?.isActive('bold')
  91. ? 'bg-gray-50 dark:bg-gray-700'
  92. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  93. type="button"
  94. >
  95. <Bold />
  96. </button>
  97. </Tooltip>
  98. <Tooltip placement="top" content={$i18n.t('Italic')}>
  99. <button
  100. on:click={() => editor?.chain().focus().toggleItalic().run()}
  101. class="{editor?.isActive('italic')
  102. ? 'bg-gray-50 dark:bg-gray-700'
  103. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  104. type="button"
  105. >
  106. <Italic />
  107. </button>
  108. </Tooltip>
  109. <Tooltip placement="top" content={$i18n.t('Underline')}>
  110. <button
  111. on:click={() => editor?.chain().focus().toggleUnderline().run()}
  112. class="{editor?.isActive('underline')
  113. ? 'bg-gray-50 dark:bg-gray-700'
  114. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  115. type="button"
  116. >
  117. <Underline />
  118. </button>
  119. </Tooltip>
  120. <Tooltip placement="top" content={$i18n.t('Strikethrough')}>
  121. <button
  122. on:click={() => editor?.chain().focus().toggleStrike().run()}
  123. class="{editor?.isActive('strike')
  124. ? 'bg-gray-50 dark:bg-gray-700'
  125. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  126. type="button"
  127. >
  128. <Strikethrough />
  129. </button>
  130. </Tooltip>
  131. <Tooltip placement="top" content={$i18n.t('Code Block')}>
  132. <button
  133. on:click={() => editor?.chain().focus().toggleCodeBlock().run()}
  134. class="{editor?.isActive('codeBlock')
  135. ? 'bg-gray-50 dark:bg-gray-700'
  136. : ''} hover:bg-gray-50 dark:hover:bg-gray-700 rounded-lg p-1.5 transition-all"
  137. type="button"
  138. >
  139. <CodeBracket />
  140. </button>
  141. </Tooltip>
  142. </div>