@jvs-milkdown/crepe 1.2.0 → 1.2.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 (75) hide show
  1. package/lib/cjs/builder.js +55 -2
  2. package/lib/cjs/builder.js.map +1 -1
  3. package/lib/cjs/feature/block-edit/index.js +73 -5
  4. package/lib/cjs/feature/block-edit/index.js.map +1 -1
  5. package/lib/cjs/feature/code-mirror/index.js +65 -3
  6. package/lib/cjs/feature/code-mirror/index.js.map +1 -1
  7. package/lib/cjs/feature/cursor/index.js +55 -2
  8. package/lib/cjs/feature/cursor/index.js.map +1 -1
  9. package/lib/cjs/feature/image-block/index.js +76 -8
  10. package/lib/cjs/feature/image-block/index.js.map +1 -1
  11. package/lib/cjs/feature/latex/index.js +55 -2
  12. package/lib/cjs/feature/latex/index.js.map +1 -1
  13. package/lib/cjs/feature/link-tooltip/index.js +55 -2
  14. package/lib/cjs/feature/link-tooltip/index.js.map +1 -1
  15. package/lib/cjs/feature/list-item/index.js +55 -2
  16. package/lib/cjs/feature/list-item/index.js.map +1 -1
  17. package/lib/cjs/feature/placeholder/index.js +55 -2
  18. package/lib/cjs/feature/placeholder/index.js.map +1 -1
  19. package/lib/cjs/feature/table/index.js +55 -2
  20. package/lib/cjs/feature/table/index.js.map +1 -1
  21. package/lib/cjs/feature/toolbar/index.js +73 -5
  22. package/lib/cjs/feature/toolbar/index.js.map +1 -1
  23. package/lib/cjs/index.js +451 -30
  24. package/lib/cjs/index.js.map +1 -1
  25. package/lib/esm/builder.js +55 -2
  26. package/lib/esm/builder.js.map +1 -1
  27. package/lib/esm/feature/block-edit/index.js +73 -5
  28. package/lib/esm/feature/block-edit/index.js.map +1 -1
  29. package/lib/esm/feature/code-mirror/index.js +65 -3
  30. package/lib/esm/feature/code-mirror/index.js.map +1 -1
  31. package/lib/esm/feature/cursor/index.js +55 -2
  32. package/lib/esm/feature/cursor/index.js.map +1 -1
  33. package/lib/esm/feature/image-block/index.js +76 -8
  34. package/lib/esm/feature/image-block/index.js.map +1 -1
  35. package/lib/esm/feature/latex/index.js +55 -2
  36. package/lib/esm/feature/latex/index.js.map +1 -1
  37. package/lib/esm/feature/link-tooltip/index.js +55 -2
  38. package/lib/esm/feature/link-tooltip/index.js.map +1 -1
  39. package/lib/esm/feature/list-item/index.js +55 -2
  40. package/lib/esm/feature/list-item/index.js.map +1 -1
  41. package/lib/esm/feature/placeholder/index.js +55 -2
  42. package/lib/esm/feature/placeholder/index.js.map +1 -1
  43. package/lib/esm/feature/table/index.js +55 -2
  44. package/lib/esm/feature/table/index.js.map +1 -1
  45. package/lib/esm/feature/toolbar/index.js +73 -5
  46. package/lib/esm/feature/toolbar/index.js.map +1 -1
  47. package/lib/esm/index.js +452 -31
  48. package/lib/esm/index.js.map +1 -1
  49. package/lib/theme/common/code-mirror.css +13 -0
  50. package/lib/theme/common/image-block.css +321 -22
  51. package/lib/theme/common/reset.css +3 -0
  52. package/lib/theme/common/toolbar.css +27 -2
  53. package/lib/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +4 -4
  55. package/src/core/locale.ts +55 -0
  56. package/src/feature/block-edit/menu/config.ts +19 -3
  57. package/src/feature/code-mirror/index.ts +3 -0
  58. package/src/feature/fixed-toolbar/component.tsx +31 -2
  59. package/src/feature/fixed-toolbar/config.ts +18 -3
  60. package/src/feature/fixed-toolbar/document-header.tsx +8 -4
  61. package/src/feature/fixed-toolbar/index.ts +18 -1
  62. package/src/feature/fixed-toolbar/menu-bar.tsx +83 -2
  63. package/src/feature/fixed-toolbar/shortcut-help-modal.tsx +244 -0
  64. package/src/feature/fixed-toolbar/view-menu-state.ts +9 -0
  65. package/src/feature/image-block/index.ts +11 -1
  66. package/src/icons/border.ts +5 -0
  67. package/src/icons/close.ts +3 -0
  68. package/src/icons/crop.ts +6 -0
  69. package/src/icons/index.ts +5 -0
  70. package/src/icons/keyboard.ts +3 -0
  71. package/src/icons/word-wrap.ts +6 -0
  72. package/src/theme/common/code-mirror.css +13 -0
  73. package/src/theme/common/image-block.css +364 -23
  74. package/src/theme/common/reset.css +3 -0
  75. package/src/theme/common/toolbar.css +30 -2
