includio-cms 0.1.3 → 0.5.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.
- package/CHANGELOG.md +76 -0
- package/ROADMAP.md +23 -13
- package/dist/admin/api/accept-invite.js +1 -5
- package/dist/admin/api/invite.js +7 -16
- package/dist/admin/client/account/account-page.svelte +20 -50
- package/dist/admin/client/account/lang.d.ts +15 -23
- package/dist/admin/client/account/lang.js +51 -67
- package/dist/admin/client/account/preferences-section.svelte +26 -84
- package/dist/admin/client/account/profile-section.svelte +60 -40
- package/dist/admin/client/account/schema.d.ts +11 -3
- package/dist/admin/client/account/schema.js +25 -16
- package/dist/admin/client/account/security-section.svelte +139 -105
- package/dist/admin/client/account/sessions-section.svelte +35 -34
- package/dist/admin/client/admin/admin-after-login-layout-content.svelte +3 -5
- package/dist/admin/client/admin/admin-layout.svelte +3 -2
- package/dist/admin/client/admin/admin-preloader.svelte +36 -0
- package/dist/admin/client/admin/admin-preloader.svelte.d.ts +18 -0
- package/dist/admin/client/admin/dashboard-page.svelte +55 -41
- package/dist/admin/client/collection/a11y-score-cell.svelte +45 -0
- package/dist/admin/client/collection/a11y-score-cell.svelte.d.ts +6 -0
- package/dist/admin/client/collection/bulk-actions-bar.svelte +83 -0
- package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +9 -0
- package/dist/admin/client/collection/collection-entries.svelte +255 -256
- package/dist/admin/client/collection/collection-view.svelte.d.ts +4 -3
- package/dist/admin/client/collection/collection-view.svelte.js +9 -5
- package/dist/admin/client/collection/collection.svelte +22 -12
- package/dist/admin/client/collection/data-table.svelte +50 -39
- package/dist/admin/client/collection/data-table.svelte.d.ts +1 -0
- package/dist/admin/client/collection/date-cell.svelte +7 -5
- package/dist/admin/client/collection/date-cell.svelte.d.ts +1 -1
- package/dist/admin/client/collection/empty-state.svelte +28 -0
- package/dist/admin/client/collection/empty-state.svelte.d.ts +9 -0
- package/dist/admin/client/collection/entry-link.svelte +10 -4
- package/dist/admin/client/collection/entry-link.svelte.d.ts +1 -0
- package/dist/admin/client/collection/grid-view.svelte +21 -23
- package/dist/admin/client/collection/grid-view.svelte.d.ts +1 -2
- package/dist/admin/client/collection/row-actions.svelte +60 -0
- package/dist/admin/client/collection/row-actions.svelte.d.ts +9 -0
- package/dist/admin/client/collection/status-badge.svelte +7 -8
- package/dist/admin/client/collection/table-pagination.svelte +122 -79
- package/dist/admin/client/collection/table-pagination.svelte.d.ts +1 -0
- package/dist/admin/client/collection/table-toolbar.svelte +108 -88
- package/dist/admin/client/collection/table-toolbar.svelte.d.ts +8 -9
- package/dist/admin/client/entry/entry-form.svelte +109 -1
- package/dist/admin/client/entry/entry-header.svelte +96 -37
- package/dist/admin/client/entry/entry-header.svelte.d.ts +5 -0
- package/dist/admin/client/entry/entry.svelte +171 -60
- package/dist/admin/client/entry/header/a11y-validator.d.ts +46 -0
- package/dist/admin/client/entry/header/a11y-validator.js +311 -0
- package/dist/admin/client/entry/header/publish-panel.svelte +373 -131
- package/dist/admin/client/entry/header/publish-panel.svelte.d.ts +4 -0
- package/dist/admin/client/entry/header/save-indicator.svelte +33 -23
- package/dist/admin/client/entry/header/schedule-popover.svelte +1 -1
- package/dist/admin/client/entry/header/status-badge.svelte +25 -118
- package/dist/admin/client/entry/header/version-history-sheet.svelte +314 -98
- package/dist/admin/client/form/form-submission/form-submission.svelte +271 -83
- package/dist/admin/client/form/form-submission/submission-field.svelte +12 -12
- package/dist/admin/client/form/form-submissions.svelte +421 -139
- package/dist/admin/client/form/submission-link.svelte +8 -2
- package/dist/admin/client/form/submission-link.svelte.d.ts +1 -0
- package/dist/admin/client/form/submission-status-badge.svelte +18 -4
- package/dist/admin/client/form/submission-status-badge.svelte.d.ts +1 -0
- package/dist/admin/client/login/lang.d.ts +32 -0
- package/dist/admin/client/login/lang.js +66 -2
- package/dist/admin/client/login/login-form.svelte +237 -95
- package/dist/admin/client/login/login-form.svelte.d.ts +2 -17
- package/dist/admin/client/login/login-page.svelte +34 -98
- package/dist/admin/client/login/reset-password-page.svelte +235 -0
- package/dist/admin/client/login/reset-password-page.svelte.d.ts +4 -0
- package/dist/admin/client/login/schema.d.ts +15 -0
- package/dist/admin/client/login/schema.js +21 -0
- package/dist/admin/client/users/accept-invite-page.svelte +166 -37
- package/dist/admin/client/users/create-user-dialog.svelte +15 -7
- package/dist/admin/client/users/delete-user-dialog.svelte +81 -16
- package/dist/admin/client/users/delete-user-dialog.svelte.d.ts +4 -1
- package/dist/admin/client/users/edit-user-dialog.svelte +3 -0
- package/dist/admin/client/users/invite-user-dialog.svelte +16 -3
- package/dist/admin/client/users/lang.d.ts +27 -0
- package/dist/admin/client/users/lang.js +64 -10
- package/dist/admin/client/users/pending-invitations.svelte +59 -23
- package/dist/admin/client/users/users-page.svelte +471 -72
- package/dist/admin/components/accessibility/accessibility-overview.svelte +2 -7
- package/dist/admin/components/dashboard/a11y-gauge.svelte +90 -0
- package/dist/admin/components/dashboard/a11y-gauge.svelte.d.ts +18 -0
- package/dist/admin/components/dashboard/accessibility-hub.svelte +13 -12
- package/dist/admin/components/dashboard/form-submissions-widget.svelte +71 -113
- package/dist/admin/components/dashboard/index.d.ts +4 -2
- package/dist/admin/components/dashboard/index.js +4 -2
- package/dist/admin/components/dashboard/recent-activity.svelte +53 -75
- package/dist/admin/components/dashboard/recent-entries.svelte +94 -0
- package/dist/admin/components/dashboard/recent-entries.svelte.d.ts +18 -0
- package/dist/admin/components/dashboard/stat-card.svelte +2 -2
- package/dist/admin/components/dashboard/tip-of-the-day.svelte +109 -0
- package/dist/admin/components/dashboard/tip-of-the-day.svelte.d.ts +3 -0
- package/dist/admin/components/dashboard/welcome-header.svelte +45 -0
- package/dist/admin/components/dashboard/welcome-header.svelte.d.ts +3 -0
- package/dist/admin/components/fields/{array-field.svelte → blocks-field.svelte} +4 -4
- package/dist/admin/components/fields/{array-field.svelte.d.ts → blocks-field.svelte.d.ts} +5 -5
- package/dist/admin/components/fields/content-field.svelte +27 -0
- package/dist/admin/components/fields/content-field.svelte.d.ts +31 -0
- package/dist/admin/components/fields/field-renderer.svelte +9 -7
- package/dist/admin/components/fields/image-field.svelte +2 -2
- package/dist/admin/components/fields/media-field.svelte +2 -2
- package/dist/admin/components/fields/seo-field.svelte +205 -25
- package/dist/admin/components/fields/simple-array-field.svelte +289 -0
- package/dist/admin/components/fields/simple-array-field.svelte.d.ts +30 -0
- package/dist/admin/components/fields/slug-field.svelte +3 -2
- package/dist/admin/components/fields/standalone-field-renderer.svelte +148 -0
- package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +9 -0
- package/dist/admin/components/fields/text-field-wrapper.svelte +13 -1
- package/dist/admin/components/fields/text-field-wrapper.svelte.d.ts +2 -2
- package/dist/admin/components/fields/url-field.svelte +5 -4
- package/dist/admin/components/layout/app-sidebar.svelte +27 -24
- package/dist/admin/components/layout/lang.d.ts +6 -0
- package/dist/admin/components/layout/lang.js +13 -1
- package/dist/admin/components/layout/layout-renderer.svelte +352 -0
- package/dist/admin/components/layout/layout-renderer.svelte.d.ts +14 -0
- package/dist/admin/components/layout/nav-breadcrumbs.svelte +4 -4
- package/dist/admin/components/layout/nav-collections.svelte +65 -36
- package/dist/admin/components/layout/nav-footer.svelte +31 -0
- package/dist/admin/components/layout/nav-footer.svelte.d.ts +18 -0
- package/dist/admin/components/layout/nav-forms.svelte +55 -30
- package/dist/admin/components/layout/nav-main.svelte +14 -52
- package/dist/admin/components/layout/nav-search.svelte +4 -3
- package/dist/admin/components/layout/nav-singletons.svelte +59 -17
- package/dist/admin/components/layout/nav-singletons.svelte.d.ts +17 -8
- package/dist/admin/components/layout/site-header.svelte +74 -13
- package/dist/admin/components/media/alt-input.svelte +32 -22
- package/dist/admin/components/media/bulk-action-bar.svelte +139 -150
- package/dist/admin/components/media/file/file-details.svelte +299 -217
- package/dist/admin/components/media/file/file-miniature.svelte +54 -41
- package/dist/admin/components/media/file/file-miniature.svelte.d.ts +1 -0
- package/dist/admin/components/media/file/file-preview.svelte +1 -1
- package/dist/admin/components/media/file-upload.svelte +24 -26
- package/dist/admin/components/media/files-list.svelte +112 -40
- package/dist/admin/components/media/files-list.svelte.d.ts +2 -0
- package/dist/admin/components/media/focal-point-input.svelte +122 -26
- package/dist/admin/components/media/media-library.svelte +127 -70
- package/dist/admin/components/media/media-search.svelte +6 -6
- package/dist/admin/components/media/media-sort.svelte +3 -1
- package/dist/admin/components/media/multi-file-summary.svelte +88 -68
- package/dist/admin/components/media/tag-combobox.svelte +141 -66
- package/dist/admin/components/media/tag-combobox.svelte.d.ts +1 -0
- package/dist/admin/components/media/tag-sidebar.svelte +139 -121
- package/dist/admin/components/tiptap/FigureNodeView.svelte +144 -15
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +254 -0
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte.d.ts +4 -0
- package/dist/admin/components/tiptap/SlashCommandPopup.svelte +212 -0
- package/dist/admin/components/tiptap/SlashCommandPopup.svelte.d.ts +8 -0
- package/dist/admin/components/tiptap/content-editor.svelte +280 -0
- package/dist/admin/components/tiptap/content-editor.svelte.d.ts +9 -0
- package/dist/admin/components/tiptap/editor-toolbar.svelte +230 -0
- package/dist/admin/components/tiptap/editor-toolbar.svelte.d.ts +16 -0
- package/dist/admin/components/tiptap/heading-a11y-plugin.d.ts +2 -0
- package/dist/admin/components/tiptap/heading-a11y-plugin.js +67 -0
- package/dist/admin/components/tiptap/image-dialog.svelte +172 -11
- package/dist/admin/components/tiptap/inline-block-node.d.ts +19 -0
- package/dist/admin/components/tiptap/inline-block-node.js +98 -0
- package/dist/admin/components/tiptap/link-dialog.svelte +9 -4
- package/dist/admin/components/tiptap/slash-command.d.ts +17 -0
- package/dist/admin/components/tiptap/slash-command.js +181 -0
- package/dist/admin/components/tiptap/structured-content-utils.d.ts +21 -0
- package/dist/admin/components/tiptap/structured-content-utils.js +150 -0
- package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -190
- package/dist/admin/email/invite-template.d.ts +8 -0
- package/dist/admin/email/invite-template.js +99 -0
- package/dist/admin/email/reset-password-template.d.ts +7 -0
- package/dist/admin/email/reset-password-template.js +96 -0
- package/dist/admin/remote/ai.remote.d.ts +1 -0
- package/dist/admin/remote/ai.remote.js +4 -1
- package/dist/admin/remote/entry.remote.d.ts +8 -0
- package/dist/admin/remote/entry.remote.js +53 -4
- package/dist/admin/remote/preview.remote.js +2 -1
- package/dist/admin/shared/password-schema.d.ts +5 -0
- package/dist/admin/shared/password-schema.js +10 -0
- package/dist/admin/styles/admin.css +1530 -151
- package/dist/admin/utils/formatDate.d.ts +1 -0
- package/dist/admin/utils/formatDate.js +8 -0
- package/dist/admin/utils/roleLabel.d.ts +2 -0
- package/dist/admin/utils/roleLabel.js +13 -0
- package/dist/ai-claude/index.d.ts +2 -0
- package/dist/ai-claude/index.js +56 -0
- package/dist/cms/runtime/api.d.ts +6 -1
- package/dist/cms/runtime/api.js +3 -0
- package/dist/cms/runtime/schemas.d.ts +9 -1
- package/dist/cms/runtime/schemas.js +8 -0
- package/dist/cms/runtime/types.d.ts +82 -10
- package/dist/cms/runtime/types.js +4 -0
- package/dist/components/ui/accordion/accordion.stories.svelte +39 -0
- package/dist/components/ui/accordion/accordion.stories.svelte.d.ts +27 -0
- package/dist/components/ui/alert/alert.stories.svelte +53 -0
- package/dist/components/ui/alert/alert.stories.svelte.d.ts +27 -0
- package/dist/components/ui/alert/alert.svelte +5 -0
- package/dist/components/ui/alert/alert.svelte.d.ts +9 -0
- package/dist/components/ui/avatar/avatar.stories.svelte +16 -0
- package/dist/components/ui/avatar/avatar.stories.svelte.d.ts +27 -0
- package/dist/components/ui/badge/badge.stories.svelte +33 -0
- package/dist/components/ui/badge/badge.stories.svelte.d.ts +27 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +33 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte.d.ts +27 -0
- package/dist/components/ui/button/button.stories.svelte +43 -0
- package/dist/components/ui/button/button.stories.svelte.d.ts +27 -0
- package/dist/components/ui/button/button.svelte +1 -2
- package/dist/components/ui/button/button.svelte.d.ts +0 -3
- package/dist/components/ui/button-group/button-group-separator.svelte.d.ts +1 -1
- package/dist/components/ui/card/card.stories.svelte +42 -0
- package/dist/components/ui/card/card.stories.svelte.d.ts +27 -0
- package/dist/components/ui/command/command.stories.svelte +51 -0
- package/dist/components/ui/command/command.stories.svelte.d.ts +27 -0
- package/dist/components/ui/dialog/dialog.stories.svelte +29 -0
- package/dist/components/ui/dialog/dialog.stories.svelte.d.ts +27 -0
- package/dist/components/ui/field/field-label.svelte.d.ts +1 -1
- package/dist/components/ui/field/field.stories.svelte +21 -0
- package/dist/components/ui/field/field.stories.svelte.d.ts +27 -0
- package/dist/components/ui/input/input.stories.svelte +40 -0
- package/dist/components/ui/input/input.stories.svelte.d.ts +27 -0
- package/dist/components/ui/input/input.svelte +2 -4
- package/dist/components/ui/item/item-separator.svelte.d.ts +1 -1
- package/dist/components/ui/label/label.stories.svelte +20 -0
- package/dist/components/ui/label/label.stories.svelte.d.ts +27 -0
- package/dist/components/ui/popover/popover.stories.svelte +29 -0
- package/dist/components/ui/popover/popover.stories.svelte.d.ts +27 -0
- package/dist/components/ui/select/select-group-heading.svelte.d.ts +1 -1
- package/dist/components/ui/select/select.stories.svelte +23 -0
- package/dist/components/ui/select/select.stories.svelte.d.ts +27 -0
- package/dist/components/ui/separator/separator.stories.svelte +24 -0
- package/dist/components/ui/separator/separator.stories.svelte.d.ts +27 -0
- package/dist/components/ui/sheet/sheet.stories.svelte +29 -0
- package/dist/components/ui/sheet/sheet.stories.svelte.d.ts +27 -0
- package/dist/components/ui/sidebar/sidebar-group.svelte +3 -3
- package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +2 -2
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte +28 -30
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +7 -7
- package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +1 -1
- package/dist/components/ui/sidebar/sidebar-trigger.svelte +4 -4
- package/dist/components/ui/sonner/sonner.stories.svelte +22 -0
- package/dist/components/ui/sonner/sonner.stories.svelte.d.ts +26 -0
- package/dist/components/ui/sonner/sonner.svelte +8 -2
- package/dist/components/ui/sonner/toast-demo.svelte +29 -0
- package/dist/components/ui/sonner/toast-demo.svelte.d.ts +6 -0
- package/dist/components/ui/textarea/textarea.stories.svelte +22 -0
- package/dist/components/ui/textarea/textarea.stories.svelte.d.ts +27 -0
- package/dist/components/ui/textarea/textarea.svelte +0 -2
- package/dist/components/ui/toggle/toggle.stories.svelte +22 -0
- package/dist/components/ui/toggle/toggle.stories.svelte.d.ts +27 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte +17 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte +26 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte.d.ts +27 -0
- package/dist/core/fields/fieldSchemaToTs.d.ts +1 -0
- package/dist/core/fields/fieldSchemaToTs.js +133 -1
- package/dist/core/fields/layoutUtils.d.ts +17 -0
- package/dist/core/fields/layoutUtils.js +149 -0
- package/dist/core/fields/structuredToHtml.d.ts +9 -0
- package/dist/core/fields/structuredToHtml.js +161 -0
- package/dist/core/server/entries/operations/create.js +2 -1
- package/dist/core/server/entries/operations/get.js +8 -6
- package/dist/core/server/entries/operations/update.d.ts +3 -0
- package/dist/core/server/entries/operations/update.js +30 -2
- package/dist/core/server/fields/queryStructuredContent.d.ts +15 -0
- package/dist/core/server/fields/queryStructuredContent.js +65 -0
- package/dist/core/server/fields/resolveImageFields.js +51 -2
- package/dist/core/server/fields/resolveRelationFields.js +2 -2
- package/dist/core/server/fields/resolveRichtextLinks.js +80 -13
- package/dist/core/server/fields/resolveUrlFields.js +57 -6
- package/dist/core/server/fields/slugResolver.d.ts +10 -0
- package/dist/core/server/fields/slugResolver.js +34 -0
- package/dist/core/server/generator/fields.js +15 -4
- package/dist/core/server/generator/generator.js +3 -2
- package/dist/files-local/index.js +126 -64
- package/dist/paraglide/.prettierignore +3 -0
- package/dist/paraglide/messages/_index.d.ts +36 -0
- package/dist/paraglide/messages/_index.js +72 -0
- package/dist/paraglide/messages/en.d.ts +5 -0
- package/dist/paraglide/messages/en.js +14 -0
- package/dist/paraglide/messages/pl.d.ts +5 -0
- package/dist/paraglide/messages/pl.js +14 -0
- package/dist/paraglide/messages.d.ts +2 -0
- package/dist/paraglide/messages.js +4 -0
- package/dist/paraglide/registry.d.ts +21 -0
- package/dist/paraglide/registry.js +31 -0
- package/dist/paraglide/runtime.d.ts +583 -0
- package/dist/paraglide/runtime.js +1402 -0
- package/dist/paraglide/server.d.ts +67 -0
- package/dist/paraglide/server.js +175 -0
- package/dist/server/auth.d.ts +5 -0
- package/dist/server/auth.js +12 -1
- package/dist/sveltekit/components/structured-content.svelte +204 -0
- package/dist/sveltekit/components/structured-content.svelte.d.ts +21 -0
- package/dist/sveltekit/config.d.ts +13 -3
- package/dist/sveltekit/index.d.ts +3 -0
- package/dist/sveltekit/index.js +3 -0
- package/dist/sveltekit/server/handle.js +1 -0
- package/dist/types/config.d.ts +3 -0
- package/dist/types/fields.d.ts +19 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/layout.d.ts +54 -0
- package/dist/types/layout.js +6 -0
- package/dist/types/structured-content.d.ts +63 -0
- package/dist/types/structured-content.js +1 -0
- package/dist/updates/0.1.4/index.d.ts +2 -0
- package/dist/updates/0.1.4/index.js +11 -0
- package/dist/updates/0.1.5/index.d.ts +2 -0
- package/dist/updates/0.1.5/index.js +18 -0
- package/dist/updates/0.2.0/index.d.ts +2 -0
- package/dist/updates/0.2.0/index.js +11 -0
- package/dist/updates/0.2.2/index.d.ts +2 -0
- package/dist/updates/0.2.2/index.js +13 -0
- package/dist/updates/0.5.0/index.d.ts +2 -0
- package/dist/updates/0.5.0/index.js +14 -0
- package/dist/updates/index.js +6 -1
- package/package.json +17 -10
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
import Suggestion, {} from '@tiptap/suggestion';
|
|
3
|
+
import tippy, {} from 'tippy.js';
|
|
4
|
+
import { mount, unmount } from 'svelte';
|
|
5
|
+
import SlashCommandPopup from './SlashCommandPopup.svelte';
|
|
6
|
+
function getStandardItems(editor) {
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
9
|
+
id: 'heading2',
|
|
10
|
+
label: 'Nagłówek 2',
|
|
11
|
+
description: 'Główna sekcja',
|
|
12
|
+
group: 'Formatowanie',
|
|
13
|
+
tier: 1,
|
|
14
|
+
action: () => editor.chain().focus().toggleHeading({ level: 2 }).run()
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'heading3',
|
|
18
|
+
label: 'Nagłówek 3',
|
|
19
|
+
description: 'Podsekcja',
|
|
20
|
+
group: 'Formatowanie',
|
|
21
|
+
tier: 1,
|
|
22
|
+
action: () => editor.chain().focus().toggleHeading({ level: 3 }).run()
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'bulletList',
|
|
26
|
+
label: 'Lista punktowa',
|
|
27
|
+
description: 'Lista bez numeracji',
|
|
28
|
+
group: 'Formatowanie',
|
|
29
|
+
tier: 1,
|
|
30
|
+
action: () => editor.chain().focus().toggleBulletList().run()
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'orderedList',
|
|
34
|
+
label: 'Lista numerowana',
|
|
35
|
+
description: 'Lista numerowana',
|
|
36
|
+
group: 'Formatowanie',
|
|
37
|
+
tier: 1,
|
|
38
|
+
action: () => editor.chain().focus().toggleOrderedList().run()
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'blockquote',
|
|
42
|
+
label: 'Cytat',
|
|
43
|
+
description: 'Cytat blokowy',
|
|
44
|
+
group: 'Formatowanie',
|
|
45
|
+
tier: 2,
|
|
46
|
+
action: () => editor.chain().focus().toggleBlockquote().run()
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'codeBlock',
|
|
50
|
+
label: 'Blok kodu',
|
|
51
|
+
description: 'Blok kodu',
|
|
52
|
+
group: 'Formatowanie',
|
|
53
|
+
tier: 2,
|
|
54
|
+
action: () => editor.chain().focus().toggleCodeBlock().run()
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'horizontalRule',
|
|
58
|
+
label: 'Linia pozioma',
|
|
59
|
+
description: 'Linia oddzielająca',
|
|
60
|
+
group: 'Formatowanie',
|
|
61
|
+
tier: 2,
|
|
62
|
+
action: () => editor.chain().focus().setHorizontalRule().run()
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
function getInlineBlockItems(inlineBlocks, editor) {
|
|
67
|
+
return inlineBlocks.map((block) => ({
|
|
68
|
+
id: `block-${block.slug}`,
|
|
69
|
+
label: block.label ? Object.values(block.label)[0] : block.slug,
|
|
70
|
+
group: 'Bloki',
|
|
71
|
+
action: () => {
|
|
72
|
+
editor.commands.insertInlineBlock({ blockType: block.slug });
|
|
73
|
+
}
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
export const SlashCommand = Extension.create({
|
|
77
|
+
name: 'slashCommand',
|
|
78
|
+
addOptions() {
|
|
79
|
+
return {
|
|
80
|
+
inlineBlocks: [],
|
|
81
|
+
suggestion: {
|
|
82
|
+
char: '/',
|
|
83
|
+
startOfLine: true
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
addProseMirrorPlugins() {
|
|
88
|
+
const { inlineBlocks } = this.options;
|
|
89
|
+
return [
|
|
90
|
+
Suggestion({
|
|
91
|
+
editor: this.editor,
|
|
92
|
+
char: '/',
|
|
93
|
+
startOfLine: true,
|
|
94
|
+
command: ({ editor, range, props: item }) => {
|
|
95
|
+
// Delete the "/" + query text, then run the item's action
|
|
96
|
+
editor.chain().focus().deleteRange(range).run();
|
|
97
|
+
item.action(editor.commands);
|
|
98
|
+
},
|
|
99
|
+
items: ({ query }) => {
|
|
100
|
+
const allItems = [
|
|
101
|
+
...getInlineBlockItems(inlineBlocks, this.editor),
|
|
102
|
+
...getStandardItems(this.editor)
|
|
103
|
+
];
|
|
104
|
+
if (!query)
|
|
105
|
+
return allItems;
|
|
106
|
+
const q = query.toLowerCase();
|
|
107
|
+
return allItems.filter((item) => item.label.toLowerCase().includes(q) ||
|
|
108
|
+
item.group.toLowerCase().includes(q));
|
|
109
|
+
},
|
|
110
|
+
render: () => {
|
|
111
|
+
let popup;
|
|
112
|
+
let component;
|
|
113
|
+
let container;
|
|
114
|
+
return {
|
|
115
|
+
onStart: (props) => {
|
|
116
|
+
container = document.createElement('div');
|
|
117
|
+
component = mount(SlashCommandPopup, {
|
|
118
|
+
target: container,
|
|
119
|
+
props: {
|
|
120
|
+
items: props.items,
|
|
121
|
+
command: props.command
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
popup = tippy(document.body, {
|
|
125
|
+
getReferenceClientRect: () => props.clientRect?.(),
|
|
126
|
+
appendTo: () => document.body,
|
|
127
|
+
content: container,
|
|
128
|
+
showOnCreate: true,
|
|
129
|
+
interactive: true,
|
|
130
|
+
trigger: 'manual',
|
|
131
|
+
placement: 'bottom-start',
|
|
132
|
+
maxWidth: 320
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
onUpdate: (props) => {
|
|
136
|
+
if (!component || !container)
|
|
137
|
+
return;
|
|
138
|
+
// Re-mount with updated props
|
|
139
|
+
unmount(component);
|
|
140
|
+
component = mount(SlashCommandPopup, {
|
|
141
|
+
target: container,
|
|
142
|
+
props: {
|
|
143
|
+
items: props.items,
|
|
144
|
+
command: props.command
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
popup?.setProps({
|
|
148
|
+
getReferenceClientRect: () => props.clientRect?.()
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
onKeyDown: (props) => {
|
|
152
|
+
if (props.event.key === 'Escape') {
|
|
153
|
+
popup?.hide();
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
// Delegate arrow/enter to the popup via custom event
|
|
157
|
+
const el = container?.querySelector('[data-slash-popup]');
|
|
158
|
+
if (el) {
|
|
159
|
+
const handled = el.dispatchEvent(new CustomEvent('slash-keydown', {
|
|
160
|
+
detail: { key: props.event.key },
|
|
161
|
+
bubbles: false,
|
|
162
|
+
cancelable: true
|
|
163
|
+
}));
|
|
164
|
+
// If the event wasn't cancelled, the popup handled it
|
|
165
|
+
return !handled;
|
|
166
|
+
}
|
|
167
|
+
return false;
|
|
168
|
+
},
|
|
169
|
+
onExit: () => {
|
|
170
|
+
popup?.destroy();
|
|
171
|
+
if (component)
|
|
172
|
+
unmount(component);
|
|
173
|
+
container = undefined;
|
|
174
|
+
component = undefined;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
})
|
|
179
|
+
];
|
|
180
|
+
}
|
|
181
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SCNode, SCMark, StructuredContentDoc } from '../../../types/structured-content.js';
|
|
2
|
+
/** Generic tree walker — visits every node depth-first. */
|
|
3
|
+
export declare function walkNodes(nodes: SCNode[] | undefined, visitor: (node: SCNode) => void): void;
|
|
4
|
+
/** Extract all `data-entry-id` values from link marks in a StructuredContentDoc. */
|
|
5
|
+
export declare function extractEntryIds(doc: StructuredContentDoc): string[];
|
|
6
|
+
/** Extract all `data-media-id` values from figure/video/image nodes and inlineBlock blockData. */
|
|
7
|
+
export declare function extractMediaIds(doc: StructuredContentDoc): string[];
|
|
8
|
+
/** Validate & type-narrow unknown JSON to StructuredContentDoc. Throws on invalid input.
|
|
9
|
+
* Parses inlineBlock blockData from JSON string → object. */
|
|
10
|
+
export declare function tiptapDocToStructured(json: unknown): StructuredContentDoc;
|
|
11
|
+
/** Convert StructuredContentDoc to TipTap-compatible JSON.
|
|
12
|
+
* Stringifies inlineBlock blockData object → JSON string for PM attr safety. */
|
|
13
|
+
export declare function structuredToTiptapDoc(doc: StructuredContentDoc): Record<string, unknown>;
|
|
14
|
+
/** Deep clone a StructuredContentDoc. */
|
|
15
|
+
export declare function cloneDoc(doc: StructuredContentDoc): StructuredContentDoc;
|
|
16
|
+
/** Walk link marks in a doc, calling replacer for each. Mutates the doc in place. */
|
|
17
|
+
export declare function walkLinkMarks(doc: StructuredContentDoc, replacer: (mark: SCMark) => void): void;
|
|
18
|
+
/** Walk inlineBlock nodes in a doc, calling replacer for each. Mutates in place. */
|
|
19
|
+
export declare function walkInlineBlockNodes(doc: StructuredContentDoc, replacer: (node: SCNode) => void): void;
|
|
20
|
+
/** Walk media nodes (figure/video/image) in a doc, calling replacer for each. Mutates in place. */
|
|
21
|
+
export declare function walkMediaNodes(doc: StructuredContentDoc, replacer: (node: SCNode) => void): void;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/** Generic tree walker — visits every node depth-first. */
|
|
2
|
+
export function walkNodes(nodes, visitor) {
|
|
3
|
+
if (!nodes)
|
|
4
|
+
return;
|
|
5
|
+
for (const node of nodes) {
|
|
6
|
+
visitor(node);
|
|
7
|
+
if (node.content) {
|
|
8
|
+
walkNodes(node.content, visitor);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Extract relation/entry IDs from inlineBlock blockData values. */
|
|
13
|
+
function extractIdsFromBlockData(blockData, key) {
|
|
14
|
+
const ids = [];
|
|
15
|
+
for (const val of Object.values(blockData)) {
|
|
16
|
+
if (typeof val === 'string' && val.length === 36 && key === 'relation') {
|
|
17
|
+
ids.push(val);
|
|
18
|
+
}
|
|
19
|
+
else if (Array.isArray(val)) {
|
|
20
|
+
for (const item of val) {
|
|
21
|
+
if (typeof item === 'string' && item.length === 36)
|
|
22
|
+
ids.push(item);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return ids;
|
|
27
|
+
}
|
|
28
|
+
/** Extract all `data-entry-id` values from link marks in a StructuredContentDoc. */
|
|
29
|
+
export function extractEntryIds(doc) {
|
|
30
|
+
const ids = [];
|
|
31
|
+
walkNodes(doc.content, (node) => {
|
|
32
|
+
if (!node.marks)
|
|
33
|
+
return;
|
|
34
|
+
for (const mark of node.marks) {
|
|
35
|
+
if (mark.type === 'link' && mark.attrs?.['data-entry-id']) {
|
|
36
|
+
ids.push(mark.attrs['data-entry-id']);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return ids;
|
|
41
|
+
}
|
|
42
|
+
/** Extract all `data-media-id` values from figure/video/image nodes and inlineBlock blockData. */
|
|
43
|
+
export function extractMediaIds(doc) {
|
|
44
|
+
const ids = [];
|
|
45
|
+
walkNodes(doc.content, (node) => {
|
|
46
|
+
if (['figure', 'video', 'image'].includes(node.type) && node.attrs?.['data-media-id']) {
|
|
47
|
+
ids.push(node.attrs['data-media-id']);
|
|
48
|
+
}
|
|
49
|
+
if (node.type === 'inlineBlock' && node.attrs?.blockData && typeof node.attrs.blockData === 'object') {
|
|
50
|
+
const data = node.attrs.blockData;
|
|
51
|
+
for (const val of Object.values(data)) {
|
|
52
|
+
// media/image fields store UUID strings
|
|
53
|
+
if (typeof val === 'string' && val.length === 36)
|
|
54
|
+
ids.push(val);
|
|
55
|
+
if (Array.isArray(val)) {
|
|
56
|
+
for (const item of val) {
|
|
57
|
+
if (typeof item === 'string' && item.length === 36)
|
|
58
|
+
ids.push(item);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return ids;
|
|
65
|
+
}
|
|
66
|
+
/** Parse inlineBlock blockData from JSON string → object (deep, in-place). */
|
|
67
|
+
function parseInlineBlockData(nodes) {
|
|
68
|
+
if (!nodes)
|
|
69
|
+
return;
|
|
70
|
+
for (const node of nodes) {
|
|
71
|
+
if (node.type === 'inlineBlock' && node.attrs?.blockData && typeof node.attrs.blockData === 'string') {
|
|
72
|
+
try {
|
|
73
|
+
node.attrs.blockData = JSON.parse(node.attrs.blockData);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// keep string on parse failure
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (node.content)
|
|
80
|
+
parseInlineBlockData(node.content);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Stringify inlineBlock blockData from object → JSON string (deep, in-place). */
|
|
84
|
+
function stringifyInlineBlockData(nodes) {
|
|
85
|
+
if (!nodes)
|
|
86
|
+
return;
|
|
87
|
+
for (const node of nodes) {
|
|
88
|
+
if (node.type === 'inlineBlock' && node.attrs?.blockData && typeof node.attrs.blockData === 'object') {
|
|
89
|
+
node.attrs.blockData = JSON.stringify(node.attrs.blockData);
|
|
90
|
+
}
|
|
91
|
+
if (node.content)
|
|
92
|
+
stringifyInlineBlockData(node.content);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Validate & type-narrow unknown JSON to StructuredContentDoc. Throws on invalid input.
|
|
96
|
+
* Parses inlineBlock blockData from JSON string → object. */
|
|
97
|
+
export function tiptapDocToStructured(json) {
|
|
98
|
+
if (!json || typeof json !== 'object') {
|
|
99
|
+
throw new Error('Invalid structured content: expected object');
|
|
100
|
+
}
|
|
101
|
+
const obj = json;
|
|
102
|
+
if (obj.type !== 'doc') {
|
|
103
|
+
throw new Error(`Invalid structured content: root type must be "doc", got "${obj.type}"`);
|
|
104
|
+
}
|
|
105
|
+
if (!Array.isArray(obj.content)) {
|
|
106
|
+
throw new Error('Invalid structured content: "content" must be an array');
|
|
107
|
+
}
|
|
108
|
+
const doc = JSON.parse(JSON.stringify(json));
|
|
109
|
+
parseInlineBlockData(doc.content);
|
|
110
|
+
return doc;
|
|
111
|
+
}
|
|
112
|
+
/** Convert StructuredContentDoc to TipTap-compatible JSON.
|
|
113
|
+
* Stringifies inlineBlock blockData object → JSON string for PM attr safety. */
|
|
114
|
+
export function structuredToTiptapDoc(doc) {
|
|
115
|
+
const cloned = JSON.parse(JSON.stringify(doc));
|
|
116
|
+
stringifyInlineBlockData(cloned.content);
|
|
117
|
+
return cloned;
|
|
118
|
+
}
|
|
119
|
+
/** Deep clone a StructuredContentDoc. */
|
|
120
|
+
export function cloneDoc(doc) {
|
|
121
|
+
return JSON.parse(JSON.stringify(doc));
|
|
122
|
+
}
|
|
123
|
+
/** Walk link marks in a doc, calling replacer for each. Mutates the doc in place. */
|
|
124
|
+
export function walkLinkMarks(doc, replacer) {
|
|
125
|
+
walkNodes(doc.content, (node) => {
|
|
126
|
+
if (!node.marks)
|
|
127
|
+
return;
|
|
128
|
+
for (const mark of node.marks) {
|
|
129
|
+
if (mark.type === 'link') {
|
|
130
|
+
replacer(mark);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/** Walk inlineBlock nodes in a doc, calling replacer for each. Mutates in place. */
|
|
136
|
+
export function walkInlineBlockNodes(doc, replacer) {
|
|
137
|
+
walkNodes(doc.content, (node) => {
|
|
138
|
+
if (node.type === 'inlineBlock') {
|
|
139
|
+
replacer(node);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/** Walk media nodes (figure/video/image) in a doc, calling replacer for each. Mutates in place. */
|
|
144
|
+
export function walkMediaNodes(doc, replacer) {
|
|
145
|
+
walkNodes(doc.content, (node) => {
|
|
146
|
+
if (['figure', 'video', 'image'].includes(node.type)) {
|
|
147
|
+
replacer(node);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
@@ -4,39 +4,22 @@
|
|
|
4
4
|
import BubbleMenu from '@tiptap/extension-bubble-menu';
|
|
5
5
|
import { extensions } from './extensions.js';
|
|
6
6
|
import ToolbarButton from './toolbar-button.svelte';
|
|
7
|
+
import EditorToolbar from './editor-toolbar.svelte';
|
|
7
8
|
import LinkDialog from './link-dialog.svelte';
|
|
8
9
|
import ImageDialog from './image-dialog.svelte';
|
|
9
10
|
import VideoDialog from './video-dialog.svelte';
|
|
10
11
|
import TableDialog from './table-dialog.svelte';
|
|
11
12
|
import Textarea from '../../../components/ui/textarea/textarea.svelte';
|
|
12
13
|
import * as Tooltip from '../../../components/ui/tooltip/index.js';
|
|
13
|
-
import * as DropdownMenu from '../../../components/ui/dropdown-menu/index.js';
|
|
14
|
-
import Button from '../../../components/ui/button/button.svelte';
|
|
15
14
|
import Separator from '../../../components/ui/separator/separator.svelte';
|
|
16
15
|
|
|
17
|
-
// Icons
|
|
18
|
-
import H_2 from '@tabler/icons-svelte/icons/h-2';
|
|
19
|
-
import H_3 from '@tabler/icons-svelte/icons/h-3';
|
|
20
|
-
import LetterP from '@tabler/icons-svelte/icons/letter-p';
|
|
16
|
+
// Icons (bubble menu only)
|
|
21
17
|
import Bold from '@tabler/icons-svelte/icons/bold';
|
|
22
18
|
import Italic from '@tabler/icons-svelte/icons/italic';
|
|
23
19
|
import Underline from '@tabler/icons-svelte/icons/underline';
|
|
24
20
|
import Strikethrough from '@tabler/icons-svelte/icons/strikethrough';
|
|
25
21
|
import Highlight from '@tabler/icons-svelte/icons/highlight';
|
|
26
|
-
import AlignLeft from '@tabler/icons-svelte/icons/align-left';
|
|
27
|
-
import AlignCenter from '@tabler/icons-svelte/icons/align-center';
|
|
28
|
-
import AlignRight from '@tabler/icons-svelte/icons/align-right';
|
|
29
|
-
import AlignJustified from '@tabler/icons-svelte/icons/align-justified';
|
|
30
|
-
import List from '@tabler/icons-svelte/icons/list';
|
|
31
|
-
import ListNumbers from '@tabler/icons-svelte/icons/list-numbers';
|
|
32
|
-
import Quote from '@tabler/icons-svelte/icons/quote';
|
|
33
22
|
import LinkIcon from '@tabler/icons-svelte/icons/link';
|
|
34
|
-
import Photo from '@tabler/icons-svelte/icons/photo';
|
|
35
|
-
import VideoIcon from '@tabler/icons-svelte/icons/video';
|
|
36
|
-
import Table from '@tabler/icons-svelte/icons/table';
|
|
37
|
-
import Code from '@tabler/icons-svelte/icons/code';
|
|
38
|
-
import FileCode from '@tabler/icons-svelte/icons/file-code';
|
|
39
|
-
import SourceCode from '@tabler/icons-svelte/icons/source-code';
|
|
40
23
|
import RowInsertBottom from '@tabler/icons-svelte/icons/row-insert-bottom';
|
|
41
24
|
import RowInsertTop from '@tabler/icons-svelte/icons/row-insert-top';
|
|
42
25
|
import ColumnInsertLeft from '@tabler/icons-svelte/icons/column-insert-left';
|
|
@@ -108,171 +91,16 @@
|
|
|
108
91
|
<div class="border-input bg-background rounded-lg border">
|
|
109
92
|
<!-- Toolbar -->
|
|
110
93
|
{#if ed}
|
|
111
|
-
<
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
label="Nagłówek 3"
|
|
122
|
-
active={ed.isActive('heading', { level: 3 })}
|
|
123
|
-
onclick={() => ed.chain().focus().toggleHeading({ level: 3 }).run()}
|
|
124
|
-
>
|
|
125
|
-
<H_3 class="h-4 w-4" />
|
|
126
|
-
</ToolbarButton>
|
|
127
|
-
<ToolbarButton
|
|
128
|
-
label="Paragraf"
|
|
129
|
-
active={ed.isActive('paragraph') && !ed.isActive('heading')}
|
|
130
|
-
onclick={() => ed.chain().focus().setParagraph().run()}
|
|
131
|
-
>
|
|
132
|
-
<LetterP class="h-4 w-4" />
|
|
133
|
-
</ToolbarButton>
|
|
134
|
-
|
|
135
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
136
|
-
|
|
137
|
-
<!-- Text formatting -->
|
|
138
|
-
<ToolbarButton
|
|
139
|
-
label="Pogrubienie"
|
|
140
|
-
active={ed.isActive('bold')}
|
|
141
|
-
onclick={() => ed.chain().focus().toggleBold().run()}
|
|
142
|
-
>
|
|
143
|
-
<Bold class="h-4 w-4" />
|
|
144
|
-
</ToolbarButton>
|
|
145
|
-
<ToolbarButton
|
|
146
|
-
label="Kursywa"
|
|
147
|
-
active={ed.isActive('italic')}
|
|
148
|
-
onclick={() => ed.chain().focus().toggleItalic().run()}
|
|
149
|
-
>
|
|
150
|
-
<Italic class="h-4 w-4" />
|
|
151
|
-
</ToolbarButton>
|
|
152
|
-
<ToolbarButton
|
|
153
|
-
label="Podkreślenie"
|
|
154
|
-
active={ed.isActive('underline')}
|
|
155
|
-
onclick={() => ed.chain().focus().toggleUnderline().run()}
|
|
156
|
-
>
|
|
157
|
-
<Underline class="h-4 w-4" />
|
|
158
|
-
</ToolbarButton>
|
|
159
|
-
<ToolbarButton
|
|
160
|
-
label="Przekreślenie"
|
|
161
|
-
active={ed.isActive('strike')}
|
|
162
|
-
onclick={() => ed.chain().focus().toggleStrike().run()}
|
|
163
|
-
>
|
|
164
|
-
<Strikethrough class="h-4 w-4" />
|
|
165
|
-
</ToolbarButton>
|
|
166
|
-
<ToolbarButton
|
|
167
|
-
label="Wyróżnienie"
|
|
168
|
-
active={ed.isActive('highlight')}
|
|
169
|
-
onclick={() => ed.chain().focus().toggleHighlight().run()}
|
|
170
|
-
>
|
|
171
|
-
<Highlight class="h-4 w-4" />
|
|
172
|
-
</ToolbarButton>
|
|
173
|
-
|
|
174
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
175
|
-
|
|
176
|
-
<!-- Alignment -->
|
|
177
|
-
<ToolbarButton
|
|
178
|
-
label="Do lewej"
|
|
179
|
-
active={ed.isActive({ textAlign: 'left' })}
|
|
180
|
-
onclick={() => ed.chain().focus().setTextAlign('left').run()}
|
|
181
|
-
>
|
|
182
|
-
<AlignLeft class="h-4 w-4" />
|
|
183
|
-
</ToolbarButton>
|
|
184
|
-
<ToolbarButton
|
|
185
|
-
label="Wyśrodkuj"
|
|
186
|
-
active={ed.isActive({ textAlign: 'center' })}
|
|
187
|
-
onclick={() => ed.chain().focus().setTextAlign('center').run()}
|
|
188
|
-
>
|
|
189
|
-
<AlignCenter class="h-4 w-4" />
|
|
190
|
-
</ToolbarButton>
|
|
191
|
-
<ToolbarButton
|
|
192
|
-
label="Do prawej"
|
|
193
|
-
active={ed.isActive({ textAlign: 'right' })}
|
|
194
|
-
onclick={() => ed.chain().focus().setTextAlign('right').run()}
|
|
195
|
-
>
|
|
196
|
-
<AlignRight class="h-4 w-4" />
|
|
197
|
-
</ToolbarButton>
|
|
198
|
-
<ToolbarButton
|
|
199
|
-
label="Wyjustuj"
|
|
200
|
-
active={ed.isActive({ textAlign: 'justify' })}
|
|
201
|
-
onclick={() => ed.chain().focus().setTextAlign('justify').run()}
|
|
202
|
-
>
|
|
203
|
-
<AlignJustified class="h-4 w-4" />
|
|
204
|
-
</ToolbarButton>
|
|
205
|
-
|
|
206
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
207
|
-
|
|
208
|
-
<!-- Lists & Quote -->
|
|
209
|
-
<ToolbarButton
|
|
210
|
-
label="Lista punktowa"
|
|
211
|
-
active={ed.isActive('bulletList')}
|
|
212
|
-
onclick={() => ed.chain().focus().toggleBulletList().run()}
|
|
213
|
-
>
|
|
214
|
-
<List class="h-4 w-4" />
|
|
215
|
-
</ToolbarButton>
|
|
216
|
-
<ToolbarButton
|
|
217
|
-
label="Lista numerowana"
|
|
218
|
-
active={ed.isActive('orderedList')}
|
|
219
|
-
onclick={() => ed.chain().focus().toggleOrderedList().run()}
|
|
220
|
-
>
|
|
221
|
-
<ListNumbers class="h-4 w-4" />
|
|
222
|
-
</ToolbarButton>
|
|
223
|
-
<ToolbarButton
|
|
224
|
-
label="Cytat"
|
|
225
|
-
active={ed.isActive('blockquote')}
|
|
226
|
-
onclick={() => ed.chain().focus().toggleBlockquote().run()}
|
|
227
|
-
>
|
|
228
|
-
<Quote class="h-4 w-4" />
|
|
229
|
-
</ToolbarButton>
|
|
230
|
-
|
|
231
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
232
|
-
|
|
233
|
-
<!-- Link, Image, Table -->
|
|
234
|
-
<ToolbarButton
|
|
235
|
-
label="Link"
|
|
236
|
-
active={ed.isActive('link')}
|
|
237
|
-
onclick={() => (linkDialogOpen = true)}
|
|
238
|
-
>
|
|
239
|
-
<LinkIcon class="h-4 w-4" />
|
|
240
|
-
</ToolbarButton>
|
|
241
|
-
<ToolbarButton label="Obrazek" active={false} onclick={() => (imageDialogOpen = true)}>
|
|
242
|
-
<Photo class="h-4 w-4" />
|
|
243
|
-
</ToolbarButton>
|
|
244
|
-
<ToolbarButton label="Wideo" active={false} onclick={() => (videoDialogOpen = true)}>
|
|
245
|
-
<VideoIcon class="h-4 w-4" />
|
|
246
|
-
</ToolbarButton>
|
|
247
|
-
<ToolbarButton label="Tabela" active={false} onclick={() => (tableDialogOpen = true)}>
|
|
248
|
-
<Table class="h-4 w-4" />
|
|
249
|
-
</ToolbarButton>
|
|
250
|
-
|
|
251
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
252
|
-
|
|
253
|
-
<!-- Code -->
|
|
254
|
-
<ToolbarButton
|
|
255
|
-
label="Kod inline"
|
|
256
|
-
active={ed.isActive('code')}
|
|
257
|
-
onclick={() => ed.chain().focus().toggleCode().run()}
|
|
258
|
-
>
|
|
259
|
-
<Code class="h-4 w-4" />
|
|
260
|
-
</ToolbarButton>
|
|
261
|
-
<ToolbarButton
|
|
262
|
-
label="Blok kodu"
|
|
263
|
-
active={ed.isActive('codeBlock')}
|
|
264
|
-
onclick={() => ed.chain().focus().toggleCodeBlock().run()}
|
|
265
|
-
>
|
|
266
|
-
<FileCode class="h-4 w-4" />
|
|
267
|
-
</ToolbarButton>
|
|
268
|
-
|
|
269
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
270
|
-
|
|
271
|
-
<!-- HTML View -->
|
|
272
|
-
<ToolbarButton label="Widok HTML" active={isCodeViewActive} onclick={toggleCodeView}>
|
|
273
|
-
<SourceCode class="h-4 w-4" />
|
|
274
|
-
</ToolbarButton>
|
|
275
|
-
</div>
|
|
94
|
+
<EditorToolbar
|
|
95
|
+
editor={ed}
|
|
96
|
+
onLinkDialog={() => (linkDialogOpen = true)}
|
|
97
|
+
onImageDialog={() => (imageDialogOpen = true)}
|
|
98
|
+
onVideoDialog={() => (videoDialogOpen = true)}
|
|
99
|
+
onTableDialog={() => (tableDialogOpen = true)}
|
|
100
|
+
showCodeView={true}
|
|
101
|
+
{isCodeViewActive}
|
|
102
|
+
onToggleCodeView={toggleCodeView}
|
|
103
|
+
/>
|
|
276
104
|
{/if}
|
|
277
105
|
|
|
278
106
|
<!-- Bubble Menu -->
|
|
@@ -444,23 +272,23 @@
|
|
|
444
272
|
|
|
445
273
|
:global(.ProseMirror th),
|
|
446
274
|
:global(.ProseMirror td) {
|
|
447
|
-
border: 1px solid
|
|
275
|
+
border: 1px solid var(--border);
|
|
448
276
|
padding: 0.5em;
|
|
449
277
|
text-align: left;
|
|
450
278
|
}
|
|
451
279
|
|
|
452
280
|
:global(.ProseMirror th) {
|
|
453
|
-
background-color:
|
|
281
|
+
background-color: var(--muted);
|
|
454
282
|
font-weight: 600;
|
|
455
283
|
}
|
|
456
284
|
|
|
457
285
|
:global(.ProseMirror .selectedCell) {
|
|
458
|
-
background-color:
|
|
286
|
+
background-color: var(--accent);
|
|
459
287
|
}
|
|
460
288
|
|
|
461
289
|
/* Code block styles */
|
|
462
290
|
:global(.ProseMirror pre) {
|
|
463
|
-
background-color:
|
|
291
|
+
background-color: var(--muted);
|
|
464
292
|
border-radius: 0.5rem;
|
|
465
293
|
padding: 1rem;
|
|
466
294
|
overflow-x: auto;
|
|
@@ -517,7 +345,7 @@
|
|
|
517
345
|
|
|
518
346
|
:global(.tiptap-figure figcaption) {
|
|
519
347
|
font-size: 0.875rem;
|
|
520
|
-
color:
|
|
348
|
+
color: var(--muted-foreground);
|
|
521
349
|
text-align: center;
|
|
522
350
|
margin-top: 0.5rem;
|
|
523
351
|
}
|
|
@@ -525,7 +353,7 @@
|
|
|
525
353
|
/* Syntax highlighting */
|
|
526
354
|
:global(.hljs-comment),
|
|
527
355
|
:global(.hljs-quote) {
|
|
528
|
-
color:
|
|
356
|
+
color: var(--muted-foreground);
|
|
529
357
|
font-style: italic;
|
|
530
358
|
}
|
|
531
359
|
|