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,499 @@
1
+ /**
2
+ * Inkpen Export Styles
3
+ *
4
+ * Styles for export menu and export-related UI elements.
5
+ */
6
+
7
+ /* Export Dropdown in Sticky Toolbar */
8
+ .inkpen-export-dropdown {
9
+ position: relative;
10
+ display: inline-flex;
11
+ }
12
+
13
+ .inkpen-export-dropdown__toggle {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ gap: 0.25rem;
17
+ }
18
+
19
+ .inkpen-export-dropdown__toggle.is-active {
20
+ background: var(--inkpen-color-bg-hover);
21
+ }
22
+
23
+ .inkpen-export-dropdown__caret {
24
+ font-size: 0.625rem;
25
+ opacity: 0.6;
26
+ margin-left: 0.125rem;
27
+ }
28
+
29
+ .inkpen-export-dropdown__menu {
30
+ position: absolute;
31
+ bottom: calc(100% + 8px);
32
+ right: 0;
33
+ min-width: 200px;
34
+ padding: 0.375rem;
35
+ background: var(--inkpen-toolbar-bg);
36
+ border: 1px solid var(--inkpen-color-border);
37
+ border-radius: var(--inkpen-radius);
38
+ box-shadow: var(--inkpen-shadow-lg);
39
+ z-index: 100;
40
+ opacity: 0;
41
+ visibility: hidden;
42
+ transform: translateY(4px);
43
+ transition: opacity 150ms, transform 150ms, visibility 150ms;
44
+ }
45
+
46
+ .inkpen-export-dropdown__menu.is-open {
47
+ opacity: 1;
48
+ visibility: visible;
49
+ transform: translateY(0);
50
+ }
51
+
52
+ /* Position menu above for bottom toolbar, below for other positions */
53
+ [data-position="left"] .inkpen-export-dropdown__menu,
54
+ [data-position="right"] .inkpen-export-dropdown__menu {
55
+ bottom: auto;
56
+ top: 0;
57
+ right: calc(100% + 8px);
58
+ left: auto;
59
+ }
60
+
61
+ .inkpen-export-dropdown__header {
62
+ padding: 0.375rem 0.625rem;
63
+ font-size: 0.6875rem;
64
+ font-weight: 600;
65
+ text-transform: uppercase;
66
+ letter-spacing: 0.05em;
67
+ color: var(--inkpen-color-text-muted);
68
+ }
69
+
70
+ .inkpen-export-dropdown__divider {
71
+ height: 1px;
72
+ margin: 0.375rem 0;
73
+ background: var(--inkpen-color-border);
74
+ }
75
+
76
+ .inkpen-export-dropdown__item {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 0.625rem;
80
+ width: 100%;
81
+ padding: 0.5rem 0.625rem;
82
+ border: none;
83
+ border-radius: var(--inkpen-radius-sm);
84
+ background: transparent;
85
+ color: var(--inkpen-color-text);
86
+ font-size: 0.875rem;
87
+ text-align: left;
88
+ cursor: pointer;
89
+ transition: background-color 100ms;
90
+ }
91
+
92
+ .inkpen-export-dropdown__item:hover {
93
+ background: var(--inkpen-color-bg-hover);
94
+ }
95
+
96
+ .inkpen-export-dropdown__item:focus {
97
+ outline: none;
98
+ background: var(--inkpen-color-bg-hover);
99
+ }
100
+
101
+ .inkpen-export-dropdown__icon {
102
+ flex-shrink: 0;
103
+ width: 1.25rem;
104
+ text-align: center;
105
+ font-size: 0.875rem;
106
+ }
107
+
108
+ .inkpen-export-dropdown__label {
109
+ flex: 1;
110
+ }
111
+
112
+ .inkpen-export-dropdown__shortcut {
113
+ font-size: 0.6875rem;
114
+ color: var(--inkpen-color-text-muted);
115
+ font-family: var(--inkpen-font-mono);
116
+ }
117
+
118
+ /* Export Menu Button */
119
+ .inkpen-export-button {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ gap: 0.375rem;
123
+ padding: 0.375rem 0.625rem;
124
+ border: 1px solid var(--inkpen-color-border);
125
+ border-radius: var(--inkpen-radius);
126
+ background: var(--inkpen-toolbar-bg);
127
+ color: var(--inkpen-color-text);
128
+ font-size: 0.875rem;
129
+ cursor: pointer;
130
+ transition: background-color 150ms, border-color 150ms;
131
+ }
132
+
133
+ .inkpen-export-button:hover {
134
+ background: var(--inkpen-color-bg-hover);
135
+ border-color: var(--inkpen-color-border-hover);
136
+ }
137
+
138
+ .inkpen-export-button:focus {
139
+ outline: none;
140
+ box-shadow: 0 0 0 2px var(--inkpen-color-primary-alpha);
141
+ }
142
+
143
+ .inkpen-export-button__icon {
144
+ font-size: 1rem;
145
+ line-height: 1;
146
+ }
147
+
148
+ .inkpen-export-button__caret {
149
+ font-size: 0.625rem;
150
+ opacity: 0.6;
151
+ }
152
+
153
+ /* Export Dropdown Menu */
154
+ .inkpen-export-menu {
155
+ position: absolute;
156
+ top: calc(100% + 4px);
157
+ right: 0;
158
+ min-width: 220px;
159
+ padding: 0.375rem;
160
+ background: var(--inkpen-toolbar-bg);
161
+ border: 1px solid var(--inkpen-color-border);
162
+ border-radius: var(--inkpen-radius);
163
+ box-shadow: var(--inkpen-shadow-lg);
164
+ z-index: 100;
165
+ opacity: 0;
166
+ visibility: hidden;
167
+ transform: translateY(-4px);
168
+ transition: opacity 150ms, transform 150ms, visibility 150ms;
169
+ }
170
+
171
+ .inkpen-export-menu.is-open {
172
+ opacity: 1;
173
+ visibility: visible;
174
+ transform: translateY(0);
175
+ }
176
+
177
+ /* Menu Items */
178
+ .inkpen-export-menu__item {
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 0.75rem;
182
+ width: 100%;
183
+ padding: 0.5rem 0.75rem;
184
+ border: none;
185
+ border-radius: var(--inkpen-radius-sm);
186
+ background: transparent;
187
+ color: var(--inkpen-color-text);
188
+ font-size: 0.875rem;
189
+ text-align: left;
190
+ cursor: pointer;
191
+ transition: background-color 100ms;
192
+ }
193
+
194
+ .inkpen-export-menu__item:hover {
195
+ background: var(--inkpen-color-bg-hover);
196
+ }
197
+
198
+ .inkpen-export-menu__item:focus {
199
+ outline: none;
200
+ background: var(--inkpen-color-bg-hover);
201
+ }
202
+
203
+ .inkpen-export-menu__item:disabled {
204
+ opacity: 0.5;
205
+ cursor: not-allowed;
206
+ }
207
+
208
+ .inkpen-export-menu__icon {
209
+ flex-shrink: 0;
210
+ width: 1.25rem;
211
+ text-align: center;
212
+ font-size: 1rem;
213
+ }
214
+
215
+ .inkpen-export-menu__label {
216
+ flex: 1;
217
+ }
218
+
219
+ .inkpen-export-menu__shortcut {
220
+ font-size: 0.75rem;
221
+ color: var(--inkpen-color-text-muted);
222
+ font-family: var(--inkpen-font-mono);
223
+ }
224
+
225
+ /* Divider */
226
+ .inkpen-export-menu__divider {
227
+ height: 1px;
228
+ margin: 0.375rem 0;
229
+ background: var(--inkpen-color-border);
230
+ }
231
+
232
+ /* Section Header */
233
+ .inkpen-export-menu__header {
234
+ padding: 0.375rem 0.75rem;
235
+ font-size: 0.6875rem;
236
+ font-weight: 600;
237
+ text-transform: uppercase;
238
+ letter-spacing: 0.05em;
239
+ color: var(--inkpen-color-text-muted);
240
+ }
241
+
242
+ /* Export Progress Indicator */
243
+ .inkpen-export-progress {
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 0.5rem;
247
+ padding: 0.5rem 0.75rem;
248
+ font-size: 0.875rem;
249
+ color: var(--inkpen-color-text-muted);
250
+ }
251
+
252
+ .inkpen-export-progress__spinner {
253
+ width: 1rem;
254
+ height: 1rem;
255
+ border: 2px solid var(--inkpen-color-border);
256
+ border-top-color: var(--inkpen-color-primary);
257
+ border-radius: 50%;
258
+ animation: inkpen-spin 0.6s linear infinite;
259
+ }
260
+
261
+ @keyframes inkpen-spin {
262
+ to { transform: rotate(360deg); }
263
+ }
264
+
265
+ /* Export Success Message */
266
+ .inkpen-export-success {
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 0.5rem;
270
+ padding: 0.5rem 0.75rem;
271
+ font-size: 0.875rem;
272
+ color: var(--inkpen-color-success, #22c55e);
273
+ }
274
+
275
+ .inkpen-export-success__icon {
276
+ font-size: 1rem;
277
+ }
278
+
279
+ /* Export Error Message */
280
+ .inkpen-export-error {
281
+ display: flex;
282
+ align-items: center;
283
+ gap: 0.5rem;
284
+ padding: 0.5rem 0.75rem;
285
+ font-size: 0.875rem;
286
+ color: var(--inkpen-color-error, #ef4444);
287
+ }
288
+
289
+ /* Export Modal/Dialog */
290
+ .inkpen-export-dialog {
291
+ position: fixed;
292
+ top: 50%;
293
+ left: 50%;
294
+ transform: translate(-50%, -50%);
295
+ width: 90%;
296
+ max-width: 480px;
297
+ max-height: 90vh;
298
+ padding: 1.5rem;
299
+ background: var(--inkpen-toolbar-bg);
300
+ border: 1px solid var(--inkpen-color-border);
301
+ border-radius: var(--inkpen-radius-lg);
302
+ box-shadow: var(--inkpen-shadow-xl);
303
+ z-index: 1000;
304
+ overflow-y: auto;
305
+ }
306
+
307
+ .inkpen-export-dialog__backdrop {
308
+ position: fixed;
309
+ inset: 0;
310
+ background: rgba(0, 0, 0, 0.5);
311
+ z-index: 999;
312
+ }
313
+
314
+ .inkpen-export-dialog__header {
315
+ display: flex;
316
+ align-items: center;
317
+ justify-content: space-between;
318
+ margin-bottom: 1rem;
319
+ }
320
+
321
+ .inkpen-export-dialog__title {
322
+ margin: 0;
323
+ font-size: 1.125rem;
324
+ font-weight: 600;
325
+ }
326
+
327
+ .inkpen-export-dialog__close {
328
+ padding: 0.25rem;
329
+ border: none;
330
+ background: transparent;
331
+ color: var(--inkpen-color-text-muted);
332
+ font-size: 1.25rem;
333
+ cursor: pointer;
334
+ line-height: 1;
335
+ }
336
+
337
+ .inkpen-export-dialog__close:hover {
338
+ color: var(--inkpen-color-text);
339
+ }
340
+
341
+ /* Export Options Form */
342
+ .inkpen-export-options {
343
+ display: flex;
344
+ flex-direction: column;
345
+ gap: 1rem;
346
+ }
347
+
348
+ .inkpen-export-option {
349
+ display: flex;
350
+ flex-direction: column;
351
+ gap: 0.375rem;
352
+ }
353
+
354
+ .inkpen-export-option__label {
355
+ font-size: 0.875rem;
356
+ font-weight: 500;
357
+ }
358
+
359
+ .inkpen-export-option__input {
360
+ padding: 0.5rem 0.75rem;
361
+ border: 1px solid var(--inkpen-color-border);
362
+ border-radius: var(--inkpen-radius);
363
+ background: var(--inkpen-editor-bg);
364
+ color: var(--inkpen-color-text);
365
+ font-size: 0.875rem;
366
+ }
367
+
368
+ .inkpen-export-option__input:focus {
369
+ outline: none;
370
+ border-color: var(--inkpen-color-primary);
371
+ box-shadow: 0 0 0 2px var(--inkpen-color-primary-alpha);
372
+ }
373
+
374
+ .inkpen-export-option__select {
375
+ padding: 0.5rem 0.75rem;
376
+ border: 1px solid var(--inkpen-color-border);
377
+ border-radius: var(--inkpen-radius);
378
+ background: var(--inkpen-editor-bg);
379
+ color: var(--inkpen-color-text);
380
+ font-size: 0.875rem;
381
+ cursor: pointer;
382
+ }
383
+
384
+ .inkpen-export-option__checkbox {
385
+ display: flex;
386
+ align-items: center;
387
+ gap: 0.5rem;
388
+ }
389
+
390
+ .inkpen-export-option__checkbox input[type="checkbox"] {
391
+ width: 1rem;
392
+ height: 1rem;
393
+ margin: 0;
394
+ cursor: pointer;
395
+ }
396
+
397
+ /* Export Actions */
398
+ .inkpen-export-dialog__actions {
399
+ display: flex;
400
+ justify-content: flex-end;
401
+ gap: 0.5rem;
402
+ margin-top: 1.5rem;
403
+ padding-top: 1rem;
404
+ border-top: 1px solid var(--inkpen-color-border);
405
+ }
406
+
407
+ .inkpen-export-dialog__button {
408
+ padding: 0.5rem 1rem;
409
+ border: 1px solid var(--inkpen-color-border);
410
+ border-radius: var(--inkpen-radius);
411
+ background: var(--inkpen-toolbar-bg);
412
+ color: var(--inkpen-color-text);
413
+ font-size: 0.875rem;
414
+ font-weight: 500;
415
+ cursor: pointer;
416
+ transition: background-color 100ms;
417
+ }
418
+
419
+ .inkpen-export-dialog__button:hover {
420
+ background: var(--inkpen-color-bg-hover);
421
+ }
422
+
423
+ .inkpen-export-dialog__button--primary {
424
+ background: var(--inkpen-color-primary);
425
+ border-color: var(--inkpen-color-primary);
426
+ color: white;
427
+ }
428
+
429
+ .inkpen-export-dialog__button--primary:hover {
430
+ background: var(--inkpen-color-primary-hover);
431
+ }
432
+
433
+ /* PDF Options */
434
+ .inkpen-pdf-options {
435
+ display: grid;
436
+ grid-template-columns: 1fr 1fr;
437
+ gap: 1rem;
438
+ }
439
+
440
+ .inkpen-pdf-options__margins {
441
+ grid-column: span 2;
442
+ }
443
+
444
+ .inkpen-pdf-margins {
445
+ display: grid;
446
+ grid-template-columns: repeat(4, 1fr);
447
+ gap: 0.5rem;
448
+ }
449
+
450
+ .inkpen-pdf-margins__input {
451
+ display: flex;
452
+ flex-direction: column;
453
+ gap: 0.25rem;
454
+ }
455
+
456
+ .inkpen-pdf-margins__label {
457
+ font-size: 0.75rem;
458
+ color: var(--inkpen-color-text-muted);
459
+ text-align: center;
460
+ }
461
+
462
+ .inkpen-pdf-margins__input input {
463
+ width: 100%;
464
+ padding: 0.375rem 0.5rem;
465
+ border: 1px solid var(--inkpen-color-border);
466
+ border-radius: var(--inkpen-radius-sm);
467
+ text-align: center;
468
+ font-size: 0.875rem;
469
+ }
470
+
471
+ /* Dark mode */
472
+ @media (prefers-color-scheme: dark) {
473
+ .inkpen-export-dialog__backdrop {
474
+ background: rgba(0, 0, 0, 0.7);
475
+ }
476
+ }
477
+
478
+ /* Reduced motion */
479
+ @media (prefers-reduced-motion: reduce) {
480
+ .inkpen-export-menu {
481
+ transition: none;
482
+ }
483
+
484
+ .inkpen-export-progress__spinner {
485
+ animation: none;
486
+ border-top-color: var(--inkpen-color-primary);
487
+ opacity: 0.5;
488
+ }
489
+ }
490
+
491
+ /* Print */
492
+ @media print {
493
+ .inkpen-export-button,
494
+ .inkpen-export-menu,
495
+ .inkpen-export-dialog,
496
+ .inkpen-export-dialog__backdrop {
497
+ display: none !important;
498
+ }
499
+ }