@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
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.16.0"
6
6
  },
7
- "version": "0.1.159",
7
+ "version": "0.1.160",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "0.8.4",
10
10
  "unbuild": "2.0.0"
@@ -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 par defaut et sur le bord droit du champ quand il depasserait
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 width = Math.min(PANEL_WIDTH, window.innerWidth - PANEL_GAP * 2)
192
- const left = rect.left + width > window.innerWidth - PANEL_GAP
193
- ? Math.max(PANEL_GAP, rect.right - width)
194
- : rect.left
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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tekkare/romulus",
3
- "version": "0.1.160",
3
+ "version": "0.1.161",
4
4
  "description": "Romulus Design System - Nuxt module by Tekkare",
5
5
  "license": "MIT",
6
6
  "type": "module",