inkpen 0.7.1

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 (95) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.rubocop.yml +8 -0
  4. data/.yardopts +11 -0
  5. data/CLAUDE.md +141 -0
  6. data/README.md +409 -0
  7. data/Rakefile +19 -0
  8. data/app/assets/javascripts/inkpen/controllers/editor_controller.js +2050 -0
  9. data/app/assets/javascripts/inkpen/controllers/sticky_toolbar_controller.js +667 -0
  10. data/app/assets/javascripts/inkpen/controllers/toolbar_controller.js +693 -0
  11. data/app/assets/javascripts/inkpen/export/html.js +637 -0
  12. data/app/assets/javascripts/inkpen/export/index.js +30 -0
  13. data/app/assets/javascripts/inkpen/export/markdown.js +697 -0
  14. data/app/assets/javascripts/inkpen/export/pdf.js +372 -0
  15. data/app/assets/javascripts/inkpen/extensions/advanced_table.js +640 -0
  16. data/app/assets/javascripts/inkpen/extensions/block_commands.js +300 -0
  17. data/app/assets/javascripts/inkpen/extensions/block_gutter.js +338 -0
  18. data/app/assets/javascripts/inkpen/extensions/callout.js +303 -0
  19. data/app/assets/javascripts/inkpen/extensions/columns.js +403 -0
  20. data/app/assets/javascripts/inkpen/extensions/database.js +990 -0
  21. data/app/assets/javascripts/inkpen/extensions/document_section.js +352 -0
  22. data/app/assets/javascripts/inkpen/extensions/drag_handle.js +407 -0
  23. data/app/assets/javascripts/inkpen/extensions/embed.js +629 -0
  24. data/app/assets/javascripts/inkpen/extensions/enhanced_image.js +566 -0
  25. data/app/assets/javascripts/inkpen/extensions/export_commands.js +271 -0
  26. data/app/assets/javascripts/inkpen/extensions/file_attachment.js +593 -0
  27. data/app/assets/javascripts/inkpen/extensions/inkpen_table/index.js +58 -0
  28. data/app/assets/javascripts/inkpen/extensions/inkpen_table/inkpen_table.js +638 -0
  29. data/app/assets/javascripts/inkpen/extensions/inkpen_table/inkpen_table_cell.js +100 -0
  30. data/app/assets/javascripts/inkpen/extensions/inkpen_table/inkpen_table_header.js +100 -0
  31. data/app/assets/javascripts/inkpen/extensions/inkpen_table/table_constants.js +152 -0
  32. data/app/assets/javascripts/inkpen/extensions/inkpen_table/table_helpers.js +254 -0
  33. data/app/assets/javascripts/inkpen/extensions/inkpen_table/table_menu.js +282 -0
  34. data/app/assets/javascripts/inkpen/extensions/preformatted.js +239 -0
  35. data/app/assets/javascripts/inkpen/extensions/section.js +281 -0
  36. data/app/assets/javascripts/inkpen/extensions/section_title.js +126 -0
  37. data/app/assets/javascripts/inkpen/extensions/slash_commands.js +439 -0
  38. data/app/assets/javascripts/inkpen/extensions/table_of_contents.js +474 -0
  39. data/app/assets/javascripts/inkpen/extensions/toggle_block.js +332 -0
  40. data/app/assets/javascripts/inkpen/index.js +87 -0
  41. data/app/assets/stylesheets/inkpen/advanced_table.css +514 -0
  42. data/app/assets/stylesheets/inkpen/animations.css +626 -0
  43. data/app/assets/stylesheets/inkpen/block_gutter.css +265 -0
  44. data/app/assets/stylesheets/inkpen/callout.css +359 -0
  45. data/app/assets/stylesheets/inkpen/columns.css +314 -0
  46. data/app/assets/stylesheets/inkpen/database.css +658 -0
  47. data/app/assets/stylesheets/inkpen/document_section.css +305 -0
  48. data/app/assets/stylesheets/inkpen/drag_drop.css +220 -0
  49. data/app/assets/stylesheets/inkpen/editor.css +652 -0
  50. data/app/assets/stylesheets/inkpen/embed.css +468 -0
  51. data/app/assets/stylesheets/inkpen/enhanced_image.css +453 -0
  52. data/app/assets/stylesheets/inkpen/export.css +499 -0
  53. data/app/assets/stylesheets/inkpen/file_attachment.css +347 -0
  54. data/app/assets/stylesheets/inkpen/footnotes.css +136 -0
  55. data/app/assets/stylesheets/inkpen/inkpen_table.css +608 -0
  56. data/app/assets/stylesheets/inkpen/preformatted.css +215 -0
  57. data/app/assets/stylesheets/inkpen/search_replace.css +58 -0
  58. data/app/assets/stylesheets/inkpen/section.css +236 -0
  59. data/app/assets/stylesheets/inkpen/slash_menu.css +252 -0
  60. data/app/assets/stylesheets/inkpen/sticky_toolbar.css +314 -0
  61. data/app/assets/stylesheets/inkpen/toc.css +386 -0
  62. data/app/assets/stylesheets/inkpen/toggle.css +260 -0
  63. data/app/helpers/inkpen/editor_helper.rb +114 -0
  64. data/app/views/inkpen/_editor.html.erb +139 -0
  65. data/config/importmap.rb +170 -0
  66. data/docs/.DS_Store +0 -0
  67. data/docs/CHANGELOG.md +571 -0
  68. data/docs/FEATURES.md +436 -0
  69. data/docs/ROADMAP.md +3029 -0
  70. data/docs/VISION.md +235 -0
  71. data/docs/extensions/INKPEN_TABLE.md +482 -0
  72. data/docs/thinking/CORRECTED_NO_VUE.md +756 -0
  73. data/docs/thinking/EXECUTIVE_SUMMARY.md +403 -0
  74. data/docs/thinking/INKPEN_CODE_SAMPLES.md +1479 -0
  75. data/docs/thinking/INKPEN_MASTER_GUIDE.md +891 -0
  76. data/docs/thinking/README_START_HERE.md +341 -0
  77. data/lib/inkpen/configuration.rb +175 -0
  78. data/lib/inkpen/editor.rb +204 -0
  79. data/lib/inkpen/engine.rb +32 -0
  80. data/lib/inkpen/extensions/base.rb +109 -0
  81. data/lib/inkpen/extensions/code_block_syntax.rb +177 -0
  82. data/lib/inkpen/extensions/document_section.rb +111 -0
  83. data/lib/inkpen/extensions/forced_document.rb +183 -0
  84. data/lib/inkpen/extensions/mention.rb +155 -0
  85. data/lib/inkpen/extensions/preformatted.rb +111 -0
  86. data/lib/inkpen/extensions/section.rb +139 -0
  87. data/lib/inkpen/extensions/slash_commands.rb +100 -0
  88. data/lib/inkpen/extensions/table.rb +182 -0
  89. data/lib/inkpen/extensions/task_list.rb +145 -0
  90. data/lib/inkpen/sticky_toolbar.rb +157 -0
  91. data/lib/inkpen/toolbar.rb +145 -0
  92. data/lib/inkpen/version.rb +5 -0
  93. data/lib/inkpen.rb +101 -0
  94. data/sig/inkpen.rbs +4 -0
  95. metadata +165 -0
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Document Section Styles for Inkpen Editor
3
+ *
4
+ * Collapsible content-grouping sections with left-gutter toggle.
5
+ * Notion-style document structure with semantic H2 titles.
6
+ *
7
+ * @since 0.8.0
8
+ */
9
+
10
+ /* ==========================================================================
11
+ CSS Custom Properties
12
+ ========================================================================== */
13
+
14
+ :root {
15
+ --inkpen-doc-section-border: #e5e7eb;
16
+ --inkpen-doc-section-border-hover: #d1d5db;
17
+ --inkpen-doc-section-bg: transparent;
18
+ --inkpen-doc-section-gutter-width: 1.75rem;
19
+ --inkpen-doc-section-toggle-size: 1.25rem;
20
+ --inkpen-doc-section-toggle-bg: #f3f4f6;
21
+ --inkpen-doc-section-toggle-bg-hover: #e5e7eb;
22
+ --inkpen-doc-section-toggle-color: #6b7280;
23
+ --inkpen-doc-section-toggle-color-hover: #374151;
24
+ --inkpen-doc-section-title-size: 1.25rem;
25
+ --inkpen-doc-section-title-weight: 600;
26
+ --inkpen-doc-section-title-color: inherit;
27
+ --inkpen-doc-section-radius: 4px;
28
+ --inkpen-doc-section-spacing: 1.5rem;
29
+ }
30
+
31
+ /* Dark mode */
32
+ [data-theme="dark"],
33
+ .dark {
34
+ --inkpen-doc-section-border: #374151;
35
+ --inkpen-doc-section-border-hover: #4b5563;
36
+ --inkpen-doc-section-toggle-bg: #1f2937;
37
+ --inkpen-doc-section-toggle-bg-hover: #374151;
38
+ --inkpen-doc-section-toggle-color: #9ca3af;
39
+ --inkpen-doc-section-toggle-color-hover: #e5e7eb;
40
+ }
41
+
42
+ /* ==========================================================================
43
+ Document Section Container
44
+ ========================================================================== */
45
+
46
+ .inkpen-doc-section {
47
+ position: relative;
48
+ margin: var(--inkpen-doc-section-spacing) 0;
49
+ padding-left: var(--inkpen-doc-section-gutter-width);
50
+ border-left: 2px solid var(--inkpen-doc-section-border);
51
+ background: var(--inkpen-doc-section-bg);
52
+ transition: border-color 150ms ease;
53
+ }
54
+
55
+ .inkpen-doc-section:hover {
56
+ border-left-color: var(--inkpen-doc-section-border-hover);
57
+ }
58
+
59
+ /* First section - no top margin */
60
+ .ProseMirror > .inkpen-doc-section:first-child {
61
+ margin-top: 0;
62
+ }
63
+
64
+ /* ==========================================================================
65
+ Left Gutter with Collapse Toggle
66
+ ========================================================================== */
67
+
68
+ .inkpen-doc-section__gutter {
69
+ position: absolute;
70
+ left: calc(-1 * var(--inkpen-doc-section-toggle-size) / 2 - 1px);
71
+ top: 0;
72
+ width: var(--inkpen-doc-section-toggle-size);
73
+ display: flex;
74
+ flex-direction: column;
75
+ align-items: center;
76
+ z-index: 10;
77
+ }
78
+
79
+ .inkpen-doc-section__toggle {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ width: var(--inkpen-doc-section-toggle-size);
84
+ height: var(--inkpen-doc-section-toggle-size);
85
+ padding: 0;
86
+ border: none;
87
+ background: var(--inkpen-doc-section-toggle-bg);
88
+ border-radius: var(--inkpen-doc-section-radius);
89
+ cursor: pointer;
90
+ color: var(--inkpen-doc-section-toggle-color);
91
+ transition: background 150ms ease, color 150ms ease, transform 150ms ease;
92
+ }
93
+
94
+ .inkpen-doc-section__toggle:hover {
95
+ background: var(--inkpen-doc-section-toggle-bg-hover);
96
+ color: var(--inkpen-doc-section-toggle-color-hover);
97
+ }
98
+
99
+ .inkpen-doc-section__toggle:focus {
100
+ outline: none;
101
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.4);
102
+ }
103
+
104
+ .inkpen-doc-section__toggle svg {
105
+ width: 12px;
106
+ height: 12px;
107
+ transition: transform 150ms ease;
108
+ }
109
+
110
+ /* ==========================================================================
111
+ Section Title (H2)
112
+ ========================================================================== */
113
+
114
+ .inkpen-doc-section__title {
115
+ font-size: var(--inkpen-doc-section-title-size);
116
+ font-weight: var(--inkpen-doc-section-title-weight);
117
+ color: var(--inkpen-doc-section-title-color);
118
+ line-height: 1.4;
119
+ margin: 0 0 0.5rem 0;
120
+ padding: 0;
121
+ outline: none;
122
+ }
123
+
124
+ /* Placeholder for empty title */
125
+ .inkpen-doc-section__title:empty::before {
126
+ content: "Section title...";
127
+ color: #9ca3af;
128
+ pointer-events: none;
129
+ }
130
+
131
+ [data-theme="dark"] .inkpen-doc-section__title:empty::before,
132
+ .dark .inkpen-doc-section__title:empty::before {
133
+ color: #6b7280;
134
+ }
135
+
136
+ /* ==========================================================================
137
+ Section Content
138
+ ========================================================================== */
139
+
140
+ .inkpen-doc-section__content {
141
+ position: relative;
142
+ }
143
+
144
+ /* Content spacing */
145
+ .inkpen-doc-section__content > * + * {
146
+ margin-top: 0.75rem;
147
+ }
148
+
149
+ /* Title is first child, no margin */
150
+ .inkpen-doc-section__content > .inkpen-doc-section__title:first-child {
151
+ margin-top: 0;
152
+ }
153
+
154
+ /* ==========================================================================
155
+ Collapsed State
156
+ ========================================================================== */
157
+
158
+ .inkpen-doc-section[data-collapsed="true"] .inkpen-doc-section__content > *:not(.inkpen-doc-section__title) {
159
+ display: none;
160
+ }
161
+
162
+ /* Collapsed border style - dashed */
163
+ .inkpen-doc-section[data-collapsed="true"] {
164
+ border-left-style: dashed;
165
+ }
166
+
167
+ /* ==========================================================================
168
+ Nesting (Depth Levels)
169
+ ========================================================================== */
170
+
171
+ /* Level 2 - indented */
172
+ .inkpen-doc-section[data-depth="2"] {
173
+ margin-left: 0.5rem;
174
+ }
175
+
176
+ .inkpen-doc-section[data-depth="2"] .inkpen-doc-section__title {
177
+ font-size: 1.125rem;
178
+ }
179
+
180
+ /* Level 3 - further indented */
181
+ .inkpen-doc-section[data-depth="3"] {
182
+ margin-left: 1rem;
183
+ }
184
+
185
+ .inkpen-doc-section[data-depth="3"] .inkpen-doc-section__title {
186
+ font-size: 1rem;
187
+ }
188
+
189
+ /* Nested sections have less vertical spacing */
190
+ .inkpen-doc-section .inkpen-doc-section {
191
+ margin: 1rem 0;
192
+ }
193
+
194
+ /* ==========================================================================
195
+ Focus States
196
+ ========================================================================== */
197
+
198
+ .inkpen-doc-section:focus-within {
199
+ border-left-color: var(--inkpen-color-primary, #3b82f6);
200
+ }
201
+
202
+ /* ==========================================================================
203
+ Drag Handle Integration
204
+ ========================================================================== */
205
+
206
+ /* When dragging, show visual feedback */
207
+ .inkpen-doc-section.is-dragging {
208
+ opacity: 0.5;
209
+ }
210
+
211
+ .inkpen-doc-section.is-drop-target {
212
+ border-left-color: var(--inkpen-color-primary, #3b82f6);
213
+ box-shadow: inset 2px 0 0 var(--inkpen-color-primary, #3b82f6);
214
+ }
215
+
216
+ /* ==========================================================================
217
+ Animations
218
+ ========================================================================== */
219
+
220
+ /* Content reveal animation */
221
+ .inkpen-doc-section[data-collapsed="false"] .inkpen-doc-section__content > *:not(.inkpen-doc-section__title) {
222
+ animation: inkpen-doc-section-reveal 150ms ease-out;
223
+ }
224
+
225
+ @keyframes inkpen-doc-section-reveal {
226
+ from {
227
+ opacity: 0;
228
+ transform: translateY(-4px);
229
+ }
230
+ to {
231
+ opacity: 1;
232
+ transform: translateY(0);
233
+ }
234
+ }
235
+
236
+ /* ==========================================================================
237
+ Mobile Optimizations
238
+ ========================================================================== */
239
+
240
+ @media (max-width: 768px) {
241
+ :root {
242
+ --inkpen-doc-section-gutter-width: 1.5rem;
243
+ --inkpen-doc-section-toggle-size: 1.5rem;
244
+ --inkpen-doc-section-title-size: 1.125rem;
245
+ }
246
+
247
+ .inkpen-doc-section[data-depth="2"],
248
+ .inkpen-doc-section[data-depth="3"] {
249
+ margin-left: 0.25rem;
250
+ }
251
+ }
252
+
253
+ /* Touch-friendly: larger tap targets */
254
+ @media (pointer: coarse) {
255
+ .inkpen-doc-section__toggle {
256
+ width: 1.75rem;
257
+ height: 1.75rem;
258
+ }
259
+ }
260
+
261
+ /* ==========================================================================
262
+ Reduced Motion
263
+ ========================================================================== */
264
+
265
+ @media (prefers-reduced-motion: reduce) {
266
+ .inkpen-doc-section,
267
+ .inkpen-doc-section__toggle,
268
+ .inkpen-doc-section__toggle svg {
269
+ transition: none;
270
+ }
271
+
272
+ .inkpen-doc-section[data-collapsed="false"] .inkpen-doc-section__content > *:not(.inkpen-doc-section__title) {
273
+ animation: none;
274
+ }
275
+ }
276
+
277
+ /* ==========================================================================
278
+ Print Styles
279
+ ========================================================================== */
280
+
281
+ @media print {
282
+ /* Always show content when printing */
283
+ .inkpen-doc-section {
284
+ border-left: 2px solid #ccc;
285
+ page-break-inside: avoid;
286
+ }
287
+
288
+ .inkpen-doc-section[data-collapsed="true"] .inkpen-doc-section__content > *:not(.inkpen-doc-section__title) {
289
+ display: block !important;
290
+ }
291
+
292
+ .inkpen-doc-section__gutter {
293
+ display: none;
294
+ }
295
+
296
+ .inkpen-doc-section {
297
+ padding-left: 1rem;
298
+ }
299
+
300
+ .inkpen-doc-section[data-depth="2"],
301
+ .inkpen-doc-section[data-depth="3"] {
302
+ margin-left: 0;
303
+ padding-left: 2rem;
304
+ }
305
+ }
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Drag & Drop Styles for Inkpen Editor
3
+ *
4
+ * Visual feedback for block drag and drop operations.
5
+ *
6
+ * @since 0.3.2
7
+ */
8
+
9
+ /* ==========================================================================
10
+ CSS Custom Properties
11
+ ========================================================================== */
12
+
13
+ :root {
14
+ --inkpen-drop-indicator-color: #3b82f6;
15
+ --inkpen-drop-indicator-height: 3px;
16
+ --inkpen-drop-indicator-dot-size: 8px;
17
+ --inkpen-drag-ghost-bg: #ffffff;
18
+ --inkpen-drag-ghost-border: #e5e7eb;
19
+ --inkpen-drag-ghost-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
20
+ }
21
+
22
+ /* Dark mode */
23
+ [data-theme="dark"],
24
+ .dark {
25
+ --inkpen-drop-indicator-color: #60a5fa;
26
+ --inkpen-drag-ghost-bg: #1f2937;
27
+ --inkpen-drag-ghost-border: #374151;
28
+ --inkpen-drag-ghost-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
29
+ }
30
+
31
+ /* ==========================================================================
32
+ Editor Dragging State
33
+ ========================================================================== */
34
+
35
+ /* Editor during drag operation */
36
+ .inkpen-editor.is-block-dragging {
37
+ cursor: grabbing !important;
38
+ }
39
+
40
+ .inkpen-editor.is-block-dragging * {
41
+ cursor: grabbing !important;
42
+ }
43
+
44
+ /* Reduce pointer events on content during drag for smoother experience */
45
+ .inkpen-editor.is-block-dragging .ProseMirror > * {
46
+ pointer-events: none;
47
+ }
48
+
49
+ /* ==========================================================================
50
+ Drop Indicator
51
+ ========================================================================== */
52
+
53
+ .inkpen-drop-indicator {
54
+ position: absolute;
55
+ left: 0;
56
+ right: 0;
57
+ height: var(--inkpen-drop-indicator-height);
58
+ background: var(--inkpen-drop-indicator-color);
59
+ border-radius: calc(var(--inkpen-drop-indicator-height) / 2);
60
+ pointer-events: none;
61
+ z-index: 100;
62
+ transform: translateY(-50%);
63
+ }
64
+
65
+ /* Dot at start of indicator */
66
+ .inkpen-drop-indicator::before {
67
+ content: "";
68
+ position: absolute;
69
+ top: 50%;
70
+ left: 0;
71
+ width: var(--inkpen-drop-indicator-dot-size);
72
+ height: var(--inkpen-drop-indicator-dot-size);
73
+ background: var(--inkpen-drop-indicator-color);
74
+ border-radius: 50%;
75
+ transform: translate(-50%, -50%);
76
+ }
77
+
78
+ /* Dot at end of indicator */
79
+ .inkpen-drop-indicator::after {
80
+ content: "";
81
+ position: absolute;
82
+ top: 50%;
83
+ right: 0;
84
+ width: var(--inkpen-drop-indicator-dot-size);
85
+ height: var(--inkpen-drop-indicator-dot-size);
86
+ background: var(--inkpen-drop-indicator-color);
87
+ border-radius: 50%;
88
+ transform: translate(50%, -50%);
89
+ }
90
+
91
+ /* Animated entrance */
92
+ .inkpen-drop-indicator {
93
+ animation: inkpen-drop-indicator-enter 100ms ease-out;
94
+ }
95
+
96
+ @keyframes inkpen-drop-indicator-enter {
97
+ from {
98
+ opacity: 0;
99
+ transform: translateY(-50%) scaleX(0.8);
100
+ }
101
+ to {
102
+ opacity: 1;
103
+ transform: translateY(-50%) scaleX(1);
104
+ }
105
+ }
106
+
107
+ /* ==========================================================================
108
+ Dragging Block Visual Feedback
109
+ ========================================================================== */
110
+
111
+ /* Block being dragged (via gutter) */
112
+ .inkpen-block-gutter.is-dragging + .ProseMirror > * {
113
+ opacity: 0.5;
114
+ }
115
+
116
+ /* The block row that's being dragged */
117
+ .inkpen-editor.is-block-dragging .ProseMirror > [data-dragging="true"] {
118
+ opacity: 0.4;
119
+ background: var(--inkpen-drop-indicator-color);
120
+ background: linear-gradient(
121
+ 90deg,
122
+ rgba(59, 130, 246, 0.1) 0%,
123
+ rgba(59, 130, 246, 0.05) 100%
124
+ );
125
+ border-radius: 4px;
126
+ }
127
+
128
+ /* ==========================================================================
129
+ Ghost Element (follows cursor)
130
+ ========================================================================== */
131
+
132
+ .inkpen-drag-ghost {
133
+ position: fixed;
134
+ padding: 0.5rem 1rem;
135
+ background: var(--inkpen-drag-ghost-bg);
136
+ border: 1px solid var(--inkpen-drag-ghost-border);
137
+ border-radius: 6px;
138
+ box-shadow: var(--inkpen-drag-ghost-shadow);
139
+ opacity: 0.95;
140
+ pointer-events: none;
141
+ z-index: 9999;
142
+ max-width: 300px;
143
+ overflow: hidden;
144
+ text-overflow: ellipsis;
145
+ white-space: nowrap;
146
+ font-size: 0.875rem;
147
+ line-height: 1.4;
148
+ }
149
+
150
+ .inkpen-drag-ghost::before {
151
+ content: "⋮⋮";
152
+ margin-right: 0.5rem;
153
+ opacity: 0.5;
154
+ }
155
+
156
+ /* ==========================================================================
157
+ Block Hover States During Drag
158
+ ========================================================================== */
159
+
160
+ /* Highlight potential drop targets */
161
+ .inkpen-editor.is-block-dragging .ProseMirror > *:not([data-dragging="true"]) {
162
+ transition: transform 150ms ease, box-shadow 150ms ease;
163
+ }
164
+
165
+ /* Space opening animation for drop target */
166
+ .inkpen-editor.is-block-dragging .ProseMirror > *.is-drop-target-before {
167
+ transform: translateY(8px);
168
+ }
169
+
170
+ .inkpen-editor.is-block-dragging .ProseMirror > *.is-drop-target-after {
171
+ transform: translateY(-8px);
172
+ }
173
+
174
+ /* ==========================================================================
175
+ Mobile Optimizations
176
+ ========================================================================== */
177
+
178
+ @media (max-width: 768px) {
179
+ .inkpen-drop-indicator {
180
+ --inkpen-drop-indicator-height: 4px;
181
+ --inkpen-drop-indicator-dot-size: 10px;
182
+ }
183
+
184
+ .inkpen-drag-ghost {
185
+ max-width: 200px;
186
+ font-size: 0.8125rem;
187
+ }
188
+ }
189
+
190
+ /* Touch-friendly: larger touch targets during drag */
191
+ @media (pointer: coarse) {
192
+ .inkpen-editor.is-block-dragging .ProseMirror > * {
193
+ min-height: 44px;
194
+ }
195
+ }
196
+
197
+ /* ==========================================================================
198
+ Reduced Motion
199
+ ========================================================================== */
200
+
201
+ @media (prefers-reduced-motion: reduce) {
202
+ .inkpen-drop-indicator {
203
+ animation: none;
204
+ }
205
+
206
+ .inkpen-editor.is-block-dragging .ProseMirror > * {
207
+ transition: none;
208
+ }
209
+ }
210
+
211
+ /* ==========================================================================
212
+ Print Styles
213
+ ========================================================================== */
214
+
215
+ @media print {
216
+ .inkpen-drop-indicator,
217
+ .inkpen-drag-ghost {
218
+ display: none !important;
219
+ }
220
+ }