@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/components/QApp.vue +13 -6
- package/components/QChart.vue +533 -0
- package/components/QDatePicker.vue +95 -14
- package/components/QFooter.vue +16 -2
- package/components/QHeader.vue +16 -2
- package/components/QLayout.vue +138 -0
- package/components/QSidebar.vue +20 -3
- package/components/internal/QDateCalendar.vue +112 -19
- package/index.ts +24 -2
- package/lib/chart.test.ts +991 -0
- package/lib/chart.ts +1340 -0
- package/lib/color.test.ts +81 -0
- package/lib/color.ts +60 -0
- package/lib/datePicker.test.ts +122 -0
- package/lib/datePicker.ts +114 -0
- package/lib/layout.test.ts +125 -0
- package/lib/layout.ts +181 -0
- package/module.ts +0 -18
- package/package.json +2 -10
- package/scripts/generate-exports.ts +22 -0
- package/styles/main.css +320 -132
- package/components/QEditorJs.vue +0 -146
- package/components/QVideo.vue +0 -305
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.
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
:
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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;
|