@placeholderco/placeholder-ui 1.0.12 → 2.1.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 (278) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +134 -130
  3. package/dist/app.css +178 -0
  4. package/dist/bootstrap.min.css +3600 -0
  5. package/dist/cards/GitCard.svelte +115 -0
  6. package/dist/cards/GitCard.svelte.d.ts +22 -0
  7. package/dist/display/Avatar.svelte +29 -17
  8. package/dist/display/Avatar.svelte.d.ts +12 -2
  9. package/dist/display/LinkCollection.svelte +40 -18
  10. package/dist/display/LinkCollection.svelte.d.ts +9 -2
  11. package/dist/display/Paper.svelte +31 -19
  12. package/dist/display/Paper.svelte.d.ts +12 -3
  13. package/dist/display/alert/Alert.svelte +129 -0
  14. package/dist/display/alert/Alert.svelte.d.ts +15 -0
  15. package/dist/display/alert/AlertVariant.d.ts +1 -0
  16. package/dist/display/alert/AlertVariant.js +1 -0
  17. package/dist/display/filetree/FileTree.svelte +259 -0
  18. package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
  19. package/dist/display/filetree/FileTreeItem.svelte +396 -0
  20. package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
  21. package/dist/display/filetree/FileTreeNode.d.ts +46 -0
  22. package/dist/display/filetree/FileTreeNode.js +115 -0
  23. package/dist/display/filetree/index.d.ts +5 -0
  24. package/dist/display/filetree/index.js +3 -0
  25. package/dist/editors/CodeMirror.svelte +306 -0
  26. package/dist/editors/CodeMirror.svelte.d.ts +31 -0
  27. package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
  28. package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
  29. package/dist/editors/tiptap/TipTap.svelte +856 -0
  30. package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
  31. package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
  32. package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
  33. package/dist/editors/tiptap/collaboration.d.ts +55 -0
  34. package/dist/editors/tiptap/collaboration.js +1 -0
  35. package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
  36. package/dist/editors/tiptap/extensions/Alert.js +72 -0
  37. package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
  38. package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
  39. package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
  40. package/dist/editors/tiptap/extensions/Div.js +89 -0
  41. package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
  42. package/dist/editors/tiptap/extensions/Span.js +56 -0
  43. package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
  44. package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
  45. package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
  46. package/dist/editors/tiptap/extensions/index.d.ts +7 -0
  47. package/dist/editors/tiptap/extensions/index.js +5 -0
  48. package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
  49. package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
  50. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
  51. package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
  52. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
  53. package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
  54. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
  55. package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
  56. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
  57. package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
  58. package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
  59. package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
  60. package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
  61. package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
  62. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
  63. package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
  64. package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
  65. package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
  66. package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
  67. package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
  68. package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
  69. package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
  70. package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
  71. package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
  72. package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
  73. package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
  74. package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
  75. package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
  76. package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
  77. package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
  78. package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
  79. package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
  80. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
  81. package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
  82. package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
  83. package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
  84. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
  85. package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
  86. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
  87. package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
  88. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
  89. package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
  90. package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
  91. package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
  92. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
  93. package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
  94. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
  95. package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
  96. package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
  97. package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
  98. package/dist/form/Autocomplete.svelte +86 -135
  99. package/dist/form/Autocomplete.svelte.d.ts +6 -8
  100. package/dist/form/AutocompleteMulti.svelte +385 -227
  101. package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
  102. package/dist/form/Checkbox.svelte +59 -54
  103. package/dist/form/Checkbox.svelte.d.ts +14 -5
  104. package/dist/form/Chips.svelte +29 -13
  105. package/dist/form/Chips.svelte.d.ts +16 -2
  106. package/dist/form/ColorPicker.svelte +957 -0
  107. package/dist/form/ColorPicker.svelte.d.ts +78 -0
  108. package/dist/form/ComboBox.svelte +30 -20
  109. package/dist/form/ComboBox.svelte.d.ts +1 -1
  110. package/dist/form/ComboBoxItemBuilder.svelte +161 -188
  111. package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
  112. package/dist/form/ComboBoxMulti.svelte +38 -24
  113. package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
  114. package/dist/form/CronBuilder.svelte +84 -67
  115. package/dist/form/CronBuilder.svelte.d.ts +16 -3
  116. package/dist/form/DatePicker.svelte +148 -195
  117. package/dist/form/DateRangePicker.svelte +101 -98
  118. package/dist/form/DateTimePicker.svelte +167 -208
  119. package/dist/form/DateTimePicker.svelte.d.ts +10 -2
  120. package/dist/form/FormGroup.svelte +33 -10
  121. package/dist/form/FormGroup.svelte.d.ts +12 -2
  122. package/dist/form/Number.svelte +70 -47
  123. package/dist/form/Number.svelte.d.ts +36 -6
  124. package/dist/form/Radio.svelte +18 -18
  125. package/dist/form/RadioGroup.svelte +23 -12
  126. package/dist/form/RadioGroup.svelte.d.ts +13 -2
  127. package/dist/form/SegmentedControl.svelte +76 -56
  128. package/dist/form/SegmentedControl.svelte.d.ts +9 -4
  129. package/dist/form/Select.svelte +150 -233
  130. package/dist/form/Select.svelte.d.ts +29 -5
  131. package/dist/form/SelectMulti.svelte +163 -277
  132. package/dist/form/SelectMulti.svelte.d.ts +36 -7
  133. package/dist/form/Slider.svelte +183 -269
  134. package/dist/form/Slider.svelte.d.ts +32 -17
  135. package/dist/form/StringArrayBuilder.svelte +249 -0
  136. package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
  137. package/dist/form/Switch.svelte +164 -106
  138. package/dist/form/Switch.svelte.d.ts +22 -3
  139. package/dist/form/TextArea.svelte +49 -29
  140. package/dist/form/TextArea.svelte.d.ts +23 -3
  141. package/dist/form/Textbox.svelte +69 -68
  142. package/dist/form/Textbox.svelte.d.ts +32 -4
  143. package/dist/form/TimePicker.svelte +42 -47
  144. package/dist/form/TimePicker.svelte.d.ts +12 -2
  145. package/dist/form/comboBoxCore.svelte.d.ts +99 -0
  146. package/dist/form/comboBoxCore.svelte.js +243 -0
  147. package/dist/icon/Icon.svelte +8 -3
  148. package/dist/icon/Icon.svelte.d.ts +8 -3
  149. package/dist/icon/file-type-bmp.svg +1 -0
  150. package/dist/icon/file-type-csv.svg +1 -0
  151. package/dist/icon/file-type-doc.svg +1 -0
  152. package/dist/icon/file-type-docx.svg +1 -0
  153. package/dist/icon/file-type-jpg.svg +1 -0
  154. package/dist/icon/file-type-pdf.svg +1 -0
  155. package/dist/icon/file-type-png.svg +1 -0
  156. package/dist/icon/file-type-ppt.svg +1 -0
  157. package/dist/icon/file-type-svg.svg +1 -0
  158. package/dist/icon/file-type-txt.svg +1 -0
  159. package/dist/icon/file-type-xls.svg +1 -0
  160. package/dist/icon/file-type-zip.svg +1 -0
  161. package/dist/icon/index.d.ts +166 -151
  162. package/dist/icon/index.js +166 -152
  163. package/dist/icon/logo-placeholder.svg +6 -0
  164. package/dist/icon/source-code.svg +1 -0
  165. package/dist/icon/sun-moon.svg +1 -0
  166. package/dist/icon/table.svg +6 -0
  167. package/dist/index.d.ts +146 -82
  168. package/dist/index.js +77 -78
  169. package/dist/layout/AppShell.svelte +12 -162
  170. package/dist/layout/AppShell.svelte.d.ts +6 -27
  171. package/dist/layout/CustomNavbar.svelte +9 -7
  172. package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
  173. package/dist/layout/Navbar.svelte +161 -129
  174. package/dist/layout/Navbar.svelte.d.ts +29 -15
  175. package/dist/layout/NavbarItemDisplay.svelte +2 -2
  176. package/dist/layout/NavbarItemView.svelte +182 -0
  177. package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
  178. package/dist/layout/Sidenav.svelte +280 -341
  179. package/dist/layout/Sidenav.svelte.d.ts +36 -4
  180. package/dist/models/ComboBoxItem.d.ts +2 -0
  181. package/dist/models/Employee.d.ts +53 -0
  182. package/dist/models/Employee.js +23 -0
  183. package/dist/models/Hyperlink.d.ts +3 -1
  184. package/dist/models/LinkCollectionItem.d.ts +3 -1
  185. package/dist/models/NavbarItem.d.ts +6 -2
  186. package/dist/theme.svelte.d.ts +0 -1
  187. package/dist/theme.svelte.js +46 -58
  188. package/dist/ui/Accordion.svelte +81 -242
  189. package/dist/ui/Accordion.svelte.d.ts +37 -14
  190. package/dist/ui/AccordionItem.svelte +303 -0
  191. package/dist/ui/AccordionItem.svelte.d.ts +21 -0
  192. package/dist/ui/ActionIcon.svelte +25 -21
  193. package/dist/ui/ActionIcon.svelte.d.ts +15 -2
  194. package/dist/ui/Badge.svelte +163 -171
  195. package/dist/ui/Badge.svelte.d.ts +13 -5
  196. package/dist/ui/Button.svelte +178 -205
  197. package/dist/ui/Button.svelte.d.ts +19 -2
  198. package/dist/ui/ButtonVariant.d.ts +15 -1
  199. package/dist/ui/ContextMenu.svelte +146 -0
  200. package/dist/ui/ContextMenu.svelte.d.ts +37 -0
  201. package/dist/ui/ContextMenuList.svelte +188 -0
  202. package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
  203. package/dist/ui/Dialog.svelte +183 -111
  204. package/dist/ui/Dialog.svelte.d.ts +21 -4
  205. package/dist/ui/Drawer.svelte +237 -184
  206. package/dist/ui/Drawer.svelte.d.ts +20 -2
  207. package/dist/ui/Dropdown.svelte +24 -14
  208. package/dist/ui/Dropdown.svelte.d.ts +11 -2
  209. package/dist/ui/Dropzone.svelte +159 -57
  210. package/dist/ui/Dropzone.svelte.d.ts +29 -2
  211. package/dist/ui/Link.svelte +12 -4
  212. package/dist/ui/Link.svelte.d.ts +8 -2
  213. package/dist/ui/Loader.svelte +23 -18
  214. package/dist/ui/Loader.svelte.d.ts +5 -2
  215. package/dist/ui/Logo.svelte +37 -0
  216. package/dist/ui/Logo.svelte.d.ts +16 -0
  217. package/dist/ui/MultiSortable.svelte +287 -0
  218. package/dist/ui/MultiSortable.svelte.d.ts +50 -0
  219. package/dist/ui/Pagination.svelte +15 -9
  220. package/dist/ui/Pagination.svelte.d.ts +6 -2
  221. package/dist/ui/Popover.svelte +43 -65
  222. package/dist/ui/Popover.svelte.d.ts +14 -5
  223. package/dist/ui/ProgressBar.svelte +28 -30
  224. package/dist/ui/ProgressBarVariant.d.ts +7 -1
  225. package/dist/ui/SegmentedControl.svelte +0 -0
  226. package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
  227. package/dist/ui/Sortable.svelte +163 -0
  228. package/dist/ui/Sortable.svelte.d.ts +47 -0
  229. package/dist/ui/Table.svelte +383 -80
  230. package/dist/ui/Table.svelte.d.ts +43 -2
  231. package/dist/ui/Tabs.svelte +22 -18
  232. package/dist/ui/Tabs.svelte.d.ts +6 -2
  233. package/dist/ui/ThemeSwitcher.svelte +26 -7
  234. package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
  235. package/dist/ui/Tooltip.svelte +312 -180
  236. package/dist/ui/Tooltip.svelte.d.ts +4 -3
  237. package/dist/uiTheme.svelte.d.ts +86 -0
  238. package/dist/uiTheme.svelte.js +214 -0
  239. package/dist/util/DateFunctions.js +1 -1
  240. package/dist/util/DragDrop.d.ts +50 -0
  241. package/dist/util/DragDrop.js +154 -0
  242. package/dist/util/NavigateTo.js +2 -2
  243. package/dist/util/dayjs.d.ts +4 -0
  244. package/dist/util/dayjs.js +15 -0
  245. package/package.json +66 -26
  246. package/dist/display/Alert.svelte +0 -179
  247. package/dist/display/Alert.svelte.d.ts +0 -13
  248. package/dist/form/FileInput.svelte +0 -235
  249. package/dist/form/FileInput.svelte.d.ts +0 -23
  250. package/dist/form/PasswordInput.svelte +0 -253
  251. package/dist/form/PasswordInput.svelte.d.ts +0 -34
  252. package/dist/form/Rating.svelte +0 -235
  253. package/dist/form/Rating.svelte.d.ts +0 -21
  254. package/dist/styles/components.css +0 -199
  255. package/dist/styles/dark.css +0 -146
  256. package/dist/styles/index.css +0 -116
  257. package/dist/styles/reset.css +0 -110
  258. package/dist/styles/semantic.css +0 -86
  259. package/dist/styles/tokens.css +0 -203
  260. package/dist/styles/utilities.css +0 -523
  261. package/dist/ui/Breadcrumbs.svelte +0 -131
  262. package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
  263. package/dist/ui/LoadingOverlay.svelte +0 -53
  264. package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
  265. package/dist/ui/Progress.svelte +0 -191
  266. package/dist/ui/Progress.svelte.d.ts +0 -15
  267. package/dist/ui/RingProgress.svelte +0 -141
  268. package/dist/ui/RingProgress.svelte.d.ts +0 -18
  269. package/dist/ui/Skeleton.svelte +0 -85
  270. package/dist/ui/Skeleton.svelte.d.ts +0 -12
  271. package/dist/ui/Stepper.svelte +0 -355
  272. package/dist/ui/Stepper.svelte.d.ts +0 -24
  273. package/dist/ui/Timeline.svelte +0 -225
  274. package/dist/ui/Timeline.svelte.d.ts +0 -23
  275. /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
  276. /package/dist/{actions → util}/ClickOutside.js +0 -0
  277. /package/dist/{transitions → util}/Transitions.d.ts +0 -0
  278. /package/dist/{transitions → util}/Transitions.js +0 -0
