@dnax/ui 0.0.27 → 0.0.29

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,2149 @@ 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
+ /* ===== QBar ===== */
9028
+ .q-bar {
9029
+ display: flex;
9030
+ align-items: center;
9031
+ gap: 10px;
9032
+ min-height: 40px;
9033
+ padding: 0 12px;
9034
+ font-size: 13px;
9035
+ line-height: 1.4;
9036
+ color: var(--foreground, #1d1d1d);
9037
+ background: transparent;
9038
+ user-select: none;
9039
+ }
9040
+ .q-bar--dense {
9041
+ gap: 8px;
9042
+ min-height: 32px;
9043
+ padding: 0 10px;
9044
+ font-size: 12px;
9045
+ }
9046
+ .q-bar--dark {
9047
+ color: #ececef;
9048
+ background: #1d1d1d;
9049
+ }
9050
+ .q-bar > * {
9051
+ flex-shrink: 0;
9052
+ }
9053
+ .q-bar__dot {
9054
+ width: 12px;
9055
+ height: 12px;
9056
+ border-radius: 50%;
9057
+ }
9058
+
9059
+ /* ===== QEditorJs (Editor.js, éditeur par blocs) ===== */
9060
+ .q-editor-js {
9061
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9062
+ border-radius: var(--q-radius, 12px);
9063
+ background: var(--card, #ffffff);
9064
+ color: var(--foreground, #1d1d1d);
9065
+ overflow: hidden;
9066
+ transition: border-color 0.15s ease;
9067
+ }
9068
+ .q-editor-js:focus-within {
9069
+ border-color: var(--primary, #1976d2);
9070
+ }
9071
+ .q-editor-js--disable {
9072
+ opacity: 0.7;
9073
+ pointer-events: none;
9074
+ }
9075
+ .q-editor-js__holder {
9076
+ padding: 14px 16px;
9077
+ }
9078
+ .q-editor-js .codex-editor__redactor {
9079
+ padding-bottom: 40px;
9080
+ }
9081
+ .q-editor-js .ce-block__content,
9082
+ .q-editor-js .ce-toolbar__content {
9083
+ max-width: none;
9084
+ }
9085
+ .q-editor-js .ce-block {
9086
+ margin-bottom: 8px;
9087
+ }
9088
+ .q-editor-js .ce-paragraph {
9089
+ color: var(--foreground, #1d1d1d);
9090
+ font-size: 14px;
9091
+ line-height: 1.7;
9092
+ outline: none;
9093
+ }
9094
+ .q-editor-js .ce-paragraph[data-placeholder]:empty::before {
9095
+ color: var(--muted, #8b93a1);
9096
+ }
9097
+ .q-editor-js .ce-header {
9098
+ color: var(--foreground, #1d1d1d);
9099
+ font-weight: 700;
9100
+ line-height: 1.3;
9101
+ }
9102
+ .q-editor-js h1.ce-header {
9103
+ font-size: 1.55em;
9104
+ }
9105
+ .q-editor-js h2.ce-header {
9106
+ font-size: 1.3em;
9107
+ }
9108
+ .q-editor-js h3.ce-header {
9109
+ font-size: 1.1em;
9110
+ }
9111
+ .q-editor-js .cdx-list {
9112
+ color: var(--foreground, #1d1d1d);
9113
+ line-height: 1.7;
9114
+ }
9115
+ .q-editor-js .cdx-checklist {
9116
+ color: var(--foreground, #1d1d1d);
9117
+ }
9118
+ .q-editor-js .ce-code__textarea {
9119
+ background: color-mix(in srgb, var(--foreground, #1d1d1d) 6%, transparent);
9120
+ color: var(--foreground, #1d1d1d);
9121
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9122
+ border-radius: 8px;
9123
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
9124
+ }
9125
+ .q-editor-js .cdx-quote {
9126
+ margin: 0;
9127
+ padding: 10px 14px;
9128
+ border-left: 3px solid var(--primary, #1976d2);
9129
+ background: color-mix(in srgb, var(--primary, #1976d2) 8%, transparent);
9130
+ color: var(--foreground, #1d1d1d);
9131
+ border-radius: 0 8px 8px 0;
9132
+ }
9133
+ .q-editor-js .ce-toolbar__plus,
9134
+ .q-editor-js .ce-toolbar__settings-btn {
9135
+ color: var(--foreground, #1d1d1d);
9136
+ }
9137
+ .q-editor-js .ce-toolbar__plus:hover,
9138
+ .q-editor-js .ce-toolbar__settings-btn:hover {
9139
+ color: var(--primary, #1976d2);
9140
+ }
9141
+ .q-editor-js .ce-inline-toolbar,
9142
+ .q-editor-js .ce-conv-toolbar,
9143
+ .q-editor-js .ce-toolbox__button,
9144
+ .q-editor-js .ce-popover {
9145
+ background: var(--card, #ffffff);
9146
+ color: var(--foreground, #1d1d1d);
9147
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9148
+ }
9149
+ .q-editor-js .ce-toolbox__button--active,
9150
+ .q-editor-js .ce-inline-tool--active {
9151
+ color: var(--primary, #1976d2);
9152
+ }
9153
+
9154
+ /* NodeView Vue de la table : wrapper + table + tbody (contentDOM) */
9155
+ .q-tiptap__editor .ProseMirror .q-tiptap__table-wrapper {
9156
+ position: relative;
9157
+ overflow-x: auto;
9158
+ margin: 0.6em 0;
9159
+ }
9160
+ .q-tiptap__editor .ProseMirror .q-tiptap__table-wrapper table {
9161
+ margin: 0;
9162
+ width: 100%;
9163
+ table-layout: fixed;
9164
+ }
9165
+ /* Poignées de redimensionnement des colonnes (NodeView Vue) */
9166
+ .q-tiptap__resize-handle {
9167
+ position: absolute;
9168
+ top: 0;
9169
+ bottom: 0;
9170
+ z-index: 2;
9171
+ width: 7px;
9172
+ margin-left: -3.5px;
9173
+ cursor: col-resize;
9174
+ touch-action: none;
9175
+ }
9176
+ .q-tiptap__resize-handle::after {
9177
+ content: "";
9178
+ position: absolute;
9179
+ top: 0;
9180
+ bottom: 0;
9181
+ left: 2.5px;
9182
+ width: 2px;
9183
+ border-radius: 2px;
9184
+ background: transparent;
9185
+ transition: background-color 0.15s ease;
9186
+ }
9187
+ .q-tiptap__resize-handle:hover::after,
9188
+ .q-tiptap__resize-handle:active::after {
9189
+ background: var(--q-tiptap-primary);
9190
+ }
9191
+
9192
+ /* — dialog image / lien (saisie URL) — */
9193
+ .q-tiptap__dialog {
9194
+ display: flex;
9195
+ flex-direction: column;
9196
+ gap: 10px;
9197
+ min-width: 300px;
9198
+ padding: 14px 16px;
9199
+ }
9200
+
9201
+ /* — task list (NodeView Vue → q-checkbox dnax.ui) — */
9202
+ .q-tiptap__editor .ProseMirror ul[data-type="taskList"] {
9203
+ padding-left: 0;
9204
+ list-style: none;
9205
+ }
9206
+ .q-tiptap__editor .ProseMirror ul[data-type="taskList"] li[data-node-view-wrapper] {
9207
+ display: flex;
9208
+ align-items: flex-start;
9209
+ gap: 9px;
9210
+ list-style: none;
9211
+ }
9212
+ .q-tiptap__task-check {
9213
+ display: inline-flex;
9214
+ align-items: center;
9215
+ flex-shrink: 0;
9216
+ margin-top: 2px;
9217
+ cursor: pointer;
9218
+ user-select: none;
9219
+ }
9220
+ .q-tiptap__task-content {
9221
+ flex: 1;
9222
+ min-width: 0;
9223
+ }
9224
+ .q-tiptap__task-content--checked {
9225
+ color: var(--q-tiptap-muted);
9226
+ text-decoration: line-through;
9227
+ }
9228
+
9229
+ /* ===== QSpreadsheet (tableur type Excel) ===== */
9230
+ .q-spreadsheet {
9231
+ --q-spreadsheet-border: rgb(0 0 0 / 0.1);
9232
+ --q-spreadsheet-header-bg: rgb(0 0 0 / 0.03);
9233
+ --q-spreadsheet-row-alt: rgb(0 0 0 / 0.015);
9234
+ --q-spreadsheet-range: rgb(25 118 210 / 0.1);
9235
+ --q-spreadsheet-range-brd: var(--primary, #1976d2);
9236
+
9237
+ position: relative;
9238
+ display: flex;
9239
+ flex-direction: column;
9240
+ width: 100%;
9241
+ overflow: hidden;
9242
+ border-radius: var(--q-radius, 0);
9243
+ background: #fff;
9244
+ color: var(--foreground, #1d1d1d);
9245
+ font-size: 13px;
9246
+ }
9247
+ .q-spreadsheet--bordered {
9248
+ border: 1px solid var(--q-spreadsheet-border);
9249
+ }
9250
+ .q-spreadsheet--flat {
9251
+ box-shadow: none;
9252
+ }
9253
+ .q-spreadsheet--disable {
9254
+ opacity: 0.6;
9255
+ pointer-events: none;
9256
+ user-select: none;
9257
+ }
9258
+ .q-spreadsheet--dark,
9259
+ .dark .q-spreadsheet {
9260
+ --q-spreadsheet-border: rgb(255 255 255 / 0.12);
9261
+ --q-spreadsheet-header-bg: rgb(255 255 255 / 0.05);
9262
+ --q-spreadsheet-row-alt: rgb(255 255 255 / 0.02);
9263
+ background: var(--card, #1d1d1d);
9264
+ color: var(--foreground, #ececef);
9265
+ }
9266
+
9267
+ /* ─── Barre d'outils ─── */
9268
+ .q-spreadsheet__toolbar {
9269
+ display: flex;
9270
+ align-items: center;
9271
+ flex-wrap: wrap;
9272
+ gap: 4px;
9273
+ padding: 6px 8px;
9274
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9275
+ background: var(--q-spreadsheet-header-bg);
9276
+ }
9277
+ .q-spreadsheet__sheet-name {
9278
+ display: inline-flex;
9279
+ align-items: center;
9280
+ gap: 6px;
9281
+ margin-right: 6px;
9282
+ padding: 3px 10px;
9283
+ font-size: 12px;
9284
+ font-weight: 600;
9285
+ color: var(--foreground, #1d1d1d);
9286
+ background: rgb(25 118 210 / 0.08);
9287
+ border-radius: 6px;
9288
+ white-space: nowrap;
9289
+ }
9290
+ .q-spreadsheet__tb-group {
9291
+ display: inline-flex;
9292
+ align-items: center;
9293
+ gap: 2px;
9294
+ padding: 0 4px;
9295
+ border-left: 1px solid var(--q-spreadsheet-border);
9296
+ }
9297
+ .q-spreadsheet__tool {
9298
+ display: inline-flex;
9299
+ align-items: center;
9300
+ justify-content: center;
9301
+ width: 28px;
9302
+ height: 28px;
9303
+ padding: 0;
9304
+ border: 0;
9305
+ border-radius: 6px;
9306
+ background: transparent;
9307
+ color: var(--foreground, #1d1d1d);
9308
+ cursor: pointer;
9309
+ transition: background-color 0.15s ease;
9310
+ }
9311
+ .q-spreadsheet__tool:hover:not(:disabled) {
9312
+ background: rgb(25 118 210 / 0.1);
9313
+ color: var(--primary, #1976d2);
9314
+ }
9315
+ .q-spreadsheet__tool:disabled {
9316
+ opacity: 0.35;
9317
+ cursor: default;
9318
+ }
9319
+ .q-spreadsheet__tool .iconify {
9320
+ font-size: 17px;
9321
+ }
9322
+ .q-spreadsheet--dense .q-spreadsheet__tool {
9323
+ width: 24px;
9324
+ height: 24px;
9325
+ }
9326
+
9327
+ /* ─── Viewport / table ─── */
9328
+ .q-spreadsheet__viewport {
9329
+ position: relative;
9330
+ overflow: auto;
9331
+ outline: none;
9332
+ }
9333
+ .q-spreadsheet__table {
9334
+ width: max-content;
9335
+ min-width: 100%;
9336
+ border-collapse: separate;
9337
+ border-spacing: 0;
9338
+ table-layout: fixed;
9339
+ font-size: 13px;
9340
+ }
9341
+
9342
+ /* ─── En-têtes ─── */
9343
+ .q-spreadsheet__corner,
9344
+ .q-spreadsheet__colhead,
9345
+ .q-spreadsheet__rownum {
9346
+ position: sticky;
9347
+ background-color: var(--q-spreadsheet-header-bg);
9348
+ color: var(--foreground, #1d1d1d);
9349
+ font-weight: 600;
9350
+ user-select: none;
9351
+ }
9352
+ .q-spreadsheet__corner {
9353
+ top: 0;
9354
+ left: 0;
9355
+ z-index: 6;
9356
+ width: 34px;
9357
+ min-width: 34px;
9358
+ height: 28px;
9359
+ border-right: 1px solid var(--q-spreadsheet-border);
9360
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9361
+ text-align: center;
9362
+ vertical-align: middle;
9363
+ cursor: pointer;
9364
+ }
9365
+ .q-spreadsheet__colhead {
9366
+ top: 0;
9367
+ z-index: 4;
9368
+ height: 28px;
9369
+ padding: 0 10px 0 6px;
9370
+ border-right: 1px solid var(--q-spreadsheet-border);
9371
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9372
+ text-align: left;
9373
+ white-space: nowrap;
9374
+ overflow: hidden;
9375
+ cursor: pointer;
9376
+ }
9377
+ .q-spreadsheet__colhead--sel {
9378
+ background: rgb(25 118 210 / 0.12);
9379
+ }
9380
+ .q-spreadsheet__colhead-inner {
9381
+ display: flex;
9382
+ flex-direction: column;
9383
+ justify-content: center;
9384
+ min-width: 0;
9385
+ height: 100%;
9386
+ padding-right: 6px;
9387
+ }
9388
+ .q-spreadsheet__colhead-letter {
9389
+ font-size: 9.5px;
9390
+ font-weight: 700;
9391
+ line-height: 1.1;
9392
+ letter-spacing: 0.04em;
9393
+ text-transform: uppercase;
9394
+ color: var(--primary, #1976d2);
9395
+ }
9396
+ .q-spreadsheet__colhead-label {
9397
+ font-size: 11.5px;
9398
+ line-height: 1.25;
9399
+ overflow: hidden;
9400
+ text-overflow: ellipsis;
9401
+ }
9402
+ .q-spreadsheet__rownum {
9403
+ left: 0;
9404
+ z-index: 3;
9405
+ width: 34px;
9406
+ min-width: 34px;
9407
+ border-right: 1px solid var(--q-spreadsheet-border);
9408
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9409
+ font-size: 11px;
9410
+ font-weight: 500;
9411
+ text-align: center;
9412
+ vertical-align: middle;
9413
+ cursor: pointer;
9414
+ }
9415
+ .q-spreadsheet__rownum--sel {
9416
+ background: rgb(25 118 210 / 0.12);
9417
+ color: var(--primary, #1976d2);
9418
+ }
9419
+ .q-spreadsheet__row--sel {
9420
+ background: var(--q-spreadsheet-range);
9421
+ }
9422
+ .q-spreadsheet__resize {
9423
+ position: absolute;
9424
+ top: 0;
9425
+ right: 0;
9426
+ bottom: 0;
9427
+ z-index: 5;
9428
+ width: 6px;
9429
+ cursor: col-resize;
9430
+ }
9431
+ .q-spreadsheet__colhead {
9432
+ position: sticky;
9433
+ }
9434
+
9435
+ /* ─── Cellules ─── */
9436
+ .q-spreadsheet__cell {
9437
+ position: relative;
9438
+ height: var(--q-spreadsheet-row-height, 32px);
9439
+ padding: 2px 8px;
9440
+ border-right: 1px solid var(--q-spreadsheet-border);
9441
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9442
+ background: transparent;
9443
+ text-align: left;
9444
+ white-space: nowrap;
9445
+ overflow: hidden;
9446
+ text-overflow: ellipsis;
9447
+ cursor: cell;
9448
+ outline: none;
9449
+ }
9450
+ .q-spreadsheet__cell-text {
9451
+ display: block;
9452
+ overflow: hidden;
9453
+ text-overflow: ellipsis;
9454
+ }
9455
+ .q-spreadsheet__cell--number {
9456
+ text-align: right;
9457
+ font-variant-numeric: tabular-nums;
9458
+ }
9459
+ .q-spreadsheet__cell--center {
9460
+ text-align: center;
9461
+ }
9462
+ .q-spreadsheet__cell--right {
9463
+ text-align: right;
9464
+ }
9465
+ .q-spreadsheet__cell--in-range {
9466
+ background: var(--q-spreadsheet-range);
9467
+ }
9468
+ .q-spreadsheet__cell--active {
9469
+ background: var(--q-spreadsheet-range);
9470
+ box-shadow: inset 0 0 0 2px var(--q-spreadsheet-range-brd);
9471
+ }
9472
+ .q-spreadsheet__cell--editing {
9473
+ background: #fff;
9474
+ box-shadow: none;
9475
+ }
9476
+ .q-spreadsheet__cell--readonly {
9477
+ cursor: default;
9478
+ }
9479
+ .q-spreadsheet__cell--bool {
9480
+ text-align: center;
9481
+ }
9482
+
9483
+ /* ─── Case à cocher booléenne ─── */
9484
+ .q-spreadsheet__checkbox {
9485
+ display: inline-flex;
9486
+ align-items: center;
9487
+ justify-content: center;
9488
+ width: 17px;
9489
+ height: 17px;
9490
+ padding: 0;
9491
+ border: 1.5px solid var(--q-spreadsheet-border);
9492
+ border-radius: 4px;
9493
+ background: transparent;
9494
+ color: #fff;
9495
+ cursor: pointer;
9496
+ vertical-align: middle;
9497
+ }
9498
+ .q-spreadsheet__checkbox--on {
9499
+ background: var(--primary, #1976d2);
9500
+ border-color: var(--primary, #1976d2);
9501
+ }
9502
+ .q-spreadsheet__checkbox:disabled {
9503
+ cursor: default;
9504
+ opacity: 0.6;
9505
+ }
9506
+ .q-spreadsheet__checkbox .iconify {
9507
+ font-size: 12px;
9508
+ }
9509
+
9510
+ /* ─── Badges (type select + chip) ─── */
9511
+ .q-spreadsheet__badge {
9512
+ display: inline-block;
9513
+ max-width: 100%;
9514
+ padding: 1px 8px;
9515
+ border-radius: 999px;
9516
+ font-size: 11.5px;
9517
+ font-weight: 600;
9518
+ line-height: 1.6;
9519
+ white-space: nowrap;
9520
+ overflow: hidden;
9521
+ text-overflow: ellipsis;
9522
+ vertical-align: middle;
9523
+ }
9524
+
9525
+ /* ─── Éditeur overlay ─── */
9526
+ .q-spreadsheet__editor {
9527
+ position: absolute;
9528
+ z-index: 20;
9529
+ display: flex;
9530
+ align-items: center;
9531
+ border: 2px solid var(--primary, #1976d2);
9532
+ background: #fff;
9533
+ box-shadow: 0 6px 18px rgb(0 0 0 / 0.14);
9534
+ }
9535
+ .q-spreadsheet--dark .q-spreadsheet__editor,
9536
+ .dark .q-spreadsheet__editor {
9537
+ background: var(--card, #1d1d1d);
9538
+ }
9539
+ .q-spreadsheet__editor-input {
9540
+ width: 100%;
9541
+ min-width: 0;
9542
+ height: 100%;
9543
+ padding: 2px 6px;
9544
+ border: 0;
9545
+ outline: none;
9546
+ background: transparent;
9547
+ color: var(--foreground, #1d1d1d);
9548
+ font: inherit;
9549
+ }
9550
+ .q-spreadsheet__editor--select {
9551
+ flex-direction: column;
9552
+ align-items: stretch;
9553
+ border-color: rgb(25 118 210 / 0.45);
9554
+ }
9555
+ .q-spreadsheet__editor--select .q-spreadsheet__editor-input {
9556
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9557
+ }
9558
+ .q-spreadsheet__options {
9559
+ max-height: 180px;
9560
+ overflow: auto;
9561
+ padding: 4px;
9562
+ }
9563
+ .q-spreadsheet__option {
9564
+ display: flex;
9565
+ align-items: center;
9566
+ gap: 8px;
9567
+ width: 100%;
9568
+ padding: 5px 8px;
9569
+ border: 0;
9570
+ border-radius: 6px;
9571
+ background: transparent;
9572
+ color: var(--foreground, #1d1d1d);
9573
+ font-size: 12.5px;
9574
+ text-align: left;
9575
+ cursor: pointer;
9576
+ }
9577
+ .q-spreadsheet__option:hover,
9578
+ .q-spreadsheet__option--active {
9579
+ background: rgb(25 118 210 / 0.1);
9580
+ }
9581
+ .q-spreadsheet__option-swatch {
9582
+ flex-shrink: 0;
9583
+ width: 12px;
9584
+ height: 12px;
9585
+ border-radius: 3px;
9586
+ border: 1px solid var(--q-spreadsheet-border);
9587
+ }
9588
+
9589
+ /* ─── Barre de formule (fx) ─── */
9590
+ .q-spreadsheet__fx {
9591
+ display: flex;
9592
+ align-items: center;
9593
+ gap: 8px;
9594
+ padding: 4px 8px;
9595
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9596
+ background: var(--q-spreadsheet-header-bg);
9597
+ }
9598
+ .q-spreadsheet__fx-ref {
9599
+ flex-shrink: 0;
9600
+ min-width: 46px;
9601
+ padding: 2px 6px;
9602
+ text-align: center;
9603
+ font-weight: 700;
9604
+ font-size: 11.5px;
9605
+ color: var(--primary, #1976d2);
9606
+ background: rgb(25 118 210 / 0.08);
9607
+ border: 1px solid var(--q-spreadsheet-border);
9608
+ border-radius: 4px;
9609
+ }
9610
+ .q-spreadsheet__fx-badge {
9611
+ flex-shrink: 0;
9612
+ font-style: italic;
9613
+ font-weight: 600;
9614
+ font-size: 11px;
9615
+ color: #8b93a1;
9616
+ user-select: none;
9617
+ }
9618
+ .q-spreadsheet__fx-input {
9619
+ flex: 1;
9620
+ min-width: 0;
9621
+ padding: 4px 8px;
9622
+ border: 1px solid transparent;
9623
+ border-radius: 4px;
9624
+ background: transparent;
9625
+ color: var(--foreground, #1d1d1d);
9626
+ font: inherit;
9627
+ font-size: 12.5px;
9628
+ outline: none;
9629
+ }
9630
+ .q-spreadsheet__fx-input:focus {
9631
+ border-color: var(--primary, #1976d2);
9632
+ background: #fff;
9633
+ }
9634
+ .dark .q-spreadsheet__fx-input:focus,
9635
+ .q-spreadsheet--dark .q-spreadsheet__fx-input:focus {
9636
+ background: var(--card, #1d1d1d);
9637
+ }
9638
+ .q-spreadsheet__fx-input:disabled {
9639
+ opacity: 0.55;
9640
+ }
9641
+
9642
+ /* ─── Éditeur formule (textarea monospace) ─── */
9643
+ .q-spreadsheet__editor--formula {
9644
+ align-items: stretch;
9645
+ border-color: rgb(25 118 210 / 0.55);
9646
+ }
9647
+ .q-spreadsheet__editor-area {
9648
+ width: 100%;
9649
+ min-height: 28px;
9650
+ padding: 4px 6px;
9651
+ border: 0;
9652
+ outline: none;
9653
+ background: transparent;
9654
+ color: var(--foreground, #1d1d1d);
9655
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
9656
+ font-size: 12.5px;
9657
+ line-height: 1.45;
9658
+ resize: none;
9659
+ }
9660
+
9661
+ /* ─── Erreurs de formule ─── */
9662
+ .q-spreadsheet__cell--error {
9663
+ color: #c62828;
9664
+ font-weight: 600;
9665
+ }
9666
+ .q-spreadsheet--dark .q-spreadsheet__cell--error,
9667
+ .dark .q-spreadsheet__cell--error {
9668
+ color: #ff8a80;
9669
+ }
9670
+
9671
+ /* ─── fond opaque pour le freeze (variables) ─── */
9672
+ .q-spreadsheet {
9673
+ --q-spreadsheet-bg: #ffffff;
9674
+ }
9675
+ .q-spreadsheet--dark,
9676
+ .dark .q-spreadsheet {
9677
+ --q-spreadsheet-bg: var(--card, #1d1d1d);
9678
+ }
9679
+
9680
+ /* ─── Resize lignes (handle bas du numéro) ─── */
9681
+ .q-spreadsheet__row-resize {
9682
+ position: absolute;
9683
+ right: 0;
9684
+ bottom: 0;
9685
+ left: 0;
9686
+ height: 5px;
9687
+ cursor: row-resize;
9688
+ }
9689
+ /* ─── Bouton filtre colonne ─── */
9690
+ .q-spreadsheet__fbtn {
9691
+ position: absolute;
9692
+ top: 50%;
9693
+ right: 12px;
9694
+ display: inline-flex;
9695
+ align-items: center;
9696
+ justify-content: center;
9697
+ width: 16px;
9698
+ height: 16px;
9699
+ padding: 0;
9700
+ border: 0;
9701
+ border-radius: 4px;
9702
+ background: transparent;
9703
+ color: #8b93a1;
9704
+ opacity: 0.45;
9705
+ cursor: pointer;
9706
+ transform: translateY(-50%);
9707
+ }
9708
+ .q-spreadsheet__colhead:hover .q-spreadsheet__fbtn,
9709
+ .q-spreadsheet__fbtn--on {
9710
+ opacity: 1;
9711
+ }
9712
+ .q-spreadsheet__fbtn--on {
9713
+ color: var(--primary, #1976d2);
9714
+ background: rgb(25 118 210 / 0.12);
9715
+ }
9716
+ .q-spreadsheet__fbtn .iconify {
9717
+ font-size: 13px;
9718
+ }
9719
+
9720
+ /* ─── Freeze panes ─── */
9721
+ .q-spreadsheet__cell--frozen-row,
9722
+ .q-spreadsheet__cell--frozen-col {
9723
+ position: sticky;
9724
+ z-index: 2;
9725
+ }
9726
+ .q-spreadsheet__cell--frozen-both {
9727
+ position: sticky;
9728
+ z-index: 3;
9729
+ }
9730
+ .q-spreadsheet__colhead--frozen {
9731
+ z-index: 5;
9732
+ }
9733
+ .q-spreadsheet__rownum--frozen {
9734
+ z-index: 3;
9735
+ }
9736
+ .q-spreadsheet__rownum--frozen,
9737
+ .q-spreadsheet__colhead--frozen,
9738
+ .q-spreadsheet__cell--frozen-row,
9739
+ .q-spreadsheet__cell--frozen-col,
9740
+ .q-spreadsheet__cell--frozen-both {
9741
+ box-shadow: -1px 0 0 0 var(--q-spreadsheet-border), 0 -1px 0 0 var(--q-spreadsheet-border);
9742
+ }
9743
+
9744
+ /* ─── Poignée autofill + prévisualisation ─── */
9745
+ .q-spreadsheet__fill {
9746
+ position: absolute;
9747
+ z-index: 40;
9748
+ width: 8px;
9749
+ height: 8px;
9750
+ border: 1.5px solid #fff;
9751
+ border-radius: 2px;
9752
+ background: var(--primary, #1976d2);
9753
+ cursor: crosshair;
9754
+ box-shadow: 0 0 0 1px rgb(0 0 0 / 0.2);
9755
+ }
9756
+ .q-spreadsheet__cell--fill {
9757
+ box-shadow: inset 0 0 0 2px var(--primary, #1976d2);
9758
+ }
9759
+
9760
+ /* ─── Pas de lignes ─── */
9761
+ .q-spreadsheet__no-rows {
9762
+ padding: 14px 16px;
9763
+ color: #8b93a1;
9764
+ font-size: 12.5px;
9765
+ text-align: center;
9766
+ border-right: 1px solid var(--q-spreadsheet-border);
9767
+ border-bottom: 1px solid var(--q-spreadsheet-border);
9768
+ }
9769
+
9770
+ /* ─── Menu contextuel / popup filtre (téléportés body) ─── */
9771
+ .q-spreadsheet__ctx,
9772
+ .q-spreadsheet__fpop {
9773
+ z-index: 1300;
9774
+ min-width: 214px;
9775
+ max-width: 300px;
9776
+ padding: 5px;
9777
+ color: var(--foreground, #1d1d1d);
9778
+ background: var(--card, #fff);
9779
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9780
+ border-radius: 9px;
9781
+ box-shadow: 0 12px 32px rgb(0 0 0 / 0.16);
9782
+ font-size: 13px;
9783
+ user-select: none;
9784
+ }
9785
+ .dark .q-spreadsheet__ctx,
9786
+ .dark .q-spreadsheet__fpop {
9787
+ color: #ececef;
9788
+ background: #1d1d1d;
9789
+ }
9790
+ .q-spreadsheet__ctx-title {
9791
+ padding: 4px 8px 6px;
9792
+ font-size: 11px;
9793
+ font-weight: 700;
9794
+ letter-spacing: 0.04em;
9795
+ text-transform: uppercase;
9796
+ color: #8b93a1;
9797
+ border-bottom: 1px solid var(--border, rgb(0 0 0 / 0.08));
9798
+ margin-bottom: 4px;
9799
+ }
9800
+ .q-spreadsheet__mi {
9801
+ display: flex;
9802
+ align-items: center;
9803
+ gap: 9px;
9804
+ width: 100%;
9805
+ padding: 5px 9px;
9806
+ border: 0;
9807
+ border-radius: 6px;
9808
+ background: transparent;
9809
+ color: inherit;
9810
+ font: inherit;
9811
+ font-size: 12.5px;
9812
+ text-align: left;
9813
+ cursor: pointer;
9814
+ }
9815
+ .q-spreadsheet__mi:hover:not(:disabled) {
9816
+ background: rgb(25 118 210 / 0.09);
9817
+ }
9818
+ .q-spreadsheet__mi--on {
9819
+ color: var(--primary, #1976d2);
9820
+ background: rgb(25 118 210 / 0.12);
9821
+ }
9822
+ .q-spreadsheet__mi:disabled {
9823
+ opacity: 0.38;
9824
+ cursor: default;
9825
+ }
9826
+ .q-spreadsheet__mi .iconify {
9827
+ font-size: 15px;
9828
+ flex-shrink: 0;
9829
+ }
9830
+ .q-spreadsheet__sep {
9831
+ height: 1px;
9832
+ margin: 5px 6px;
9833
+ background: var(--border, rgb(0 0 0 / 0.09));
9834
+ }
9835
+ .q-spreadsheet__ctx-label {
9836
+ padding: 6px 8px 3px;
9837
+ font-size: 10px;
9838
+ font-weight: 700;
9839
+ text-transform: uppercase;
9840
+ letter-spacing: 0.05em;
9841
+ color: #8b93a1;
9842
+ }
9843
+ .q-spreadsheet__swatches {
9844
+ display: flex;
9845
+ flex-wrap: wrap;
9846
+ gap: 4px;
9847
+ padding: 2px 6px 6px;
9848
+ }
9849
+ .q-spreadsheet__swatch {
9850
+ width: 17px;
9851
+ height: 17px;
9852
+ padding: 0;
9853
+ border: 1px solid var(--border, rgb(0 0 0 / 0.14));
9854
+ border-radius: 4px;
9855
+ cursor: pointer;
9856
+ }
9857
+ .q-spreadsheet__swatch--on {
9858
+ outline: 2px solid var(--primary, #1976d2);
9859
+ outline-offset: 1px;
9860
+ }
9861
+ .q-spreadsheet__swatch:disabled {
9862
+ opacity: 0.45;
9863
+ cursor: default;
9864
+ }
9865
+
9866
+ /* ─── Popup filtre ─── */
9867
+ .q-spreadsheet__fpop {
9868
+ width: 248px;
9869
+ }
9870
+ .q-spreadsheet__fpop-head {
9871
+ display: flex;
9872
+ align-items: center;
9873
+ gap: 8px;
9874
+ padding: 4px 6px 6px;
9875
+ }
9876
+ .q-spreadsheet__fpop-head .iconify {
9877
+ color: var(--primary, #1976d2);
9878
+ flex-shrink: 0;
9879
+ }
9880
+ .q-spreadsheet__fpop-name {
9881
+ flex: 1;
9882
+ font-weight: 600;
9883
+ font-size: 12.5px;
9884
+ overflow: hidden;
9885
+ text-overflow: ellipsis;
9886
+ white-space: nowrap;
9887
+ }
9888
+ .q-spreadsheet__fpop-close {
9889
+ display: inline-flex;
9890
+ align-items: center;
9891
+ justify-content: center;
9892
+ width: 22px;
9893
+ height: 22px;
9894
+ padding: 0;
9895
+ border: 0;
9896
+ border-radius: 5px;
9897
+ background: transparent;
9898
+ color: inherit;
9899
+ cursor: pointer;
9900
+ }
9901
+ .q-spreadsheet__fpop-close:hover {
9902
+ background: rgb(0 0 0 / 0.08);
9903
+ }
9904
+ .q-spreadsheet__fpop-search {
9905
+ width: 100%;
9906
+ padding: 5px 8px;
9907
+ border: 1px solid var(--border, rgb(0 0 0 / 0.16));
9908
+ border-radius: 6px;
9909
+ background: transparent;
9910
+ color: inherit;
9911
+ font: inherit;
9912
+ font-size: 12.5px;
9913
+ outline: none;
9914
+ }
9915
+ .q-spreadsheet__fpop-search:focus {
9916
+ border-color: var(--primary, #1976d2);
9917
+ }
9918
+ .q-spreadsheet__fpop-list {
9919
+ max-height: 240px;
9920
+ overflow: auto;
9921
+ margin-top: 6px;
9922
+ }
9923
+ .q-spreadsheet__fpop-row {
9924
+ display: flex;
9925
+ align-items: center;
9926
+ gap: 8px;
9927
+ width: 100%;
9928
+ padding: 4px 8px;
9929
+ border: 0;
9930
+ border-radius: 5px;
9931
+ background: transparent;
9932
+ color: inherit;
9933
+ font: inherit;
9934
+ font-size: 12.5px;
9935
+ text-align: left;
9936
+ cursor: pointer;
9937
+ }
9938
+ .q-spreadsheet__fpop-row:hover {
9939
+ background: rgb(25 118 210 / 0.08);
9940
+ }
9941
+ .q-spreadsheet__fpop-check {
9942
+ display: inline-flex;
9943
+ align-items: center;
9944
+ justify-content: center;
9945
+ width: 15px;
9946
+ height: 15px;
9947
+ flex-shrink: 0;
9948
+ border: 1px solid var(--border, rgb(0 0 0 / 0.2));
9949
+ border-radius: 4px;
9950
+ color: #fff;
9951
+ }
9952
+ .q-spreadsheet__fpop-row--on .q-spreadsheet__fpop-check {
9953
+ background: var(--primary, #1976d2);
9954
+ border-color: var(--primary, #1976d2);
9955
+ }
9956
+ .q-spreadsheet__fpop-check .iconify {
9957
+ font-size: 11px;
9958
+ }
9959
+ .q-spreadsheet__fpop-label {
9960
+ flex: 1;
9961
+ min-width: 0;
9962
+ overflow: hidden;
9963
+ text-overflow: ellipsis;
9964
+ white-space: nowrap;
9965
+ }
9966
+ .q-spreadsheet__fpop-label--blank {
9967
+ color: #8b93a1;
9968
+ font-style: italic;
9969
+ }
9970
+ .q-spreadsheet__fpop-count {
9971
+ color: #8b93a1;
9972
+ font-size: 11.5px;
9973
+ }
9974
+ .q-spreadsheet__fpop-empty {
9975
+ padding: 10px;
9976
+ color: #8b93a1;
9977
+ font-size: 12px;
9978
+ text-align: center;
9979
+ }
9980
+ .q-spreadsheet__fpop > .q-spreadsheet__mi {
9981
+ margin-top: 4px;
9982
+ }
9983
+
9984
+ /* ─── place pour le bouton filtre dans l'en-tête ─── */
9985
+ .q-spreadsheet__colhead-inner {
9986
+ padding-right: 26px;
9987
+ }
9988
+
9989
+ /* ─── Suggestions de fonctions (formule) ─── */
9990
+ .q-spreadsheet__editor--formula {
9991
+ flex-direction: column;
9992
+ align-items: stretch;
9993
+ }
9994
+ .q-spreadsheet__fnsug {
9995
+ display: flex;
9996
+ flex-direction: column;
9997
+ max-height: 208px;
9998
+ overflow: auto;
9999
+ padding: 3px;
10000
+ border-top: 1px solid var(--q-spreadsheet-border);
10001
+ background: var(--card, #fff);
10002
+ }
10003
+ .q-spreadsheet--dark .q-spreadsheet__fnsug,
10004
+ .dark .q-spreadsheet__fnsug {
10005
+ background: var(--card, #1d1d1d);
10006
+ }
10007
+ .q-spreadsheet__fnsug-item {
10008
+ display: flex;
10009
+ align-items: baseline;
10010
+ gap: 8px;
10011
+ width: 100%;
10012
+ padding: 4px 8px;
10013
+ border: 0;
10014
+ border-radius: 5px;
10015
+ background: transparent;
10016
+ color: inherit;
10017
+ font: inherit;
10018
+ font-size: 12.5px;
10019
+ text-align: left;
10020
+ cursor: pointer;
10021
+ }
10022
+ .q-spreadsheet__fnsug-item code {
10023
+ color: var(--primary, #1976d2);
10024
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
10025
+ font-weight: 700;
10026
+ }
10027
+ .q-spreadsheet__fnsug-item span {
10028
+ color: #8b93a1;
10029
+ font-size: 11.5px;
10030
+ }
10031
+ .q-spreadsheet__fnsug-item:hover,
10032
+ .q-spreadsheet__fnsug-item--on {
10033
+ background: rgb(25 118 210 / 0.1);
10034
+ }
10035
+ .q-spreadsheet__fnsug--fx {
10036
+ position: fixed;
10037
+ z-index: 1320;
10038
+ border: 1px solid var(--border, rgb(0 0 0 / 0.12));
10039
+ border-radius: 8px;
10040
+ box-shadow: 0 10px 26px rgb(0 0 0 / 0.16);
10041
+ }
10042
+
10043
+ /* ─── Virtualisation : rangées d'espacement ─── */
10044
+ .q-spreadsheet__vpad td {
10045
+ padding: 0 !important;
10046
+ border: none !important;
10047
+ }
10048
+
10049
+ /* ─── Onglets de feuilles (classeur multi) ─── */
10050
+ .q-spreadsheet__sheets {
10051
+ display: flex;
10052
+ align-items: flex-end;
10053
+ gap: 2px;
10054
+ padding: 6px 8px 0;
10055
+ overflow-x: auto;
10056
+ background: var(--q-spreadsheet-header-bg);
10057
+ border-bottom: 1px solid var(--q-spreadsheet-border);
10058
+ user-select: none;
10059
+ }
10060
+ .q-spreadsheet__sheet-tab {
10061
+ display: inline-flex;
10062
+ align-items: center;
10063
+ gap: 6px;
10064
+ max-width: 180px;
10065
+ padding: 5px 10px 6px;
10066
+ border: 1px solid transparent;
10067
+ border-bottom: 0;
10068
+ border-radius: 7px 7px 0 0;
10069
+ background: transparent;
10070
+ color: var(--foreground, #1d1d1d);
10071
+ font-size: 12px;
10072
+ cursor: pointer;
10073
+ white-space: nowrap;
10074
+ }
10075
+ .q-spreadsheet__sheet-tab:hover {
10076
+ background: rgb(0 0 0 / 0.05);
10077
+ }
10078
+ .dark .q-spreadsheet__sheet-tab:hover,
10079
+ .q-spreadsheet--dark .q-spreadsheet__sheet-tab:hover {
10080
+ background: rgb(255 255 255 / 0.08);
10081
+ }
10082
+ .q-spreadsheet__sheet-tab--on {
10083
+ background: var(--card, #fff);
10084
+ border-color: var(--q-spreadsheet-border);
10085
+ color: var(--primary, #1976d2);
10086
+ font-weight: 600;
10087
+ }
10088
+ .dark .q-spreadsheet__sheet-tab--on,
10089
+ .q-spreadsheet--dark .q-spreadsheet__sheet-tab--on {
10090
+ background: var(--card, #1d1d1d);
10091
+ }
10092
+ .q-spreadsheet__sheet-name-label {
10093
+ overflow: hidden;
10094
+ text-overflow: ellipsis;
10095
+ }
10096
+ .q-spreadsheet__sheet-rename {
10097
+ width: 110px;
10098
+ padding: 2px 4px;
10099
+ border: 1px solid var(--primary, #1976d2);
10100
+ border-radius: 4px;
10101
+ background: transparent;
10102
+ color: inherit;
10103
+ font: inherit;
10104
+ font-size: 12px;
10105
+ outline: none;
10106
+ }
10107
+ .q-spreadsheet__sheet-close,
10108
+ .q-spreadsheet__sheet-add {
10109
+ display: inline-flex;
10110
+ align-items: center;
10111
+ justify-content: center;
10112
+ width: 18px;
10113
+ height: 18px;
10114
+ padding: 0;
10115
+ border: 0;
10116
+ border-radius: 4px;
10117
+ background: transparent;
10118
+ color: inherit;
10119
+ cursor: pointer;
10120
+ flex-shrink: 0;
10121
+ }
10122
+ .q-spreadsheet__sheet-close:hover {
10123
+ color: #c62828;
10124
+ background: rgb(198 40 40 / 0.12);
10125
+ }
10126
+ .q-spreadsheet__sheet-close .iconify {
10127
+ font-size: 12px;
10128
+ }
10129
+ .q-spreadsheet__sheet-add {
10130
+ margin: 0 2px 4px;
10131
+ color: #8b93a1;
10132
+ font-size: 15px;
10133
+ }
10134
+ .q-spreadsheet__sheet-add:hover {
10135
+ color: var(--primary, #1976d2);
10136
+ background: rgb(25 118 210 / 0.1);
10137
+ }
10138
+
10139
+ /* ─── Find & Replace ─── */
10140
+ .q-spreadsheet__find {
10141
+ display: flex;
10142
+ align-items: center;
10143
+ gap: 6px;
10144
+ padding: 4px 8px;
10145
+ border-bottom: 1px solid var(--q-spreadsheet-border);
10146
+ background: rgb(255 251 235);
10147
+ }
10148
+ .dark .q-spreadsheet__find,
10149
+ .q-spreadsheet--dark .q-spreadsheet__find {
10150
+ background: rgb(255 180 0 / 0.08);
10151
+ }
10152
+ .q-spreadsheet__find-icon {
10153
+ flex-shrink: 0;
10154
+ color: #8b93a1;
10155
+ font-size: 15px;
10156
+ }
10157
+ .q-spreadsheet__find-input {
10158
+ min-width: 0;
10159
+ padding: 4px 8px;
10160
+ border: 1px solid var(--q-spreadsheet-border);
10161
+ border-radius: 6px;
10162
+ background: transparent;
10163
+ color: inherit;
10164
+ font: inherit;
10165
+ font-size: 12.5px;
10166
+ outline: none;
10167
+ }
10168
+ .q-spreadsheet__find-input:focus {
10169
+ border-color: var(--primary, #1976d2);
10170
+ }
10171
+ .q-spreadsheet__find-input--repl {
10172
+ flex: 1;
10173
+ }
10174
+ .q-spreadsheet__find-count {
10175
+ font-size: 11.5px;
10176
+ color: #8b93a1;
10177
+ white-space: nowrap;
10178
+ }
10179
+ .q-spreadsheet__find-close {
10180
+ margin-left: 2px;
10181
+ }
10182
+ .q-spreadsheet__cell--find {
10183
+ background-color: rgb(255 235 59 / 0.35) !important;
10184
+ }
10185
+ .q-spreadsheet__cell--find-cur {
10186
+ background-color: rgb(255 214 0 / 0.45) !important;
10187
+ box-shadow: inset 0 0 0 2px #f5b301 !important;
10188
+ }
10189
+
10190
+ /* ─── Wrap text / hauteur auto / fusion / lignes masquées ─── */
10191
+ .q-spreadsheet__cell-text--wrap {
10192
+ white-space: pre-wrap;
10193
+ overflow: visible;
10194
+ text-overflow: clip;
10195
+ word-break: break-word;
10196
+ line-height: 1.35;
10197
+ }
10198
+ .q-spreadsheet__cell--merged {
10199
+ overflow: hidden;
10200
+ }
10201
+ .q-spreadsheet__cell--invalid {
10202
+ box-shadow: inset 0 0 0 2px #ef4444 !important;
10203
+ }
10204
+
10205
+ /* ─── Toolbar actif ─── */
10206
+ .q-spreadsheet__tool--on {
10207
+ color: var(--primary, #1976d2);
10208
+ background: rgb(25 118 210 / 0.14);
10209
+ }
10210
+
10211
+ /* ─── Panneau Conditional formatting ─── */
10212
+ .q-spreadsheet__cf {
10213
+ display: flex;
10214
+ align-items: center;
10215
+ flex-wrap: wrap;
10216
+ gap: 6px;
10217
+ padding: 5px 8px;
10218
+ border-bottom: 1px solid var(--q-spreadsheet-border);
10219
+ background: rgb(239 246 255);
10220
+ font-size: 12.5px;
10221
+ }
10222
+ .dark .q-spreadsheet__cf,
10223
+ .q-spreadsheet--dark .q-spreadsheet__cf {
10224
+ background: rgb(30 58 138 / 0.25);
10225
+ }
10226
+ .q-spreadsheet__cf-title {
10227
+ font-weight: 600;
10228
+ color: var(--primary, #1976d2);
10229
+ }
10230
+ .q-spreadsheet__cf-kind {
10231
+ padding: 4px 6px;
10232
+ border: 1px solid var(--q-spreadsheet-border);
10233
+ border-radius: 6px;
10234
+ background: transparent;
10235
+ color: inherit;
10236
+ font: inherit;
10237
+ font-size: 12px;
10238
+ }
10239
+ .q-spreadsheet__swatches--mini {
10240
+ gap: 3px;
10241
+ padding: 2px;
10242
+ }
10243
+ .q-spreadsheet__swatches--mini .q-spreadsheet__swatch {
10244
+ width: 14px;
10245
+ height: 14px;
10246
+ }
10247
+ .q-spreadsheet__cf-apply {
10248
+ padding: 3px 10px !important;
10249
+ }
10250
+ .q-spreadsheet__cf-list {
10251
+ display: flex;
10252
+ flex-wrap: wrap;
10253
+ gap: 4px;
10254
+ width: 100%;
10255
+ }
10256
+ .q-spreadsheet__cf-chip {
10257
+ display: inline-flex;
10258
+ align-items: center;
10259
+ gap: 4px;
10260
+ padding: 2px 6px;
10261
+ border: 1px solid var(--q-spreadsheet-border);
10262
+ border-radius: 999px;
10263
+ font-size: 11px;
10264
+ }
10265
+ .q-spreadsheet__cf-chip .q-spreadsheet__sheet-close {
10266
+ width: 14px;
10267
+ height: 14px;
10268
+ }
10269
+ .q-spreadsheet__cell--hide,
10270
+ .q-spreadsheet__colhead--hide {
10271
+ display: none;
10272
+ }
10273
+
10274
+ /* ─── Barre d'état + zoom ─── */
10275
+ .q-spreadsheet__status {
10276
+ display: flex;
10277
+ align-items: center;
10278
+ gap: 10px;
10279
+ min-height: 24px;
10280
+ padding: 2px 8px;
10281
+ border-top: 1px solid var(--q-spreadsheet-border);
10282
+ background: var(--q-spreadsheet-header-bg);
10283
+ font-size: 11.5px;
10284
+ color: #8b93a1;
10285
+ user-select: none;
10286
+ }
10287
+ .q-spreadsheet__status-cell {
10288
+ display: inline-flex;
10289
+ align-items: center;
10290
+ gap: 5px;
10291
+ font-weight: 600;
10292
+ color: var(--foreground, #1d1d1d);
10293
+ }
10294
+ .q-spreadsheet__status-item {
10295
+ color: #8b93a1;
10296
+ }
10297
+ .q-spreadsheet__status-stats {
10298
+ font-variant-numeric: tabular-nums;
10299
+ color: var(--primary, #1976d2);
10300
+ }
10301
+ .q-spreadsheet__status-chip {
10302
+ padding: 1px 7px;
10303
+ border-radius: 999px;
10304
+ background: rgb(25 118 210 / 0.12);
10305
+ color: var(--primary, #1976d2);
10306
+ }
10307
+ .q-spreadsheet__status-spacer {
10308
+ flex: 1;
10309
+ }
10310
+ .q-spreadsheet__status-zoom {
10311
+ display: inline-flex;
10312
+ align-items: center;
10313
+ gap: 2px;
10314
+ }
10315
+ .q-spreadsheet__status-zoom .q-spreadsheet__tool {
10316
+ width: 22px;
10317
+ height: 20px;
10318
+ }
10319
+ .q-spreadsheet__status-zoom-pct {
10320
+ min-width: 42px;
10321
+ padding: 2px 4px;
10322
+ border: 1px solid var(--q-spreadsheet-border);
10323
+ border-radius: 4px;
10324
+ background: transparent;
10325
+ color: inherit;
10326
+ font: inherit;
10327
+ font-size: 11px;
10328
+ text-align: center;
10329
+ cursor: pointer;
10330
+ }
10331
+ .q-spreadsheet__status-zoom-pct:hover {
10332
+ color: var(--primary, #1976d2);
10333
+ border-color: var(--primary, #1976d2);
10334
+ }
10335
+
10336
+ /* ─── Scroll animé (smooth) pour la virtualisation ─── */
10337
+ .q-spreadsheet__viewport {
10338
+ scroll-behavior: smooth;
10339
+ }
10340
+ .q-spreadsheet__viewport:focus {
10341
+ outline: none;
10342
+ }
10343
+ @media (prefers-reduced-motion: reduce) {
10344
+ .q-spreadsheet__viewport {
10345
+ scroll-behavior: auto;
10346
+ }
10347
+ }
10348
+
10349
+ /* ─── Onglets de feuilles en bas (Excel) ─── */
10350
+ .q-spreadsheet__sheets--bottom {
10351
+ align-items: flex-start;
10352
+ padding: 0 8px 6px;
10353
+ border-bottom: 0;
10354
+ border-top: 1px solid var(--q-spreadsheet-border);
10355
+ }
10356
+ .q-spreadsheet__sheets--bottom .q-spreadsheet__sheet-tab {
10357
+ border-top: 0;
10358
+ border-bottom: 1px solid transparent;
10359
+ border-radius: 0 0 7px 7px;
10360
+ }
10361
+ .q-spreadsheet__sheets--bottom .q-spreadsheet__sheet-tab--on {
10362
+ border-color: var(--q-spreadsheet-border);
10363
+ }
10364
+ .q-spreadsheet__sheets--bottom .q-spreadsheet__sheet-add {
10365
+ margin: 4px 2px 0;
10366
+ }
10367
+
10368
+ /* ─── Drag & drop réordonner lignes / colonnes ─── */
10369
+ .q-spreadsheet__rownum,
10370
+ .q-spreadsheet__colhead {
10371
+ cursor: grab;
10372
+ }
10373
+ .q-spreadsheet__rownum--drop,
10374
+ .q-spreadsheet__colhead--drop {
10375
+ background: rgb(25 118 210 / 0.22) !important;
10376
+ }
10377
+
10378
+ /* ===== QInteract (drag & resize de widgets) ===== */
10379
+ .q-interact {
10380
+ --q-interact-border: rgb(0 0 0 / 0.1);
10381
+ --q-interact-line: rgb(25 118 210 / 0.14);
10382
+ --q-interact-accent: var(--primary, #1976d2);
10383
+
10384
+ position: relative;
10385
+ width: 100%;
10386
+ overflow: hidden;
10387
+ border: 1px solid var(--q-interact-border);
10388
+ border-radius: 10px;
10389
+ background: rgb(0 0 0 / 0.015);
10390
+ user-select: none;
10391
+ }
10392
+ .q-interact--grid {
10393
+ background-image:
10394
+ linear-gradient(var(--q-interact-line) 1px, transparent 1px),
10395
+ linear-gradient(90deg, var(--q-interact-line) 1px, transparent 1px);
10396
+ background-position: -1px -1px;
10397
+ }
10398
+ .q-interact--static {
10399
+ cursor: default;
10400
+ }
10401
+ .q-interact__item {
10402
+ position: absolute;
10403
+ display: flex;
10404
+ flex-direction: column;
10405
+ border: 1px solid var(--q-interact-border);
10406
+ border-radius: 8px;
10407
+ background: var(--card, #fff);
10408
+ box-shadow: 0 1px 3px rgb(0 0 0 / 0.08);
10409
+ cursor: grab;
10410
+ touch-action: none;
10411
+ }
10412
+ .q-interact__item--active {
10413
+ border-color: var(--q-interact-accent);
10414
+ box-shadow: 0 0 0 1.5px var(--q-interact-accent), 0 6px 18px rgb(0 0 0 / 0.12);
10415
+ z-index: 10;
10416
+ }
10417
+ .q-interact__item--dragging,
10418
+ .q-interact__item--resizing {
10419
+ z-index: 11;
10420
+ cursor: grabbing;
10421
+ box-shadow: 0 12px 26px rgb(0 0 0 / 0.18);
10422
+ }
10423
+ .q-interact__handle {
10424
+ display: flex;
10425
+ align-items: center;
10426
+ gap: 6px;
10427
+ padding: 5px 10px;
10428
+ font-size: 12px;
10429
+ font-weight: 600;
10430
+ color: var(--foreground, #1d1d1d);
10431
+ border-bottom: 1px solid var(--q-interact-border);
10432
+ background: rgb(0 0 0 / 0.03);
10433
+ cursor: grab;
10434
+ }
10435
+ .q-interact--dense .q-interact__handle {
10436
+ padding: 3px 8px;
10437
+ font-size: 11px;
10438
+ }
10439
+ .q-interact__grip {
10440
+ display: inline-flex;
10441
+ color: #8b93a1;
10442
+ }
10443
+ .q-interact__content {
10444
+ flex: 1;
10445
+ min-height: 0;
10446
+ overflow: hidden;
10447
+ }
10448
+ .q-interact__default {
10449
+ padding: 12px;
10450
+ font-size: 13px;
10451
+ }
10452
+ .q-interact__resize {
10453
+ position: absolute;
10454
+ right: 0;
10455
+ bottom: 0;
10456
+ z-index: 2;
10457
+ width: 18px;
10458
+ height: 18px;
10459
+ cursor: nwse-resize;
10460
+ }
10461
+ .q-interact__resize::after {
10462
+ content: "";
10463
+ position: absolute;
10464
+ right: 3px;
10465
+ bottom: 3px;
10466
+ width: 8px;
10467
+ height: 8px;
10468
+ border-right: 2px solid var(--q-interact-accent);
10469
+ border-bottom: 2px solid var(--q-interact-accent);
10470
+ opacity: 0.55;
10471
+ }
10472
+ .q-interact__item:hover .q-interact__resize::after {
10473
+ opacity: 1;
10474
+ }
10475
+ .q-interact--dark {
10476
+ --q-interact-border: rgb(255 255 255 / 0.12);
10477
+ background: rgb(255 255 255 / 0.02);
10478
+ }
10479
+ .q-interact--dark .q-interact__item {
10480
+ background: var(--card, #1d1d1d);
10481
+ color: #ececef;
10482
+ }
10483
+ .q-interact--dark .q-interact__handle {
10484
+ background: rgb(255 255 255 / 0.05);
10485
+ }
10486
+
10487
+ /* ===== QBoard (dashboard type Power BI) ===== */
10488
+ .q-board {
10489
+ --q-board-line: rgb(25 118 210 / 0.12);
10490
+ --q-board-label: rgb(139 147 161 / 0.6);
10491
+
10492
+ position: relative;
10493
+ width: 100%;
10494
+ border: 1px solid var(--q-interact-border, rgb(0 0 0 / 0.1));
10495
+ border-radius: 10px;
10496
+ background: rgb(0 0 0 / 0.02);
10497
+ overflow: hidden;
10498
+ }
10499
+ .q-board__grid {
10500
+ position: absolute;
10501
+ inset: 0;
10502
+ background-image:
10503
+ linear-gradient(var(--q-board-line) 1px, transparent 1px),
10504
+ linear-gradient(90deg, var(--q-board-line) 1px, transparent 1px);
10505
+ background-position: -1px -1px;
10506
+ pointer-events: none;
10507
+ }
10508
+ .q-board__cell-label {
10509
+ position: absolute;
10510
+ display: flex;
10511
+ align-items: center;
10512
+ justify-content: center;
10513
+ font-size: 10px;
10514
+ color: var(--q-board-label);
10515
+ user-select: none;
10516
+ }
10517
+ .q-board__cell-label--col {
10518
+ top: 2px;
10519
+ }
10520
+ .q-board__cell-label--row {
10521
+ left: 3px;
10522
+ }
10523
+ .q-board__interact {
10524
+ position: absolute !important;
10525
+ inset: 0 !important;
10526
+ width: 100% !important;
10527
+ height: 100% !important;
10528
+ border: 0 !important;
10529
+ border-radius: 0 !important;
10530
+ background: transparent !important;
10531
+ box-shadow: none !important;
10532
+ }
10533
+ .q-board--dark {
10534
+ --q-board-line: rgb(255 255 255 / 0.1);
10535
+ background: rgb(255 255 255 / 0.02);
10536
+ }
10537
+ .q-board--dense .q-board__cell-label {
10538
+ font-size: 9px;
10539
+ }