@dnax/ui 0.0.19 → 0.0.21

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]
@@ -242,6 +280,15 @@ const onClear = () => {
242
280
  emit("clear")
243
281
  }
244
282
 
283
+ // Clear du champ de recherche du panneau (sheet/modal) : vide la recherche
284
+ // sans effacer la sélection, garde le focus dans l'input
285
+ const onSearchClear = () => {
286
+ query.value = ""
287
+ emit("update:inputValue", "")
288
+ activeIndex.value = 0
289
+ nextTick(() => panelInput.value?.focus())
290
+ }
291
+
245
292
  const isSelected = (opt: any) => getValue(opt) === props.modelValue
246
293
 
247
294
  // À la perte de focus : si le texte saisi ne correspond exactement à aucune
@@ -428,13 +475,19 @@ watch(open, (v) => {
428
475
  <div
429
476
  ref="sheetRef"
430
477
  class="q-autocomplete__sheet"
431
- :class="[`q-autocomplete__sheet--${mode}`, modeOptions?.class]"
478
+ :class="sheetClasses"
432
479
  :style="[sheetStyle, modeOptions?.style]"
433
480
  role="dialog"
434
481
  aria-modal="true"
435
482
  :aria-label="sheetTitle"
436
483
  >
437
- <div class="q-autocomplete__sheet-header">
484
+ <div
485
+ class="q-autocomplete__sheet-header"
486
+ @pointerdown="onDragStart"
487
+ @pointermove="onDragMove"
488
+ @pointerup="onDragEnd"
489
+ @pointercancel="onDragEnd"
490
+ >
438
491
  <span class="q-autocomplete__sheet-title">{{ sheetTitle }}</span>
439
492
  <button
440
493
  type="button"
@@ -458,6 +511,15 @@ watch(open, (v) => {
458
511
  @input="onInput"
459
512
  @keydown="onKeydown"
460
513
  />
514
+ <button
515
+ v-if="query !== ''"
516
+ type="button"
517
+ class="q-autocomplete__search-clear"
518
+ aria-label="Effacer la recherche"
519
+ @mousedown.prevent="onSearchClear"
520
+ >
521
+ <Icon :icon="icons.x" aria-hidden="true" />
522
+ </button>
461
523
  </div>
462
524
  <div
463
525
  ref="popupRef"
@@ -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.19",
3
+ "version": "0.0.21",
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 */
@@ -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;
@@ -3548,6 +3571,27 @@ html.dark body {
3548
3571
  .q-autocomplete__search-input::placeholder {
3549
3572
  color: rgb(0 0 0 / 0.45);
3550
3573
  }
3574
+ .q-autocomplete__search-clear {
3575
+ display: inline-flex;
3576
+ align-items: center;
3577
+ justify-content: center;
3578
+ width: 20px;
3579
+ height: 20px;
3580
+ padding: 0;
3581
+ border: none;
3582
+ border-radius: 50%;
3583
+ background: rgb(0 0 0 / 0.15);
3584
+ color: inherit;
3585
+ cursor: pointer;
3586
+ flex-shrink: 0;
3587
+ }
3588
+ .q-autocomplete__search-clear:hover {
3589
+ background: rgb(0 0 0 / 0.25);
3590
+ }
3591
+ .q-autocomplete__search-clear svg {
3592
+ width: 12px;
3593
+ height: 12px;
3594
+ }
3551
3595
  .q-autocomplete__sheet-list {
3552
3596
  overflow-y: auto;
3553
3597
  padding: 6px;
@@ -7476,7 +7520,11 @@ html.dark body {
7476
7520
  }
7477
7521
  .q-col {
7478
7522
  min-width: 0;
7479
- grid-column-start: calc(var(--q-col-offset, 0) + 1);
7523
+ /* Placement auto par défaut : fallback -1 → calc(0) = 0 → valeur INVALIDE
7524
+ pour grid-column-start → la propriété retombe sur auto et l'item est
7525
+ auto-placé (sinon TOUS les q-col démarreraient en colonne 1 et se
7526
+ superposeraient — une seule colonne visible). */
7527
+ grid-column-start: calc(var(--q-col-offset, -1) + 1);
7480
7528
  grid-column-end: span var(--q-col-span, 1);
7481
7529
  }
7482
7530
  .q-col--span-1 { --q-col-span: 1; }
@@ -7502,146 +7550,162 @@ html.dark body {
7502
7550
  .q-col--offset-9 { --q-col-offset: 9; }
7503
7551
  .q-col--offset-10 { --q-col-offset: 10; }
7504
7552
  .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; }
7553
+
7554
+ /* breakpoint sm : >= 600px */
7555
+ @media (min-width: 600px) {
7556
+ .q-col--span-sm-1 { --q-col-span: 1; }
7557
+ .q-col--span-sm-2 { --q-col-span: 2; }
7558
+ .q-col--span-sm-3 { --q-col-span: 3; }
7559
+ .q-col--span-sm-4 { --q-col-span: 4; }
7560
+ .q-col--span-sm-5 { --q-col-span: 5; }
7561
+ .q-col--span-sm-6 { --q-col-span: 6; }
7562
+ .q-col--span-sm-7 { --q-col-span: 7; }
7563
+ .q-col--span-sm-8 { --q-col-span: 8; }
7564
+ .q-col--span-sm-9 { --q-col-span: 9; }
7565
+ .q-col--span-sm-10 { --q-col-span: 10; }
7566
+ .q-col--span-sm-11 { --q-col-span: 11; }
7567
+ .q-col--span-sm-12 { --q-col-span: 12; }
7568
+ .q-col--offset-sm-1 { --q-col-offset: 1; }
7569
+ .q-col--offset-sm-2 { --q-col-offset: 2; }
7570
+ .q-col--offset-sm-3 { --q-col-offset: 3; }
7571
+ .q-col--offset-sm-4 { --q-col-offset: 4; }
7572
+ .q-col--offset-sm-5 { --q-col-offset: 5; }
7573
+ .q-col--offset-sm-6 { --q-col-offset: 6; }
7574
+ .q-col--offset-sm-7 { --q-col-offset: 7; }
7575
+ .q-col--offset-sm-8 { --q-col-offset: 8; }
7576
+ .q-col--offset-sm-9 { --q-col-offset: 9; }
7577
+ .q-col--offset-sm-10 { --q-col-offset: 10; }
7578
+ .q-col--offset-sm-11 { --q-col-offset: 11; }
7579
+ .q-grid--cols-sm-1 { --q-grid-cols: 1; }
7580
+ .q-grid--cols-sm-2 { --q-grid-cols: 2; }
7581
+ .q-grid--cols-sm-3 { --q-grid-cols: 3; }
7582
+ .q-grid--cols-sm-4 { --q-grid-cols: 4; }
7583
+ .q-grid--cols-sm-5 { --q-grid-cols: 5; }
7584
+ .q-grid--cols-sm-6 { --q-grid-cols: 6; }
7585
+ .q-grid--cols-sm-7 { --q-grid-cols: 7; }
7586
+ .q-grid--cols-sm-8 { --q-grid-cols: 8; }
7587
+ .q-grid--cols-sm-9 { --q-grid-cols: 9; }
7588
+ .q-grid--cols-sm-10 { --q-grid-cols: 10; }
7589
+ .q-grid--cols-sm-11 { --q-grid-cols: 11; }
7590
+ .q-grid--cols-sm-12 { --q-grid-cols: 12; }
7591
+ }
7592
+
7593
+ /* breakpoint md : >= 1024px */
7594
+ @media (min-width: 1024px) {
7595
+ .q-col--span-md-1 { --q-col-span: 1; }
7596
+ .q-col--span-md-2 { --q-col-span: 2; }
7597
+ .q-col--span-md-3 { --q-col-span: 3; }
7598
+ .q-col--span-md-4 { --q-col-span: 4; }
7599
+ .q-col--span-md-5 { --q-col-span: 5; }
7600
+ .q-col--span-md-6 { --q-col-span: 6; }
7601
+ .q-col--span-md-7 { --q-col-span: 7; }
7602
+ .q-col--span-md-8 { --q-col-span: 8; }
7603
+ .q-col--span-md-9 { --q-col-span: 9; }
7604
+ .q-col--span-md-10 { --q-col-span: 10; }
7605
+ .q-col--span-md-11 { --q-col-span: 11; }
7606
+ .q-col--span-md-12 { --q-col-span: 12; }
7607
+ .q-col--offset-md-1 { --q-col-offset: 1; }
7608
+ .q-col--offset-md-2 { --q-col-offset: 2; }
7609
+ .q-col--offset-md-3 { --q-col-offset: 3; }
7610
+ .q-col--offset-md-4 { --q-col-offset: 4; }
7611
+ .q-col--offset-md-5 { --q-col-offset: 5; }
7612
+ .q-col--offset-md-6 { --q-col-offset: 6; }
7613
+ .q-col--offset-md-7 { --q-col-offset: 7; }
7614
+ .q-col--offset-md-8 { --q-col-offset: 8; }
7615
+ .q-col--offset-md-9 { --q-col-offset: 9; }
7616
+ .q-col--offset-md-10 { --q-col-offset: 10; }
7617
+ .q-col--offset-md-11 { --q-col-offset: 11; }
7618
+ .q-grid--cols-md-1 { --q-grid-cols: 1; }
7619
+ .q-grid--cols-md-2 { --q-grid-cols: 2; }
7620
+ .q-grid--cols-md-3 { --q-grid-cols: 3; }
7621
+ .q-grid--cols-md-4 { --q-grid-cols: 4; }
7622
+ .q-grid--cols-md-5 { --q-grid-cols: 5; }
7623
+ .q-grid--cols-md-6 { --q-grid-cols: 6; }
7624
+ .q-grid--cols-md-7 { --q-grid-cols: 7; }
7625
+ .q-grid--cols-md-8 { --q-grid-cols: 8; }
7626
+ .q-grid--cols-md-9 { --q-grid-cols: 9; }
7627
+ .q-grid--cols-md-10 { --q-grid-cols: 10; }
7628
+ .q-grid--cols-md-11 { --q-grid-cols: 11; }
7629
+ .q-grid--cols-md-12 { --q-grid-cols: 12; }
7630
+ }
7631
+
7632
+ /* breakpoint lg : >= 1440px */
7633
+ @media (min-width: 1440px) {
7634
+ .q-col--span-lg-1 { --q-col-span: 1; }
7635
+ .q-col--span-lg-2 { --q-col-span: 2; }
7636
+ .q-col--span-lg-3 { --q-col-span: 3; }
7637
+ .q-col--span-lg-4 { --q-col-span: 4; }
7638
+ .q-col--span-lg-5 { --q-col-span: 5; }
7639
+ .q-col--span-lg-6 { --q-col-span: 6; }
7640
+ .q-col--span-lg-7 { --q-col-span: 7; }
7641
+ .q-col--span-lg-8 { --q-col-span: 8; }
7642
+ .q-col--span-lg-9 { --q-col-span: 9; }
7643
+ .q-col--span-lg-10 { --q-col-span: 10; }
7644
+ .q-col--span-lg-11 { --q-col-span: 11; }
7645
+ .q-col--span-lg-12 { --q-col-span: 12; }
7646
+ .q-col--offset-lg-1 { --q-col-offset: 1; }
7647
+ .q-col--offset-lg-2 { --q-col-offset: 2; }
7648
+ .q-col--offset-lg-3 { --q-col-offset: 3; }
7649
+ .q-col--offset-lg-4 { --q-col-offset: 4; }
7650
+ .q-col--offset-lg-5 { --q-col-offset: 5; }
7651
+ .q-col--offset-lg-6 { --q-col-offset: 6; }
7652
+ .q-col--offset-lg-7 { --q-col-offset: 7; }
7653
+ .q-col--offset-lg-8 { --q-col-offset: 8; }
7654
+ .q-col--offset-lg-9 { --q-col-offset: 9; }
7655
+ .q-col--offset-lg-10 { --q-col-offset: 10; }
7656
+ .q-col--offset-lg-11 { --q-col-offset: 11; }
7657
+ .q-grid--cols-lg-1 { --q-grid-cols: 1; }
7658
+ .q-grid--cols-lg-2 { --q-grid-cols: 2; }
7659
+ .q-grid--cols-lg-3 { --q-grid-cols: 3; }
7660
+ .q-grid--cols-lg-4 { --q-grid-cols: 4; }
7661
+ .q-grid--cols-lg-5 { --q-grid-cols: 5; }
7662
+ .q-grid--cols-lg-6 { --q-grid-cols: 6; }
7663
+ .q-grid--cols-lg-7 { --q-grid-cols: 7; }
7664
+ .q-grid--cols-lg-8 { --q-grid-cols: 8; }
7665
+ .q-grid--cols-lg-9 { --q-grid-cols: 9; }
7666
+ .q-grid--cols-lg-10 { --q-grid-cols: 10; }
7667
+ .q-grid--cols-lg-11 { --q-grid-cols: 11; }
7668
+ .q-grid--cols-lg-12 { --q-grid-cols: 12; }
7669
+ }
7670
+
7671
+ /* breakpoint xl : >= 1920px */
7672
+ @media (min-width: 1920px) {
7673
+ .q-col--span-xl-1 { --q-col-span: 1; }
7674
+ .q-col--span-xl-2 { --q-col-span: 2; }
7675
+ .q-col--span-xl-3 { --q-col-span: 3; }
7676
+ .q-col--span-xl-4 { --q-col-span: 4; }
7677
+ .q-col--span-xl-5 { --q-col-span: 5; }
7678
+ .q-col--span-xl-6 { --q-col-span: 6; }
7679
+ .q-col--span-xl-7 { --q-col-span: 7; }
7680
+ .q-col--span-xl-8 { --q-col-span: 8; }
7681
+ .q-col--span-xl-9 { --q-col-span: 9; }
7682
+ .q-col--span-xl-10 { --q-col-span: 10; }
7683
+ .q-col--span-xl-11 { --q-col-span: 11; }
7684
+ .q-col--span-xl-12 { --q-col-span: 12; }
7685
+ .q-col--offset-xl-1 { --q-col-offset: 1; }
7686
+ .q-col--offset-xl-2 { --q-col-offset: 2; }
7687
+ .q-col--offset-xl-3 { --q-col-offset: 3; }
7688
+ .q-col--offset-xl-4 { --q-col-offset: 4; }
7689
+ .q-col--offset-xl-5 { --q-col-offset: 5; }
7690
+ .q-col--offset-xl-6 { --q-col-offset: 6; }
7691
+ .q-col--offset-xl-7 { --q-col-offset: 7; }
7692
+ .q-col--offset-xl-8 { --q-col-offset: 8; }
7693
+ .q-col--offset-xl-9 { --q-col-offset: 9; }
7694
+ .q-col--offset-xl-10 { --q-col-offset: 10; }
7695
+ .q-col--offset-xl-11 { --q-col-offset: 11; }
7696
+ .q-grid--cols-xl-1 { --q-grid-cols: 1; }
7697
+ .q-grid--cols-xl-2 { --q-grid-cols: 2; }
7698
+ .q-grid--cols-xl-3 { --q-grid-cols: 3; }
7699
+ .q-grid--cols-xl-4 { --q-grid-cols: 4; }
7700
+ .q-grid--cols-xl-5 { --q-grid-cols: 5; }
7701
+ .q-grid--cols-xl-6 { --q-grid-cols: 6; }
7702
+ .q-grid--cols-xl-7 { --q-grid-cols: 7; }
7703
+ .q-grid--cols-xl-8 { --q-grid-cols: 8; }
7704
+ .q-grid--cols-xl-9 { --q-grid-cols: 9; }
7705
+ .q-grid--cols-xl-10 { --q-grid-cols: 10; }
7706
+ .q-grid--cols-xl-11 { --q-grid-cols: 11; }
7707
+ .q-grid--cols-xl-12 { --q-grid-cols: 12; }
7708
+ }
7645
7709
 
7646
7710
  /* ===== QGrid — mode cellules (Vant Grid) =====
7647
7711
  Activé par :column-num — cellules QGridItem en grille égale, avec icône + texte. */