@innertia-solutions/innertia-nuxt 0.1.37 → 0.1.39

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/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ All notable changes to `@innertia-solutions/innertia-nuxt` are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ### Fixed
8
+
9
+ - `Forms.Select`: el dropdown ahora usa `dropdownScope:'window'` (Preline lo teletransporta al `<body>` y lo posiciona con floating-ui). Deja de recortarse dentro de contenedores con scroll —modales, paneles— y flota por encima (`z-[10000]`). Se expone `window.FloatingUIDOM` en el plugin de Preline y se agrega `@floating-ui/dom` como dependencia.
10
+
11
+ ### Fixed
12
+
13
+ - `Kanban.Standard`: en modo `bordered=false`, el `ring` de highlight al arrastrar sobre una columna se recortaba por arriba (el contenedor `overflow-x-auto` sin padding clippeaba los 2px del ring). Se agrega `p-1` al scroll container en ese modo.
14
+
7
15
  ### BREAKING CHANGES
8
16
 
9
17
  #### apps → contexts rename
@@ -111,9 +111,10 @@ const handleChange = (e: Event) => {
111
111
  @change="handleChange"
112
112
  data-hs-select='{
113
113
  "placeholder": "Seleccionar...",
114
+ "dropdownScope": "window",
114
115
  "toggleTag": "<button type=\"button\" aria-expanded=\"false\"></button>",
115
- "toggleClasses": "innertia-field hs-select-disabled:pointer-events-none hs-select-disabled:opacity-50 aria-expanded:!rounded-b-none aria-expanded:!border-b-transparent relative pe-9 flex gap-x-2 items-center text-nowrap cursor-pointer text-start",
116
- "dropdownClasses": "-mt-px z-50 w-full max-h-72 py-1 bg-[color:var(--field-dropdown-bg)] border border-[color:var(--field-border)] rounded-b-control overflow-hidden overflow-y-auto shadow-lg",
116
+ "toggleClasses": "innertia-field hs-select-disabled:pointer-events-none hs-select-disabled:opacity-50 relative pe-9 flex gap-x-2 items-center text-nowrap cursor-pointer text-start",
117
+ "dropdownClasses": "z-[10000] w-full max-h-72 py-1 bg-[color:var(--field-dropdown-bg)] border border-[color:var(--field-border)] rounded-control overflow-hidden overflow-y-auto shadow-lg",
117
118
  "optionClasses": "py-2 px-3 w-full text-sm text-foreground cursor-pointer bg-transparent hover:bg-muted-hover focus:outline-hidden focus:bg-muted-hover",
118
119
  "optionTemplate": "<div class=\"flex justify-between items-center w-full\"><span data-title></span><span class=\"hidden hs-selected:block\"><svg class=\"shrink-0 size-3.5 text-blue-600 dark:text-blue-500\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg></span></div>"
119
120
  }'
@@ -141,24 +142,10 @@ const handleChange = (e: Event) => {
141
142
 
142
143
  <style>
143
144
  /*
144
- * Preline HSSelect: cuando el dropdown está abierto, el trigger pierde
145
- * sus esquinas inferiores y el borde inferior se vuelve invisible para
146
- * fusionarse visualmente con el dropdown panel.
147
- *
148
- * Estilos globales (sin scoped) porque el HSSelect inyecta DOM fuera
149
- * del componente Vue (button generado, no del template).
145
+ * Con `dropdownScope:'window'` Preline teletransporta el panel del dropdown al
146
+ * <body> y lo posiciona con floating-ui (fixed + offset). Así escapa el overflow
147
+ * de cualquier contenedor con scroll (modales, paneles, etc.) y flota por encima.
148
+ * El trigger conserva sus bordes/esquinas completos porque el panel ya no se
149
+ * "fusiona" con él — flota separado.
150
150
  */
151
- .hs-select [aria-expanded="true"].innertia-field {
152
- border-bottom-left-radius: 0 !important;
153
- border-bottom-right-radius: 0 !important;
154
- border-bottom-color: transparent !important;
155
- }
156
-
157
- /* Pegar el dropdown al trigger eliminando cualquier offset/margen que
158
- * Preline pueda inyectar. Target amplio: cualquier div con la clase
159
- * `rounded-b-control` dentro del wrapper `.hs-select`. */
160
- .hs-select div[class*="rounded-b-control"] {
161
- top: 100% !important;
162
- margin-top: -1px !important;
163
- }
164
151
  </style>
@@ -695,7 +695,7 @@ defineExpose({ reload: fetchAll, rows })
695
695
  ]"
696
696
  >
697
697
  <div
698
- :class="['overflow-x-auto', bordered ? 'p-3' : '']"
698
+ :class="['overflow-x-auto', bordered ? 'p-3' : 'p-1']"
699
699
  :style="sizeStyle"
700
700
  >
701
701
  <div v-if="loading && !rows.length" class="flex items-center justify-center py-16 gap-2 text-muted-foreground">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@innertia-solutions/innertia-nuxt",
3
- "version": "0.1.37",
3
+ "version": "0.1.39",
4
4
  "description": "Innertia Solutions — Nuxt layer unificada: core, auth, multitenancy, theme y app contexts",
5
5
  "keywords": [
6
6
  "nuxt",
@@ -31,6 +31,7 @@
31
31
  "vue": ">=3.5.0"
32
32
  },
33
33
  "dependencies": {
34
+ "@floating-ui/dom": "^1.7.6",
34
35
  "@nuxtjs/seo": "^3.4.0",
35
36
  "@pinia/nuxt": "^0.11.3",
36
37
  "@tabler/icons-vue": "^3.44.0",
@@ -3,6 +3,7 @@ declare global {
3
3
  HSStaticMethods?: { autoInit?: () => void }
4
4
  HSSelect?: new (el: HTMLElement) => { destroy?: () => void }
5
5
  HSThemeAppearance?: { init?: () => void }
6
+ FloatingUIDOM?: unknown
6
7
  }
7
8
  }
8
9
 
@@ -10,6 +11,13 @@ export default defineNuxtPlugin(async () => {
10
11
  if (!process.client) return
11
12
 
12
13
  try {
14
+ // Preline 3 lee `window.FloatingUIDOM` (global, no import) para posicionar
15
+ // dropdowns con `dropdownScope:'window'` (los teletransporta al body y flota
16
+ // con floating-ui, escapando cualquier overflow — ej. selects dentro de modales).
17
+ if (!window.FloatingUIDOM) {
18
+ window.FloatingUIDOM = await import('@floating-ui/dom')
19
+ }
20
+
13
21
  await import('preline')
14
22
 
15
23
  const initPreline = () => {