@dnax/ui 0.0.43 → 0.0.45

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/module.ts CHANGED
@@ -20,15 +20,6 @@ export interface DnaxUiModuleOptions {
20
20
  overlayBack?: boolean
21
21
  }
22
22
 
23
- /** Custom elements du framework HTML Video.js v10 (@videojs/html) — balises non-Vue */
24
- const VIDEOJS_CUSTOM_ELEMENTS = [
25
- "video-player",
26
- "video-skin",
27
- "youtube-video",
28
- "hlsjs-video",
29
- "mux-video",
30
- ]
31
-
32
23
  export default defineNuxtModule<DnaxUiModuleOptions>({
33
24
  meta: {
34
25
  name: "@dnax/ui",
@@ -43,15 +34,6 @@ export default defineNuxtModule<DnaxUiModuleOptions>({
43
34
  setup(options, nuxt) {
44
35
  const { resolve } = createResolver(import.meta.url)
45
36
 
46
- // Les balises <video-player>/<youtube-video>… sont des custom elements @videojs/html,
47
- // pas des composants Vue → les exclure de la résolution (évite le warn
48
- // « Failed to resolve component »).
49
- nuxt.options.vue.compilerOptions ??= {}
50
- const existing = nuxt.options.vue.compilerOptions.isCustomElement
51
- nuxt.options.vue.compilerOptions.isCustomElement = (tag: string) =>
52
- VIDEOJS_CUSTOM_ELEMENTS.includes(tag) ||
53
- (typeof existing === "function" ? existing(tag) : false)
54
-
55
37
  if (options.css) {
56
38
  const cssPath = resolve("./styles/main.css")
57
39
  if (!nuxt.options.css.includes(cssPath)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dnax/ui",
3
- "version": "0.0.43",
3
+ "version": "0.0.45",
4
4
  "module": "index.ts",
5
5
  "description": "UI design System",
6
6
  "type": "module",
@@ -22,14 +22,6 @@
22
22
  "vue": "^3.5.41"
23
23
  },
24
24
  "dependencies": {
25
- "@editorjs/checklist": "^1.6.0",
26
- "@editorjs/code": "^2.9.4",
27
- "@editorjs/delimiter": "^1.4.2",
28
- "@editorjs/editorjs": "^2.31.6",
29
- "@editorjs/header": "^2.8.9",
30
- "@editorjs/list": "^2.0.9",
31
- "@editorjs/paragraph": "^2.11.7",
32
- "@editorjs/quote": "^2.7.6",
33
25
  "@iconify/vue": "^5.0.1",
34
26
  "@nuxt/kit": "4.5.2",
35
27
  "@tiptap/extension-bubble-menu": "^3.31.3",
@@ -48,11 +40,11 @@
48
40
  "@tiptap/starter-kit": "^3.31.3",
49
41
  "@tiptap/suggestion": "^3.31.3",
50
42
  "@tiptap/vue-3": "^3.31.3",
51
- "@videojs/html": "^10.0.0-beta.32",
52
43
  "@vueuse/core": "^14.4.0",
53
44
  "arktype": "^2.2.3",
54
45
  "class-variance-authority": "^0.7.1",
55
46
  "clsx": "^2.1.1",
47
+ "echarts": "^6.1.0",
56
48
  "embla-carousel": "^8.5.0",
57
49
  "embla-carousel-vue": "^8.5.0",
58
50
  "fuse.js": "^7.1.0",
@@ -54,8 +54,30 @@ export {
54
54
  } from "./lib/overlayBack"
55
55
  export type { OverlayHandle } from "./lib/overlayBack"
56
56
  export { markOverlayClose, closeParentOverlay, vClose } from "./lib/closeOverlay"
57
+ export { placePopover } from "./lib/datePicker"
58
+ export type {
59
+ PlacePopoverOptions,
60
+ PopoverAnchor,
61
+ PopoverPlacement,
62
+ PopoverViewport,
63
+ } from "./lib/datePicker"
64
+ export { DEFAULT_LAYOUT_VIEW, parseView, qLayoutKey } from "./lib/layout"
65
+ export type { LayoutView, LayoutZone, LayoutZonePlacement, QLayoutContext } from "./lib/layout"
57
66
  export { vRipple } from "./lib/ripple"
58
67
  export type { RippleOptions, RippleValue } from "./lib/ripple"
68
+ export { chartToECharts, channelValue, pickFromEvent, tableModel, textValue } from "./lib/chart"
69
+ export type {
70
+ QChartAxis,
71
+ QChartChannel,
72
+ QChartColumn,
73
+ QChartConfig,
74
+ QChartLegend,
75
+ QChartMark,
76
+ QChartMarkType,
77
+ QChartOrientation,
78
+ QChartTable,
79
+ QChartPick,
80
+ } from "./lib/chart"
59
81
  export { vTouchPan } from "./lib/touchPan"
60
82
  export type { PanDetails, TouchPanHandler, PanDirection } from "./lib/touchPan"
61
83
  export { vTouchHold } from "./lib/touchHold"
package/styles/main.css CHANGED
@@ -52,8 +52,13 @@ body {
52
52
  .q-app {
53
53
  display: flex;
54
54
  flex-direction: column; /* header en haut, contenu au milieu, footer en bas */
55
- min-height: 100vh;
56
- min-height: 100dvh; /* barres de navigateur dynamiques (mobile) */
55
+ width: 100%; /* prend toute la largeur disponible */
56
+ /* Équivalent PUR CSS de `flex h-screen w-full` (les classes sont aussi sur la
57
+ div) : le conteneur fait exactement un écran. Ce qui dépasse doit donc défiler
58
+ dans un enfant (`min-height: 0` + `overflow: auto`), sinon le document scrolle
59
+ sous les barres. */
60
+ height: 100vh; /* fallback vieux navigateurs */
61
+ height: 100dvh; /* barres de navigateur dynamiques (mobile) */
57
62
  }
58
63
 
59
64
  /* Safe-area intégrées aux règles de base (pas de conflit de cascade) */
@@ -79,6 +84,16 @@ body {
79
84
  z-index: 100;
80
85
  }
81
86
 
87
+ /* sticky : opt-in (prop `sticky`, ou automatique dans un QLayout quand la lettre du
88
+ `view` est en majuscule) — la barre reste visible, le contenu défile dessous.
89
+ Dans un QLayout elle est close dans sa cellule : elle ne peut pas passer au-dessus
90
+ d'une colonne voisine (drawer, rangée du milieu). */
91
+ .q-header--sticky {
92
+ position: sticky;
93
+ top: 0;
94
+ z-index: 100;
95
+ }
96
+
82
97
  /* Barre d'action basse */
83
98
  /* Safe-area intégrées à la règle de base .q-footer (plus bas) */
84
99
 
@@ -105,6 +120,49 @@ body {
105
120
  padding-bottom: calc(env(safe-area-inset-bottom) + 50px);
106
121
  }
107
122
 
123
+ /* ===== QLayout — matrice 3×3 pilotée par `view` =====
124
+ Colonnes : drawer gauche / contenu / drawer droit. Rangées : header / milieu /
125
+ footer. `grid-template-areas` vient du prop `view` (variable CSS posée par le
126
+ composant). `minmax(0, 1fr)` sur la colonne du milieu = l'équivalent de
127
+ `min-width: 0` : un enfant large (tableau à colonnes nombreuses) ne pousse plus
128
+ les drawers hors de l'écran. */
129
+ .q-layout {
130
+ display: grid;
131
+ grid-template-columns: auto minmax(0, 1fr) auto;
132
+ grid-template-rows: auto minmax(0, 1fr) auto;
133
+ grid-template-areas: var(--q-layout-areas);
134
+ min-height: 100vh;
135
+ min-height: 100dvh;
136
+ }
137
+
138
+ /* Tout enfant direct sans cellule explicite (le contenu) va dans la cellule « page ».
139
+ q-header / q-footer / q-sidebar posent la leur en style inline — l'ordre
140
+ d'écriture dans le template est donc libre. */
141
+ .q-layout > * {
142
+ grid-area: var(--q-layout-page-area, p);
143
+ }
144
+
145
+ /* Mode conteneur (comme Quasar) : le layout gère son propre cadre — une hauteur
146
+ explicite est requise et le conteneur devient la zone de scroll (les barres
147
+ sticky s'y accrochent, pas à la fenêtre). */
148
+ .q-layout--container {
149
+ min-height: 0;
150
+ overflow: auto;
151
+ }
152
+
153
+ /* Drawer sticky dans un QLayout : accroché sous les barres qui le surplombent
154
+ seulement (les variables `--q-sidebar-sticky-*` sont posées par QSidebar d'après
155
+ les cellules de sa zone), sur la hauteur visible entre les deux barres — il ne
156
+ glisse donc jamais sous le header. */
157
+ .q-layout > .q-sidebar--static.q-sidebar--sticky {
158
+ top: var(--q-sidebar-sticky-top, var(--q-layout-header-h, 0px));
159
+ height: calc(
160
+ var(--q-layout-viewport-h, 100dvh) -
161
+ var(--q-sidebar-sticky-top, var(--q-layout-header-h, 0px)) -
162
+ var(--q-sidebar-sticky-bottom, var(--q-layout-footer-h, 0px))
163
+ );
164
+ }
165
+
108
166
  .q-toolbar {
109
167
  position: relative;
110
168
  display: flex;
@@ -203,31 +261,66 @@ body {
203
261
  border-color: rgb(244 67 54 / 0.4);
204
262
  }
205
263
 
206
- /* ===== Tokens de couleur (palette Material façon Quasar) ===== */
207
- :root {
208
- --primary: #1976d2;
209
- --primary-foreground: #fff;
210
- --secondary: #26a69a;
211
- --secondary-foreground: #fff;
212
- --accent: #9c27b0;
213
- --accent-foreground: #fff;
214
- --dark: #1d1d1d;
215
- --dark-foreground: #fff;
216
- --positive: #21ba45;
217
- --positive-foreground: #fff;
218
- --negative: #c10015;
219
- --negative-foreground: #fff;
220
- --info: #31ccec;
221
- --info-foreground: #fff;
222
- --warning: #f2c037;
223
- --warning-foreground: #1d1d1d;
224
-
225
- /* Tokens sémantiques (utilisés par le mode sombre) */
226
- --background: #ffffff;
227
- --foreground: #1d1d1d;
228
- --card: #ffffff;
229
- --muted: #f4f6f9;
230
- --border: rgb(0 0 0 / 0.12);
264
+ /* ===== Tokens de couleur (palette Material façon Quasar) =====
265
+ Déclarés dans `@layer dnax-tokens` : une règle hors couche (le thème de
266
+ l'application hôte) gagne toujours sur une règle en couche, quelle que soit
267
+ la spécificité et l'ordre d'émission. Sans cette couche, ce `:root` — émis
268
+ *après* le CSS de l'hôte — écrasait ses tokens de même nom (`--primary`,
269
+ `--accent`, `--muted`, `--border`…). C'est ce qui faisait apparaître le
270
+ violet `--accent: #9c27b0` dans les docs à thème bleu (Docd/Docus).
271
+ Attention : les noms shadcn n'ont pas le même sens ici (`--accent` = couleur
272
+ d'accent Material, pas la surface de survol shadcn). */
273
+ @layer dnax-tokens {
274
+ :root {
275
+ --primary: #1976d2;
276
+ --primary-foreground: #fff;
277
+ --secondary: #26a69a;
278
+ --secondary-foreground: #fff;
279
+ --accent: #9c27b0;
280
+ --accent-foreground: #fff;
281
+ --dark: #1d1d1d;
282
+ --dark-foreground: #fff;
283
+ --positive: #21ba45;
284
+ --positive-foreground: #fff;
285
+ --negative: #c10015;
286
+ --negative-foreground: #fff;
287
+ --info: #31ccec;
288
+ --info-foreground: #fff;
289
+ --warning: #f2c037;
290
+ --warning-foreground: #1d1d1d;
291
+
292
+ /* Tokens sémantiques (utilisés par le mode sombre) */
293
+ --background: #ffffff;
294
+ --foreground: #1d1d1d;
295
+ --card: #ffffff;
296
+ --muted: #f4f6f9;
297
+ --border: rgb(0 0 0 / 0.12);
298
+
299
+ /* Palette des séries de <q-chart> (convention `--chart-N`, reprise de shadcn) :
300
+ ce sont les SEULES couleurs de la palette Material à être faites pour ça —
301
+ `--secondary` et `--accent` sont des surfaces chez shadcn-vue, pas des
302
+ couleurs de série (une ligne de leur couleur serait invisible). */
303
+ --chart-1: #1976d2;
304
+ --chart-2: #26a69a;
305
+ --chart-3: #9c27b0;
306
+ --chart-4: #31ccec;
307
+ --chart-5: #21ba45;
308
+ --chart-6: #f2c037;
309
+ }
310
+
311
+ /* Mode sombre : mêmes règles de priorité que ci-dessus. */
312
+ .dark {
313
+ --background: #0f1115;
314
+ --foreground: #e6edf3;
315
+ --card: #161b22;
316
+ --muted: #1c2128;
317
+ --border: rgb(255 255 255 / 0.12);
318
+ --q-table-border: rgb(255 255 255 / 0.12);
319
+ --q-table-header-bg: rgb(255 255 255 / 0.04);
320
+ --q-table-hover-bg: rgb(255 255 255 / 0.06);
321
+ --q-sidebar-border: rgb(255 255 255 / 0.12);
322
+ --q-translucent-bg: #0f1115;
323
+ }
231
324
  }
232
325
 
233
326
  /* ===== Mode sombre (QConfigProvider mode="dark" | "system") =====
@@ -235,16 +328,6 @@ body {
235
328
  Les overlays téléportés au body (dialog, sheets) sont couverts via html.dark. */
236
329
  .dark {
237
330
  color-scheme: dark;
238
- --background: #0f1115;
239
- --foreground: #e6edf3;
240
- --card: #161b22;
241
- --muted: #1c2128;
242
- --border: rgb(255 255 255 / 0.12);
243
- --q-table-border: rgb(255 255 255 / 0.12);
244
- --q-table-header-bg: rgb(255 255 255 / 0.04);
245
- --q-table-hover-bg: rgb(255 255 255 / 0.06);
246
- --q-sidebar-border: rgb(255 255 255 / 0.12);
247
- --q-translucent-bg: #0f1115;
248
331
  }
249
332
 
250
333
  /* Surface de base : le conteneur et la page (html.dark body) */
@@ -628,6 +711,15 @@ html.dark body {
628
711
  z-index: 100;
629
712
  }
630
713
 
714
+ /* sticky (prop `sticky`, ou automatique dans un QLayout avec une lettre majuscule) :
715
+ la rangée footer étant la dernière, elle tombe en fin de page dans les deux cas —
716
+ `F` ne change donc rien de visible, contrairement à `H` sur le header. */
717
+ .q-footer--sticky {
718
+ position: sticky;
719
+ bottom: 0;
720
+ z-index: 100;
721
+ }
722
+
631
723
  /* no-padding : horizontal collé aux bords — safe-area conservées */
632
724
  .q-footer--no-padding {
633
725
  padding: 4px 0;
@@ -5541,6 +5633,57 @@ a.q-breadcrumbs__el:hover {
5541
5633
  overflow-y: auto;
5542
5634
  }
5543
5635
 
5636
+ /* — mode popover : panneau ancré au champ, sans voile — */
5637
+ /* `top`/`bottom`/`left` sont posés en inline par `positionPopover()` : le panneau
5638
+ suit le champ au scroll et bascule au-dessus quand la place manque. */
5639
+ .q-date-picker__overlay--popover {
5640
+ inset: auto;
5641
+ display: block;
5642
+ width: max-content;
5643
+ background-color: transparent;
5644
+ }
5645
+
5646
+ /* Flèche (caret) : portée par le voile et non par le panneau — `.q-date-picker__sheet`
5647
+ est en `overflow: hidden` et la rognerait. Elle est peinte *avant* le panneau (ordre
5648
+ du DOM) : seule sa moitié dépassante reste visible, le reste passe sous le bord. */
5649
+ .q-date-picker__overlay--popover::before {
5650
+ content: "";
5651
+ position: absolute;
5652
+ top: -5px;
5653
+ left: var(--q-date-picker-caret, 24px);
5654
+ width: 10px;
5655
+ height: 10px;
5656
+ margin-left: -5px;
5657
+ background-color: #fff;
5658
+ border-top: 1px solid rgb(0 0 0 / 0.08);
5659
+ border-left: 1px solid rgb(0 0 0 / 0.08);
5660
+ transform: rotate(45deg);
5661
+ }
5662
+
5663
+ .q-date-picker__overlay--popover-up::before {
5664
+ top: auto;
5665
+ bottom: -5px;
5666
+ border: none;
5667
+ border-right: 1px solid rgb(0 0 0 / 0.08);
5668
+ border-bottom: 1px solid rgb(0 0 0 / 0.08);
5669
+ }
5670
+
5671
+ .q-date-picker__sheet--popover {
5672
+ width: 360px;
5673
+ max-width: calc(100vw - 16px);
5674
+ border: 1px solid rgb(0 0 0 / 0.08);
5675
+ box-shadow: 0 10px 32px rgb(0 0 0 / 0.16);
5676
+ }
5677
+
5678
+ .dark .q-date-picker__overlay--popover::before {
5679
+ background-color: var(--card);
5680
+ border-color: rgb(255 255 255 / 0.12);
5681
+ }
5682
+
5683
+ .dark .q-date-picker__sheet--popover {
5684
+ border-color: rgb(255 255 255 / 0.12);
5685
+ }
5686
+
5544
5687
  /* — calendrier — */
5545
5688
  .q-date-calendar {
5546
5689
  display: flex;
@@ -5561,6 +5704,34 @@ a.q-breadcrumbs__el:hover {
5561
5704
  font-weight: 600;
5562
5705
  }
5563
5706
 
5707
+ /* En-tête cliquable (prop `month-dropdown`) : même poids que le libellé simple */
5708
+ .q-date-calendar__nav-label--button {
5709
+ display: inline-flex;
5710
+ align-items: center;
5711
+ gap: 4px;
5712
+ padding: 4px 8px;
5713
+ border: none;
5714
+ border-radius: 8px;
5715
+ background: transparent;
5716
+ color: inherit;
5717
+ font: inherit;
5718
+ font-size: 14px;
5719
+ font-weight: 600;
5720
+ cursor: pointer;
5721
+ transition: background-color 0.15s ease;
5722
+ }
5723
+
5724
+ .q-date-calendar__nav-label--button:hover,
5725
+ .q-date-calendar__nav-label--open {
5726
+ background-color: rgb(0 0 0 / 0.06);
5727
+ }
5728
+
5729
+ .q-date-calendar__nav-caret {
5730
+ width: 14px;
5731
+ height: 14px;
5732
+ opacity: 0.65;
5733
+ }
5734
+
5564
5735
  .q-date-calendar__nav-btn {
5565
5736
  display: inline-flex;
5566
5737
  align-items: center;
@@ -5659,6 +5830,88 @@ a.q-breadcrumbs__el:hover {
5659
5830
  background-color: var(--primary);
5660
5831
  }
5661
5832
 
5833
+ /* — choix du mois / de l'année (en-tête cliquable) — */
5834
+ .q-date-calendar__picker {
5835
+ display: flex;
5836
+ flex-direction: column;
5837
+ gap: 8px;
5838
+ padding: 2px 0;
5839
+ }
5840
+
5841
+ .q-date-calendar__picker-year {
5842
+ display: flex;
5843
+ align-items: center;
5844
+ justify-content: space-between;
5845
+ }
5846
+
5847
+ .q-date-calendar__picker-year-label {
5848
+ font-size: 14px;
5849
+ font-weight: 600;
5850
+ }
5851
+
5852
+ .q-date-calendar__picker-months {
5853
+ display: grid;
5854
+ grid-template-columns: repeat(3, 1fr);
5855
+ gap: 4px;
5856
+ }
5857
+
5858
+ .q-date-calendar__picker-month {
5859
+ padding: 8px 0;
5860
+ border: none;
5861
+ border-radius: 8px;
5862
+ background: transparent;
5863
+ color: inherit;
5864
+ font: inherit;
5865
+ font-size: 13px;
5866
+ cursor: pointer;
5867
+ transition: background-color 0.15s ease;
5868
+ }
5869
+
5870
+ .q-date-calendar__picker-month:hover {
5871
+ background-color: rgb(0 0 0 / 0.06);
5872
+ }
5873
+
5874
+ .q-date-calendar__picker-month--current {
5875
+ background-color: var(--primary);
5876
+ color: var(--primary-foreground);
5877
+ font-weight: 600;
5878
+ }
5879
+
5880
+ .q-date-calendar__picker-month--current:hover {
5881
+ background-color: var(--primary);
5882
+ }
5883
+
5884
+ /* — raccourci « Today » (prop `today-btn`) : bord à bord dans le panneau — */
5885
+ .q-date-calendar__footer {
5886
+ display: flex;
5887
+ justify-content: flex-end;
5888
+ margin: 0 -12px -12px;
5889
+ padding: 8px 12px;
5890
+ border-top: 1px solid rgb(0 0 0 / 0.08);
5891
+ }
5892
+
5893
+ .q-date-calendar__today {
5894
+ padding: 2px 6px;
5895
+ border: none;
5896
+ border-radius: 6px;
5897
+ background: transparent;
5898
+ color: var(--primary);
5899
+ font: inherit;
5900
+ font-size: 13px;
5901
+ font-weight: 500;
5902
+ cursor: pointer;
5903
+ transition: background-color 0.15s ease;
5904
+ }
5905
+
5906
+ .q-date-calendar__today:hover {
5907
+ background-color: rgb(0 0 0 / 0.04);
5908
+ }
5909
+
5910
+ .q-date-calendar__today:disabled {
5911
+ opacity: 0.4;
5912
+ cursor: default;
5913
+ }
5914
+
5662
5915
  /* — transition panneau — */
5663
5916
  .q-date-modal-enter-active,
5664
5917
  .q-date-modal-leave-active {
@@ -5678,6 +5931,36 @@ a.q-breadcrumbs__el:hover {
5678
5931
  animation: q-sheet-pop-out 0.2s ease forwards;
5679
5932
  }
5680
5933
 
5934
+ /* — transition popover : le panneau entre par le bas (ou par le haut s'il est basculé) — */
5935
+ .q-date-popover-enter-active,
5936
+ .q-date-popover-leave-active {
5937
+ transition: opacity 0.12s ease;
5938
+ }
5939
+
5940
+ .q-date-popover-enter-from,
5941
+ .q-date-popover-leave-to {
5942
+ opacity: 0;
5943
+ }
5944
+
5945
+ .q-date-popover-enter-active .q-date-picker__sheet {
5946
+ animation: q-popup-in 0.12s ease;
5947
+ }
5948
+
5949
+ .q-date-popover-leave-active .q-date-picker__sheet {
5950
+ animation: q-date-popover-out 0.1s ease forwards;
5951
+ }
5952
+
5953
+ .q-date-picker__overlay--popover-up.q-date-popover-enter-active .q-date-picker__sheet {
5954
+ animation: q-popup-in-up 0.12s ease;
5955
+ }
5956
+
5957
+ @keyframes q-date-popover-out {
5958
+ to {
5959
+ opacity: 0;
5960
+ transform: translateY(-4px);
5961
+ }
5962
+ }
5963
+
5681
5964
  /* ===== QCountryPicker : panneaux sheet / modal / dialog ===== */
5682
5965
  .q-country-picker__overlay {
5683
5966
  position: fixed;
@@ -9416,101 +9699,6 @@ a.q-breadcrumbs__el:hover {
9416
9699
  border-radius: 50%;
9417
9700
  }
9418
9701
 
9419
- /* ===== QEditorJs (Editor.js, éditeur par blocs) ===== */
9420
- .q-editor-js {
9421
- border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9422
- border-radius: var(--q-radius, 12px);
9423
- background: var(--card, #ffffff);
9424
- color: var(--foreground, #1d1d1d);
9425
- overflow: hidden;
9426
- transition: border-color 0.15s ease;
9427
- }
9428
- .q-editor-js:focus-within {
9429
- border-color: var(--primary, #1976d2);
9430
- }
9431
- .q-editor-js--disable {
9432
- opacity: 0.7;
9433
- pointer-events: none;
9434
- }
9435
- .q-editor-js__holder {
9436
- padding: 14px 16px;
9437
- }
9438
- .q-editor-js .codex-editor__redactor {
9439
- padding-bottom: 40px;
9440
- }
9441
- .q-editor-js .ce-block__content,
9442
- .q-editor-js .ce-toolbar__content {
9443
- max-width: none;
9444
- }
9445
- .q-editor-js .ce-block {
9446
- margin-bottom: 8px;
9447
- }
9448
- .q-editor-js .ce-paragraph {
9449
- color: var(--foreground, #1d1d1d);
9450
- font-size: 14px;
9451
- line-height: 1.7;
9452
- outline: none;
9453
- }
9454
- .q-editor-js .ce-paragraph[data-placeholder]:empty::before {
9455
- color: var(--muted, #8b93a1);
9456
- }
9457
- .q-editor-js .ce-header {
9458
- color: var(--foreground, #1d1d1d);
9459
- font-weight: 700;
9460
- line-height: 1.3;
9461
- }
9462
- .q-editor-js h1.ce-header {
9463
- font-size: 1.55em;
9464
- }
9465
- .q-editor-js h2.ce-header {
9466
- font-size: 1.3em;
9467
- }
9468
- .q-editor-js h3.ce-header {
9469
- font-size: 1.1em;
9470
- }
9471
- .q-editor-js .cdx-list {
9472
- color: var(--foreground, #1d1d1d);
9473
- line-height: 1.7;
9474
- }
9475
- .q-editor-js .cdx-checklist {
9476
- color: var(--foreground, #1d1d1d);
9477
- }
9478
- .q-editor-js .ce-code__textarea {
9479
- background: color-mix(in srgb, var(--foreground, #1d1d1d) 6%, transparent);
9480
- color: var(--foreground, #1d1d1d);
9481
- border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9482
- border-radius: 8px;
9483
- font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
9484
- }
9485
- .q-editor-js .cdx-quote {
9486
- margin: 0;
9487
- padding: 10px 14px;
9488
- border-left: 3px solid var(--primary, #1976d2);
9489
- background: color-mix(in srgb, var(--primary, #1976d2) 8%, transparent);
9490
- color: var(--foreground, #1d1d1d);
9491
- border-radius: 0 8px 8px 0;
9492
- }
9493
- .q-editor-js .ce-toolbar__plus,
9494
- .q-editor-js .ce-toolbar__settings-btn {
9495
- color: var(--foreground, #1d1d1d);
9496
- }
9497
- .q-editor-js .ce-toolbar__plus:hover,
9498
- .q-editor-js .ce-toolbar__settings-btn:hover {
9499
- color: var(--primary, #1976d2);
9500
- }
9501
- .q-editor-js .ce-inline-toolbar,
9502
- .q-editor-js .ce-conv-toolbar,
9503
- .q-editor-js .ce-toolbox__button,
9504
- .q-editor-js .ce-popover {
9505
- background: var(--card, #ffffff);
9506
- color: var(--foreground, #1d1d1d);
9507
- border: 1px solid var(--border, rgb(0 0 0 / 0.12));
9508
- }
9509
- .q-editor-js .ce-toolbox__button--active,
9510
- .q-editor-js .ce-inline-tool--active {
9511
- color: var(--primary, #1976d2);
9512
- }
9513
-
9514
9702
  /* NodeView Vue de la table : wrapper + table + tbody (contentDOM) */
9515
9703
  .q-tiptap__editor .ProseMirror .q-tiptap__table-wrapper {
9516
9704
  position: relative;