@yewdiel21/motion-kit 0.18.0 → 0.19.0
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/README.md +240 -222
- package/dist/auto/index.d.ts +4 -3
- package/dist/auto/index.js +5 -3
- package/dist/auto/index.js.map +1 -1
- package/dist/{chunk-QFBOHPWZ.js → chunk-CQP66AZK.js} +2 -2
- package/dist/{chunk-QP4QJOEN.js → chunk-H4STLMCM.js} +2 -2
- package/dist/{chunk-EDMXWUW3.js → chunk-KDIJX6G4.js} +3 -3
- package/dist/{chunk-DOOMULVV.js → chunk-OLT3CWDJ.js} +4 -2
- package/dist/chunk-OLT3CWDJ.js.map +1 -0
- package/dist/{chunk-AWDEKDEJ.js → chunk-PEDYJ2TV.js} +8 -22
- package/dist/chunk-PEDYJ2TV.js.map +1 -0
- package/dist/{chunk-Q7IW4FV3.js → chunk-Y4GIBTRG.js} +1422 -967
- package/dist/chunk-Y4GIBTRG.js.map +1 -0
- package/dist/css/components/code-block.css +267 -0
- package/dist/css/components/command-search.css +274 -2
- package/dist/css/components/dialog.css +264 -0
- package/dist/css/components/heatmap-chart.css +267 -1
- package/dist/css/components/scroll-area.css +261 -0
- package/dist/css/components/select.css +284 -4
- package/dist/elements/index.d.ts +15 -4
- package/dist/elements/index.js +36 -6
- package/dist/elements/index.js.map +1 -1
- package/dist/{engine-t8d7brjn.d.ts → engine-D6XV-WNt.d.ts} +50 -1
- package/dist/gl/index.js +2 -2
- package/dist/index.css +308 -7
- package/dist/index.d.ts +3 -3
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +20 -7
- package/dist/react/index.js +56 -7
- package/dist/react/index.js.map +1 -1
- package/dist/{reduced-dPsZYqtI.d.ts → reduced-4croIXl-.d.ts} +1 -1
- package/dist/{store-6hZNKiee.d.ts → store-CAHWkurn.d.ts} +1 -1
- package/package.json +110 -110
- package/registry.json +1357 -1340
- package/src/auto/auto-init.ts +341 -339
- package/src/components/code-block/README.md +1 -1
- package/src/components/code-block/code-block.css +5 -0
- package/src/components/code-block/engine.ts +5 -0
- package/src/components/command-search/README.md +1 -1
- package/src/components/command-search/command-search.css +12 -2
- package/src/components/command-search/engine.ts +6 -0
- package/src/components/dialog/README.md +104 -103
- package/src/components/dialog/dialog.css +2 -0
- package/src/components/dialog/engine.ts +465 -449
- package/src/components/heatmap-chart/README.md +48 -48
- package/src/components/heatmap-chart/engine.ts +6 -1
- package/src/components/heatmap-chart/heatmap-chart.css +5 -1
- package/src/components/icons.ts +1 -0
- package/src/components/scroll-area/README.md +89 -0
- package/src/components/scroll-area/element.ts +35 -0
- package/src/components/scroll-area/engine.ts +528 -0
- package/src/components/scroll-area/react.tsx +67 -0
- package/src/components/scroll-area/scroll-area.css +260 -0
- package/src/components/select/README.md +1 -1
- package/src/components/select/engine.ts +16 -4
- package/src/components/select/select.css +22 -4
- package/src/core/timing.ts +2 -0
- package/src/elements/index.ts +321 -318
- package/src/index.ts +1 -0
- package/src/motion/morph.ts +5 -2
- package/src/react/index.ts +2 -1
- package/dist/chunk-AWDEKDEJ.js.map +0 -1
- package/dist/chunk-DOOMULVV.js.map +0 -1
- package/dist/chunk-Q7IW4FV3.js.map +0 -1
- /package/dist/{chunk-QFBOHPWZ.js.map → chunk-CQP66AZK.js.map} +0 -0
- /package/dist/{chunk-QP4QJOEN.js.map → chunk-H4STLMCM.js.map} +0 -0
- /package/dist/{chunk-EDMXWUW3.js.map → chunk-KDIJX6G4.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# code-block
|
|
2
2
|
|
|
3
|
-
Bloque de código con título y lenguaje opcionales, números de línea y botón copiar con confirmación. El código siempre se trata como texto: una cadena que parece HTML se muestra como código, nunca se interpreta.
|
|
3
|
+
Bloque de código con título y lenguaje opcionales, números de línea y botón copiar con confirmación. El código siempre se trata como texto: una cadena que parece HTML se muestra como código, nunca se interpreta. Las líneas largas se desplazan con la barra de [`scroll-area`](../scroll-area/README.md), clara sobre el editor; al arrastrarla toma el color de las palabras clave.
|
|
4
4
|
|
|
5
5
|
```html
|
|
6
6
|
<mk-code-block class="mk-code-block" title="Instalar" language="bash">
|
|
@@ -20,6 +20,11 @@ mk-code-block {
|
|
|
20
20
|
--mk-code-property: #8fd6ff;
|
|
21
21
|
--mk-code-punctuation: #9aa0aa;
|
|
22
22
|
--mk-code-operator: #c9ced6;
|
|
23
|
+
/* The scroll-area bar, light on the editor in both modes; dragged, it takes the keyword colour like the focus ring. */
|
|
24
|
+
--mk-scroll-thumb: rgb(255 255 255 / 0.2);
|
|
25
|
+
--mk-scroll-thumb-hover: rgb(255 255 255 / 0.36);
|
|
26
|
+
--mk-scroll-thumb-active: var(--mk-code-keyword);
|
|
27
|
+
--mk-scroll-rail: rgb(255 255 255 / 0.05);
|
|
23
28
|
position: relative;
|
|
24
29
|
display: block;
|
|
25
30
|
overflow: hidden;
|
|
@@ -3,6 +3,7 @@ import { reduced } from '../../core/reduced';
|
|
|
3
3
|
import { createScope } from '../../core/scope';
|
|
4
4
|
import { inert, type Instance } from '../../core/types';
|
|
5
5
|
import { press } from '../../motion/micro';
|
|
6
|
+
import { createScrollArea } from '../scroll-area/engine';
|
|
6
7
|
import { languageFamily, renderCode } from './highlight';
|
|
7
8
|
|
|
8
9
|
/*
|
|
@@ -11,6 +12,7 @@ import { languageFamily, renderCode } from './highlight';
|
|
|
11
12
|
* show as code. Copy writes the exact string with the Clipboard API and reports
|
|
12
13
|
* success or failure in a polite status; on failure the code is selected so it
|
|
13
14
|
* can be copied by hand. A copy that finishes after destroy changes nothing.
|
|
15
|
+
* Long lines scroll under the kit's scroll-area bar, light on the dark editor.
|
|
14
16
|
* Parts (made when absent): pre > code, [data-mk-code-copy], [data-mk-code-status].
|
|
15
17
|
*/
|
|
16
18
|
|
|
@@ -136,6 +138,9 @@ export function createCodeBlock(root: HTMLElement | null, options: CodeBlockOpti
|
|
|
136
138
|
if (options.language) scope.attr(root, 'data-mk-language', options.language);
|
|
137
139
|
if (options.lineNumbers) scope.attr(root, 'data-mk-line-numbers', '');
|
|
138
140
|
scope.attr(root, 'data-mk-ready', '');
|
|
141
|
+
// The <pre> is already the keyboard's way in; the bar follows it under the header.
|
|
142
|
+
const area = createScrollArea(root, { viewport: pre, focusable: false, decorative: true });
|
|
143
|
+
scope.add(() => area.destroy());
|
|
139
144
|
|
|
140
145
|
// A framework that already rendered the lines owns them; the engine only copies.
|
|
141
146
|
const prerendered = Boolean(code.querySelector('[data-mk-code-line]'));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# command-search
|
|
2
2
|
|
|
3
|
-
Paleta de comandos en un `<dialog>` modal sobre vidrio oscuro. Se abre con ⌘K / Ctrl+K o con un botón `[data-mk-command-open]` y crece desde el botón que la abre (o desde el disparador visible con ⌘K/Ctrl+K) y se pliega de vuelta en él al cerrar: el color del botón se funde en el panel y la forma viaja 0,7 s; `open(origen)` elige otro control y `open(null)` la abre en su sitio. Al escribir filtra por coincidencia aproximada (letras en orden, sin tildes ni mayúsculas) y marca las letras con `<mark>` creado como texto. Los resultados se agrupan; una píldora se desliza bajo el activo con la curva swing.
|
|
3
|
+
Paleta de comandos en un `<dialog>` modal sobre vidrio oscuro. Se abre con ⌘K / Ctrl+K o con un botón `[data-mk-command-open]` y crece desde el botón que la abre (o desde el disparador visible con ⌘K/Ctrl+K) y se pliega de vuelta en él al cerrar: el color del botón se funde en el panel y la forma viaja 0,7 s; `open(origen)` elige otro control y `open(null)` la abre en su sitio. Al escribir filtra por coincidencia aproximada (letras en orden, sin tildes ni mayúsculas) y marca las letras con `<mark>` creado como texto. Los resultados se agrupan; una píldora se desliza bajo el activo con la curva swing. Los resultados largos se desplazan con la barra de [`scroll-area`](../scroll-area/README.md), clara sobre el vidrio oscuro; el foco sigue en el campo.
|
|
4
4
|
|
|
5
5
|
```html
|
|
6
6
|
<mk-command-search class="mk-command-search" items='[{"id":"charts","label":"Charts","group":"Páginas","href":"/chart"},{"id":"chart","label":"Chart","group":"Componentes","href":"/chart"}]'>
|
|
@@ -86,8 +86,18 @@ mk-command-search {
|
|
|
86
86
|
overflow-y: auto;
|
|
87
87
|
padding: 0 0.6rem 0.6rem;
|
|
88
88
|
overscroll-behavior: contain;
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* The scroll-area bar, light on the dark glass in both modes; long results leave it a lane. */
|
|
92
|
+
[data-mk-command] [data-mk-command-panel] {
|
|
93
|
+
--mk-scroll-thumb: rgb(255 255 255 / 0.2);
|
|
94
|
+
--mk-scroll-thumb-hover: rgb(255 255 255 / 0.36);
|
|
95
|
+
--mk-scroll-thumb-active: rgb(255 255 255 / 0.62);
|
|
96
|
+
--mk-scroll-rail: rgb(255 255 255 / 0.05);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
[data-mk-command] [data-mk-command-panel][data-mk-overflow-y] [data-mk-command-scroll] {
|
|
100
|
+
padding-right: 14px;
|
|
91
101
|
}
|
|
92
102
|
|
|
93
103
|
[data-mk-command] [data-mk-command-pill] {
|
|
@@ -5,6 +5,7 @@ import { inert, type Instance } from '../../core/types';
|
|
|
5
5
|
import { blurIn } from '../../motion/micro';
|
|
6
6
|
import { morphClose, morphOpen, releaseShared, showOrigin } from '../../motion/morph';
|
|
7
7
|
import { fadeBackdrop, openModal } from '../../motion/surface';
|
|
8
|
+
import { createScrollArea } from '../scroll-area/engine';
|
|
8
9
|
import { matchScore } from './match';
|
|
9
10
|
|
|
10
11
|
/*
|
|
@@ -17,6 +18,7 @@ import { matchScore } from './match';
|
|
|
17
18
|
* under the active result on the swing curve; arrows, Home and End move it,
|
|
18
19
|
* Enter picks it (onSelect, mk:select; an href navigates), Escape closes and
|
|
19
20
|
* focus goes back. Combobox + listbox semantics with aria-activedescendant.
|
|
21
|
+
* Long results scroll under the kit's scroll-area bar, kept light on the glass.
|
|
20
22
|
*/
|
|
21
23
|
|
|
22
24
|
export interface CommandItem {
|
|
@@ -119,6 +121,9 @@ export function createCommandSearch(root: HTMLElement | null, options: CommandSe
|
|
|
119
121
|
root.append(dialog);
|
|
120
122
|
scope.add(() => dialog.remove());
|
|
121
123
|
scope.attr(root, 'data-mk-ready', '');
|
|
124
|
+
// The bar runs between the field and the footer; the input keeps the focus, so it is not a tab stop.
|
|
125
|
+
const area = createScrollArea(panel, { viewport: scroller, axis: 'y', focusable: false, decorative: true });
|
|
126
|
+
scope.add(() => area.destroy());
|
|
122
127
|
|
|
123
128
|
let isOpen = false;
|
|
124
129
|
let opener: HTMLElement | null = null;
|
|
@@ -255,6 +260,7 @@ export function createCommandSearch(root: HTMLElement | null, options: CommandSe
|
|
|
255
260
|
openModal(dialog);
|
|
256
261
|
// The rows grow with the panel: no entrance of their own on open.
|
|
257
262
|
render(false);
|
|
263
|
+
area.refresh();
|
|
258
264
|
input.focus();
|
|
259
265
|
void fadeBackdrop(dialog, 'in');
|
|
260
266
|
morphOpen(panel, from, { hideOrigin: true });
|
|
@@ -1,103 +1,104 @@
|
|
|
1
|
-
# dialog
|
|
2
|
-
|
|
3
|
-
El diálogo sobre `<dialog>` nativo (foco atrapado, Escape, capa superior). El botón que lo abre se convierte en el diálogo y al cerrar vuelve a él.
|
|
4
|
-
|
|
5
|
-
- **Abrir desde el botón (morph):** la superficie viaja recortada desde el rect del botón en 0.7 s con la curva signature y toma su color en 0.3 s; el contenido crece como grupo desde la caja del botón con blur 8 → 0. El botón se oculta en 80 ms mientras está "dentro".
|
|
6
|
-
- **Elementos compartidos:** `data-mk-shared="titulo"` en una pieza del botón y otra del diálogo: el texto vuela de una a otra (0.7 s al abrir, 0.5 s al cerrar).
|
|
7
|
-
- **Sin botón en pantalla:** escala .92 → 1 en 0.35 s (`power2.out`).
|
|
8
|
-
- **Cerrar:** el diálogo se cierra al instante (el foco vuelve y la página responde) mientras una copia inerte se pliega al botón: forma 0.5 s, contenido con blur → 32 px (`.37,.35,0,1`) y fundido (`.56,.27,0,1`), velo `power3.in`; el botón reaparece 0.3 s tras 0.2 s. Sin botón: escala .9 + blur 32.
|
|
9
|
-
- **Líquido** (`variant="liquid"`): dos blobs bajo filtro goo; posición con resorte 144/14 y patada de 2400 px/s, tamaño 0.3 s `cubic(.8,.3,.5,.8)`, radio 0.7 s, contenido `scale 2 → 1` y blur 8 → 0, color 0.4 s tras 0.15 s. Cierre con resorte 130/18.
|
|
10
|
-
- **Backdrop:** tinte 0.5 s con la curva signature (`linear()`).
|
|
11
|
-
- **Auto-resize:** si el contenido crece o se encoge, la altura se ajusta en 0.45 s (signature).
|
|
12
|
-
- **Arrastrar para cerrar:** sigue al puntero a la mitad y encoge (`1 − y/400`); pasados 100 px se cierra donde quedó, si no vuelve con `elastic.out(.5,.5)` 0.5 s. También con la rueda. Ignora controles, áreas con scroll y `[data-mk-no-drag]`.
|
|
13
|
-
- **Ventana flotante** (`float="clave"`, escritorio ≥ 680 px): el asa la levanta (la página sigue usable), se mueve con resorte 1100/38 e inercia, se queda dentro de la pantalla, se redimensiona por las esquinas (mín. 320 × 240) y recuerda su sitio. Un clic en el asa la devuelve.
|
|
14
|
-
- **Móvil (< 680 px):** pantalla completa, radio 0.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
<button class="mk-button mk-button--
|
|
28
|
-
|
|
29
|
-
</
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
defineElements
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
<Dialog.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
<
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<Dialog.
|
|
51
|
-
|
|
52
|
-
</Dialog.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
| `
|
|
70
|
-
| `
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
<
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
<Dialog.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
1
|
+
# dialog
|
|
2
|
+
|
|
3
|
+
El diálogo sobre `<dialog>` nativo (foco atrapado, Escape, capa superior). El botón que lo abre se convierte en el diálogo y al cerrar vuelve a él.
|
|
4
|
+
|
|
5
|
+
- **Abrir desde el botón (morph):** la superficie viaja recortada desde el rect del botón en 0.7 s con la curva signature y toma su color en 0.3 s; el contenido crece como grupo desde la caja del botón con blur 8 → 0. El botón se oculta en 80 ms mientras está "dentro".
|
|
6
|
+
- **Elementos compartidos:** `data-mk-shared="titulo"` en una pieza del botón y otra del diálogo: el texto vuela de una a otra (0.7 s al abrir, 0.5 s al cerrar).
|
|
7
|
+
- **Sin botón en pantalla:** escala .92 → 1 en 0.35 s (`power2.out`).
|
|
8
|
+
- **Cerrar:** el diálogo se cierra al instante (el foco vuelve y la página responde) mientras una copia inerte se pliega al botón: forma 0.5 s, contenido con blur → 32 px (`.37,.35,0,1`) y fundido (`.56,.27,0,1`), velo `power3.in`; el botón reaparece 0.3 s tras 0.2 s. Sin botón: escala .9 + blur 32.
|
|
9
|
+
- **Líquido** (`variant="liquid"`): dos blobs bajo filtro goo; posición con resorte 144/14 y patada de 2400 px/s, tamaño 0.3 s `cubic(.8,.3,.5,.8)`, radio 0.7 s, contenido `scale 2 → 1` y blur 8 → 0, color 0.4 s tras 0.15 s. Cierre con resorte 130/18.
|
|
10
|
+
- **Backdrop:** tinte 0.5 s con la curva signature (`linear()`).
|
|
11
|
+
- **Auto-resize:** si el contenido crece o se encoge, la altura se ajusta en 0.45 s (signature).
|
|
12
|
+
- **Arrastrar para cerrar:** sigue al puntero a la mitad y encoge (`1 − y/400`); pasados 100 px se cierra donde quedó, si no vuelve con `elastic.out(.5,.5)` 0.5 s. También con la rueda. Ignora controles, áreas con scroll y `[data-mk-no-drag]`.
|
|
13
|
+
- **Ventana flotante** (`float="clave"`, escritorio ≥ 680 px): el asa la levanta (la página sigue usable), se mueve con resorte 1100/38 e inercia, se queda dentro de la pantalla, se redimensiona por las esquinas (mín. 320 × 240) y recuerda su sitio. Un clic en el asa la devuelve.
|
|
14
|
+
- **Móvil (< 680 px):** pantalla completa, radio 0.
|
|
15
|
+
- **Cuerpo largo:** `[data-mk-part="body"]` se desplaza con la barra de [`scroll-area`](../scroll-area/README.md) en lugar de la del sistema. Ocupa solo la caja del cuerpo, entre cabecera y pie, deja libres las esquinas redondeadas y funde los bordes con más contenido.
|
|
16
|
+
|
|
17
|
+
- **Sheet** (`variant="sheet"`): la hoja sube desde abajo (`y 100% → 0`, 0.72 s `cubic-bezier(.16,1,.3,1)`) y lo marcado con `[data-mk-underlay]` se hunde a escala .98 y opacidad .4 con un resorte 300/30. Al cerrar, una copia inerte cae por debajo de la pantalla y el foco vuelve al instante. No sale del botón. Mientras está abierta, la página no hace scroll.
|
|
18
|
+
|
|
19
|
+
## HTML / Astro
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<button class="mk-button" data-mk-open="crear">Crear proyecto</button>
|
|
23
|
+
|
|
24
|
+
<mk-dialog id="crear" heading="Crear proyecto" description="Se guarda en tu espacio.">
|
|
25
|
+
<label class="mk-field"><span class="mk-field__label">Nombre</span><input /></label>
|
|
26
|
+
<div data-mk-part="footer">
|
|
27
|
+
<button class="mk-button mk-button--text" data-mk-close>Cancelar</button>
|
|
28
|
+
<button class="mk-button mk-button--primary">Crear</button>
|
|
29
|
+
</div>
|
|
30
|
+
</mk-dialog>
|
|
31
|
+
|
|
32
|
+
<script>
|
|
33
|
+
import { defineElements } from '@yewdiel21/motion-kit/elements';
|
|
34
|
+
defineElements(['mk-dialog']);
|
|
35
|
+
</script>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Sin `heading`, tus hijos van dentro tal cual si ya usan partes (`data-mk-part="header|body|footer"`), o dentro de un cuerpo si no. Sobre tu propio `<dialog class="mk-dialog">`: `createDialog(dialog, opciones)`.
|
|
39
|
+
|
|
40
|
+
## React
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
<Dialog.Root variant="liquid" onOpenChange={setOpen}>
|
|
44
|
+
<Dialog.Trigger className="mk-button">Crear</Dialog.Trigger>
|
|
45
|
+
<Dialog.Content>
|
|
46
|
+
<Dialog.Header>
|
|
47
|
+
<div><Dialog.Title>Crear proyecto</Dialog.Title></div>
|
|
48
|
+
<Dialog.Actions><Dialog.Close /></Dialog.Actions>
|
|
49
|
+
</Dialog.Header>
|
|
50
|
+
<Dialog.Body>…</Dialog.Body>
|
|
51
|
+
<Dialog.Footer>…</Dialog.Footer>
|
|
52
|
+
</Dialog.Content>
|
|
53
|
+
</Dialog.Root>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Las opciones van en `Dialog.Root` (`variant`, `placement`, `float`…). Controlado con `open` + `onOpenChange`, o libre con `defaultOpen`. `Dialog.Trigger` registra su botón como origen.
|
|
57
|
+
|
|
58
|
+
## Opciones
|
|
59
|
+
|
|
60
|
+
| Opción | Atributo | Por defecto | Qué hace |
|
|
61
|
+
|---|---|---|---|
|
|
62
|
+
| `variant` | `variant` | `'morph'` | `'liquid'` para la versión líquida; `'sheet'` para la hoja que sube desde abajo; `'drawer'` desliza desde su lado (`data-mk-drawer`, ver [drawer](../drawer/README.md)) |
|
|
63
|
+
| `placement` | `placement` | `'center'` | `'anchor'` junto al botón, `'side'` panel lateral |
|
|
64
|
+
| `anchor` | — | caja del origen | Con `placement: 'anchor'`, función que devuelve la caja (`DOMRect`) junto a la que se coloca; se lee al abrir y al redimensionar ([context-menu](../context-menu/README.md) la usa para el puntero) |
|
|
65
|
+
| `backdrop` | `no-backdrop` | `true` | Velo tintado |
|
|
66
|
+
| `closeOnBackdrop` | `persistent` | `true` | Clic fuera cierra |
|
|
67
|
+
| `drag` | `no-drag` | `true` | Arrastrar para cerrar |
|
|
68
|
+
| `float` | `float="clave"` | `false` | Ventana flotante (necesita un `[data-mk-part="handle"]`; con `heading` se crea) |
|
|
69
|
+
| `autoResize` | — | `true` | Ajuste suave de altura |
|
|
70
|
+
| `triggers` | (el `id`) | `true` | `[data-mk-open="<id>"]` lo abre |
|
|
71
|
+
| `modal` | — | `true` | Modal o no |
|
|
72
|
+
| `labels` | `close-label` | `{ close: 'Cerrar', float, dock }` | Textos accesibles |
|
|
73
|
+
| `size` | `size` | `md` (400 px) | `sm` 360, `lg` 640, `xl` 960 |
|
|
74
|
+
|
|
75
|
+
## Sheet
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<main data-mk-underlay>…la página…</main>
|
|
79
|
+
<button class="mk-button" data-mk-open="proyecto">Ver proyecto</button>
|
|
80
|
+
<mk-dialog id="proyecto" variant="sheet" heading="Private Space">…</mk-dialog>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
<Dialog.Root variant="sheet">
|
|
85
|
+
<Dialog.Trigger>Ver proyecto</Dialog.Trigger>
|
|
86
|
+
<Dialog.Content>…</Dialog.Content>
|
|
87
|
+
</Dialog.Root>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Ancho hasta `--mk-sheet-max-width` (720px), alto hasta `100dvh − 24px`, radio solo arriba; en el móvil ocupa todo el ancho. Se cierra con Escape, con el fondo, arrastrando hacia abajo o con `[data-mk-close]`. Con movimiento reducido aparece y desaparece sin animar y la página de detrás no cambia. Funciones sueltas: `sheetOpen`, `sheetClose`, `pushUnderlay`, `releaseUnderlay`.
|
|
91
|
+
|
|
92
|
+
## Controles y eventos
|
|
93
|
+
|
|
94
|
+
`open(origen?)`, `close()`, `toggle(origen?)`, `float()`, `dock()`, `isOpen`, `isFloating`, `destroy()`.
|
|
95
|
+
Eventos que burbujean desde el `<dialog>`: `mk:open` (`detail.origin`), `mk:close` (cancelable; `detail.inPlace` tras un arrastre), `mk:closed`.
|
|
96
|
+
Cualquier `[data-mk-part="close"]` o `[data-mk-close]` dentro lo cierra.
|
|
97
|
+
|
|
98
|
+
## Variables CSS
|
|
99
|
+
|
|
100
|
+
`--mk-dialog-bg` (surface-2), `--mk-dialog-radius` (40px), `--mk-dialog-width` (400px), `--mk-dialog-padding` (24px), `--mk-dialog-shadow`.
|
|
101
|
+
|
|
102
|
+
## Accesibilidad
|
|
103
|
+
|
|
104
|
+
`<dialog>` nativo: foco atrapado, Escape, fondo inerte. El título (`data-mk-part="title"`) nombra el diálogo y la descripción lo describe. El foco va al primer campo al abrir y vuelve al botón al cerrar. Con movimiento reducido abre y cierra sin viaje ni arrastre.
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
--mk-dialog-width: 400px;
|
|
6
6
|
--mk-dialog-padding: 24px;
|
|
7
7
|
--mk-dialog-shadow: 0 24px 64px -16px rgb(0 0 0 / 0.35);
|
|
8
|
+
/* The body's scroll-area bar keeps its ends clear of the rounded corners. */
|
|
9
|
+
--mk-scroll-inset: max(6px, calc(var(--mk-dialog-radius) * 0.6));
|
|
8
10
|
width: min(var(--mk-dialog-width), calc(100vw - 32px));
|
|
9
11
|
max-width: none;
|
|
10
12
|
max-height: min(88dvh, calc(100dvh - 32px));
|