@@ -0,0 +1,56 @@
1
+ import { Node, mergeAttributes } from '@tiptap/core';
2
+ export const Span = Node.create({
3
+ name: 'span',
4
+ priority: 100,
5
+ group: 'block',
6
+ content: 'inline*',
7
+ isolating: false,
8
+ defining: false,
9
+ addOptions() {
10
+ return {
11
+ HTMLAttributes: {},
12
+ };
13
+ },
14
+ parseHTML() {
15
+ return [
16
+ {
17
+ tag: 'span',
18
+ priority: 50,
19
+ },
20
+ ];
21
+ },
22
+ renderHTML({ HTMLAttributes }) {
23
+ return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];
24
+ },
25
+ addAttributes() {
26
+ return {
27
+ class: {
28
+ default: null,
29
+ parseHTML: element => element.getAttribute('class'),
30
+ renderHTML: attributes => {
31
+ if (!attributes.class)
32
+ return {};
33
+ return { class: attributes.class };
34
+ },
35
+ },
36
+ style: {
37
+ default: null,
38
+ parseHTML: element => element.getAttribute('style'),
39
+ renderHTML: attributes => {
40
+ if (!attributes.style)
41
+ return {};
42
+ return { style: attributes.style };
43
+ },
44
+ },
45
+ id: {
46
+ default: null,
47
+ parseHTML: element => element.getAttribute('id'),
48
+ renderHTML: attributes => {
49
+ if (!attributes.id)
50
+ return {};
51
+ return { id: attributes.id };
52
+ },
53
+ },
54
+ };
55
+ },
56
+ });
@@ -0,0 +1,236 @@
1
+ /* Styles for the CodeBlockEditor TipTap extension (CodeMirror-powered code blocks).
2
+ Syntax colors target the stable tok-* classes emitted by @lezer/highlight's
3
+ classHighlighter: light palette follows CodeMirror's default highlight style,
4
+ dark palette follows One Dark. Dark mode uses the library's `.dark` root class. */
5
+
6
+ .code-block-editor {
7
+ position: relative;
8
+ margin: 0 0 1em 0;
9
+ border: 1px solid var(--border-color, #dddddd);
10
+ border-radius: 6px;
11
+ background: var(--page-bg, #f7f7f8);
12
+ }
13
+
14
+ .code-block-editor.ProseMirror-selectednode {
15
+ border-color: var(--ui-tertiary, #40c5b5);
16
+ }
17
+
18
+ .code-block-editor .cm-editor {
19
+ background: transparent;
20
+ }
21
+
22
+ .code-block-editor .cm-editor.cm-focused {
23
+ outline: none;
24
+ }
25
+
26
+ .code-block-editor .cm-editor .cm-scroller {
27
+ font-family: 'Monaco', 'Courier New', monospace;
28
+ font-size: 0.875em;
29
+ line-height: 1.5;
30
+ border-radius: 6px;
31
+ }
32
+
33
+ .code-block-editor .cm-editor .cm-content {
34
+ padding: 12px 14px;
35
+ caret-color: var(--text-color, #1a1a1a);
36
+ }
37
+
38
+ .dark .code-block-editor .cm-editor .cm-cursor {
39
+ border-left-color: #e6e6e6;
40
+ }
41
+
42
+ .dark .code-block-editor .cm-editor .cm-selectionBackground {
43
+ background: rgba(115, 135, 175, 0.35);
44
+ }
45
+
46
+ .dark .code-block-editor .cm-editor.cm-focused .cm-selectionBackground {
47
+ background: rgba(115, 135, 175, 0.45);
48
+ }
49
+
50
+ .dark .code-block-editor .cm-editor .cm-matchingBracket {
51
+ background: rgba(255, 255, 255, 0.12);
52
+ }
53
+
54
+ /* Language picker */
55
+ .code-block-editor .code-block-language {
56
+ position: absolute;
57
+ top: 6px;
58
+ right: 6px;
59
+ z-index: 2;
60
+ max-width: 40%;
61
+ padding: 2px 6px;
62
+ font-size: 12px;
63
+ border: 1px solid var(--border-color, #dddddd);
64
+ border-radius: 4px;
65
+ background: var(--paper-body-bg, #ffffff);
66
+ color: var(--text-color, #1a1a1a);
67
+ opacity: 0.4;
68
+ transition: opacity 0.15s ease;
69
+ cursor: pointer;
70
+ }
71
+
72
+ .code-block-editor:hover .code-block-language,
73
+ .code-block-editor .code-block-language:focus {
74
+ opacity: 1;
75
+ }
76
+
77
+ .code-block-editor .code-block-language:disabled {
78
+ cursor: default;
79
+ }
80
+
81
+ /* Autocomplete tooltip */
82
+ .code-block-editor .cm-tooltip {
83
+ border: 1px solid var(--border-color, #dddddd);
84
+ background: var(--paper-body-bg, #ffffff);
85
+ color: var(--text-color, #1a1a1a);
86
+ border-radius: 4px;
87
+ }
88
+
89
+ .code-block-editor .cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected] {
90
+ background: var(--ui-tertiary, #40c5b5);
91
+ color: #ffffff;
92
+ }
93
+
94
+ /* Syntax palette — light */
95
+ .code-block-editor .cm-editor .tok-keyword {
96
+ color: #770088;
97
+ }
98
+
99
+ .code-block-editor .cm-editor .tok-atom,
100
+ .code-block-editor .cm-editor .tok-bool,
101
+ .code-block-editor .cm-editor .tok-url,
102
+ .code-block-editor .cm-editor .tok-labelName {
103
+ color: #221199;
104
+ }
105
+
106
+ .code-block-editor .cm-editor .tok-literal,
107
+ .code-block-editor .cm-editor .tok-number,
108
+ .code-block-editor .cm-editor .tok-inserted {
109
+ color: #116644;
110
+ }
111
+
112
+ .code-block-editor .cm-editor .tok-string,
113
+ .code-block-editor .cm-editor .tok-deleted {
114
+ color: #aa1111;
115
+ }
116
+
117
+ .code-block-editor .cm-editor .tok-string2 {
118
+ color: #ee4400;
119
+ }
120
+
121
+ .code-block-editor .cm-editor .tok-variableName.tok-definition {
122
+ color: #0000ff;
123
+ }
124
+
125
+ .code-block-editor .cm-editor .tok-variableName.tok-local {
126
+ color: #3300aa;
127
+ }
128
+
129
+ .code-block-editor .cm-editor .tok-typeName,
130
+ .code-block-editor .cm-editor .tok-namespace {
131
+ color: #008855;
132
+ }
133
+
134
+ .code-block-editor .cm-editor .tok-className {
135
+ color: #116677;
136
+ }
137
+
138
+ .code-block-editor .cm-editor .tok-variableName2,
139
+ .code-block-editor .cm-editor .tok-macroName {
140
+ color: #225566;
141
+ }
142
+
143
+ .code-block-editor .cm-editor .tok-propertyName {
144
+ color: #0055aa;
145
+ }
146
+
147
+ .code-block-editor .cm-editor .tok-propertyName.tok-definition {
148
+ color: #0000cc;
149
+ }
150
+
151
+ .code-block-editor .cm-editor .tok-comment {
152
+ color: #994400;
153
+ font-style: italic;
154
+ }
155
+
156
+ .code-block-editor .cm-editor .tok-meta {
157
+ color: #7a757a;
158
+ }
159
+
160
+ .code-block-editor .cm-editor .tok-invalid {
161
+ color: #ff0000;
162
+ }
163
+
164
+ .code-block-editor .cm-editor .tok-heading {
165
+ font-weight: 700;
166
+ }
167
+
168
+ .code-block-editor .cm-editor .tok-emphasis {
169
+ font-style: italic;
170
+ }
171
+
172
+ .code-block-editor .cm-editor .tok-strong {
173
+ font-weight: 700;
174
+ }
175
+
176
+ .code-block-editor .cm-editor .tok-link {
177
+ text-decoration: underline;
178
+ }
179
+
180
+ /* Syntax palette — dark (One Dark) */
181
+ .dark .code-block-editor .cm-editor .tok-keyword {
182
+ color: #c678dd;
183
+ }
184
+
185
+ .dark .code-block-editor .cm-editor .tok-atom,
186
+ .dark .code-block-editor .cm-editor .tok-bool,
187
+ .dark .code-block-editor .cm-editor .tok-url,
188
+ .dark .code-block-editor .cm-editor .tok-labelName,
189
+ .dark .code-block-editor .cm-editor .tok-literal,
190
+ .dark .code-block-editor .cm-editor .tok-number {
191
+ color: #d19a66;
192
+ }
193
+
194
+ .dark .code-block-editor .cm-editor .tok-string,
195
+ .dark .code-block-editor .cm-editor .tok-inserted {
196
+ color: #98c379;
197
+ }
198
+
199
+ .dark .code-block-editor .cm-editor .tok-string2,
200
+ .dark .code-block-editor .cm-editor .tok-operator {
201
+ color: #56b6c2;
202
+ }
203
+
204
+ .dark .code-block-editor .cm-editor .tok-deleted {
205
+ color: #e06c75;
206
+ }
207
+
208
+ .dark .code-block-editor .cm-editor .tok-variableName.tok-definition,
209
+ .dark .code-block-editor .cm-editor .tok-variableName.tok-local,
210
+ .dark .code-block-editor .cm-editor .tok-propertyName.tok-definition {
211
+ color: #61afef;
212
+ }
213
+
214
+ .dark .code-block-editor .cm-editor .tok-typeName,
215
+ .dark .code-block-editor .cm-editor .tok-namespace,
216
+ .dark .code-block-editor .cm-editor .tok-className {
217
+ color: #e5c07b;
218
+ }
219
+
220
+ .dark .code-block-editor .cm-editor .tok-variableName2,
221
+ .dark .code-block-editor .cm-editor .tok-macroName,
222
+ .dark .code-block-editor .cm-editor .tok-propertyName {
223
+ color: #e06c75;
224
+ }
225
+
226
+ .dark .code-block-editor .cm-editor .tok-comment {
227
+ color: #7f848e;
228
+ }
229
+
230
+ .dark .code-block-editor .cm-editor .tok-meta {
231
+ color: #abb2bf;
232
+ }
233
+
234
+ .dark .code-block-editor .cm-editor .tok-invalid {
235
+ color: #ff5c57;
236
+ }
@@ -0,0 +1,17 @@
1
+ import type { Extension } from '@codemirror/state';
2
+ /** Language identifiers supported by the rich code block editor */
3
+ export type CodeBlockLanguageId = 'plaintext' | 'javascript' | 'typescript' | 'html' | 'css' | 'json' | 'markdown' | 'sql' | 'csharp' | 'powershell';
4
+ export interface CodeBlockLanguageDef {
5
+ /** Value stored in the code block's language attribute and `language-` CSS class */
6
+ id: CodeBlockLanguageId;
7
+ /** Human-readable name shown in the language picker */
8
+ label: string;
9
+ /** Alternative names recognised when parsing existing content (e.g. 'cs' for csharp) */
10
+ aliases: string[];
11
+ /** Factory for the CodeMirror language support (highlighting + completions) */
12
+ load: () => Extension;
13
+ }
14
+ /** All languages available to rich code blocks */
15
+ export declare const codeBlockLanguages: CodeBlockLanguageDef[];
16
+ /** Look up a language definition by id or alias (case-insensitive) */
17
+ export declare function resolveCodeBlockLanguage(language: string | null | undefined): CodeBlockLanguageDef | undefined;
@@ -0,0 +1,124 @@
1
+ import { javascript } from '@codemirror/lang-javascript';
2
+ import { html } from '@codemirror/lang-html';
3
+ import { css } from '@codemirror/lang-css';
4
+ import { json } from '@codemirror/lang-json';
5
+ import { markdown } from '@codemirror/lang-markdown';
6
+ import { sql, MSSQL } from '@codemirror/lang-sql';
7
+ import { LanguageSupport, StreamLanguage } from '@codemirror/language';
8
+ import { completeAnyWord, completeFromList } from '@codemirror/autocomplete';
9
+ import { csharp } from '@codemirror/legacy-modes/mode/clike';
10
+ import { powerShell } from '@codemirror/legacy-modes/mode/powershell';
11
+ // C# and PowerShell have no native CodeMirror 6 packages, so they use legacy stream
12
+ // parsers. Those provide highlighting only, so keyword/cmdlet lists plus word matching
13
+ // stand in for the scope-aware completions the native language packages ship with.
14
+ const CSHARP_KEYWORDS = ('abstract as async await base bool break byte case catch char checked class const continue ' +
15
+ 'decimal default delegate do double dynamic else enum event explicit extern false finally fixed ' +
16
+ 'float for foreach get global goto if implicit in init int interface internal is lock long ' +
17
+ 'nameof namespace new null object operator out override params partial private protected public ' +
18
+ 'readonly record ref required return sbyte sealed set short sizeof stackalloc static string ' +
19
+ 'struct switch this throw true try typeof uint ulong unchecked unsafe ushort using value var ' +
20
+ 'virtual void volatile when where while yield').split(' ');
21
+ const CSHARP_COMMON_TYPES = ('Console Convert DateTime Dictionary Exception Guid IEnumerable IList List Math Nullable ' +
22
+ 'Object StringBuilder Task TimeSpan').split(' ');
23
+ const POWERSHELL_KEYWORDS = ('begin break catch class continue data do dynamicparam else elseif end enum exit filter ' +
24
+ 'finally for foreach from function hidden if in param process return static switch throw trap ' +
25
+ 'try until using var while workflow').split(' ');
26
+ const POWERSHELL_CMDLETS = ('Add-Content Add-Member Clear-Content Clear-Variable Compare-Object ConvertFrom-Json ' +
27
+ 'ConvertTo-Json Copy-Item Export-Csv ForEach-Object Format-List Format-Table Get-ChildItem ' +
28
+ 'Get-Command Get-Content Get-Date Get-Help Get-Item Get-ItemProperty Get-Location Get-Member ' +
29
+ 'Get-Module Get-Process Get-Random Get-Service Get-Variable Group-Object Import-Csv ' +
30
+ 'Import-Module Install-Module Invoke-Command Invoke-Expression Invoke-RestMethod ' +
31
+ 'Invoke-WebRequest Join-Path Measure-Object Move-Item New-Item New-Object Out-File Out-Null ' +
32
+ 'Read-Host Remove-Item Remove-Variable Rename-Item Resolve-Path Restart-Service Select-Object ' +
33
+ 'Select-String Set-Content Set-ExecutionPolicy Set-Item Set-Location Set-Variable Sort-Object ' +
34
+ 'Split-Path Start-Process Start-Service Start-Sleep Stop-Process Stop-Service Tee-Object ' +
35
+ 'Test-Connection Test-Path Wait-Process Where-Object Write-Debug Write-Error Write-Host ' +
36
+ 'Write-Output Write-Verbose Write-Warning').split(' ');
37
+ function toCompletions(words, type) {
38
+ return words.map((label) => ({ label, type }));
39
+ }
40
+ function legacySupport(parser, completions) {
41
+ const language = StreamLanguage.define(parser);
42
+ return new LanguageSupport(language, [
43
+ language.data.of({ autocomplete: completeFromList(completions) }),
44
+ language.data.of({ autocomplete: completeAnyWord })
45
+ ]);
46
+ }
47
+ /** All languages available to rich code blocks */
48
+ export const codeBlockLanguages = [
49
+ {
50
+ id: 'plaintext',
51
+ label: 'Plain text',
52
+ aliases: ['text', 'plain', 'txt', 'none'],
53
+ load: () => []
54
+ },
55
+ {
56
+ id: 'javascript',
57
+ label: 'JavaScript',
58
+ aliases: ['js', 'jsx', 'mjs', 'node'],
59
+ load: () => javascript({ jsx: true })
60
+ },
61
+ {
62
+ id: 'typescript',
63
+ label: 'TypeScript',
64
+ aliases: ['ts', 'tsx'],
65
+ load: () => javascript({ typescript: true, jsx: true })
66
+ },
67
+ {
68
+ id: 'html',
69
+ label: 'HTML',
70
+ aliases: ['xml', 'svg', 'markup', 'xhtml'],
71
+ load: () => html()
72
+ },
73
+ {
74
+ id: 'css',
75
+ label: 'CSS',
76
+ aliases: ['scss', 'less'],
77
+ load: () => css()
78
+ },
79
+ {
80
+ id: 'json',
81
+ label: 'JSON',
82
+ aliases: ['jsonc'],
83
+ load: () => json()
84
+ },
85
+ {
86
+ id: 'markdown',
87
+ label: 'Markdown',
88
+ aliases: ['md'],
89
+ load: () => markdown()
90
+ },
91
+ {
92
+ id: 'sql',
93
+ label: 'SQL',
94
+ aliases: ['tsql', 'mssql', 'sqlserver', 'mysql', 'postgres', 'postgresql', 'sqlite', 'plsql'],
95
+ // T-SQL dialect: covers standard SQL plus SQL Server extras
96
+ // ([bracketed] identifiers, @variables, TOP, NVARCHAR, ...)
97
+ load: () => sql({ dialect: MSSQL, upperCaseKeywords: true })
98
+ },
99
+ {
100
+ id: 'csharp',
101
+ label: 'C#',
102
+ aliases: ['cs', 'c#', 'dotnet'],
103
+ load: () => legacySupport(csharp, [
104
+ ...toCompletions(CSHARP_KEYWORDS, 'keyword'),
105
+ ...toCompletions(CSHARP_COMMON_TYPES, 'class')
106
+ ])
107
+ },
108
+ {
109
+ id: 'powershell',
110
+ label: 'PowerShell',
111
+ aliases: ['ps', 'ps1', 'pwsh', 'posh'],
112
+ load: () => legacySupport(powerShell, [
113
+ ...toCompletions(POWERSHELL_KEYWORDS, 'keyword'),
114
+ ...toCompletions(POWERSHELL_CMDLETS, 'function')
115
+ ])
116
+ }
117
+ ];
118
+ /** Look up a language definition by id or alias (case-insensitive) */
119
+ export function resolveCodeBlockLanguage(language) {
120
+ if (!language)
121
+ return undefined;
122
+ const normalized = language.toLowerCase();
123
+ return codeBlockLanguages.find((def) => def.id === normalized || def.aliases.includes(normalized));
124
+ }
@@ -0,0 +1,7 @@
1
+ export { Alert } from './Alert.js';
2
+ export { Div } from './Div.js';
3
+ export { Span } from './Span.js';
4
+ export { CodeBlockEditor } from './CodeBlockEditor.js';
5
+ export type { CodeBlockEditorOptions, CodeBlocksOptions } from './CodeBlockEditor.js';
6
+ export { codeBlockLanguages, resolveCodeBlockLanguage } from './codeBlockLanguages.js';
7
+ export type { CodeBlockLanguageDef, CodeBlockLanguageId } from './codeBlockLanguages.js';
@@ -0,0 +1,5 @@
1
+ export { Alert } from './Alert.js';
2
+ export { Div } from './Div.js';
3
+ export { Span } from './Span.js';
4
+ export { CodeBlockEditor } from './CodeBlockEditor.js';
5
+ export { codeBlockLanguages, resolveCodeBlockLanguage } from './codeBlockLanguages.js';
@@ -0,0 +1,261 @@
1
+ <script lang="ts">
2
+ import type { Editor } from '@tiptap/core'
3
+ import ToolbarButton from './ToolbarButton.svelte'
4
+ import { iconAlertTriangle } from '../../../icon/index.js'
5
+
6
+ interface Props {
7
+ editor: Editor
8
+ }
9
+
10
+ let { editor }: Props = $props()
11
+
12
+ let showDialog = $state(false)
13
+ let dialogElement: HTMLDivElement | undefined = $state()
14
+ let titleInputElement: HTMLInputElement | undefined = $state()
15
+ let selectedVariant = $state('default')
16
+ let alertTitle = $state('Alert')
17
+
18
+ const variants = [
19
+ { value: 'default', label: 'Default', color: 'var(--ui-accent)' },
20
+ { value: 'warning', label: 'Warning', color: '#ffc107' },
21
+ { value: 'danger', label: 'Danger', color: '#dc3545' }
22
+ ]
23
+
24
+ const toggleDialog = () => {
25
+ showDialog = !showDialog
26
+ if (showDialog) {
27
+ // Focus and select the title input when dialog opens
28
+ setTimeout(() => {
29
+ titleInputElement?.focus()
30
+ titleInputElement?.select()
31
+ }, 0)
32
+ }
33
+ }
34
+
35
+ const insertAlert = () => {
36
+ editor
37
+ .chain()
38
+ .focus()
39
+ .setAlert({
40
+ variant: selectedVariant,
41
+ title: alertTitle || 'Alert'
42
+ })
43
+ .run()
44
+
45
+ showDialog = false
46
+ // Reset to defaults
47
+ selectedVariant = 'default'
48
+ alertTitle = 'Alert'
49
+ }
50
+
51
+ const closeDialog = () => {
52
+ showDialog = false
53
+ selectedVariant = 'default'
54
+ alertTitle = 'Alert'
55
+ }
56
+ </script>
57
+
58
+ <div style="position: relative; display: inline-block;">
59
+ <ToolbarButton
60
+ icon={iconAlertTriangle}
61
+ title="Insert Alert"
62
+ active={showDialog}
63
+ onclick={toggleDialog}
64
+ />
65
+
66
+ {#if showDialog}
67
+ <div class="alert-dialog" bind:this={dialogElement}>
68
+ <div class="dialog-header">
69
+ <h4>Insert Alert</h4>
70
+ </div>
71
+
72
+ <div class="dialog-body">
73
+ <div class="form-group">
74
+ <label for="alert-title">Title</label>
75
+ <input
76
+ id="alert-title"
77
+ type="text"
78
+ bind:this={titleInputElement}
79
+ bind:value={alertTitle}
80
+ placeholder="Enter alert title"
81
+ class="form-input"
82
+ />
83
+ </div>
84
+
85
+ <div class="form-group">
86
+ <label for="alert-variants">Variant</label>
87
+ <div id="alert-variants" class="variant-grid" role="group" aria-label="Alert variant selection">
88
+ {#each variants as variant}
89
+ <button
90
+ class="variant-button"
91
+ class:active={selectedVariant === variant.value}
92
+ style="border-left: 4px solid {variant.color}"
93
+ onclick={() => (selectedVariant = variant.value)}
94
+ type="button"
95
+ >
96
+ {variant.label}
97
+ </button>
98
+ {/each}
99
+ </div>
100
+ </div>
101
+ </div>
102
+
103
+ <div class="dialog-footer">
104
+ <button class="btn btn-secondary" onclick={closeDialog} type="button">
105
+ Cancel
106
+ </button>
107
+ <button class="btn btn-primary" onclick={insertAlert} type="button">
108
+ Insert
109
+ </button>
110
+ </div>
111
+ </div>
112
+ {/if}
113
+ </div>
114
+
115
+ <style>
116
+ .alert-dialog {
117
+ position: absolute;
118
+ top: 100%;
119
+ right: 0;
120
+ margin-top: 4px;
121
+ display: flex;
122
+ flex-direction: column;
123
+ background: var(--paper-body-bg);
124
+ border: 1px solid var(--border-color);
125
+ border-radius: 6px;
126
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
127
+ z-index: 1000;
128
+ min-width: 300px;
129
+ max-width: 350px;
130
+ }
131
+
132
+ :global(.dark) .alert-dialog {
133
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
134
+ }
135
+
136
+ .dialog-header {
137
+ padding: 12px 16px;
138
+ border-bottom: 1px solid var(--border-color);
139
+ }
140
+
141
+ .dialog-header h4 {
142
+ margin: 0;
143
+ font-size: 14px;
144
+ font-weight: 600;
145
+ color: var(--text-color);
146
+ }
147
+
148
+ .dialog-body {
149
+ padding: 16px;
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: 16px;
153
+ }
154
+
155
+ .form-group {
156
+ display: flex;
157
+ flex-direction: column;
158
+ gap: 8px;
159
+ }
160
+
161
+ .form-group label {
162
+ font-size: 12px;
163
+ font-weight: 600;
164
+ color: var(--text-color);
165
+ }
166
+
167
+ .form-input {
168
+ padding: 8px 12px;
169
+ border: 1px solid var(--border-color);
170
+ border-radius: 4px;
171
+ background: var(--input-bg);
172
+ color: var(--text-color);
173
+ font-size: 13px;
174
+ font-family: inherit;
175
+ }
176
+
177
+ .form-input:focus {
178
+ outline: none;
179
+ border-color: var(--ui-primary);
180
+ }
181
+
182
+ :global(.dark) .form-input:focus {
183
+ border-color: var(--ui-accent);
184
+ }
185
+
186
+ .variant-grid {
187
+ display: flex;
188
+ flex-direction: column;
189
+ gap: 8px;
190
+ }
191
+
192
+ .variant-button {
193
+ width: 100%;
194
+ padding: 10px 12px;
195
+ border: 1px solid var(--border-color);
196
+ border-radius: 4px;
197
+ background: var(--paper-body-bg);
198
+ color: var(--text-color);
199
+ font-size: 13px;
200
+ font-weight: 500;
201
+ cursor: pointer;
202
+ transition: all 0.15s ease;
203
+ text-align: left;
204
+ }
205
+
206
+ .variant-button:hover {
207
+ background: var(--page-bg);
208
+ }
209
+
210
+ .variant-button.active {
211
+ background: var(--page-bg);
212
+ border-color: var(--ui-primary);
213
+ font-weight: 600;
214
+ }
215
+
216
+ :global(.dark) .variant-button.active {
217
+ border-color: var(--ui-accent);
218
+ }
219
+
220
+ .dialog-footer {
221
+ padding: 12px 16px;
222
+ border-top: 1px solid var(--border-color);
223
+ display: flex;
224
+ gap: 8px;
225
+ justify-content: flex-end;
226
+ }
227
+
228
+ .btn {
229
+ padding: 6px 16px;
230
+ border: none;
231
+ border-radius: 4px;
232
+ font-size: 13px;
233
+ font-weight: 500;
234
+ cursor: pointer;
235
+ transition: all 0.15s ease;
236
+ }
237
+
238
+ .btn-secondary {
239
+ background: var(--page-bg);
240
+ color: var(--text-color);
241
+ border: 1px solid var(--border-color);
242
+ }
243
+
244
+ .btn-secondary:hover {
245
+ background: var(--border-color);
246
+ }
247
+
248
+ .btn-primary {
249
+ background: var(--ui-primary);
250
+ color: var(--off-white);
251
+ }
252
+
253
+ .btn-primary:hover {
254
+ opacity: 0.9;
255
+ }
256
+
257
+ :global(.dark) .btn-primary {
258
+ background: var(--ui-accent);
259
+ color: var(--ui-primary);
260
+ }
261
+ </style>