@placeholderco/placeholder-ui 1.0.11 → 2.0.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 (289) 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 +270 -137
  99. package/dist/form/Autocomplete.svelte.d.ts +58 -10
  100. package/dist/form/AutocompleteMulti.svelte +385 -227
  101. package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
  102. package/dist/form/Checkbox.svelte +124 -43
  103. package/dist/form/Checkbox.svelte.d.ts +26 -2
  104. package/dist/form/Chips.svelte +47 -17
  105. package/dist/form/Chips.svelte.d.ts +24 -3
  106. package/dist/form/ComboBox.svelte +30 -20
  107. package/dist/form/ComboBox.svelte.d.ts +1 -1
  108. package/dist/form/ComboBoxItemBuilder.svelte +161 -188
  109. package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
  110. package/dist/form/ComboBoxMulti.svelte +38 -24
  111. package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
  112. package/dist/form/CronBuilder.svelte +84 -67
  113. package/dist/form/CronBuilder.svelte.d.ts +16 -3
  114. package/dist/form/DatePicker.svelte +177 -191
  115. package/dist/form/DatePicker.svelte.d.ts +17 -2
  116. package/dist/form/DateRangePicker.svelte +775 -0
  117. package/dist/form/DateRangePicker.svelte.d.ts +23 -0
  118. package/dist/form/DateTimePicker.svelte +168 -209
  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 +71 -29
  123. package/dist/form/Number.svelte.d.ts +39 -6
  124. package/dist/form/Radio.svelte +174 -0
  125. package/dist/form/Radio.svelte.d.ts +21 -0
  126. package/dist/form/RadioGroup.svelte +52 -138
  127. package/dist/form/RadioGroup.svelte.d.ts +19 -2
  128. package/dist/form/SegmentedControl.svelte +103 -57
  129. package/dist/form/SegmentedControl.svelte.d.ts +12 -2
  130. package/dist/form/Select.svelte +160 -229
  131. package/dist/form/Select.svelte.d.ts +35 -6
  132. package/dist/form/SelectMulti.svelte +166 -277
  133. package/dist/form/SelectMulti.svelte.d.ts +37 -6
  134. package/dist/form/Slider.svelte +185 -268
  135. package/dist/form/Slider.svelte.d.ts +33 -16
  136. package/dist/form/StringArrayBuilder.svelte +249 -0
  137. package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
  138. package/dist/form/Switch.svelte +164 -106
  139. package/dist/form/Switch.svelte.d.ts +22 -3
  140. package/dist/form/TextArea.svelte +80 -45
  141. package/dist/form/TextArea.svelte.d.ts +35 -10
  142. package/dist/form/Textbox.svelte +80 -47
  143. package/dist/form/Textbox.svelte.d.ts +41 -8
  144. package/dist/form/TimePicker.svelte +42 -47
  145. package/dist/form/TimePicker.svelte.d.ts +12 -2
  146. package/dist/form/comboBoxCore.svelte.d.ts +99 -0
  147. package/dist/form/comboBoxCore.svelte.js +243 -0
  148. package/dist/icon/Icon.svelte +8 -3
  149. package/dist/icon/Icon.svelte.d.ts +8 -3
  150. package/dist/icon/cube-send.svg +1 -0
  151. package/dist/icon/file-type-bmp.svg +1 -0
  152. package/dist/icon/file-type-csv.svg +1 -0
  153. package/dist/icon/file-type-doc.svg +1 -0
  154. package/dist/icon/file-type-docx.svg +1 -0
  155. package/dist/icon/file-type-jpg.svg +1 -0
  156. package/dist/icon/file-type-pdf.svg +1 -0
  157. package/dist/icon/file-type-png.svg +1 -0
  158. package/dist/icon/file-type-ppt.svg +1 -0
  159. package/dist/icon/file-type-svg.svg +1 -0
  160. package/dist/icon/file-type-txt.svg +1 -0
  161. package/dist/icon/file-type-xls.svg +1 -0
  162. package/dist/icon/file-type-zip.svg +1 -0
  163. package/dist/icon/index.d.ts +166 -145
  164. package/dist/icon/index.js +166 -146
  165. package/dist/icon/layout-sidebar-left-collapse.svg +1 -0
  166. package/dist/icon/layout-sidebar-left-expand.svg +1 -0
  167. package/dist/icon/logo-placeholder.svg +6 -0
  168. package/dist/icon/paperclip.svg +1 -0
  169. package/dist/icon/source-code.svg +1 -0
  170. package/dist/icon/sun-moon.svg +1 -0
  171. package/dist/icon/table.svg +6 -0
  172. package/dist/icon/thumb-down.svg +1 -0
  173. package/dist/icon/thumb-up.svg +1 -0
  174. package/dist/index.d.ts +93 -22
  175. package/dist/index.js +28 -27
  176. package/dist/layout/AppShell.svelte +12 -162
  177. package/dist/layout/AppShell.svelte.d.ts +6 -27
  178. package/dist/layout/CustomNavbar.svelte +9 -7
  179. package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
  180. package/dist/layout/Navbar.svelte +158 -110
  181. package/dist/layout/Navbar.svelte.d.ts +26 -12
  182. package/dist/layout/NavbarItemDisplay.svelte +2 -2
  183. package/dist/layout/NavbarItemView.svelte +182 -0
  184. package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
  185. package/dist/layout/Sidenav.svelte +280 -341
  186. package/dist/layout/Sidenav.svelte.d.ts +36 -4
  187. package/dist/models/ComboBoxItem.d.ts +2 -0
  188. package/dist/models/Employee.d.ts +53 -0
  189. package/dist/models/Employee.js +23 -0
  190. package/dist/models/Hyperlink.d.ts +3 -1
  191. package/dist/models/LinkCollectionItem.d.ts +3 -1
  192. package/dist/models/NavbarItem.d.ts +6 -2
  193. package/dist/theme.svelte.d.ts +0 -1
  194. package/dist/theme.svelte.js +46 -58
  195. package/dist/ui/Accordion.svelte +81 -242
  196. package/dist/ui/Accordion.svelte.d.ts +37 -14
  197. package/dist/ui/AccordionItem.svelte +303 -0
  198. package/dist/ui/AccordionItem.svelte.d.ts +21 -0
  199. package/dist/ui/ActionIcon.svelte +25 -21
  200. package/dist/ui/ActionIcon.svelte.d.ts +15 -2
  201. package/dist/ui/Badge.svelte +170 -161
  202. package/dist/ui/Badge.svelte.d.ts +16 -4
  203. package/dist/ui/Button.svelte +178 -205
  204. package/dist/ui/Button.svelte.d.ts +19 -2
  205. package/dist/ui/ButtonVariant.d.ts +15 -1
  206. package/dist/ui/ContextMenu.svelte +146 -0
  207. package/dist/ui/ContextMenu.svelte.d.ts +37 -0
  208. package/dist/ui/ContextMenuList.svelte +188 -0
  209. package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
  210. package/dist/ui/Dialog.svelte +183 -104
  211. package/dist/ui/Dialog.svelte.d.ts +21 -2
  212. package/dist/ui/Drawer.svelte +237 -184
  213. package/dist/ui/Drawer.svelte.d.ts +20 -2
  214. package/dist/ui/Dropdown.svelte +24 -14
  215. package/dist/ui/Dropdown.svelte.d.ts +11 -2
  216. package/dist/ui/Dropzone.svelte +159 -57
  217. package/dist/ui/Dropzone.svelte.d.ts +29 -2
  218. package/dist/ui/Link.svelte +12 -4
  219. package/dist/ui/Link.svelte.d.ts +8 -2
  220. package/dist/ui/Loader.svelte +23 -18
  221. package/dist/ui/Loader.svelte.d.ts +5 -2
  222. package/dist/ui/Logo.svelte +37 -0
  223. package/dist/ui/Logo.svelte.d.ts +16 -0
  224. package/dist/ui/MultiSortable.svelte +287 -0
  225. package/dist/ui/MultiSortable.svelte.d.ts +50 -0
  226. package/dist/ui/Pagination.svelte +12 -6
  227. package/dist/ui/Pagination.svelte.d.ts +6 -2
  228. package/dist/ui/Popover.svelte +43 -65
  229. package/dist/ui/Popover.svelte.d.ts +14 -5
  230. package/dist/ui/ProgressBar.svelte +169 -0
  231. package/dist/ui/ProgressBar.svelte.d.ts +30 -0
  232. package/dist/ui/ProgressBarVariant.d.ts +7 -0
  233. package/dist/ui/ProgressBarVariant.js +1 -0
  234. package/dist/ui/SegmentedControl.svelte +0 -0
  235. package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
  236. package/dist/ui/Sortable.svelte +163 -0
  237. package/dist/ui/Sortable.svelte.d.ts +47 -0
  238. package/dist/ui/Table.svelte +497 -56
  239. package/dist/ui/Table.svelte.d.ts +64 -2
  240. package/dist/ui/Tabs.svelte +22 -18
  241. package/dist/ui/Tabs.svelte.d.ts +6 -2
  242. package/dist/ui/ThemeSwitcher.svelte +26 -7
  243. package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
  244. package/dist/ui/Tooltip.svelte +312 -180
  245. package/dist/ui/Tooltip.svelte.d.ts +4 -3
  246. package/dist/uiTheme.svelte.d.ts +86 -0
  247. package/dist/uiTheme.svelte.js +214 -0
  248. package/dist/util/DateFunctions.js +1 -1
  249. package/dist/util/DragDrop.d.ts +50 -0
  250. package/dist/util/DragDrop.js +154 -0
  251. package/dist/util/NavigateTo.js +2 -2
  252. package/dist/util/dayjs.d.ts +4 -0
  253. package/dist/util/dayjs.js +15 -0
  254. package/dist/util/interceptLinkClick.d.ts +13 -0
  255. package/dist/util/interceptLinkClick.js +33 -0
  256. package/package.json +66 -26
  257. package/dist/display/Alert.svelte +0 -179
  258. package/dist/display/Alert.svelte.d.ts +0 -13
  259. package/dist/form/FileInput.svelte +0 -235
  260. package/dist/form/FileInput.svelte.d.ts +0 -23
  261. package/dist/form/PasswordInput.svelte +0 -252
  262. package/dist/form/PasswordInput.svelte.d.ts +0 -33
  263. package/dist/form/Rating.svelte +0 -235
  264. package/dist/form/Rating.svelte.d.ts +0 -21
  265. package/dist/styles/components.css +0 -199
  266. package/dist/styles/dark.css +0 -146
  267. package/dist/styles/index.css +0 -116
  268. package/dist/styles/reset.css +0 -110
  269. package/dist/styles/semantic.css +0 -86
  270. package/dist/styles/tokens.css +0 -203
  271. package/dist/styles/utilities.css +0 -523
  272. package/dist/ui/Breadcrumbs.svelte +0 -131
  273. package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
  274. package/dist/ui/LoadingOverlay.svelte +0 -53
  275. package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
  276. package/dist/ui/Progress.svelte +0 -191
  277. package/dist/ui/Progress.svelte.d.ts +0 -15
  278. package/dist/ui/RingProgress.svelte +0 -141
  279. package/dist/ui/RingProgress.svelte.d.ts +0 -18
  280. package/dist/ui/Skeleton.svelte +0 -85
  281. package/dist/ui/Skeleton.svelte.d.ts +0 -12
  282. package/dist/ui/Stepper.svelte +0 -355
  283. package/dist/ui/Stepper.svelte.d.ts +0 -24
  284. package/dist/ui/Timeline.svelte +0 -225
  285. package/dist/ui/Timeline.svelte.d.ts +0 -23
  286. /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
  287. /package/dist/{actions → util}/ClickOutside.js +0 -0
  288. /package/dist/{transitions → util}/Transitions.d.ts +0 -0
  289. /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>