@@ -35,6 +35,10 @@
35
35
  background: transparent;
36
36
  }
37
37
 
38
+ .milkdown .milkdown-code-block .cm-activeLineGutter {
39
+ background-color: #f5f5f5;
40
+ }
41
+
38
42
  .milkdown .milkdown-code-block .cm-panel {
39
43
  font-family: var(--crepe-font-default);
40
44
  background: transparent;
@@ -152,6 +156,15 @@
152
156
  border-bottom-right-radius: 100px;
153
157
  }
154
158
 
159
+ .milkdown .milkdown-code-block .tools .tools-button-group button.word-wrap-active {
160
+ background: var(--crepe-color-selected);
161
+ color: var(--crepe-color-primary);
162
+ }
163
+
164
+ .milkdown .milkdown-code-block .tools .tools-button-group button.word-wrap-active svg {
165
+ stroke: var(--crepe-color-primary);
166
+ }
167
+
155
168
  .milkdown .milkdown-code-block .tools .language-button {
156
169
  display: flex;
157
170
  align-items: center;
@@ -160,6 +160,8 @@
160
160
  outline: none;
161
161
  margin: 4px 0;
162
162
  display: block;
163
+ position: relative;
164
+ z-index: 120;
163
165
  }
164
166
  .milkdown .milkdown-image-block > .image-wrapper {
165
167
  position: relative;
@@ -174,13 +176,6 @@
174
176
  .milkdown .milkdown-image-block[data-align='right'] > .image-wrapper {
175
177
  margin: 0 0 0 auto;
176
178
  }
177
- .milkdown .milkdown-image-block > .image-wrapper .operation {
178
- position: absolute;
179
- display: flex;
180
- }
181
- .milkdown .milkdown-image-block > .image-wrapper .operation > .operation-item {
182
- cursor: pointer;
183
- }
184
179
  .milkdown .milkdown-image-block > .image-wrapper img {
185
180
  max-width: 100%;
186
181
  min-height: 100px;
@@ -262,28 +257,58 @@
262
257
  justify-content: center;
263
258
  align-items: center;
264
259
  }
265
- .milkdown .milkdown-image-block .image-wrapper .operation {
266
- gap: 12px;
267
- right: 12px;
268
- top: 12px;
260
+ .milkdown .milkdown-image-block .image-wrapper.cropping {
261
+ outline: none !important;
262
+ }
263
+ .milkdown .milkdown-image-block .image-toolbar {
264
+ position: absolute;
265
+ bottom: calc(100% + 8px);
266
+ left: 50%;
267
+ transform: translateX(-50%);
268
+ display: flex;
269
+ align-items: center;
270
+ justify-content: center;
271
+ gap: 4px;
272
+ padding: 4px 8px;
273
+ background: var(--crepe-color-surface);
274
+ border-radius: 8px;
275
+ box-shadow: var(--crepe-shadow-1);
269
276
  opacity: 0;
270
- transition: all 0.2s;
277
+ pointer-events: none;
278
+ transition: opacity 0.2s;
279
+ width: -moz-fit-content;
280
+ width: fit-content;
281
+ z-index: 10;
282
+ white-space: nowrap;
271
283
  }
272
- .milkdown .milkdown-image-block:hover > .image-wrapper .operation {
284
+ .milkdown .milkdown-image-block .image-toolbar::after {
285
+ content: '';
286
+ position: absolute;
287
+ left: 0;
288
+ right: 0;
289
+ bottom: -8px;
290
+ height: 8px;
291
+ }
292
+ .milkdown .milkdown-image-block:hover > .image-toolbar {
273
293
  opacity: 1;
294
+ pointer-events: auto;
274
295
  }
275
- .milkdown .milkdown-image-block .image-wrapper .operation > .operation-item {
276
- color: var(--crepe-color-on-inverse);
277
- padding: 4px;
278
- background: var(--crepe-color-inverse);
279
- opacity: 0.6;
280
- border-radius: 50%;
296
+ .milkdown .milkdown-image-block .image-toolbar-item {
297
+ display: flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ cursor: pointer;
281
301
  width: 32px;
282
302
  height: 32px;
303
+ border-radius: 6px;
304
+ color: var(--crepe-color-on-surface-variant);
283
305
  }
284
- .milkdown .milkdown-image-block .image-wrapper .operation > .operation-item svg {
285
- width: 24px;
286
- height: 24px;
306
+ .milkdown .milkdown-image-block .image-toolbar-item svg {
307
+ width: 20px;
308
+ height: 20px;
309
+ }
310
+ .milkdown .milkdown-image-block .image-toolbar-item:hover {
311
+ background: var(--crepe-color-hover);
287
312
  }
288
313
  .milkdown .milkdown-image-block .image-wrapper .image-resize-handle {
289
314
  position: absolute;
@@ -401,3 +426,277 @@
401
426
  ),
402
427
  var(--crepe-color-secondary);
403
428
  }
429
+ .milkdown .milkdown-image-block .setting-panel {
430
+ position: absolute;
431
+ top: 44px;
432
+ right: 0;
433
+ z-index: 10;
434
+ background: var(--crepe-color-surface);
435
+ border-radius: 8px;
436
+ box-shadow: var(--crepe-shadow-1);
437
+ padding: 12px;
438
+ min-width: 200px;
439
+ }
440
+ .milkdown .milkdown-image-block .setting-panel-title {
441
+ font-size: 12px;
442
+ font-weight: 600;
443
+ color: var(--crepe-color-on-surface-variant);
444
+ margin-bottom: 8px;
445
+ text-transform: uppercase;
446
+ font-family: var(--crepe-font-default);
447
+ }
448
+ .milkdown .milkdown-image-block .crop-options {
449
+ display: flex;
450
+ gap: 4px;
451
+ flex-wrap: wrap;
452
+ }
453
+ .milkdown .milkdown-image-block .crop-option {
454
+ padding: 4px 12px;
455
+ border-radius: 4px;
456
+ font-size: 12px;
457
+ font-weight: 600;
458
+ cursor: pointer;
459
+ background: var(--crepe-color-surface-low);
460
+ color: var(--crepe-color-on-surface-variant);
461
+ font-family: var(--crepe-font-default);
462
+ }
463
+ .milkdown .milkdown-image-block .crop-option:hover {
464
+ background: var(--crepe-color-hover);
465
+ }
466
+ .milkdown .milkdown-image-block .crop-option.active {
467
+ background: var(--crepe-color-selected);
468
+ color: var(--crepe-color-primary);
469
+ }
470
+ .milkdown .milkdown-image-block .setting-row {
471
+ display: flex;
472
+ align-items: center;
473
+ gap: 8px;
474
+ margin-bottom: 8px;
475
+ }
476
+ .milkdown .milkdown-image-block .setting-label {
477
+ font-size: 12px;
478
+ font-weight: 600;
479
+ color: var(--crepe-color-on-surface-variant);
480
+ min-width: 32px;
481
+ font-family: var(--crepe-font-default);
482
+ }
483
+ .milkdown .milkdown-image-block .setting-value {
484
+ font-size: 12px;
485
+ color: var(--crepe-color-on-surface-variant);
486
+ min-width: 30px;
487
+ font-family: var(--crepe-font-default);
488
+ }
489
+ .milkdown .milkdown-image-block .border-style-options {
490
+ display: flex;
491
+ gap: 4px;
492
+ }
493
+ .milkdown .milkdown-image-block .border-style-option {
494
+ padding: 4px 10px;
495
+ border-radius: 4px;
496
+ font-size: 12px;
497
+ font-weight: 600;
498
+ cursor: pointer;
499
+ background: var(--crepe-color-surface-low);
500
+ color: var(--crepe-color-on-surface-variant);
501
+ font-family: var(--crepe-font-default);
502
+ }
503
+ .milkdown .milkdown-image-block .border-style-option:hover {
504
+ background: var(--crepe-color-hover);
505
+ }
506
+ .milkdown .milkdown-image-block .border-style-option.active {
507
+ background: var(--crepe-color-selected);
508
+ color: var(--crepe-color-primary);
509
+ }
510
+ .milkdown .milkdown-image-block input[type='range'] {
511
+ flex: 1;
512
+ height: 4px;
513
+ accent-color: var(--crepe-color-primary);
514
+ }
515
+ .milkdown .milkdown-image-block input[type='color'] {
516
+ width: 28px;
517
+ height: 28px;
518
+ padding: 0;
519
+ border: 1px solid var(--crepe-color-outline);
520
+ border-radius: 4px;
521
+ cursor: pointer;
522
+ background: transparent;
523
+ }
524
+ .milkdown .milkdown-image-block .crop-actions {
525
+ display: flex;
526
+ gap: 4px;
527
+ margin-top: 8px;
528
+ flex-wrap: wrap;
529
+ }
530
+ .milkdown .milkdown-image-block .crop-action-btn {
531
+ padding: 4px 12px;
532
+ border-radius: 4px;
533
+ font-size: 12px;
534
+ font-weight: 600;
535
+ cursor: pointer;
536
+ border: 1px solid var(--crepe-color-outline);
537
+ background: var(--crepe-color-surface-low);
538
+ color: var(--crepe-color-on-surface-variant);
539
+ font-family: var(--crepe-font-default);
540
+ }
541
+ .milkdown .milkdown-image-block .crop-action-btn:hover {
542
+ background: var(--crepe-color-hover);
543
+ }
544
+ .milkdown .milkdown-image-block .crop-action-btn.primary {
545
+ background: var(--crepe-color-primary);
546
+ color: #fff;
547
+ border-color: var(--crepe-color-primary);
548
+ }
549
+ .milkdown .milkdown-image-block .crop-overlay {
550
+ position: absolute;
551
+ inset: 0;
552
+ z-index: 5;
553
+ overflow: hidden;
554
+ display: flex;
555
+ flex-direction: column;
556
+ justify-content: flex-end;
557
+ }
558
+ .milkdown .milkdown-image-block .crop-box {
559
+ position: absolute;
560
+ border: 2px solid transparent;
561
+ box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5);
562
+ cursor: move;
563
+ z-index: 2;
564
+ }
565
+ .milkdown .milkdown-image-block .crop-grid {
566
+ position: absolute;
567
+ inset: 0;
568
+ pointer-events: none;
569
+ }
570
+ .milkdown .milkdown-image-block .crop-grid-line {
571
+ position: absolute;
572
+ background: rgba(255, 255, 255, 0.4);
573
+ }
574
+ .milkdown .milkdown-image-block .crop-grid-line.horizontal {
575
+ left: 0;
576
+ right: 0;
577
+ height: 1px;
578
+ }
579
+ .milkdown .milkdown-image-block .crop-grid-line.horizontal.first {
580
+ top: 33.33%;
581
+ }
582
+ .milkdown .milkdown-image-block .crop-grid-line.horizontal.second {
583
+ top: 66.66%;
584
+ }
585
+ .milkdown .milkdown-image-block .crop-grid-line.vertical {
586
+ top: 0;
587
+ bottom: 0;
588
+ width: 1px;
589
+ }
590
+ .milkdown .milkdown-image-block .crop-grid-line.vertical.first {
591
+ left: 33.33%;
592
+ }
593
+ .milkdown .milkdown-image-block .crop-grid-line.vertical.second {
594
+ left: 66.66%;
595
+ }
596
+ .milkdown .milkdown-image-block .crop-handle {
597
+ position: absolute;
598
+ background: transparent;
599
+ z-index: 3;
600
+ }
601
+ .milkdown .milkdown-image-block .crop-handle.nw {
602
+ top: 0;
603
+ left: 0;
604
+ width: 20px;
605
+ height: 20px;
606
+ border-top: 2px solid #000;
607
+ border-left: 2px solid #000;
608
+ cursor: nwse-resize;
609
+ }
610
+ .milkdown .milkdown-image-block .crop-handle.ne {
611
+ top: 0;
612
+ right: 0;
613
+ width: 20px;
614
+ height: 20px;
615
+ border-top: 2px solid #000;
616
+ border-right: 2px solid #000;
617
+ cursor: nesw-resize;
618
+ }
619
+ .milkdown .milkdown-image-block .crop-handle.sw {
620
+ bottom: 0;
621
+ left: 0;
622
+ width: 20px;
623
+ height: 20px;
624
+ border-bottom: 2px solid #000;
625
+ border-left: 2px solid #000;
626
+ cursor: nesw-resize;
627
+ }
628
+ .milkdown .milkdown-image-block .crop-handle.se {
629
+ bottom: 0;
630
+ right: 0;
631
+ width: 20px;
632
+ height: 20px;
633
+ border-bottom: 2px solid #000;
634
+ border-right: 2px solid #000;
635
+ cursor: nwse-resize;
636
+ }
637
+ .milkdown .milkdown-image-block .crop-handle.n {
638
+ top: 0;
639
+ left: 50%;
640
+ transform: translateX(-50%);
641
+ width: 20px;
642
+ height: 0;
643
+ border-top: 2px solid #000;
644
+ cursor: ns-resize;
645
+ }
646
+ .milkdown .milkdown-image-block .crop-handle.s {
647
+ bottom: 0;
648
+ left: 50%;
649
+ transform: translateX(-50%);
650
+ width: 20px;
651
+ height: 0;
652
+ border-bottom: 2px solid #000;
653
+ cursor: ns-resize;
654
+ }
655
+ .milkdown .milkdown-image-block .crop-handle.w {
656
+ left: 0;
657
+ top: 50%;
658
+ transform: translateY(-50%);
659
+ width: 0;
660
+ height: 20px;
661
+ border-left: 2px solid #000;
662
+ cursor: ew-resize;
663
+ }
664
+ .milkdown .milkdown-image-block .crop-handle.e {
665
+ right: 0;
666
+ top: 50%;
667
+ transform: translateY(-50%);
668
+ width: 0;
669
+ height: 20px;
670
+ border-right: 2px solid #000;
671
+ cursor: ew-resize;
672
+ }
673
+ .milkdown .milkdown-image-block .crop-toolbar {
674
+ position: absolute;
675
+ bottom: 12px;
676
+ left: 50%;
677
+ transform: translateX(-50%);
678
+ display: flex;
679
+ gap: 8px;
680
+ z-index: 10;
681
+ background: var(--crepe-color-surface);
682
+ border-radius: 8px;
683
+ padding: 4px;
684
+ box-shadow: var(--crepe-shadow-1);
685
+ }
686
+ .milkdown .milkdown-image-block .crop-toolbar-btn {
687
+ width: 36px;
688
+ height: 36px;
689
+ display: flex;
690
+ align-items: center;
691
+ justify-content: center;
692
+ cursor: pointer;
693
+ border-radius: 6px;
694
+ color: var(--crepe-color-on-surface-variant);
695
+ }
696
+ .milkdown .milkdown-image-block .crop-toolbar-btn svg {
697
+ width: 20px;
698
+ height: 20px;
699
+ }
700
+ .milkdown .milkdown-image-block .crop-toolbar-btn:hover {
701
+ background: var(--crepe-color-hover);
702
+ }
@@ -237,6 +237,7 @@
237
237
  .milkdown .ProseMirror ul:has(mark) p:has(mark),
238
238
  .milkdown .ProseMirror ol:has(mark) p:has(mark) {
239
239
  padding: 4px 0;
240
+ margin: 0px;
240
241
  border: none;
241
242
  border-radius: 0;
242
243
  background-color: transparent;
@@ -260,6 +261,7 @@
260
261
  .milkdown .ProseMirror pre code {
261
262
  padding: 0;
262
263
  background: transparent;
264
+ color: var(--crepe-color-inline-code);
263
265
  }
264
266
 
265
267
  .milkdown .ProseMirror blockquote {
@@ -323,4 +325,5 @@
323
325
  .milkdown .ProseMirror ul,
324
326
  .milkdown .ProseMirror ol {
325
327
  padding: 0;
328
+ list-style: none;
326
329
  }
@@ -17,13 +17,14 @@
17
17
  }
18
18
  .milkdown .milkdown-toolbar .divider {
19
19
  width: 1px;
20
+ align-self: center;
20
21
  background: color-mix(
21
22
  in srgb,
22
23
  var(--crepe-color-outline),
23
24
  transparent 80%
24
25
  );
25
26
  height: 24px;
26
- margin: 10px;
27
+ margin: 0 4px;
27
28
  }
28
29
  .milkdown .milkdown-toolbar .toolbar-item {
29
30
  min-width: 32px;
@@ -33,6 +34,9 @@
33
34
  cursor: pointer;
34
35
  border-radius: 4px;
35
36
  }
37
+ .milkdown .milkdown-toolbar .toolbar-item:has(.milkdown-icon) {
38
+ padding: 2px 6px;
39
+ }
36
40
  .milkdown .milkdown-toolbar .toolbar-item:hover {
37
41
  background: var(--crepe-color-hover);
38
42
  }
@@ -72,15 +76,33 @@
72
76
  top: 0;
73
77
  flex-shrink: 0;
74
78
  }
79
+ .milkdown .milkdown-fixed-toolbar .toolbar-shortcut-btn {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ flex-shrink: 0;
84
+ width: 28px;
85
+ height: 28px;
86
+ border: none;
87
+ background: transparent;
88
+ cursor: pointer;
89
+ border-radius: 4px;
90
+ color: var(--crepe-color-on-surface-variant, #666);
91
+ margin-left: 6px;
92
+ }
93
+ .milkdown .milkdown-fixed-toolbar .toolbar-shortcut-btn:hover {
94
+ background: var(--crepe-color-hover);
95
+ }
75
96
  .milkdown .milkdown-fixed-toolbar .divider {
76
97
  width: 1px;
98
+ align-self: center;
77
99
  background: color-mix(
78
100
  in srgb,
79
101
  var(--crepe-color-outline),
80
102
  transparent 80%
81
103
  );
82
104
  height: 20px;
83
- margin: 10px;
105
+ margin: 0 4px;
84
106
  }
85
107
  .milkdown .milkdown-fixed-toolbar .toolbar-item {
86
108
  min-width: 28px;
@@ -90,6 +112,9 @@
90
112
  cursor: pointer;
91
113
  border-radius: 4px;
92
114
  }
115
+ .milkdown .milkdown-fixed-toolbar .toolbar-item:has(.milkdown-icon) {
116
+ padding: 2px 6px;
117
+ }
93
118
  .milkdown .milkdown-fixed-toolbar .toolbar-item:hover {
94
119
  background: var(--crepe-color-hover);
95
120
  }