@tekkare/romulus 0.1.160 → 0.1.161
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
|
@@ -172,6 +172,50 @@ const PANEL_WIDTH = 820
|
|
|
172
172
|
/** Marge gardee contre les bords de la fenetre. */
|
|
173
173
|
const PANEL_GAP = 8
|
|
174
174
|
|
|
175
|
+
/**
|
|
176
|
+
* Largeur en dessous de laquelle un conteneur n'est pas pris pour cadre : une
|
|
177
|
+
* carte etroite qui cache son debordement reduirait le panneau a un couloir,
|
|
178
|
+
* alors qu'elle ne le decoupe plus (il est pose sur la fenetre).
|
|
179
|
+
*/
|
|
180
|
+
const MIN_BOUNDS = 360
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Le cadre dans lequel le panneau doit tenir.
|
|
184
|
+
*
|
|
185
|
+
* La fenetre ne suffit pas. Un filtre pose dans un tiroir colle au bord droit
|
|
186
|
+
* de l'ecran tient contre ce bord : cale a gauche le panneau sort du tiroir
|
|
187
|
+
* par la droite, cale a droite il en sort par la gauche et couvre la page.
|
|
188
|
+
* Dans les deux cas il flotte hors de la surface qui le porte, et le lecteur
|
|
189
|
+
* lit un panneau qui n'appartient visiblement plus a rien.
|
|
190
|
+
*
|
|
191
|
+
* On remonte donc jusqu'au premier ancetre qui borne son contenu (un tiroir,
|
|
192
|
+
* une modale, un panneau du cadre : tout ce qui n'a pas `overflow: visible`),
|
|
193
|
+
* et le panneau se range dedans. Sans ancetre de ce genre — le cas courant
|
|
194
|
+
* d'un filtre pose en pleine page — le cadre reste la fenetre, et le placement
|
|
195
|
+
* ne change pas.
|
|
196
|
+
*/
|
|
197
|
+
function panelBounds(): { left: number, right: number } {
|
|
198
|
+
const viewport = { left: PANEL_GAP, right: window.innerWidth - PANEL_GAP }
|
|
199
|
+
let node = rootRef.value?.parentElement
|
|
200
|
+
|
|
201
|
+
while (node && node !== document.body) {
|
|
202
|
+
const style = getComputedStyle(node)
|
|
203
|
+
const clips = `${style.overflowX}${style.overflowY}`.replace(/visible/g, '') !== ''
|
|
204
|
+
if (clips) {
|
|
205
|
+
const box = node.getBoundingClientRect()
|
|
206
|
+
if (box.width >= MIN_BOUNDS) {
|
|
207
|
+
return {
|
|
208
|
+
left: Math.max(viewport.left, box.left + PANEL_GAP),
|
|
209
|
+
right: Math.min(viewport.right, box.right - PANEL_GAP),
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
node = node.parentElement
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return viewport
|
|
217
|
+
}
|
|
218
|
+
|
|
175
219
|
/**
|
|
176
220
|
* Le panneau est pose sur la fenetre, pas dans le champ : depose dans le flux,
|
|
177
221
|
* il etait coupe des que le filtre vivait dans un conteneur qui defile (un
|
|
@@ -179,8 +223,7 @@ const PANEL_GAP = 8
|
|
|
179
223
|
* l'appelant ne le rattrapait.
|
|
180
224
|
*
|
|
181
225
|
* Il sort donc par un `Teleport` et se positionne a la main, sous le champ,
|
|
182
|
-
* cale a gauche
|
|
183
|
-
* de l'ecran.
|
|
226
|
+
* cale a gauche du champ et ramene dans son cadre quand il en depasserait.
|
|
184
227
|
*/
|
|
185
228
|
const panelStyle = ref<Record<string, string>>({})
|
|
186
229
|
|
|
@@ -188,10 +231,12 @@ function placePanel() {
|
|
|
188
231
|
const rect = rootRef.value?.getBoundingClientRect()
|
|
189
232
|
if (!rect) return
|
|
190
233
|
|
|
191
|
-
const
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
234
|
+
const bounds = panelBounds()
|
|
235
|
+
const width = Math.min(PANEL_WIDTH, bounds.right - bounds.left)
|
|
236
|
+
// Cale a gauche du champ, puis ramene dans le cadre : le bord droit d'abord,
|
|
237
|
+
// le gauche ensuite, pour qu'un cadre plus etroit que le panneau laisse voir
|
|
238
|
+
// son debut plutot que sa fin.
|
|
239
|
+
const left = Math.max(bounds.left, Math.min(rect.left, bounds.right - width))
|
|
195
240
|
|
|
196
241
|
// Sous le champ, sauf quand il ne reste rien dessous : le panneau se pose
|
|
197
242
|
// alors au-dessus, et sa hauteur se borne a la place reellement libre.
|