@dnax/ui 0.0.27 → 0.0.28

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/styles/main.css CHANGED
@@ -6484,18 +6484,11 @@ html.dark body {
6484
6484
  }
6485
6485
  }
6486
6486
 
6487
- /* slide-* : glisse depuis un bord (32px) avec fondu */
6488
- .q-dialog-slide-up-enter-active,
6489
- .q-dialog-slide-up-leave-active,
6490
- .q-dialog-slide-down-enter-active,
6491
- .q-dialog-slide-down-leave-active,
6492
- .q-dialog-slide-left-enter-active,
6493
- .q-dialog-slide-left-leave-active,
6494
- .q-dialog-slide-right-enter-active,
6495
- .q-dialog-slide-right-leave-active {
6496
- transition: opacity var(--q-dialog-duration-enter, 0.2s) ease;
6497
- }
6498
-
6487
+ /* slide-* : vrai glissement plein écran — le panneau arrive depuis le bord
6488
+ (100vh / 100vw) et y retourne à la fermeture, comme les transitions par
6489
+ position (q-dialog-in-bottom…). Le fondu du fond est porté par l'overlay ;
6490
+ le panneau glisse sans fade (l'ancienne translation de 32px + fade
6491
+ ressemblait à un simple fondu). */
6499
6492
  .q-dialog-slide-up-enter-active,
6500
6493
  .q-dialog-slide-down-enter-active,
6501
6494
  .q-dialog-slide-left-enter-active,
