@tekkare/romulus 0.1.118 → 0.1.120
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/dist/module.json
CHANGED
|
@@ -112,8 +112,8 @@ const FR = {
|
|
|
112
112
|
kindProduct: 'Une marque',
|
|
113
113
|
kindProductHint: 'Une à {max} marques, suivies partout : prix, avis HAS, indications, ANSM, PUT, MITM, Journal officiel.',
|
|
114
114
|
brands: 'Marques surveillées',
|
|
115
|
-
brandsSearch: 'Rechercher
|
|
116
|
-
brandsHint: 'Cherchez
|
|
115
|
+
brandsSearch: 'Rechercher',
|
|
116
|
+
brandsHint: 'Cherchez par marque, molécule, classe ATC ou laboratoire. L’alerte couvre tout le hub pour chaque marque retenue.',
|
|
117
117
|
brandsRequired: 'Choisissez au moins une marque.',
|
|
118
118
|
brandsTooMany: 'Une alerte suit {max} marques au maximum.',
|
|
119
119
|
productFields: 'Tous les champs sont suivis : une alerte de marque ne se restreint pas, elle rapporte tout ce qui bouge.',
|
|
@@ -154,7 +154,7 @@ const FR = {
|
|
|
154
154
|
reseed: 'Changer les champs suivis repart d’une nouvelle référence : vous ne serez prévenu que de ce qui bouge ensuite.',
|
|
155
155
|
cancel: 'Annuler',
|
|
156
156
|
baseline:
|
|
157
|
-
'
|
|
157
|
+
'L’alerte commence par relever l’état actuel, sans rien signaler. Restez quelques instants sur la page : elle passe à « Active » dans le panneau une fois ce relevé fait, et vous préviendra ensuite de ce qui bouge.',
|
|
158
158
|
scope: 'éléments dans la vue actuellement',
|
|
159
159
|
}
|
|
160
160
|
|
|
@@ -165,8 +165,8 @@ const EN = {
|
|
|
165
165
|
kindProduct: 'A brand',
|
|
166
166
|
kindProductHint: 'One to {max} brands, watched everywhere: prices, HAS opinions, indications, ANSM, PUT, MITM, official journal.',
|
|
167
167
|
brands: 'Watched brands',
|
|
168
|
-
brandsSearch: 'Search
|
|
169
|
-
brandsHint: 'Search
|
|
168
|
+
brandsSearch: 'Search',
|
|
169
|
+
brandsHint: 'Search by brand, molecule, ATC class or company. The alert covers the whole hub for each brand kept.',
|
|
170
170
|
brandsRequired: 'Pick at least one brand.',
|
|
171
171
|
brandsTooMany: 'An alert watches at most {max} brands.',
|
|
172
172
|
productFields: 'Every field is watched: a brand alert does not narrow down, it reports whatever moves.',
|
|
@@ -207,7 +207,7 @@ const EN = {
|
|
|
207
207
|
reseed: 'Changing the watched fields restarts from a new baseline: you are only told about what moves afterwards.',
|
|
208
208
|
cancel: 'Cancel',
|
|
209
209
|
baseline:
|
|
210
|
-
'
|
|
210
|
+
'The alert starts by recording the current state, without reporting anything. Stay on the page a moment: it turns “Active” in the panel once that record is taken, and will then tell you what moves.',
|
|
211
211
|
scope: 'items in the view right now',
|
|
212
212
|
}
|
|
213
213
|
|
|
@@ -446,6 +446,7 @@ function submit() {
|
|
|
446
446
|
:label="T.brandsSearch"
|
|
447
447
|
:options="brandOptions.map((brand) => ({ label: brand, value: brand }))"
|
|
448
448
|
remote
|
|
449
|
+
panel-width="100%"
|
|
449
450
|
:lang="lang"
|
|
450
451
|
/>
|
|
451
452
|
<p v-if="brands.length > maxBrands" class="rm-alert-form__error">
|
|
@@ -502,7 +503,7 @@ function submit() {
|
|
|
502
503
|
:key="entry.key"
|
|
503
504
|
:model-value="triggers.includes(entry.key as any)"
|
|
504
505
|
:label="entry.label"
|
|
505
|
-
:
|
|
506
|
+
:description="entry.hint"
|
|
506
507
|
@update:model-value="toggleTrigger(entry.key as RmAlertTrigger)"
|
|
507
508
|
/>
|
|
508
509
|
</fieldset>
|
|
@@ -532,13 +533,16 @@ function submit() {
|
|
|
532
533
|
<fieldset class="rm-alert-form__group">
|
|
533
534
|
<legend class="rm-alert-form__label">{{ T.channels }}</legend>
|
|
534
535
|
<RmCheckbox :model-value="true" :label="T.inApp" disabled />
|
|
535
|
-
<RmCheckbox v-model="emailOn" :label="T.email" />
|
|
536
536
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
537
|
+
<!-- La case et sa frequence sur une meme rangee : le choix du canal et
|
|
538
|
+
celui de son rythme se lisent ensemble, et la frequence n'a aucun
|
|
539
|
+
sens sans la case. -->
|
|
540
|
+
<div class="rm-alert-form__channel">
|
|
541
|
+
<RmCheckbox v-model="emailOn" :label="T.email" />
|
|
540
542
|
<RmDropdownSelect
|
|
543
|
+
v-if="emailOn"
|
|
541
544
|
label=""
|
|
545
|
+
class="rm-alert-form__cadence"
|
|
542
546
|
:options="cadenceOptions.map((option) => option.label)"
|
|
543
547
|
:model-value="cadenceLabel"
|
|
544
548
|
@update:model-value="
|
|
@@ -547,6 +551,7 @@ function submit() {
|
|
|
547
551
|
"
|
|
548
552
|
/>
|
|
549
553
|
</div>
|
|
554
|
+
<p v-if="emailOn" class="rm-alert-form__hint">{{ T.cadenceHint }}</p>
|
|
550
555
|
</fieldset>
|
|
551
556
|
|
|
552
557
|
<p
|
|
@@ -572,5 +577,5 @@ function submit() {
|
|
|
572
577
|
</template>
|
|
573
578
|
|
|
574
579
|
<style scoped>
|
|
575
|
-
.rm-alert-form{display:flex;flex-direction:column;gap:18px}.rm-alert-form__label{color:var(--rm-text,#111827);font-size:13px;font-weight:600;margin:0 0 2px;padding:0}.rm-alert-form__group{border:0;display:flex;flex-direction:column;gap:8px;margin:0;padding:0}.rm-alert-form__view-name{align-items:center;color:var(--rm-text,#111827);display:flex;flex-wrap:wrap;font-size:14px;gap:6px;margin:0}.rm-alert-form__count{color:var(--rm-text-soft,#9ca3af);font-size:11.5px}.rm-alert-form__hint{color:var(--rm-text-soft,#9ca3af);font-size:12px;line-height:1.45;margin:0 0 4px}.rm-alert-form__error{color:var(--rm-danger,#b91c1c);font-size:12px;margin:0}.rm-alert-form__nested{display:flex;flex-direction:column;gap:6px;padding-left:26px}.rm-alert-form__baseline{align-items:flex-start;background:var(--rm-surface-muted,#f9fafb);border-radius:8px;color:var(--rm-text-soft,#4b5563);display:flex;font-size:12.5px;gap:8px;line-height:1.45;margin:0;padding:10px 12px}.rm-alert-form__actions{display:flex;gap:8px;justify-content:flex-end}
|
|
580
|
+
.rm-alert-form{display:flex;flex-direction:column;gap:18px}.rm-alert-form__label{color:var(--rm-text,#111827);font-size:13px;font-weight:600;margin:0 0 2px;padding:0}.rm-alert-form__group{border:0;display:flex;flex-direction:column;gap:8px;margin:0;padding:0}.rm-alert-form__view-name{align-items:center;color:var(--rm-text,#111827);display:flex;flex-wrap:wrap;font-size:14px;gap:6px;margin:0}.rm-alert-form__count{color:var(--rm-text-soft,#9ca3af);font-size:11.5px}.rm-alert-form__hint{color:var(--rm-text-soft,#9ca3af);font-size:12px;line-height:1.45;margin:0 0 4px}.rm-alert-form__error{color:var(--rm-danger,#b91c1c);font-size:12px;margin:0}.rm-alert-form__channel{align-items:center;display:flex;flex-wrap:wrap;gap:12px}.rm-alert-form__cadence{flex:1 1 240px;min-width:240px}.rm-alert-form__nested{display:flex;flex-direction:column;gap:6px;padding-left:26px}.rm-alert-form__baseline{align-items:flex-start;background:var(--rm-surface-muted,#f9fafb);border-radius:8px;color:var(--rm-text-soft,#4b5563);display:flex;font-size:12.5px;gap:8px;line-height:1.45;margin:0;padding:10px 12px}.rm-alert-form__actions{display:flex;gap:8px;justify-content:flex-end}
|
|
576
581
|
</style>
|
|
@@ -21,12 +21,22 @@ withDefaults(defineProps<{
|
|
|
21
21
|
label: string
|
|
22
22
|
/** Intitule du champ, au-dessus de la boite. Absent, rien ne sort. */
|
|
23
23
|
fieldLabel?: string
|
|
24
|
+
/**
|
|
25
|
+
* Explication posee sous l'intitule, en petit.
|
|
26
|
+
*
|
|
27
|
+
* A preferer a `tooltip` des que l'explication aide a CHOISIR : une bulle
|
|
28
|
+
* au survol se decouvre par hasard, ne s'atteint pas au doigt, et dans une
|
|
29
|
+
* liste de cases a cocher elle oblige a survoler chaque ligne pour
|
|
30
|
+
* comprendre laquelle prendre.
|
|
31
|
+
*/
|
|
32
|
+
description?: string
|
|
24
33
|
/** Bulle d'aide, sortie par une icone a droite. */
|
|
25
34
|
tooltip?: string
|
|
26
35
|
tooltipDir?: 'top' | 'right' | 'bottom' | 'left'
|
|
27
36
|
disabled?: boolean
|
|
28
37
|
}>(), {
|
|
29
38
|
fieldLabel: '',
|
|
39
|
+
description: '',
|
|
30
40
|
tooltip: '',
|
|
31
41
|
tooltipDir: 'top',
|
|
32
42
|
disabled: false,
|
|
@@ -54,7 +64,10 @@ const checked = defineModel<boolean>({ default: false })
|
|
|
54
64
|
:size="20"
|
|
55
65
|
/>
|
|
56
66
|
</span>
|
|
57
|
-
<span class="rm-
|
|
67
|
+
<span class="rm-checkbox__text">
|
|
68
|
+
<span class="rm-checkbox__label">{{ label }}</span>
|
|
69
|
+
<span v-if="description" class="rm-checkbox__desc">{{ description }}</span>
|
|
70
|
+
</span>
|
|
58
71
|
</label>
|
|
59
72
|
|
|
60
73
|
<RmTooltip v-if="tooltip" :text="tooltip" :dir="tooltipDir" class="rm-checkbox__help">
|
|
@@ -65,5 +78,5 @@ const checked = defineModel<boolean>({ default: false })
|
|
|
65
78
|
</template>
|
|
66
79
|
|
|
67
80
|
<style scoped>
|
|
68
|
-
.rm-checkbox__field-label{color:var(--text-secondary);font-size:var(--font-12,12px);font-weight:600;margin-bottom:6px}.rm-checkbox__wrap{position:relative}.rm-checkbox__box,.rm-checkbox__wrap{align-items:center;display:flex;gap:var(--space-8)}.rm-checkbox__box{background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:var(--radius-md,8px);color:var(--text-primary);cursor:pointer;flex:1;font-size:var(--font-14,14px);font-weight:600;min-height:40px;padding:0 var(--space-12);transition:border-color var(--duration-fast,.15s) var(--ease-out,ease)}.rm-checkbox__box:hover:not(.is-disabled){border-color:var(--color-primary)}.rm-checkbox__box:focus-within{border-color:var(--color-primary);box-shadow:0 0 0 4px rgba(var(--brand-rgb),.1)}.rm-checkbox__box.is-disabled{color:var(--text-muted);cursor:not-allowed}.rm-checkbox__input{height:1px;opacity:0;pointer-events:none;position:absolute;width:1px}.rm-checkbox__icon{color:var(--text-muted);display:flex;flex-shrink:0}.rm-checkbox__icon.is-checked{color:var(--color-primary)}.rm-checkbox__box.is-disabled .rm-checkbox__icon{color:var(--border-default)}.rm-checkbox__label{min-width:0}.rm-checkbox__help{color:var(--text-muted)}
|
|
81
|
+
.rm-checkbox__field-label{color:var(--text-secondary);font-size:var(--font-12,12px);font-weight:600;margin-bottom:6px}.rm-checkbox__wrap{position:relative}.rm-checkbox__box,.rm-checkbox__wrap{align-items:center;display:flex;gap:var(--space-8)}.rm-checkbox__box{background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:var(--radius-md,8px);color:var(--text-primary);cursor:pointer;flex:1;font-size:var(--font-14,14px);font-weight:600;min-height:40px;padding:0 var(--space-12);transition:border-color var(--duration-fast,.15s) var(--ease-out,ease)}.rm-checkbox__box:hover:not(.is-disabled){border-color:var(--color-primary)}.rm-checkbox__box:focus-within{border-color:var(--color-primary);box-shadow:0 0 0 4px rgba(var(--brand-rgb),.1)}.rm-checkbox__box.is-disabled{color:var(--text-muted);cursor:not-allowed}.rm-checkbox__input{height:1px;opacity:0;pointer-events:none;position:absolute;width:1px}.rm-checkbox__icon{color:var(--text-muted);display:flex;flex-shrink:0}.rm-checkbox__icon.is-checked{color:var(--color-primary)}.rm-checkbox__box.is-disabled .rm-checkbox__icon{color:var(--border-default)}.rm-checkbox__text{display:flex;flex-direction:column;gap:2px;min-width:0}.rm-checkbox__label{min-width:0}.rm-checkbox__desc{font-size:var(--font-12);font-weight:400;line-height:1.4}.rm-checkbox__desc,.rm-checkbox__help{color:var(--text-muted)}
|
|
69
82
|
</style>
|
|
@@ -117,10 +117,43 @@ function onDocumentClick(event: MouseEvent) {
|
|
|
117
117
|
if (!rootRef.value?.contains(event.target as Node)) close()
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Le panneau s'ouvre vers le haut quand il n'y a pas la place en dessous.
|
|
122
|
+
*
|
|
123
|
+
* Dans une modale, un selecteur pose en bas de formulaire deroulait sa liste
|
|
124
|
+
* hors du cadre visible et forcait un defilement pour lire ses propres
|
|
125
|
+
* options. La place se mesure sur le cadre defilant le plus proche, pas sur
|
|
126
|
+
* la fenetre : c'est lui qui coupe.
|
|
127
|
+
*/
|
|
128
|
+
const dropUp = ref(false)
|
|
129
|
+
|
|
130
|
+
function scrollParent(node: HTMLElement | null): HTMLElement | null {
|
|
131
|
+
let current = node?.parentElement ?? null
|
|
132
|
+
while (current) {
|
|
133
|
+
const overflow = getComputedStyle(current).overflowY
|
|
134
|
+
if (overflow === 'auto' || overflow === 'scroll') return current
|
|
135
|
+
current = current.parentElement
|
|
136
|
+
}
|
|
137
|
+
return null
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function placePanel() {
|
|
141
|
+
const field = rootRef.value
|
|
142
|
+
if (!field) return
|
|
143
|
+
const rect = field.getBoundingClientRect()
|
|
144
|
+
const frame = scrollParent(field)?.getBoundingClientRect()
|
|
145
|
+
const bottom = frame ? frame.bottom : window.innerHeight
|
|
146
|
+
const top = frame ? frame.top : 0
|
|
147
|
+
// 320 : la hauteur qu'une liste de quelques options occupe en pratique.
|
|
148
|
+
const needed = 320
|
|
149
|
+
dropUp.value = rect.bottom + needed > bottom && rect.top - top > needed
|
|
150
|
+
}
|
|
151
|
+
|
|
120
152
|
async function toggle() {
|
|
121
153
|
if (props.disabled) return
|
|
122
154
|
if (isOpen.value) return close()
|
|
123
155
|
|
|
156
|
+
placePanel()
|
|
124
157
|
isOpen.value = true
|
|
125
158
|
rmPanelOpened(close)
|
|
126
159
|
searchTerm.value = ''
|
|
@@ -191,7 +224,12 @@ onUnmounted(() => {
|
|
|
191
224
|
<component :is="sortIcon ? PhCaretUpDown : PhCaretDown" :size="16" />
|
|
192
225
|
</button>
|
|
193
226
|
|
|
194
|
-
<div
|
|
227
|
+
<div
|
|
228
|
+
v-show="isOpen"
|
|
229
|
+
class="rm-dsel__panel"
|
|
230
|
+
:class="{ 'rm-dsel__panel--up': dropUp }"
|
|
231
|
+
@click.stop
|
|
232
|
+
>
|
|
195
233
|
<div v-if="search" class="rm-dsel__search">
|
|
196
234
|
<PhMagnifyingGlass :size="16" />
|
|
197
235
|
<input
|
|
@@ -236,5 +274,5 @@ onUnmounted(() => {
|
|
|
236
274
|
</template>
|
|
237
275
|
|
|
238
276
|
<style scoped>
|
|
239
|
-
.rm-dsel{align-items:stretch;display:flex;flex-direction:column;gap:var(--space-4);position:relative;width:196px}.rm-dsel__label{color:var(--text-secondary);font-size:var(--font-12,12px);line-height:14px}.rm-dsel__field{align-items:center;background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:var(--radius-md,8px);box-sizing:border-box;color:var(--text-primary);cursor:pointer;display:flex;font-family:inherit;font-size:var(--font-14,14px);font-weight:700;gap:var(--space-4);line-height:16px;padding:var(--space-12);text-align:left;width:100%}.rm-dsel__field:hover:not(.is-disabled){border-color:rgba(var(--brand-rgb),.3)}.rm-dsel__field.is-open{border-color:var(--color-primary)}.rm-dsel__field.is-disabled{background:var(--bg-surface-2);color:var(--text-muted);cursor:not-allowed}.rm-dsel__field:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.rm-dsel__value-slot{display:block;flex:1;min-width:0}.rm-dsel__value{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-dsel__value.is-empty{color:var(--text-muted);font-style:italic;font-weight:400}.rm-dsel__field :deep(svg){color:var(--text-secondary);flex-shrink:0}.rm-dsel__panel{border:1.5px solid var(--border-default);border-radius:var(--radius-lg,12px);box-shadow:var(--r-shadow-lg,0 8px 24px rgba(0,0,0,.12));box-sizing:border-box;flex-direction:column;left:0;margin-top:8px;max-height:500px;max-width:
|
|
277
|
+
.rm-dsel{align-items:stretch;display:flex;flex-direction:column;gap:var(--space-4);position:relative;width:196px}.rm-dsel__label{color:var(--text-secondary);font-size:var(--font-12,12px);line-height:14px}.rm-dsel__field{align-items:center;background:var(--bg-surface);border:1.5px solid var(--border-default);border-radius:var(--radius-md,8px);box-sizing:border-box;color:var(--text-primary);cursor:pointer;display:flex;font-family:inherit;font-size:var(--font-14,14px);font-weight:700;gap:var(--space-4);line-height:16px;padding:var(--space-12);text-align:left;width:100%}.rm-dsel__field:hover:not(.is-disabled){border-color:rgba(var(--brand-rgb),.3)}.rm-dsel__field.is-open{border-color:var(--color-primary)}.rm-dsel__field.is-disabled{background:var(--bg-surface-2);color:var(--text-muted);cursor:not-allowed}.rm-dsel__field:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.rm-dsel__value-slot{display:block;flex:1;min-width:0}.rm-dsel__value{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rm-dsel__value.is-empty{color:var(--text-muted);font-style:italic;font-weight:400}.rm-dsel__field :deep(svg){color:var(--text-secondary);flex-shrink:0}.rm-dsel__panel--up{bottom:100%;margin-bottom:8px;margin-top:0;top:auto}.rm-dsel__panel{border:1.5px solid var(--border-default);border-radius:var(--radius-lg,12px);box-shadow:var(--r-shadow-lg,0 8px 24px rgba(0,0,0,.12));box-sizing:border-box;flex-direction:column;left:0;margin-top:8px;max-height:500px;max-width:420px;min-width:max(230px,100%);padding:var(--space-16);position:absolute;top:100%;width:-moz-max-content;width:max-content;z-index:12}.rm-dsel__panel,.rm-dsel__search{background:var(--bg-surface);display:flex}.rm-dsel__search{align-items:center;border:1px solid var(--border-default);border-radius:var(--radius-md,8px);gap:var(--space-8);padding:var(--space-8) var(--space-12)}.rm-dsel__search :deep(svg){color:var(--text-muted);flex-shrink:0}.rm-dsel__search-input{background:none;border:none;color:var(--text-primary);font-family:inherit;font-size:var(--font-14,14px);width:100%}.rm-dsel__search-input::-moz-placeholder{color:var(--text-muted);font-size:var(--font-12,12px)}.rm-dsel__search-input::placeholder{color:var(--text-muted);font-size:var(--font-12,12px)}.rm-dsel__search-input:focus-visible{outline:none}.rm-dsel__loading{display:flex;flex-direction:column;gap:var(--space-10);padding-top:var(--space-8)}.rm-dsel__sr{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.rm-dsel__state{color:var(--text-secondary);font-size:var(--font-14,14px);font-style:italic;padding-top:var(--space-16);text-align:center}.rm-dsel__list{display:flex;flex-direction:column;list-style:none;margin:0;min-height:10px;overflow-y:auto;padding:0}.rm-dsel__list:not(:only-child){margin-top:16px}.rm-dsel__option{align-items:center;border-radius:var(--radius-sm,4px);cursor:pointer;display:flex;font-size:var(--font-14,14px);gap:var(--space-8);line-height:160%;margin:4px 0;min-height:24px;padding:var(--space-2) var(--space-4)}.rm-dsel__option :deep(svg){color:var(--text-muted);flex-shrink:0}.rm-dsel__option.is-active{background:rgba(var(--brand-rgb),.05)}.rm-dsel__option.is-selected{font-weight:700}.rm-dsel__option.is-active :deep(svg),.rm-dsel__option.is-selected :deep(svg){color:var(--color-primary)}
|
|
240
278
|
</style>
|
|
@@ -54,11 +54,18 @@ const props = withDefaults(defineProps<{
|
|
|
54
54
|
* cent premieres valeurs laisse croire que le reste n'existe pas).
|
|
55
55
|
*/
|
|
56
56
|
remote?: boolean
|
|
57
|
+
/**
|
|
58
|
+
* Largeur du panneau. Les 720px par defaut valent pour une page ; dans une
|
|
59
|
+
* modale ou un panneau de rail, ils debordent du cadre et le contenu se
|
|
60
|
+
* fait couper.
|
|
61
|
+
*/
|
|
62
|
+
panelWidth?: string
|
|
57
63
|
}>(), {
|
|
58
64
|
icon: undefined,
|
|
59
65
|
presets: () => [],
|
|
60
66
|
lang: 'en',
|
|
61
67
|
remote: false,
|
|
68
|
+
panelWidth: '720px',
|
|
62
69
|
})
|
|
63
70
|
|
|
64
71
|
const selected = defineModel<string[]>({ default: () => [] })
|
|
@@ -308,7 +315,11 @@ onUnmounted(() => {
|
|
|
308
315
|
</script>
|
|
309
316
|
|
|
310
317
|
<template>
|
|
311
|
-
<div
|
|
318
|
+
<div
|
|
319
|
+
ref="wrapperRef"
|
|
320
|
+
class="filter-complex"
|
|
321
|
+
:style="{ '--rm-fcx-panel-w': panelWidth }"
|
|
322
|
+
>
|
|
312
323
|
<button
|
|
313
324
|
class="filter-complex__trigger"
|
|
314
325
|
:class="{ 'filter-complex__trigger--active': isActive }"
|
|
@@ -455,5 +466,5 @@ onUnmounted(() => {
|
|
|
455
466
|
</template>
|
|
456
467
|
|
|
457
468
|
<style scoped>
|
|
458
|
-
.filter-complex{position:relative}.filter-complex__trigger{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);box-sizing:border-box;color:var(--text-primary);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);font-weight:var(--weight-medium);gap:var(--space-6);height:var(--rm-fbar-field-h,32px);max-width:320px;padding:0 var(--space-12);transition:all var(--duration-fast) var(--ease-in-out);white-space:nowrap}.filter-complex__trigger:hover{background:var(--bg-surface-3)}.filter-complex__icon{color:var(--color-primary);flex-shrink:0}.filter-complex__trigger--active{border-color:var(--color-primary)}.filter-complex__label{color:var(--text-muted);flex-shrink:0;font-weight:var(--weight-normal)}.filter-complex__summary{font-weight:var(--weight-semibold);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter-complex__badge{align-items:center;background-color:color-mix(in srgb,var(--color-primary) 10%,transparent);border-radius:var(--radius-pill);color:var(--color-primary);display:inline-flex;flex-shrink:0;font-size:var(--font-12);font-weight:var(--weight-semibold);height:18px;justify-content:center;line-height:1;min-width:18px;padding:0 var(--space-6)}.filter-complex__caret{color:var(--text-muted);flex-shrink:0;transition:transform var(--duration-fast) var(--ease-in-out)}.filter-complex__caret--open{transform:rotate(180deg)}.filter-complex__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl,12px);box-shadow:0 4px 24px rgba(var(--shadow-rgb),.1),0 2px 8px rgba(var(--shadow-rgb),.05);display:flex;left:0;max-height:460px;max-width:calc(100vw - 32px);overflow:hidden;position:absolute;top:calc(100% + 6px);width:720px;z-index:50}.filter-complex__left,.filter-complex__right{display:flex;flex-direction:column;gap:var(--space-10);overflow:hidden;padding:var(--space-20)}.filter-complex__left{flex:1 1 50%}.filter-complex__right{border-left:1px solid var(--border-default);flex:1 1 50%}@media (max-width:767px){.filter-complex__panel{border:none;border-radius:0;flex-direction:column;inset:0;left:0;max-height:none;max-width:none;position:fixed;top:0;width:100%;z-index:100}.filter-complex__left,.filter-complex__right{flex:1 1 50%;min-height:0}.filter-complex__right{border-left:none;border-top:1px solid var(--border-default)}}.filter-complex__head{align-items:center;display:flex;gap:var(--space-12);justify-content:space-between}.filter-complex__title{color:var(--text-primary);font-size:var(--font-14);font-weight:var(--weight-bold);margin:0}.filter-complex__presets{display:flex;flex-wrap:wrap;gap:var(--space-8)}.filter-complex__preset{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-primary);cursor:pointer;font-family:var(--font-sans);font-size:var(--font-12);font-weight:var(--weight-medium);height:26px;padding:0 var(--space-12);transition:all var(--duration-fast) var(--ease-in-out);white-space:nowrap}.filter-complex__preset:hover{border-color:var(--color-primary);color:var(--color-primary)}.filter-complex__preset.is-active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.filter-complex__search{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md,8px);display:flex;gap:var(--space-8);padding:7px var(--space-10)}.filter-complex__search:focus-within{border-color:var(--color-primary)}.filter-complex__search-input{background:transparent;border:none;color:var(--text-primary);flex:1;font-family:var(--font-sans);font-size:var(--font-14);outline:none}.filter-complex__search-input::-moz-placeholder{color:var(--text-muted)}.filter-complex__search-input::placeholder{color:var(--text-muted)}.filter-complex__search-clear{color:var(--text-muted);cursor:pointer;flex-shrink:0}.filter-complex__search-clear:hover{color:var(--text-secondary)}.filter-complex__action{background:none;border:none;cursor:pointer;font-family:var(--font-sans);font-size:var(--font-12);font-weight:var(--weight-medium);padding:0;text-decoration:underline;white-space:nowrap}.filter-complex__action--add{color:var(--color-primary)}.filter-complex__action--add:hover{color:var(--color-primary-hover)}.filter-complex__action--clear{color:var(--color-danger)}.filter-complex__list{display:flex;flex:1;flex-direction:column;overflow-y:auto}.filter-complex__item{align-items:center;background:none;border:none;border-radius:var(--radius-md,8px);color:var(--text-primary);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);gap:var(--space-10);padding:7px var(--space-8);text-align:left;transition:background-color var(--duration-fast) var(--ease-in-out)}.filter-complex__item:hover{background-color:var(--bg-surface-3)}.filter-complex__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter-complex__item-icon{flex-shrink:0}.filter-complex__item-icon--add{color:var(--color-primary)}.filter-complex__item-icon--remove{color:var(--color-danger)}.filter-complex__more{font-size:var(--font-12)}.filter-complex__empty,.filter-complex__more{color:var(--text-muted);padding:var(--space-8)}.filter-complex__empty{font-size:var(--font-14);font-style:italic}.dropdown-enter-active,.dropdown-leave-active{transition:opacity var(--duration-fast) var(--ease-in-out),transform var(--duration-fast) var(--ease-in-out)}.dropdown-enter-from,.dropdown-leave-to{opacity:0;transform:translateY(-4px)}
|
|
469
|
+
.filter-complex{position:relative}.filter-complex__trigger{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);box-sizing:border-box;color:var(--text-primary);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);font-weight:var(--weight-medium);gap:var(--space-6);height:var(--rm-fbar-field-h,32px);max-width:320px;padding:0 var(--space-12);transition:all var(--duration-fast) var(--ease-in-out);white-space:nowrap}.filter-complex__trigger:hover{background:var(--bg-surface-3)}.filter-complex__icon{color:var(--color-primary);flex-shrink:0}.filter-complex__trigger--active{border-color:var(--color-primary)}.filter-complex__label{color:var(--text-muted);flex-shrink:0;font-weight:var(--weight-normal)}.filter-complex__summary{font-weight:var(--weight-semibold);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter-complex__badge{align-items:center;background-color:color-mix(in srgb,var(--color-primary) 10%,transparent);border-radius:var(--radius-pill);color:var(--color-primary);display:inline-flex;flex-shrink:0;font-size:var(--font-12);font-weight:var(--weight-semibold);height:18px;justify-content:center;line-height:1;min-width:18px;padding:0 var(--space-6)}.filter-complex__caret{color:var(--text-muted);flex-shrink:0;transition:transform var(--duration-fast) var(--ease-in-out)}.filter-complex__caret--open{transform:rotate(180deg)}.filter-complex__panel{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-xl,12px);box-shadow:0 4px 24px rgba(var(--shadow-rgb),.1),0 2px 8px rgba(var(--shadow-rgb),.05);display:flex;left:0;max-height:460px;max-width:calc(100vw - 32px);overflow:hidden;position:absolute;top:calc(100% + 6px);width:var(--rm-fcx-panel-w,720px);z-index:50}.filter-complex__left,.filter-complex__right{display:flex;flex-direction:column;gap:var(--space-10);overflow:hidden;padding:var(--space-20)}.filter-complex__left{flex:1 1 50%}.filter-complex__right{border-left:1px solid var(--border-default);flex:1 1 50%}@media (max-width:767px){.filter-complex__panel{border:none;border-radius:0;flex-direction:column;inset:0;left:0;max-height:none;max-width:none;position:fixed;top:0;width:100%;z-index:100}.filter-complex__left,.filter-complex__right{flex:1 1 50%;min-height:0}.filter-complex__right{border-left:none;border-top:1px solid var(--border-default)}}.filter-complex__head{align-items:center;display:flex;gap:var(--space-12);justify-content:space-between}.filter-complex__title{color:var(--text-primary);font-size:var(--font-14);font-weight:var(--weight-bold);margin:0}.filter-complex__presets{display:flex;flex-wrap:wrap;gap:var(--space-8)}.filter-complex__preset{background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-pill);color:var(--text-primary);cursor:pointer;font-family:var(--font-sans);font-size:var(--font-12);font-weight:var(--weight-medium);height:26px;padding:0 var(--space-12);transition:all var(--duration-fast) var(--ease-in-out);white-space:nowrap}.filter-complex__preset:hover{border-color:var(--color-primary);color:var(--color-primary)}.filter-complex__preset.is-active{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.filter-complex__search{align-items:center;background:var(--bg-surface);border:1px solid var(--border-default);border-radius:var(--radius-md,8px);display:flex;gap:var(--space-8);padding:7px var(--space-10)}.filter-complex__search:focus-within{border-color:var(--color-primary)}.filter-complex__search-input{background:transparent;border:none;color:var(--text-primary);flex:1;font-family:var(--font-sans);font-size:var(--font-14);outline:none}.filter-complex__search-input::-moz-placeholder{color:var(--text-muted)}.filter-complex__search-input::placeholder{color:var(--text-muted)}.filter-complex__search-clear{color:var(--text-muted);cursor:pointer;flex-shrink:0}.filter-complex__search-clear:hover{color:var(--text-secondary)}.filter-complex__action{background:none;border:none;cursor:pointer;font-family:var(--font-sans);font-size:var(--font-12);font-weight:var(--weight-medium);padding:0;text-decoration:underline;white-space:nowrap}.filter-complex__action--add{color:var(--color-primary)}.filter-complex__action--add:hover{color:var(--color-primary-hover)}.filter-complex__action--clear{color:var(--color-danger)}.filter-complex__list{display:flex;flex:1;flex-direction:column;overflow-y:auto}.filter-complex__item{align-items:center;background:none;border:none;border-radius:var(--radius-md,8px);color:var(--text-primary);cursor:pointer;display:flex;font-family:var(--font-sans);font-size:var(--font-14);gap:var(--space-10);padding:7px var(--space-8);text-align:left;transition:background-color var(--duration-fast) var(--ease-in-out)}.filter-complex__item:hover{background-color:var(--bg-surface-3)}.filter-complex__item-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter-complex__item-icon{flex-shrink:0}.filter-complex__item-icon--add{color:var(--color-primary)}.filter-complex__item-icon--remove{color:var(--color-danger)}.filter-complex__more{font-size:var(--font-12)}.filter-complex__empty,.filter-complex__more{color:var(--text-muted);padding:var(--space-8)}.filter-complex__empty{font-size:var(--font-14);font-style:italic}.dropdown-enter-active,.dropdown-leave-active{transition:opacity var(--duration-fast) var(--ease-in-out),transform var(--duration-fast) var(--ease-in-out)}.dropdown-enter-from,.dropdown-leave-to{opacity:0;transform:translateY(-4px)}
|
|
459
470
|
</style>
|