@dnax/ui 0.0.18 → 0.0.20

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.
@@ -53,6 +53,8 @@ interface Props {
53
53
  sheetOptions?: QAutocompleteModeOptions
54
54
  /** Options spécifiques au mode modal */
55
55
  modalOptions?: QAutocompleteModeOptions
56
+ /** En mode sheet, swipe vers le bas sur le header pour fermer */
57
+ swipeToClose?: boolean
56
58
  }
57
59
 
58
60
  export interface QAutocompleteModeOptions {
@@ -86,6 +88,7 @@ const props = withDefaults(defineProps<Props>(), {
86
88
  loading: false,
87
89
  noOptionsLabel: "No options to display",
88
90
  mode: "inline",
91
+ swipeToClose: false,
89
92
  })
90
93
 
91
94
  const emit = defineEmits<{
@@ -157,6 +160,41 @@ const sheetTitle = computed(
157
160
  () => modeOptions.value?.title ?? props.title ?? props.label ?? props.placeholder ?? "Select",
158
161
  )
159
162
 
163
+ // — Swipe down pour fermer (mode sheet, opt-in swipe-to-close) —
164
+ const dragging = ref(false)
165
+ let dragStartY = 0
166
+ let dragDy = 0
167
+ const canSwipe = computed(() => props.swipeToClose && props.mode === "sheet")
168
+
169
+ const onDragStart = (e: PointerEvent) => {
170
+ if (!canSwipe.value) return
171
+ ;(e.target as HTMLElement).setPointerCapture(e.pointerId)
172
+ dragStartY = e.clientY
173
+ dragDy = 0
174
+ dragging.value = true
175
+ }
176
+
177
+ const onDragMove = (e: PointerEvent) => {
178
+ if (!dragging.value) return
179
+ dragDy = Math.max(0, e.clientY - dragStartY)
180
+ if (sheetRef.value) sheetRef.value.style.transform = `translateY(${dragDy}px)`
181
+ }
182
+
183
+ const onDragEnd = () => {
184
+ if (!dragging.value) return
185
+ dragging.value = false
186
+ if (dragDy > 80) closePopup()
187
+ else if (sheetRef.value) sheetRef.value.style.transform = ""
188
+ dragDy = 0
189
+ }
190
+
191
+ const sheetClasses = computed(() => [
192
+ `q-autocomplete__sheet--${props.mode}`,
193
+ modeOptions.value?.class,
194
+ dragging.value && "q-autocomplete__sheet--dragging",
195
+ canSwipe.value && "q-autocomplete__sheet--swipeable",
196
+ ])
197
+
160
198
  // — Valeurs des options —
161
199
  const getValue = (opt: any): any =>
162
200
  typeof props.optionValue === "function" ? props.optionValue(opt) : opt?.[props.optionValue]
@@ -428,13 +466,19 @@ watch(open, (v) => {
428
466
  <div
429
467
  ref="sheetRef"
430
468
  class="q-autocomplete__sheet"
431
- :class="[`q-autocomplete__sheet--${mode}`, modeOptions?.class]"
469
+ :class="sheetClasses"
432
470
  :style="[sheetStyle, modeOptions?.style]"
433
471
  role="dialog"
434
472
  aria-modal="true"
435
473
  :aria-label="sheetTitle"
436
474
  >
437
- <div class="q-autocomplete__sheet-header">
475
+ <div
476
+ class="q-autocomplete__sheet-header"
477
+ @pointerdown="onDragStart"
478
+ @pointermove="onDragMove"
479
+ @pointerup="onDragEnd"
480
+ @pointercancel="onDragEnd"
481
+ >
438
482
  <span class="q-autocomplete__sheet-title">{{ sheetTitle }}</span>
439
483
  <button
440
484
  type="button"
@@ -2,7 +2,6 @@
2
2
  // QCol — cellule de la grille : <q-col :span="6" :span-md="4" :offset="1">
3
3
  // Responsive : span-sm/md/lg/xl et offset-* écrasent la valeur de base au breakpoint.
4
4
  import { computed } from "vue"
5
- import { useGridBreakpoints } from "../lib/breakpoints"
6
5
 
7
6
  type ColSpan = number | "auto"
8
7
 
@@ -27,19 +26,19 @@ const props = withDefaults(defineProps<Props>(), {
27
26
  alignSelf: "stretch",
28
27
  })
29
28
 
30
- const bp = useGridBreakpoints()
31
-
29
+ // Les classes responsive (span-md-*…) sont TOUJOURS posées — ce sont les
30
+ // @media (min-width) du CSS qui les activent au bon breakpoint (pas de JS).
32
31
  const classes = computed(() => ({
33
32
  ...(props.span !== "auto" ? { [`q-col--span-${props.span}`]: true } : {}),
34
33
  ...(props.offset ? { [`q-col--offset-${props.offset}`]: true } : {}),
35
- ...(bp.value.sm && props.spanSm !== undefined && props.spanSm !== "auto" ? { [`q-col--span-sm-${props.spanSm}`]: true } : {}),
36
- ...(bp.value.sm && props.offsetSm ? { [`q-col--offset-sm-${props.offsetSm}`]: true } : {}),
37
- ...(bp.value.md && props.spanMd !== undefined && props.spanMd !== "auto" ? { [`q-col--span-md-${props.spanMd}`]: true } : {}),
38
- ...(bp.value.md && props.offsetMd ? { [`q-col--offset-md-${props.offsetMd}`]: true } : {}),
39
- ...(bp.value.lg && props.spanLg !== undefined && props.spanLg !== "auto" ? { [`q-col--span-lg-${props.spanLg}`]: true } : {}),
40
- ...(bp.value.lg && props.offsetLg ? { [`q-col--offset-lg-${props.offsetLg}`]: true } : {}),
41
- ...(bp.value.xl && props.spanXl !== undefined && props.spanXl !== "auto" ? { [`q-col--span-xl-${props.spanXl}`]: true } : {}),
42
- ...(bp.value.xl && props.offsetXl ? { [`q-col--offset-xl-${props.offsetXl}`]: true } : {}),
34
+ ...(props.spanSm !== undefined && props.spanSm !== "auto" ? { [`q-col--span-sm-${props.spanSm}`]: true } : {}),
35
+ ...(props.offsetSm ? { [`q-col--offset-sm-${props.offsetSm}`]: true } : {}),
36
+ ...(props.spanMd !== undefined && props.spanMd !== "auto" ? { [`q-col--span-md-${props.spanMd}`]: true } : {}),
37
+ ...(props.offsetMd ? { [`q-col--offset-md-${props.offsetMd}`]: true } : {}),
38
+ ...(props.spanLg !== undefined && props.spanLg !== "auto" ? { [`q-col--span-lg-${props.spanLg}`]: true } : {}),
39
+ ...(props.offsetLg ? { [`q-col--offset-lg-${props.offsetLg}`]: true } : {}),
40
+ ...(props.spanXl !== undefined && props.spanXl !== "auto" ? { [`q-col--span-xl-${props.spanXl}`]: true } : {}),
41
+ ...(props.offsetXl ? { [`q-col--offset-xl-${props.offsetXl}`]: true } : {}),
43
42
  }))
44
43
 
45
44
  const style = computed(() => (props.alignSelf !== "stretch" ? { alignSelf: props.alignSelf } : undefined))
@@ -4,7 +4,6 @@
4
4
  // Mode cellules (Vant) : activé par `column-num` → <q-grid-item> enfants
5
5
  // (icône + texte), ex. menu d'app : <q-grid :column-num="4" gutter="8" clickable>
6
6
  import { computed } from "vue"
7
- import { useGridBreakpoints } from "../lib/breakpoints"
8
7
 
9
8
  interface Props {
10
9
  /** Nombre de colonnes du layout (défaut : 12) */
@@ -60,8 +59,6 @@ const props = withDefaults(defineProps<Props>(), {
60
59
  iconColor: "",
61
60
  })
62
61
 
63
- const bp = useGridBreakpoints()
64
-
65
62
  const px = (v: string | number | undefined) =>
66
63
  v === undefined ? undefined : typeof v === "number" ? `${v}px` : v
67
64
 
@@ -84,12 +81,12 @@ const style = computed<Record<string, string>>(() => {
84
81
  s.alignItems = props.align
85
82
  return s
86
83
  })
87
-
84
+ // Classes cols responsive TOUJOURS posées — activées par les @media CSS
88
85
  const classes = computed(() => ({
89
- ...(bp.value.sm && props.colsSm ? { [`q-grid--cols-sm-${props.colsSm}`]: true } : {}),
90
- ...(bp.value.md && props.colsMd ? { [`q-grid--cols-md-${props.colsMd}`]: true } : {}),
91
- ...(bp.value.lg && props.colsLg ? { [`q-grid--cols-lg-${props.colsLg}`]: true } : {}),
92
- ...(bp.value.xl && props.colsXl ? { [`q-grid--cols-xl-${props.colsXl}`]: true } : {}),
86
+ ...(props.colsSm ? { [`q-grid--cols-sm-${props.colsSm}`]: true } : {}),
87
+ ...(props.colsMd ? { [`q-grid--cols-md-${props.colsMd}`]: true } : {}),
88
+ ...(props.colsLg ? { [`q-grid--cols-lg-${props.colsLg}`]: true } : {}),
89
+ ...(props.colsXl ? { [`q-grid--cols-xl-${props.colsXl}`]: true } : {}),
93
90
  "q-grid--cell": isCellMode.value,
94
91
  "q-grid--border": isCellMode.value && props.border,
95
92
  "q-grid--square": isCellMode.value && props.square,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dnax/ui",
3
- "version": "0.0.18",
3
+ "version": "0.0.20",
4
4
  "module": "index.ts",
5
5
  "description": "UI design System",
6
6
  "type": "module",
package/styles/main.css CHANGED
@@ -850,6 +850,9 @@ html.dark body {
850
850
  text-transform: uppercase;
851
851
  cursor: pointer;
852
852
  user-select: none;
853
+ /* Supprime le délai double-tap/zoom d'iOS qui « avalait » le premier tap
854
+ → la couleur active et la sélection se font dès le premier clic. */
855
+ touch-action: manipulation;
853
856
  transition:
854
857
  color 0.2s ease,
855
858
  background-color 0.2s ease,
@@ -857,9 +860,13 @@ html.dark body {
857
860
  transform 0.15s ease;
858
861
  }
859
862
 
860
- /* appui au clic : léger aplatissement (prop animated) */
861
- .q-tabs--animated .q-tab:active:not(:disabled) {
862
- transform: scale(0.94);
863
+ /* appui au clic : léger aplatissement (prop animated) — scopé aux devices avec
864
+ souris : sur mobile le scale peut faire sortir le point du doigt de l'élément
865
+ au relâchement et ANNULER le clic (second tap requis). */
866
+ @media (hover: hover) and (pointer: fine) {
867
+ .q-tabs--animated .q-tab:active:not(:disabled) {
868
+ transform: scale(0.94);
869
+ }
863
870
  }
864
871
 
865
872
  /* pop du tab actif (overshoot) — spring (défaut) et elastic */
@@ -1951,9 +1958,9 @@ html.dark body {
1951
1958
  display: inline-flex;
1952
1959
  flex-shrink: 0;
1953
1960
  color: rgb(0 0 0 / 0.45);
1954
- /* petit espace dédié entre l'icône gauche et la valeur (gap 6px du
1955
- control + 2px = 8px) — évite l'icône collée au texte */
1956
- margin-right: 2px;
1961
+ /* espace dédié entre l'icône gauche et la valeur (gap 6px du control + 6px
1962
+ = 12px) — l'icône ne doit jamais être collée au texte */
1963
+ margin-right: 6px;
1957
1964
  }
1958
1965
 
1959
1966
  .q-field__clear {
@@ -3459,6 +3466,22 @@ html.dark body {
3459
3466
  color: inherit;
3460
3467
  border-radius: var(--q-radius);
3461
3468
  box-shadow: 0 12px 40px rgb(0 0 0 / 0.3);
3469
+ transition: transform 0.25s ease;
3470
+ }
3471
+
3472
+ /* pendant le swipe : suivi direct, sans transition ni snap */
3473
+ .q-autocomplete__sheet--dragging {
3474
+ transition: none;
3475
+ }
3476
+
3477
+ /* le header est la zone qui attrape le swipe (cursor grab) — seulement si
3478
+ swipe-to-close est actif (classe --swipeable) */
3479
+ .q-autocomplete__sheet--swipeable .q-autocomplete__sheet-header {
3480
+ cursor: grab;
3481
+ touch-action: none;
3482
+ }
3483
+ .q-autocomplete__sheet--dragging .q-autocomplete__sheet-header {
3484
+ cursor: grabbing;
3462
3485
  }
3463
3486
  .q-autocomplete__overlay--modal .q-autocomplete__sheet {
3464
3487
  max-width: 480px;
@@ -7476,7 +7499,11 @@ html.dark body {
7476
7499
  }
7477
7500
  .q-col {
7478
7501
  min-width: 0;
7479
- grid-column-start: calc(var(--q-col-offset, 0) + 1);
7502
+ /* Placement auto par défaut : fallback -1 → calc(0) = 0 → valeur INVALIDE
7503
+ pour grid-column-start → la propriété retombe sur auto et l'item est
7504
+ auto-placé (sinon TOUS les q-col démarreraient en colonne 1 et se
7505
+ superposeraient — une seule colonne visible). */
7506
+ grid-column-start: calc(var(--q-col-offset, -1) + 1);
7480
7507
  grid-column-end: span var(--q-col-span, 1);
7481
7508
  }
7482
7509
  .q-col--span-1 { --q-col-span: 1; }
@@ -7502,146 +7529,162 @@ html.dark body {
7502
7529
  .q-col--offset-9 { --q-col-offset: 9; }
7503
7530
  .q-col--offset-10 { --q-col-offset: 10; }
7504
7531
  .q-col--offset-11 { --q-col-offset: 11; }
7505
- .q-col--span-sm-1 { --q-col-span: 1; }
7506
- .q-col--span-sm-2 { --q-col-span: 2; }
7507
- .q-col--span-sm-3 { --q-col-span: 3; }
7508
- .q-col--span-sm-4 { --q-col-span: 4; }
7509
- .q-col--span-sm-5 { --q-col-span: 5; }
7510
- .q-col--span-sm-6 { --q-col-span: 6; }
7511
- .q-col--span-sm-7 { --q-col-span: 7; }
7512
- .q-col--span-sm-8 { --q-col-span: 8; }
7513
- .q-col--span-sm-9 { --q-col-span: 9; }
7514
- .q-col--span-sm-10 { --q-col-span: 10; }
7515
- .q-col--span-sm-11 { --q-col-span: 11; }
7516
- .q-col--span-sm-12 { --q-col-span: 12; }
7517
- .q-col--offset-sm-1 { --q-col-offset: 1; }
7518
- .q-col--offset-sm-2 { --q-col-offset: 2; }
7519
- .q-col--offset-sm-3 { --q-col-offset: 3; }
7520
- .q-col--offset-sm-4 { --q-col-offset: 4; }
7521
- .q-col--offset-sm-5 { --q-col-offset: 5; }
7522
- .q-col--offset-sm-6 { --q-col-offset: 6; }
7523
- .q-col--offset-sm-7 { --q-col-offset: 7; }
7524
- .q-col--offset-sm-8 { --q-col-offset: 8; }
7525
- .q-col--offset-sm-9 { --q-col-offset: 9; }
7526
- .q-col--offset-sm-10 { --q-col-offset: 10; }
7527
- .q-col--offset-sm-11 { --q-col-offset: 11; }
7528
- .q-grid--cols-sm-1 { --q-grid-cols: 1; }
7529
- .q-grid--cols-sm-2 { --q-grid-cols: 2; }
7530
- .q-grid--cols-sm-3 { --q-grid-cols: 3; }
7531
- .q-grid--cols-sm-4 { --q-grid-cols: 4; }
7532
- .q-grid--cols-sm-5 { --q-grid-cols: 5; }
7533
- .q-grid--cols-sm-6 { --q-grid-cols: 6; }
7534
- .q-grid--cols-sm-7 { --q-grid-cols: 7; }
7535
- .q-grid--cols-sm-8 { --q-grid-cols: 8; }
7536
- .q-grid--cols-sm-9 { --q-grid-cols: 9; }
7537
- .q-grid--cols-sm-10 { --q-grid-cols: 10; }
7538
- .q-grid--cols-sm-11 { --q-grid-cols: 11; }
7539
- .q-grid--cols-sm-12 { --q-grid-cols: 12; }
7540
- .q-col--span-md-1 { --q-col-span: 1; }
7541
- .q-col--span-md-2 { --q-col-span: 2; }
7542
- .q-col--span-md-3 { --q-col-span: 3; }
7543
- .q-col--span-md-4 { --q-col-span: 4; }
7544
- .q-col--span-md-5 { --q-col-span: 5; }
7545
- .q-col--span-md-6 { --q-col-span: 6; }
7546
- .q-col--span-md-7 { --q-col-span: 7; }
7547
- .q-col--span-md-8 { --q-col-span: 8; }
7548
- .q-col--span-md-9 { --q-col-span: 9; }
7549
- .q-col--span-md-10 { --q-col-span: 10; }
7550
- .q-col--span-md-11 { --q-col-span: 11; }
7551
- .q-col--span-md-12 { --q-col-span: 12; }
7552
- .q-col--offset-md-1 { --q-col-offset: 1; }
7553
- .q-col--offset-md-2 { --q-col-offset: 2; }
7554
- .q-col--offset-md-3 { --q-col-offset: 3; }
7555
- .q-col--offset-md-4 { --q-col-offset: 4; }
7556
- .q-col--offset-md-5 { --q-col-offset: 5; }
7557
- .q-col--offset-md-6 { --q-col-offset: 6; }
7558
- .q-col--offset-md-7 { --q-col-offset: 7; }
7559
- .q-col--offset-md-8 { --q-col-offset: 8; }
7560
- .q-col--offset-md-9 { --q-col-offset: 9; }
7561
- .q-col--offset-md-10 { --q-col-offset: 10; }
7562
- .q-col--offset-md-11 { --q-col-offset: 11; }
7563
- .q-grid--cols-md-1 { --q-grid-cols: 1; }
7564
- .q-grid--cols-md-2 { --q-grid-cols: 2; }
7565
- .q-grid--cols-md-3 { --q-grid-cols: 3; }
7566
- .q-grid--cols-md-4 { --q-grid-cols: 4; }
7567
- .q-grid--cols-md-5 { --q-grid-cols: 5; }
7568
- .q-grid--cols-md-6 { --q-grid-cols: 6; }
7569
- .q-grid--cols-md-7 { --q-grid-cols: 7; }
7570
- .q-grid--cols-md-8 { --q-grid-cols: 8; }
7571
- .q-grid--cols-md-9 { --q-grid-cols: 9; }
7572
- .q-grid--cols-md-10 { --q-grid-cols: 10; }
7573
- .q-grid--cols-md-11 { --q-grid-cols: 11; }
7574
- .q-grid--cols-md-12 { --q-grid-cols: 12; }
7575
- .q-col--span-lg-1 { --q-col-span: 1; }
7576
- .q-col--span-lg-2 { --q-col-span: 2; }
7577
- .q-col--span-lg-3 { --q-col-span: 3; }
7578
- .q-col--span-lg-4 { --q-col-span: 4; }
7579
- .q-col--span-lg-5 { --q-col-span: 5; }
7580
- .q-col--span-lg-6 { --q-col-span: 6; }
7581
- .q-col--span-lg-7 { --q-col-span: 7; }
7582
- .q-col--span-lg-8 { --q-col-span: 8; }
7583
- .q-col--span-lg-9 { --q-col-span: 9; }
7584
- .q-col--span-lg-10 { --q-col-span: 10; }
7585
- .q-col--span-lg-11 { --q-col-span: 11; }
7586
- .q-col--span-lg-12 { --q-col-span: 12; }
7587
- .q-col--offset-lg-1 { --q-col-offset: 1; }
7588
- .q-col--offset-lg-2 { --q-col-offset: 2; }
7589
- .q-col--offset-lg-3 { --q-col-offset: 3; }
7590
- .q-col--offset-lg-4 { --q-col-offset: 4; }
7591
- .q-col--offset-lg-5 { --q-col-offset: 5; }
7592
- .q-col--offset-lg-6 { --q-col-offset: 6; }
7593
- .q-col--offset-lg-7 { --q-col-offset: 7; }
7594
- .q-col--offset-lg-8 { --q-col-offset: 8; }
7595
- .q-col--offset-lg-9 { --q-col-offset: 9; }
7596
- .q-col--offset-lg-10 { --q-col-offset: 10; }
7597
- .q-col--offset-lg-11 { --q-col-offset: 11; }
7598
- .q-grid--cols-lg-1 { --q-grid-cols: 1; }
7599
- .q-grid--cols-lg-2 { --q-grid-cols: 2; }
7600
- .q-grid--cols-lg-3 { --q-grid-cols: 3; }
7601
- .q-grid--cols-lg-4 { --q-grid-cols: 4; }
7602
- .q-grid--cols-lg-5 { --q-grid-cols: 5; }
7603
- .q-grid--cols-lg-6 { --q-grid-cols: 6; }
7604
- .q-grid--cols-lg-7 { --q-grid-cols: 7; }
7605
- .q-grid--cols-lg-8 { --q-grid-cols: 8; }
7606
- .q-grid--cols-lg-9 { --q-grid-cols: 9; }
7607
- .q-grid--cols-lg-10 { --q-grid-cols: 10; }
7608
- .q-grid--cols-lg-11 { --q-grid-cols: 11; }
7609
- .q-grid--cols-lg-12 { --q-grid-cols: 12; }
7610
- .q-col--span-xl-1 { --q-col-span: 1; }
7611
- .q-col--span-xl-2 { --q-col-span: 2; }
7612
- .q-col--span-xl-3 { --q-col-span: 3; }
7613
- .q-col--span-xl-4 { --q-col-span: 4; }
7614
- .q-col--span-xl-5 { --q-col-span: 5; }
7615
- .q-col--span-xl-6 { --q-col-span: 6; }
7616
- .q-col--span-xl-7 { --q-col-span: 7; }
7617
- .q-col--span-xl-8 { --q-col-span: 8; }
7618
- .q-col--span-xl-9 { --q-col-span: 9; }
7619
- .q-col--span-xl-10 { --q-col-span: 10; }
7620
- .q-col--span-xl-11 { --q-col-span: 11; }
7621
- .q-col--span-xl-12 { --q-col-span: 12; }
7622
- .q-col--offset-xl-1 { --q-col-offset: 1; }
7623
- .q-col--offset-xl-2 { --q-col-offset: 2; }
7624
- .q-col--offset-xl-3 { --q-col-offset: 3; }
7625
- .q-col--offset-xl-4 { --q-col-offset: 4; }
7626
- .q-col--offset-xl-5 { --q-col-offset: 5; }
7627
- .q-col--offset-xl-6 { --q-col-offset: 6; }
7628
- .q-col--offset-xl-7 { --q-col-offset: 7; }
7629
- .q-col--offset-xl-8 { --q-col-offset: 8; }
7630
- .q-col--offset-xl-9 { --q-col-offset: 9; }
7631
- .q-col--offset-xl-10 { --q-col-offset: 10; }
7632
- .q-col--offset-xl-11 { --q-col-offset: 11; }
7633
- .q-grid--cols-xl-1 { --q-grid-cols: 1; }
7634
- .q-grid--cols-xl-2 { --q-grid-cols: 2; }
7635
- .q-grid--cols-xl-3 { --q-grid-cols: 3; }
7636
- .q-grid--cols-xl-4 { --q-grid-cols: 4; }
7637
- .q-grid--cols-xl-5 { --q-grid-cols: 5; }
7638
- .q-grid--cols-xl-6 { --q-grid-cols: 6; }
7639
- .q-grid--cols-xl-7 { --q-grid-cols: 7; }
7640
- .q-grid--cols-xl-8 { --q-grid-cols: 8; }
7641
- .q-grid--cols-xl-9 { --q-grid-cols: 9; }
7642
- .q-grid--cols-xl-10 { --q-grid-cols: 10; }
7643
- .q-grid--cols-xl-11 { --q-grid-cols: 11; }
7644
- .q-grid--cols-xl-12 { --q-grid-cols: 12; }
7532
+
7533
+ /* breakpoint sm : >= 600px */
7534
+ @media (min-width: 600px) {
7535
+ .q-col--span-sm-1 { --q-col-span: 1; }
7536
+ .q-col--span-sm-2 { --q-col-span: 2; }
7537
+ .q-col--span-sm-3 { --q-col-span: 3; }
7538
+ .q-col--span-sm-4 { --q-col-span: 4; }
7539
+ .q-col--span-sm-5 { --q-col-span: 5; }
7540
+ .q-col--span-sm-6 { --q-col-span: 6; }
7541
+ .q-col--span-sm-7 { --q-col-span: 7; }
7542
+ .q-col--span-sm-8 { --q-col-span: 8; }
7543
+ .q-col--span-sm-9 { --q-col-span: 9; }
7544
+ .q-col--span-sm-10 { --q-col-span: 10; }
7545
+ .q-col--span-sm-11 { --q-col-span: 11; }
7546
+ .q-col--span-sm-12 { --q-col-span: 12; }
7547
+ .q-col--offset-sm-1 { --q-col-offset: 1; }
7548
+ .q-col--offset-sm-2 { --q-col-offset: 2; }
7549
+ .q-col--offset-sm-3 { --q-col-offset: 3; }
7550
+ .q-col--offset-sm-4 { --q-col-offset: 4; }
7551
+ .q-col--offset-sm-5 { --q-col-offset: 5; }
7552
+ .q-col--offset-sm-6 { --q-col-offset: 6; }
7553
+ .q-col--offset-sm-7 { --q-col-offset: 7; }
7554
+ .q-col--offset-sm-8 { --q-col-offset: 8; }
7555
+ .q-col--offset-sm-9 { --q-col-offset: 9; }
7556
+ .q-col--offset-sm-10 { --q-col-offset: 10; }
7557
+ .q-col--offset-sm-11 { --q-col-offset: 11; }
7558
+ .q-grid--cols-sm-1 { --q-grid-cols: 1; }
7559
+ .q-grid--cols-sm-2 { --q-grid-cols: 2; }
7560
+ .q-grid--cols-sm-3 { --q-grid-cols: 3; }
7561
+ .q-grid--cols-sm-4 { --q-grid-cols: 4; }
7562
+ .q-grid--cols-sm-5 { --q-grid-cols: 5; }
7563
+ .q-grid--cols-sm-6 { --q-grid-cols: 6; }
7564
+ .q-grid--cols-sm-7 { --q-grid-cols: 7; }
7565
+ .q-grid--cols-sm-8 { --q-grid-cols: 8; }
7566
+ .q-grid--cols-sm-9 { --q-grid-cols: 9; }
7567
+ .q-grid--cols-sm-10 { --q-grid-cols: 10; }
7568
+ .q-grid--cols-sm-11 { --q-grid-cols: 11; }
7569
+ .q-grid--cols-sm-12 { --q-grid-cols: 12; }
7570
+ }
7571
+
7572
+ /* breakpoint md : >= 1024px */
7573
+ @media (min-width: 1024px) {
7574
+ .q-col--span-md-1 { --q-col-span: 1; }
7575
+ .q-col--span-md-2 { --q-col-span: 2; }
7576
+ .q-col--span-md-3 { --q-col-span: 3; }
7577
+ .q-col--span-md-4 { --q-col-span: 4; }
7578
+ .q-col--span-md-5 { --q-col-span: 5; }
7579
+ .q-col--span-md-6 { --q-col-span: 6; }
7580
+ .q-col--span-md-7 { --q-col-span: 7; }
7581
+ .q-col--span-md-8 { --q-col-span: 8; }
7582
+ .q-col--span-md-9 { --q-col-span: 9; }
7583
+ .q-col--span-md-10 { --q-col-span: 10; }
7584
+ .q-col--span-md-11 { --q-col-span: 11; }
7585
+ .q-col--span-md-12 { --q-col-span: 12; }
7586
+ .q-col--offset-md-1 { --q-col-offset: 1; }
7587
+ .q-col--offset-md-2 { --q-col-offset: 2; }
7588
+ .q-col--offset-md-3 { --q-col-offset: 3; }
7589
+ .q-col--offset-md-4 { --q-col-offset: 4; }
7590
+ .q-col--offset-md-5 { --q-col-offset: 5; }
7591
+ .q-col--offset-md-6 { --q-col-offset: 6; }
7592
+ .q-col--offset-md-7 { --q-col-offset: 7; }
7593
+ .q-col--offset-md-8 { --q-col-offset: 8; }
7594
+ .q-col--offset-md-9 { --q-col-offset: 9; }
7595
+ .q-col--offset-md-10 { --q-col-offset: 10; }
7596
+ .q-col--offset-md-11 { --q-col-offset: 11; }
7597
+ .q-grid--cols-md-1 { --q-grid-cols: 1; }
7598
+ .q-grid--cols-md-2 { --q-grid-cols: 2; }
7599
+ .q-grid--cols-md-3 { --q-grid-cols: 3; }
7600
+ .q-grid--cols-md-4 { --q-grid-cols: 4; }
7601
+ .q-grid--cols-md-5 { --q-grid-cols: 5; }
7602
+ .q-grid--cols-md-6 { --q-grid-cols: 6; }
7603
+ .q-grid--cols-md-7 { --q-grid-cols: 7; }
7604
+ .q-grid--cols-md-8 { --q-grid-cols: 8; }
7605
+ .q-grid--cols-md-9 { --q-grid-cols: 9; }
7606
+ .q-grid--cols-md-10 { --q-grid-cols: 10; }
7607
+ .q-grid--cols-md-11 { --q-grid-cols: 11; }
7608
+ .q-grid--cols-md-12 { --q-grid-cols: 12; }
7609
+ }
7610
+
7611
+ /* breakpoint lg : >= 1440px */
7612
+ @media (min-width: 1440px) {
7613
+ .q-col--span-lg-1 { --q-col-span: 1; }
7614
+ .q-col--span-lg-2 { --q-col-span: 2; }
7615
+ .q-col--span-lg-3 { --q-col-span: 3; }
7616
+ .q-col--span-lg-4 { --q-col-span: 4; }
7617
+ .q-col--span-lg-5 { --q-col-span: 5; }
7618
+ .q-col--span-lg-6 { --q-col-span: 6; }
7619
+ .q-col--span-lg-7 { --q-col-span: 7; }
7620
+ .q-col--span-lg-8 { --q-col-span: 8; }
7621
+ .q-col--span-lg-9 { --q-col-span: 9; }
7622
+ .q-col--span-lg-10 { --q-col-span: 10; }
7623
+ .q-col--span-lg-11 { --q-col-span: 11; }
7624
+ .q-col--span-lg-12 { --q-col-span: 12; }
7625
+ .q-col--offset-lg-1 { --q-col-offset: 1; }
7626
+ .q-col--offset-lg-2 { --q-col-offset: 2; }
7627
+ .q-col--offset-lg-3 { --q-col-offset: 3; }
7628
+ .q-col--offset-lg-4 { --q-col-offset: 4; }
7629
+ .q-col--offset-lg-5 { --q-col-offset: 5; }
7630
+ .q-col--offset-lg-6 { --q-col-offset: 6; }
7631
+ .q-col--offset-lg-7 { --q-col-offset: 7; }
7632
+ .q-col--offset-lg-8 { --q-col-offset: 8; }
7633
+ .q-col--offset-lg-9 { --q-col-offset: 9; }
7634
+ .q-col--offset-lg-10 { --q-col-offset: 10; }
7635
+ .q-col--offset-lg-11 { --q-col-offset: 11; }
7636
+ .q-grid--cols-lg-1 { --q-grid-cols: 1; }
7637
+ .q-grid--cols-lg-2 { --q-grid-cols: 2; }
7638
+ .q-grid--cols-lg-3 { --q-grid-cols: 3; }
7639
+ .q-grid--cols-lg-4 { --q-grid-cols: 4; }
7640
+ .q-grid--cols-lg-5 { --q-grid-cols: 5; }
7641
+ .q-grid--cols-lg-6 { --q-grid-cols: 6; }
7642
+ .q-grid--cols-lg-7 { --q-grid-cols: 7; }
7643
+ .q-grid--cols-lg-8 { --q-grid-cols: 8; }
7644
+ .q-grid--cols-lg-9 { --q-grid-cols: 9; }
7645
+ .q-grid--cols-lg-10 { --q-grid-cols: 10; }
7646
+ .q-grid--cols-lg-11 { --q-grid-cols: 11; }
7647
+ .q-grid--cols-lg-12 { --q-grid-cols: 12; }
7648
+ }
7649
+
7650
+ /* breakpoint xl : >= 1920px */
7651
+ @media (min-width: 1920px) {
7652
+ .q-col--span-xl-1 { --q-col-span: 1; }
7653
+ .q-col--span-xl-2 { --q-col-span: 2; }
7654
+ .q-col--span-xl-3 { --q-col-span: 3; }
7655
+ .q-col--span-xl-4 { --q-col-span: 4; }
7656
+ .q-col--span-xl-5 { --q-col-span: 5; }
7657
+ .q-col--span-xl-6 { --q-col-span: 6; }
7658
+ .q-col--span-xl-7 { --q-col-span: 7; }
7659
+ .q-col--span-xl-8 { --q-col-span: 8; }
7660
+ .q-col--span-xl-9 { --q-col-span: 9; }
7661
+ .q-col--span-xl-10 { --q-col-span: 10; }
7662
+ .q-col--span-xl-11 { --q-col-span: 11; }
7663
+ .q-col--span-xl-12 { --q-col-span: 12; }
7664
+ .q-col--offset-xl-1 { --q-col-offset: 1; }
7665
+ .q-col--offset-xl-2 { --q-col-offset: 2; }
7666
+ .q-col--offset-xl-3 { --q-col-offset: 3; }
7667
+ .q-col--offset-xl-4 { --q-col-offset: 4; }
7668
+ .q-col--offset-xl-5 { --q-col-offset: 5; }
7669
+ .q-col--offset-xl-6 { --q-col-offset: 6; }
7670
+ .q-col--offset-xl-7 { --q-col-offset: 7; }
7671
+ .q-col--offset-xl-8 { --q-col-offset: 8; }
7672
+ .q-col--offset-xl-9 { --q-col-offset: 9; }
7673
+ .q-col--offset-xl-10 { --q-col-offset: 10; }
7674
+ .q-col--offset-xl-11 { --q-col-offset: 11; }
7675
+ .q-grid--cols-xl-1 { --q-grid-cols: 1; }
7676
+ .q-grid--cols-xl-2 { --q-grid-cols: 2; }
7677
+ .q-grid--cols-xl-3 { --q-grid-cols: 3; }
7678
+ .q-grid--cols-xl-4 { --q-grid-cols: 4; }
7679
+ .q-grid--cols-xl-5 { --q-grid-cols: 5; }
7680
+ .q-grid--cols-xl-6 { --q-grid-cols: 6; }
7681
+ .q-grid--cols-xl-7 { --q-grid-cols: 7; }
7682
+ .q-grid--cols-xl-8 { --q-grid-cols: 8; }
7683
+ .q-grid--cols-xl-9 { --q-grid-cols: 9; }
7684
+ .q-grid--cols-xl-10 { --q-grid-cols: 10; }
7685
+ .q-grid--cols-xl-11 { --q-grid-cols: 11; }
7686
+ .q-grid--cols-xl-12 { --q-grid-cols: 12; }
7687
+ }
7645
7688
 
7646
7689
  /* ===== QGrid — mode cellules (Vant Grid) =====
7647
7690
  Activé par :column-num — cellules QGridItem en grille égale, avec icône + texte. */