@@ -6520,19 +6513,16 @@ html.dark body {
6520
6513
 
6521
6514
  @keyframes q-dialog-slide-up-in {
6522
6515
  from {
6523
- opacity: 0;
6524
- transform: translateY(32px);
6516
+ transform: translateY(100vh);
6525
6517
  }
6526
6518
  to {
6527
- opacity: 1;
6528
6519
  transform: none;
6529
6520
  }
6530
6521
  }
6531
6522
 
6532
6523
  @keyframes q-dialog-slide-up-out {
6533
6524
  to {
6534
- opacity: 0;
6535
- transform: translateY(32px);
6525
+ transform: translateY(100vh);
6536
6526
  }
6537
6527
  }
6538
6528
 
@@ -6546,19 +6536,16 @@ html.dark body {
6546
6536
 
6547
6537
  @keyframes q-dialog-slide-down-in {
6548
6538
  from {
6549
- opacity: 0;
6550
- transform: translateY(-32px);
6539
+ transform: translateY(-100vh);
6551
6540
  }
6552
6541
  to {
6553
- opacity: 1;
6554
6542
  transform: none;
6555
6543
  }
6556
6544
  }
6557
6545
 
6558
6546
  @keyframes q-dialog-slide-down-out {
6559
6547
  to {
6560
- opacity: 0;
6561
- transform: translateY(-32px);
6548
+ transform: translateY(-100vh);
6562
6549
  }
6563
6550
  }
6564
6551
 
@@ -6572,19 +6559,16 @@ html.dark body {
6572
6559
 
6573
6560
  @keyframes q-dialog-slide-left-in {
6574
6561
  from {
6575
- opacity: 0;
6576
- transform: translateX(32px);
6562
+ transform: translateX(100vw);
6577
6563
  }
6578
6564
  to {
6579
- opacity: 1;
6580
6565
  transform: none;
6581
6566
  }
6582
6567
  }
6583
6568
 
6584
6569
  @keyframes q-dialog-slide-left-out {
6585
6570
  to {
6586
- opacity: 0;
6587
- transform: translateX(32px);
6571
+ transform: translateX(100vw);
6588
6572
  }
6589
6573
  }
6590
6574
 
@@ -6598,22 +6582,49 @@ html.dark body {
6598
6582
 
6599
6583
  @keyframes q-dialog-slide-right-in {
6600
6584
  from {
6601
- opacity: 0;
6602
- transform: translateX(-32px);
6585
+ transform: translateX(-100vw);
6603
6586
  }
6604
6587
  to {
6605
- opacity: 1;
6606
6588
  transform: none;
6607
6589
  }
6608
6590
  }
6609
6591
 
6610
6592
  @keyframes q-dialog-slide-right-out {
6611
6593
  to {
6612
- opacity: 0;
6613
- transform: translateX(-32px);
6594
+ transform: translateX(-100vw);
6614
6595
  }
6615
6596
  }
6616
6597
 
6598
+ /* sheet-up / sheet-down : mêmes mouvements que slide-up/down (plein écran),
6599
+ mais l'OUVERTURE décélère en fin de course — courbe « pose » type sheet
6600
+ natif (cubic-bezier(0.32, 0.72, 0, 1)) ; la fermeture reste identique à
6601
+ slide. Keyframes partagées avec slide-*. */
6602
+ .q-dialog-sheet-up-enter-active,
6603
+ .q-dialog-sheet-down-enter-active {
6604
+ transition: opacity var(--q-dialog-duration-enter, 0.2s) ease;
6605
+ }
6606
+
6607
+ .q-dialog-sheet-up-leave-active,
6608
+ .q-dialog-sheet-down-leave-active {
6609
+ transition: opacity var(--q-dialog-duration-leave, 0.15s) ease-in-out;
6610
+ }
6611
+
6612
+ .q-dialog-sheet-up-enter-active .q-dialog__content {
6613
+ animation: q-dialog-slide-up-in var(--q-dialog-duration-enter, 0.3s) cubic-bezier(0.32, 0.72, 0, 1);
6614
+ }
6615
+
6616
+ .q-dialog-sheet-up-leave-active .q-dialog__content {
6617
+ animation: q-dialog-slide-up-out var(--q-dialog-duration-leave, 0.15s) ease-in-out forwards;
6618
+ }
6619
+
6620
+ .q-dialog-sheet-down-enter-active .q-dialog__content {
6621
+ animation: q-dialog-slide-down-in var(--q-dialog-duration-enter, 0.3s) cubic-bezier(0.32, 0.72, 0, 1);
6622
+ }
6623
+
6624
+ .q-dialog-sheet-down-leave-active .q-dialog__content {
6625
+ animation: q-dialog-slide-down-out var(--q-dialog-duration-leave, 0.15s) ease-in-out forwards;
6626
+ }
6627
+
6617
6628
  /* swipe-* : le panneau glisse depuis un bord et y REVIENT à la fermeture
6618
6629
  (aller-retour, comme la sidebar) — swipe-left : vient de la droite et y
6619
6630
  retourne ; swipe-right : vient de la gauche et y retourne. */
@@ -6666,6 +6677,34 @@ html.dark body {
6666
6677
  }
6667
6678
  }
6668
6679
 
6680
+ /* Easing sur mesure — props transition-easing-enter / transition-easing-leave :
6681
+ l'overlay porte les variables CSS inline (--q-dialog-easing-enter/leave),
6682
+ posées uniquement quand la prop est fournie. Les sélecteurs d'attribut
6683
+ `style*` ne matchent que dans ce cas → la courbe par défaut de chaque
6684
+ transition (ease, ease-in-out, cubic-bezier de sheet/swipe…) reste intacte
6685
+ tant qu'on n'a rien réglé. */
6686
+ /* Le panneau : animation-timing-function de TOUTES les transitions qui
6687
+ animent .q-dialog__content (zoom, slide-*, sheet-*, swipe-*, défaut selon
6688
+ position). */
6689
+ .q-dialog__overlay[style*="--q-dialog-easing-enter"] .q-dialog__content {
6690
+ animation-timing-function: var(--q-dialog-easing-enter, ease);
6691
+ }
6692
+
6693
+ .q-dialog__overlay[style*="--q-dialog-easing-leave"] .q-dialog__content {
6694
+ animation-timing-function: var(--q-dialog-easing-leave, ease-in-out);
6695
+ }
6696
+
6697
+ /* Le fond (overlay) : même easing pour son fondu d'opacité — la phase courante
6698
+ est détectée via la classe de transition (*-enter-active / *-leave-active,
6699
+ commune à fade, zoom, slide…). */
6700
+ .q-dialog__overlay[style*="--q-dialog-easing-enter"][class*="-enter-active"] {
6701
+ transition-timing-function: var(--q-dialog-easing-enter, ease);
6702
+ }
6703
+
6704
+ .q-dialog__overlay[style*="--q-dialog-easing-leave"][class*="-leave-active"] {
6705
+ transition-timing-function: var(--q-dialog-easing-leave, ease-in-out);
6706
+ }
6707
+
6669
6708
  /* ===== QContainer ===== */
6670
6709
  .q-container {
6671
6710
  width: 100%;
@@ -8352,3 +8391,805 @@ html.dark body {
8352
8391
  animation: none;
8353
8392
  }
8354
8393
  }
8394
+
8395
+ /* ===== QTiptap ===== */
8396
+ .q-tiptap {
8397
+ --q-tiptap-bg: #fff;
8398
+ --q-tiptap-toolbar-bg: #f6f7f9;
8399
+ --q-tiptap-border: var(--border, rgb(0 0 0 / 0.12));
8400
+ --q-tiptap-text: var(--foreground, #1d1d1d);
8401
+ /* ⚠ --muted est un token de FOND (bg grisé shadcn), pas une couleur de texte
8402
+ → icônes/secondary en gris texte explicite */
8403
+ --q-tiptap-muted: #8b93a1;
8404
+ --q-tiptap-primary: var(--primary, #1976d2);
8405
+ --q-tiptap-radius: var(--q-radius, 12px);
8406
+ --q-tiptap-code-bg: rgb(0 0 0 / 0.06);
8407
+ --q-tiptap-quote-bg: rgb(25 118 210 / 0.07);
8408
+ display: flex;
8409
+ flex-direction: column;
8410
+ overflow: hidden;
8411
+ border: 1px solid var(--q-tiptap-border);
8412
+ border-radius: var(--q-tiptap-radius);
8413
+ background-color: var(--q-tiptap-bg);
8414
+ color: var(--q-tiptap-text);
8415
+ }
8416
+ .dark .q-tiptap {
8417
+ --q-tiptap-bg: #1e1e22;
8418
+ --q-tiptap-toolbar-bg: #27272c;
8419
+ --q-tiptap-border: rgb(255 255 255 / 0.12);
8420
+ --q-tiptap-text: #ececef;
8421
+ --q-tiptap-muted: #9aa2b1;
8422
+ --q-tiptap-code-bg: rgb(255 255 255 / 0.08);
8423
+ --q-tiptap-quote-bg: rgb(25 118 210 / 0.18);
8424
+ }
8425
+ .q-tiptap--filled {
8426
+ --q-tiptap-bg: #f6f7f9;
8427
+ --q-tiptap-toolbar-bg: transparent;
8428
+ border-color: transparent;
8429
+ box-shadow: inset 0 0 0 1px var(--q-tiptap-border);
8430
+ }
8431
+ .dark .q-tiptap--filled {
8432
+ --q-tiptap-bg: #26262b;
8433
+ --q-tiptap-toolbar-bg: transparent;
8434
+ box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.1);
8435
+ }
8436
+ .q-tiptap--square {
8437
+ border-radius: 0;
8438
+ }
8439
+ .q-tiptap--disable {
8440
+ opacity: 0.7;
8441
+ }
8442
+ .q-tiptap--disable .q-tiptap__body {
8443
+ pointer-events: none;
8444
+ }
8445
+
8446
+ /* — barre d'outils — */
8447
+ .q-tiptap__toolbar {
8448
+ display: flex;
8449
+ align-items: center;
8450
+ flex-wrap: wrap;
8451
+ gap: 2px;
8452
+ padding: 4px 6px;
8453
+ background-color: var(--q-tiptap-toolbar-bg);
8454
+ border-bottom: 1px solid var(--q-tiptap-border);
8455
+ }
8456
+ .q-tiptap__group {
8457
+ display: flex;
8458
+ align-items: center;
8459
+ gap: 2px;
8460
+ }
8461
+ .q-tiptap__group + .q-tiptap__group {
8462
+ margin-left: 6px;
8463
+ padding-left: 6px;
8464
+ border-left: 1px solid var(--q-tiptap-border);
8465
+ }
8466
+ .q-tiptap__tool {
8467
+ display: inline-flex;
8468
+ align-items: center;
8469
+ justify-content: center;
8470
+ width: 30px;
8471
+ height: 30px;
8472
+ padding: 0;
8473
+ border: 0;
8474
+ border-radius: 8px;
8475
+ background: transparent;
8476
+ color: var(--q-tiptap-muted);
8477
+ cursor: pointer;
8478
+ transition:
8479
+ background-color 0.15s ease,
8480
+ color 0.15s ease;
8481
+ }
8482
+ .q-tiptap__tool svg {
8483
+ width: 17px;
8484
+ height: 17px;
8485
+ }
8486
+ .q-tiptap__tool:hover:not(:disabled) {
8487
+ background-color: rgb(0 0 0 / 0.06);
8488
+ color: var(--q-tiptap-text);
8489
+ }
8490
+ .dark .q-tiptap__tool:hover:not(:disabled) {
8491
+ background-color: rgb(255 255 255 / 0.08);
8492
+ }
8493
+ .q-tiptap__tool--active {
8494
+ background-color: rgb(25 118 210 / 0.14);
8495
+ background-color: color-mix(in srgb, var(--q-tiptap-primary) 14%, transparent);
8496
+ color: var(--q-tiptap-primary);
8497
+ }
8498
+ .q-tiptap__tool:disabled {
8499
+ opacity: 0.4;
8500
+ cursor: not-allowed;
8501
+ }
8502
+ .q-tiptap--dense .q-tiptap__tool {
8503
+ width: 26px;
8504
+ height: 26px;
8505
+ }
8506
+
8507
+ /* — zone d'édition — */
8508
+ .q-tiptap__body {
8509
+ position: relative;
8510
+ flex: 1;
8511
+ min-width: 0;
8512
+ }
8513
+ .q-tiptap__editor {
8514
+ position: relative;
8515
+ z-index: 1;
8516
+ min-height: 180px;
8517
+ }
8518
+ .q-tiptap__editor > div,
8519
+ .q-tiptap__editor .ProseMirror {
8520
+ min-height: inherit;
8521
+ }
8522
+ .q-tiptap__editor .ProseMirror {
8523
+ padding: var(--q-tiptap-content-padding, 5%);
8524
+ outline: none;
8525
+ font-size: 14px;
8526
+ line-height: 1.7;
8527
+ color: var(--q-tiptap-text);
8528
+ caret-color: var(--q-tiptap-primary);
8529
+ word-wrap: break-word;
8530
+ }
8531
+
8532
+ /* placeholder (visible quand le document est vide) — aligné sur le padding
8533
+ par défaut (5% sur les 4 côtés) */
8534
+ .q-tiptap__placeholder {
8535
+ position: absolute;
8536
+ z-index: 0;
8537
+ top: 5%;
8538
+ left: 5%;
8539
+ right: 5%;
8540
+ font-style: italic;
8541
+ font-size: 14px;
8542
+ line-height: 1.7;
8543
+ color: var(--q-tiptap-muted);
8544
+ pointer-events: none;
8545
+ white-space: pre-wrap;
8546
+ }
8547
+
8548
+ /* — typographie du contenu édité (ProseMirror) — */
8549
+ .q-tiptap__editor .ProseMirror p {
8550
+ margin: 0 0 0.6em;
8551
+ }
8552
+ .q-tiptap__editor .ProseMirror h1,
8553
+ .q-tiptap__editor .ProseMirror h2,
8554
+ .q-tiptap__editor .ProseMirror h3 {
8555
+ margin: 0.8em 0 0.4em;
8556
+ color: var(--q-tiptap-text);
8557
+ font-weight: 700;
8558
+ line-height: 1.3;
8559
+ }
8560
+ .q-tiptap__editor .ProseMirror h1 {
8561
+ font-size: 1.55em;
8562
+ }
8563
+ .q-tiptap__editor .ProseMirror h2 {
8564
+ font-size: 1.3em;
8565
+ }
8566
+ .q-tiptap__editor .ProseMirror h3 {
8567
+ font-size: 1.1em;
8568
+ }
8569
+ .q-tiptap__editor .ProseMirror > *:first-child {
8570
+ margin-top: 0;
8571
+ }
8572
+ .q-tiptap__editor .ProseMirror ul,
8573
+ .q-tiptap__editor .ProseMirror ol {
8574
+ margin: 0 0 0.8em;
8575
+ /* listes décalées d'un retrait (margin-left) ; petit padding pour les
8576
+ marqueurs (puces / numéros) */
8577
+ margin-left: 1.5em;
8578
+ padding-left: 0.4em;
8579
+ }
8580
+ /* listes imbriquées : retrait réduit pour rester lisible */
8581
+ .q-tiptap__editor .ProseMirror ul ul,
8582
+ .q-tiptap__editor .ProseMirror ul ol,
8583
+ .q-tiptap__editor .ProseMirror ol ul,
8584
+ .q-tiptap__editor .ProseMirror ol ol {
8585
+ margin-left: 0.75em;
8586
+ }
8587
+ /* Tailwind preflight met ul/ol { list-style: none } → restaurer les marqueurs */
8588
+ .q-tiptap__editor .ProseMirror ul {
8589
+ list-style-type: disc;
8590
+ }
8591
+ .q-tiptap__editor .ProseMirror ol {
8592
+ list-style-type: decimal;
8593
+ }
8594
+ .q-tiptap__editor .ProseMirror ul ul {
8595
+ list-style-type: circle;
8596
+ }
8597
+ .q-tiptap__editor .ProseMirror ul ul ul {
8598
+ list-style-type: square;
8599
+ }
8600
+ .q-tiptap__editor .ProseMirror li {
8601
+ margin: 0.15em 0;
8602
+ }
8603
+ .q-tiptap__editor .ProseMirror li p {
8604
+ margin: 0;
8605
+ }
8606
+ .q-tiptap__editor .ProseMirror blockquote {
8607
+ margin: 0.6em 0;
8608
+ padding: 6px 12px;
8609
+ border-left: 3px solid var(--q-tiptap-primary);
8610
+ border-radius: 0 8px 8px 0;
8611
+ background: var(--q-tiptap-quote-bg);
8612
+ }
8613
+ .q-tiptap__editor .ProseMirror blockquote p {
8614
+ margin: 0;
8615
+ }
8616
+ .q-tiptap__editor .ProseMirror pre {
8617
+ margin: 0.6em 0;
8618
+ padding: 10px 12px;
8619
+ overflow-x: auto;
8620
+ border: 1px solid var(--q-tiptap-border);
8621
+ border-radius: 8px;
8622
+ background: var(--q-tiptap-code-bg);
8623
+ font-size: 0.92em;
8624
+ }
8625
+ .q-tiptap__editor .ProseMirror pre code {
8626
+ background: none;
8627
+ padding: 0;
8628
+ font-size: 1em;
8629
+ }
8630
+ .q-tiptap__editor .ProseMirror code {
8631
+ padding: 0.1em 0.35em;
8632
+ border-radius: 4px;
8633
+ background: var(--q-tiptap-code-bg);
8634
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
8635
+ font-size: 0.92em;
8636
+ }
8637
+ .q-tiptap__editor .ProseMirror a {
8638
+ color: var(--q-tiptap-primary);
8639
+ text-decoration: underline;
8640
+ cursor: pointer;
8641
+ }
8642
+ .q-tiptap__editor .ProseMirror hr {
8643
+ margin: 0.8em 0;
8644
+ border: none;
8645
+ border-top: 1px solid var(--q-tiptap-border);
8646
+ }
8647
+ .q-tiptap__editor .ProseMirror img {
8648
+ display: block;
8649
+ max-width: 100%;
8650
+ height: auto;
8651
+ margin: 0.6em auto;
8652
+ border-radius: 8px;
8653
+ box-shadow: 0 0 0 1px var(--q-tiptap-border);
8654
+ }
8655
+ .q-tiptap__editor .ProseMirror .ProseMirror-selectednode {
8656
+ outline: 2px solid var(--q-tiptap-primary);
8657
+ border-radius: 4px;
8658
+ }
8659
+
8660
+ /* — couleur de texte (toolbar + palette popover) — */
8661
+ .q-tiptap__tool--color {
8662
+ position: relative;
8663
+ }
8664
+ .q-tiptap__color-bar {
8665
+ position: absolute;
8666
+ right: 7px;
8667
+ bottom: 4px;
8668
+ left: 7px;
8669
+ height: 3px;
8670
+ border-radius: 2px;
8671
+ pointer-events: none;
8672
+ }
8673
+ .q-tiptap__tool--disabled {
8674
+ opacity: 0.4;
8675
+ cursor: not-allowed;
8676
+ }
8677
+ .q-tiptap__tool--color:focus-visible {
8678
+ box-shadow: inset 0 0 0 2px var(--q-tiptap-primary);
8679
+ }
8680
+ .q-tiptap__palette {
8681
+ position: fixed;
8682
+ z-index: 4000;
8683
+ width: 224px;
8684
+ padding: 10px;
8685
+ background: var(--q-tiptap-bg);
8686
+ border: 1px solid var(--q-tiptap-border);
8687
+ border-radius: 12px;
8688
+ box-shadow: 0 14px 34px rgb(0 0 0 / 0.18);
8689
+ }
8690
+ .q-tiptap__palette-title {
8691
+ margin: 0 2px 8px;
8692
+ font-size: 11px;
8693
+ font-weight: 600;
8694
+ text-transform: uppercase;
8695
+ letter-spacing: 0.05em;
8696
+ color: var(--q-tiptap-muted);
8697
+ }
8698
+ .q-tiptap__palette-swatches {
8699
+ display: grid;
8700
+ grid-template-columns: repeat(7, 1fr);
8701
+ gap: 6px;
8702
+ }
8703
+ .q-tiptap__swatch {
8704
+ position: relative;
8705
+ width: 100%;
8706
+ aspect-ratio: 1;
8707
+ padding: 0;
8708
+ border: 1px solid var(--q-tiptap-border);
8709
+ border-radius: 6px;
8710
+ background: transparent;
8711
+ cursor: pointer;
8712
+ transition: transform 0.1s ease;
8713
+ }
8714
+ .q-tiptap__swatch:hover {
8715
+ transform: scale(1.12);
8716
+ }
8717
+ .q-tiptap__swatch--active {
8718
+ box-shadow:
8719
+ 0 0 0 2px var(--q-tiptap-bg),
8720
+ 0 0 0 4px var(--q-tiptap-primary);
8721
+ }
8722
+ .q-tiptap__swatch--none {
8723
+ background: #fff;
8724
+ background-image: linear-gradient(
8725
+ to top right,
8726
+ transparent calc(50% - 1px),
8727
+ #e5484d calc(50% - 1px),
8728
+ #e5484d calc(50% + 1px),
8729
+ transparent calc(50% + 1px)
8730
+ );
8731
+ }
8732
+ .q-tiptap__palette-custom {
8733
+ display: flex;
8734
+ align-items: center;
8735
+ gap: 8px;
8736
+ margin-top: 10px;
8737
+ padding-top: 10px;
8738
+ border-top: 1px solid var(--q-tiptap-border);
8739
+ font-size: 12px;
8740
+ color: var(--q-tiptap-muted);
8741
+ cursor: pointer;
8742
+ }
8743
+ .q-tiptap__palette-custom input[type="color"] {
8744
+ width: 26px;
8745
+ height: 26px;
8746
+ padding: 0;
8747
+ border: 1px solid var(--q-tiptap-border);
8748
+ border-radius: 6px;
8749
+ background: none;
8750
+ cursor: pointer;
8751
+ }
8752
+ .q-tiptap__palette-custom input[type="color"]::-webkit-color-swatch-wrapper {
8753
+ padding: 2px;
8754
+ }
8755
+ .q-tiptap__palette-custom input[type="color"]::-webkit-color-swatch {
8756
+ border: none;
8757
+ border-radius: 4px;
8758
+ }
8759
+
8760
+ /* — mentions (@) : puce dans le document + popup de suggestion — */
8761
+ .q-tiptap__editor .ProseMirror span[data-type="mention"] {
8762
+ display: inline-block;
8763
+ padding: 0 5px;
8764
+ margin: 0 1px;
8765
+ border-radius: 6px;
8766
+ background: rgb(25 118 210 / 0.12);
8767
+ background: color-mix(in srgb, var(--q-tiptap-primary) 14%, transparent);
8768
+ color: var(--q-tiptap-primary);
8769
+ font-weight: 500;
8770
+ white-space: nowrap;
8771
+ }
8772
+ .q-tiptap__mention-list {
8773
+ display: flex;
8774
+ flex-direction: column;
8775
+ gap: 2px;
8776
+ width: 220px;
8777
+ max-height: 240px;
8778
+ overflow-y: auto;
8779
+ padding: 4px;
8780
+ background: var(--q-tiptap-bg);
8781
+ border: 1px solid var(--q-tiptap-border);
8782
+ border-radius: 10px;
8783
+ box-shadow: 0 12px 28px rgb(0 0 0 / 0.18);
8784
+ }
8785
+ .q-tiptap__mention-item {
8786
+ display: flex;
8787
+ align-items: center;
8788
+ width: 100%;
8789
+ padding: 6px 10px;
8790
+ border: 0;
8791
+ border-radius: 7px;
8792
+ background: transparent;
8793
+ color: var(--q-tiptap-text);
8794
+ font-size: 13px;
8795
+ text-align: left;
8796
+ cursor: pointer;
8797
+ white-space: nowrap;
8798
+ overflow: hidden;
8799
+ text-overflow: ellipsis;
8800
+ }
8801
+ .q-tiptap__mention-item:hover,
8802
+ .q-tiptap__mention-item--active {
8803
+ background: rgb(25 118 210 / 0.12);
8804
+ background: color-mix(in srgb, var(--q-tiptap-primary) 14%, transparent);
8805
+ color: var(--q-tiptap-primary);
8806
+ }
8807
+ .q-tiptap__mention-empty {
8808
+ padding: 8px 10px;
8809
+ font-size: 13px;
8810
+ color: var(--q-tiptap-muted);
8811
+ }
8812
+
8813
+ /* — bubble menu : barre contextuelle de formatage (sélection) — */
8814
+ .q-tiptap__bubble {
8815
+ display: flex;
8816
+ align-items: center;
8817
+ gap: 2px;
8818
+ width: max-content;
8819
+ padding: 4px;
8820
+ background: var(--q-tiptap-bg);
8821
+ border: 1px solid var(--q-tiptap-border);
8822
+ border-radius: 12px;
8823
+ box-shadow: 0 10px 28px rgb(0 0 0 / 0.16);
8824
+ }
8825
+ .q-tiptap__bubble-btn {
8826
+ display: inline-flex;
8827
+ align-items: center;
8828
+ justify-content: center;
8829
+ width: 28px;
8830
+ height: 28px;
8831
+ padding: 0;
8832
+ border: 0;
8833
+ border-radius: 8px;
8834
+ background: transparent;
8835
+ color: var(--q-tiptap-muted);
8836
+ cursor: pointer;
8837
+ transition:
8838
+ background-color 0.15s ease,
8839
+ color 0.15s ease;
8840
+ }
8841
+ .q-tiptap__bubble-btn svg {
8842
+ width: 15px;
8843
+ height: 15px;
8844
+ }
8845
+ .q-tiptap__bubble-btn:hover:not(:disabled) {
8846
+ background-color: rgb(0 0 0 / 0.06);
8847
+ color: var(--q-tiptap-text);
8848
+ }
8849
+ .dark .q-tiptap__bubble-btn:hover:not(:disabled) {
8850
+ background-color: rgb(255 255 255 / 0.08);
8851
+ }
8852
+ .q-tiptap__bubble-btn--active {
8853
+ background-color: rgb(25 118 210 / 0.14);
8854
+ background-color: color-mix(in srgb, var(--q-tiptap-primary) 14%, transparent);
8855
+ color: var(--q-tiptap-primary);
8856
+ }
8857
+ .q-tiptap__bubble-btn:disabled {
8858
+ opacity: 0.4;
8859
+ cursor: not-allowed;
8860
+ }
8861
+ .q-tiptap__bubble-sep {
8862
+ width: 1px;
8863
+ height: 16px;
8864
+ margin: 0 3px;
8865
+ background: var(--q-tiptap-border);
8866
+ }
8867
+ .q-tiptap__bubble .q-tiptap__color-bar {
8868
+ right: 6px;
8869
+ bottom: 3px;
8870
+ left: 6px;
8871
+ }
8872
+
8873
+ /* — drag handle : poignée de déplacement des blocs — */
8874
+ .q-tiptap__drag-handle {
8875
+ display: inline-flex;
8876
+ align-items: center;
8877
+ justify-content: center;
8878
+ width: 20px;
8879
+ height: 20px;
8880
+ /* espace minimum entre l'icône et l'élément dragué (≥ 5% de la largeur de
8881
+ l'éditeur, relatif au conteneur positionné .q-tiptap__body) */
8882
+ margin-right: 5%;
8883
+ color: var(--q-tiptap-muted);
8884
+ cursor: grab;
8885
+ border-radius: 6px;
8886
+ transition: color 0.15s ease, background-color 0.15s ease;
8887
+ }
8888
+ .q-tiptap__drag-handle:hover {
8889
+ color: var(--q-tiptap-primary);
8890
+ background: rgb(25 118 210 / 0.12);
8891
+ background: color-mix(in srgb, var(--q-tiptap-primary) 14%, transparent);
8892
+ }
8893
+ .q-tiptap__drag-handle:active {
8894
+ cursor: grabbing;
8895
+ }
8896
+ .q-tiptap__drag-handle svg {
8897
+ width: 16px;
8898
+ height: 16px;
8899
+ }
8900
+
8901
+ /* Les popups (mentions, palette, bubble) sont montés HORS de .q-tiptap
8902
+ (Teleport / body via props.mount) → ils n'héritent PAS de --q-tiptap-*.
8903
+ On leur redéfinit leurs variables localement : fond blanc en light
8904
+ (--card), sombre via html.dark. */
8905
+ .q-tiptap__mention-list,
8906
+ .q-tiptap__palette,
8907
+ .q-tiptap__bubble,
8908
+ .q-tiptap__table-menu {
8909
+ --q-tiptap-bg: var(--card, #ffffff);
8910
+ --q-tiptap-border: var(--border, rgb(0 0 0 / 0.12));
8911
+ --q-tiptap-text: var(--foreground, #1d1d1d);
8912
+ --q-tiptap-muted: #8b93a1;
8913
+ --q-tiptap-primary: var(--primary, #1976d2);
8914
+ }
8915
+ .dark .q-tiptap__mention-list,
8916
+ .dark .q-tiptap__palette,
8917
+ .dark .q-tiptap__bubble,
8918
+ .dark .q-tiptap__table-menu {
8919
+ --q-tiptap-bg: #1e1e22;
8920
+ --q-tiptap-border: rgb(255 255 255 / 0.12);
8921
+ --q-tiptap-text: #ececef;
8922
+ --q-tiptap-muted: #9aa2b1;
8923
+ --q-tiptap-primary: var(--primary, #1976d2);
8924
+ }
8925
+
8926
+ /* — sélecteur de taille de police (toolbar, q-select) — */
8927
+ .q-tiptap__size {
8928
+ display: inline-flex;
8929
+ align-items: center;
8930
+ margin: 0 2px;
8931
+ }
8932
+ .q-tiptap__font-size {
8933
+ width: 100px;
8934
+ font-size: 12px;
8935
+ }
8936
+ .q-tiptap__font-size .q-select__display {
8937
+ font-size: 12px;
8938
+ }
8939
+ .q-tiptap__font-size.q-field--dense .q-select__arrow {
8940
+ width: 14px;
8941
+ height: 14px;
8942
+ }
8943
+ .q-tiptap__font-size .q-select__popup {
8944
+ width: 100px;
8945
+ min-width: 100px;
8946
+ }
8947
+ .q-tiptap__font-size .q-select__option-label {
8948
+ font-size: 12px;
8949
+ }
8950
+
8951
+ /* — tableaux : rendu dans le document + popup d'actions — */
8952
+ .q-tiptap__editor .ProseMirror .tableWrapper {
8953
+ overflow-x: auto;
8954
+ }
8955
+ .q-tiptap__editor .ProseMirror table {
8956
+ width: 100%;
8957
+ margin: 0.6em 0;
8958
+ border-collapse: collapse;
8959
+ table-layout: fixed;
8960
+ }
8961
+ .q-tiptap__editor .ProseMirror th,
8962
+ .q-tiptap__editor .ProseMirror td {
8963
+ position: relative;
8964
+ min-width: 60px;
8965
+ padding: 6px 10px;
8966
+ border: 1px solid var(--q-tiptap-border);
8967
+ vertical-align: top;
8968
+ }
8969
+ .q-tiptap__editor .ProseMirror th {
8970
+ background: var(--q-tiptap-toolbar-bg);
8971
+ font-weight: 600;
8972
+ text-align: left;
8973
+ }
8974
+ .q-tiptap__editor .ProseMirror .selectedCell::after {
8975
+ content: "";
8976
+ position: absolute;
8977
+ inset: 0;
8978
+ background: rgb(25 118 210 / 0.14);
8979
+ background: color-mix(in srgb, var(--q-tiptap-primary) 14%, transparent);
8980
+ pointer-events: none;
8981
+ }
8982
+ .q-tiptap__editor .ProseMirror .column-resize-handle {
8983
+ position: absolute;
8984
+ top: 0;
8985
+ right: -3px;
8986
+ bottom: 0;
8987
+ width: 5px;
8988
+ background: var(--q-tiptap-primary);
8989
+ cursor: col-resize;
8990
+ }
8991
+ .q-tiptap__editor .ProseMirror td p,
8992
+ .q-tiptap__editor .ProseMirror th p {
8993
+ margin: 0 0 0.2em;
8994
+ }
8995
+ .q-tiptap__table-menu {
8996
+ position: fixed;
8997
+ z-index: 4000;
8998
+ display: flex;
8999
+ flex-direction: column;
9000
+ gap: 2px;
9001
+ width: 212px;
9002
+ padding: 5px;
9003
+ background: var(--q-tiptap-bg);
9004
+ border: 1px solid var(--q-tiptap-border);
9005
+ border-radius: 10px;
9006
+ box-shadow: 0 12px 28px rgb(0 0 0 / 0.18);
9007
+ }
9008
+ .q-tiptap__table-action {
9009
+ display: flex;
9010
+ align-items: center;
9011
+ width: 100%;
9012
+ padding: 6px 10px;
9013
+ border: 0;
9014
+ border-radius: 7px;
9015
+ background: transparent;
9016
+ color: var(--q-tiptap-text);
9017
+ font-size: 13px;
9018
+ text-align: left;
9019
+ cursor: pointer;
9020
+ }
9021
+ .q-tiptap__table-action:hover {
9022
+ background: rgb(25 118 210 / 0.12);
9023
+ background: color-mix(in srgb, var(--q-tiptap-primary) 14%, transparent);
9024
+ color: var(--q-tiptap-primary);
9025
+ }
9026
+
9027
+ /* ===== QEditorJs (Editor.js, éditeur par blocs) ===== */
9028
+ .q-editor-js {
9029
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9030
+ border-radius: var(--q-radius, 12px);
9031
+ background: var(--card, #ffffff);
9032
+ color: var(--foreground, #1d1d1d);
9033
+ overflow: hidden;
9034
+ transition: border-color 0.15s ease;
9035
+ }
9036
+ .q-editor-js:focus-within {
9037
+ border-color: var(--primary, #1976d2);
9038
+ }
9039
+ .q-editor-js--disable {
9040
+ opacity: 0.7;
9041
+ pointer-events: none;
9042
+ }
9043
+ .q-editor-js__holder {
9044
+ padding: 14px 16px;
9045
+ }
9046
+ .q-editor-js .codex-editor__redactor {
9047
+ padding-bottom: 40px;
9048
+ }
9049
+ .q-editor-js .ce-block__content,
9050
+ .q-editor-js .ce-toolbar__content {
9051
+ max-width: none;
9052
+ }
9053
+ .q-editor-js .ce-block {
9054
+ margin-bottom: 8px;
9055
+ }
9056
+ .q-editor-js .ce-paragraph {
9057
+ color: var(--foreground, #1d1d1d);
9058
+ font-size: 14px;
9059
+ line-height: 1.7;
9060
+ outline: none;
9061
+ }
9062
+ .q-editor-js .ce-paragraph[data-placeholder]:empty::before {
9063
+ color: var(--muted, #8b93a1);
9064
+ }
9065
+ .q-editor-js .ce-header {
9066
+ color: var(--foreground, #1d1d1d);
9067
+ font-weight: 700;
9068
+ line-height: 1.3;
9069
+ }
9070
+ .q-editor-js h1.ce-header {
9071
+ font-size: 1.55em;
9072
+ }
9073
+ .q-editor-js h2.ce-header {
9074
+ font-size: 1.3em;
9075
+ }
9076
+ .q-editor-js h3.ce-header {
9077
+ font-size: 1.1em;
9078
+ }
9079
+ .q-editor-js .cdx-list {
9080
+ color: var(--foreground, #1d1d1d);
9081
+ line-height: 1.7;
9082
+ }
9083
+ .q-editor-js .cdx-checklist {
9084
+ color: var(--foreground, #1d1d1d);
9085
+ }
9086
+ .q-editor-js .ce-code__textarea {
9087
+ background: color-mix(in srgb, var(--foreground, #1d1d1d) 6%, transparent);
9088
+ color: var(--foreground, #1d1d1d);
9089
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9090
+ border-radius: 8px;
9091
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
9092
+ }
9093
+ .q-editor-js .cdx-quote {
9094
+ margin: 0;
9095
+ padding: 10px 14px;
9096
+ border-left: 3px solid var(--primary, #1976d2);
9097
+ background: color-mix(in srgb, var(--primary, #1976d2) 8%, transparent);
9098
+ color: var(--foreground, #1d1d1d);
9099
+ border-radius: 0 8px 8px 0;
9100
+ }
9101
+ .q-editor-js .ce-toolbar__plus,
9102
+ .q-editor-js .ce-toolbar__settings-btn {
9103
+ color: var(--foreground, #1d1d1d);
9104
+ }
9105
+ .q-editor-js .ce-toolbar__plus:hover,
9106
+ .q-editor-js .ce-toolbar__settings-btn:hover {
9107
+ color: var(--primary, #1976d2);
9108
+ }
9109
+ .q-editor-js .ce-inline-toolbar,
9110
+ .q-editor-js .ce-conv-toolbar,
9111
+ .q-editor-js .ce-toolbox__button,
9112
+ .q-editor-js .ce-popover {
9113
+ background: var(--card, #ffffff);
9114
+ color: var(--foreground, #1d1d1d);
9115
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9116
+ }
9117
+ .q-editor-js .ce-toolbox__button--active,
9118
+ .q-editor-js .ce-inline-tool--active {
9119
+ color: var(--primary, #1976d2);
9120
+ }
9121
+
9122
+ /* NodeView Vue de la table : wrapper + table + tbody (contentDOM) */
9123
+ .q-tiptap__editor .ProseMirror .q-tiptap__table-wrapper {
9124
+ position: relative;
9125
+ overflow-x: auto;
9126
+ margin: 0.6em 0;
9127
+ }
9128
+ .q-tiptap__editor .ProseMirror .q-tiptap__table-wrapper table {
9129
+ margin: 0;
9130
+ width: 100%;
9131
+ table-layout: fixed;
9132
+ }
9133
+ /* Poignées de redimensionnement des colonnes (NodeView Vue) */
9134
+ .q-tiptap__resize-handle {
9135
+ position: absolute;
9136
+ top: 0;
9137
+ bottom: 0;
9138
+ z-index: 2;
9139
+ width: 7px;
9140
+ margin-left: -3.5px;
9141
+ cursor: col-resize;
9142
+ touch-action: none;
9143
+ }
9144
+ .q-tiptap__resize-handle::after {
9145
+ content: "";
9146
+ position: absolute;
9147
+ top: 0;
9148
+ bottom: 0;
9149
+ left: 2.5px;
9150
+ width: 2px;
9151
+ border-radius: 2px;
9152
+ background: transparent;
9153
+ transition: background-color 0.15s ease;
9154
+ }
9155
+ .q-tiptap__resize-handle:hover::after,
9156
+ .q-tiptap__resize-handle:active::after {
9157
+ background: var(--q-tiptap-primary);
9158
+ }
9159
+
9160
+ /* — dialog image / lien (saisie URL) — */
9161
+ .q-tiptap__dialog {
9162
+ display: flex;
9163
+ flex-direction: column;
9164
+ gap: 10px;
9165
+ min-width: 300px;
9166
+ padding: 14px 16px;
9167
+ }
9168
+
9169
+ /* — task list (NodeView Vue → q-checkbox dnax.ui) — */
9170
+ .q-tiptap__editor .ProseMirror ul[data-type="taskList"] {
9171
+ padding-left: 0;
9172
+ list-style: none;
9173
+ }
9174
+ .q-tiptap__editor .ProseMirror ul[data-type="taskList"] li[data-node-view-wrapper] {
9175
+ display: flex;
9176
+ align-items: flex-start;
9177
+ gap: 9px;
9178
+ list-style: none;
9179
+ }
9180
+ .q-tiptap__task-check {
9181
+ display: inline-flex;
9182
+ align-items: center;
9183
+ flex-shrink: 0;
9184
+ margin-top: 2px;
9185
+ cursor: pointer;
9186
+ user-select: none;
9187
+ }
9188
+ .q-tiptap__task-content {
9189
+ flex: 1;
9190
+ min-width: 0;
9191
+ }
9192
+ .q-tiptap__task-content--checked {
9193
+ color: var(--q-tiptap-muted);
9194
+ text-decoration: line-through;
9195
+ }