@reservi/preact 2.0.0-beta.0 → 2.0.0-beta.2

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/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { CalendarApi } from '@reservi/core';
2
2
  import { CalendarOptions } from '@reservi/core';
3
+ import { CalendarViewAdapter } from '@reservi/core';
3
4
  import { ComponentChildren } from 'preact';
4
5
  import { DayGridModel } from '@reservi/core';
5
6
  import { dayGridPlugin } from '@reservi/core';
@@ -8,6 +9,7 @@ import { defineTheme } from '@reservi/core';
8
9
  import { EventDef } from '@reservi/core';
9
10
  import { EventInput } from '@reservi/core';
10
11
  import { eventsToICS } from '@reservi/core';
12
+ import { KeyboardAction } from '@reservi/core';
11
13
  import { ListModel } from '@reservi/core';
12
14
  import { listPlugin } from '@reservi/core';
13
15
  import { MultiMonthModel } from '@reservi/core';
@@ -39,15 +41,25 @@ declare interface CalendarProps {
39
41
  options: ReserviCalendarOptions;
40
42
  }
41
43
 
44
+ export { CalendarViewAdapter }
45
+
46
+ export declare function callDidMount<Arg extends {
47
+ el: HTMLElement;
48
+ }>(el: Element | null, hook: ((arg: Arg) => void) | undefined, buildArg: () => Omit<Arg, "el">): void;
49
+
42
50
  /** Une clases base con las del usuario (filtra vacíos). */
43
51
  export declare function cx(...classes: (string | undefined | false)[]): string;
44
52
 
53
+ /** Formateador de fecha para cabeceras; `false` significa "sin texto". */
54
+ export declare function dateFormatter(locale: string, options: Intl.DateTimeFormatOptions | false | undefined, fallback: Intl.DateTimeFormatOptions): ((date: Date) => string) | null;
55
+
45
56
  /** Argumento del slot de celda de día. */
46
57
  export declare interface DayCellContentArg {
47
58
  date: Date;
48
59
  dayNumber: number;
49
60
  isToday: boolean;
50
61
  isOther: boolean;
62
+ view: ViewArg;
51
63
  }
52
64
 
53
65
  export { dayGridPlugin }
@@ -65,6 +77,12 @@ declare interface DayGridViewProps {
65
77
  export declare interface DayHeaderContentArg {
66
78
  date: Date;
67
79
  text: string;
80
+ /** Día de la semana, 0 = domingo … 6 = sábado. */
81
+ dayOfWeek: number;
82
+ /** Día del mes (1–31). */
83
+ dayNumber: number;
84
+ isToday: boolean;
85
+ view: ViewArg;
68
86
  }
69
87
 
70
88
  export { definePlugin }
@@ -85,6 +103,13 @@ declare interface DragOptions {
85
103
  snap?: string | undefined;
86
104
  /** Si se indica, redimensiona por ese borde; si no, mueve el evento. */
87
105
  edge?: ResizeEdge | undefined;
106
+ /**
107
+ * Se llama en cada movimiento con el rango destino (minutos absolutos del
108
+ * dia), y con `null` al soltar. Sirve para pintar el fantasma que indica
109
+ * donde va a caer el evento; sin esto la tarjeta se queda quieta y salta a su
110
+ * nueva posicion solo al soltar.
111
+ */
112
+ onPreview?: ((range: RangePreview | null) => void) | undefined;
88
113
  }
89
114
 
90
115
  /** Argumento del slot de contenido de evento. */
@@ -93,6 +118,7 @@ export declare interface EventContentArg {
93
118
  isAllDay: boolean;
94
119
  /** Texto de hora ya formateado (vacío si allDay). */
95
120
  timeText: string;
121
+ view: ViewArg;
96
122
  }
97
123
 
98
124
  export { EventDef }
@@ -105,11 +131,43 @@ export declare type GridKind = "dayGrid" | "timeGrid";
105
131
 
106
132
  export declare function handleEventKeydown(e: KeyboardEvent, opts: KeydownOptions): void;
107
133
 
134
+ /**
135
+ * Puente para pintar contenido del framework anfitrión dentro del árbol de
136
+ * Preact. Lo implementan los wrappers (p. ej. `@reservi/react` con portales).
137
+ */
138
+ export declare interface HostBridge {
139
+ /** Un hueco ha entrado en el DOM: pinta `node` dentro de `el`. */
140
+ mount(id: string, el: HTMLElement, node: unknown): void;
141
+ /** El contenido del hueco `id` ha cambiado. */
142
+ update(id: string, node: unknown): void;
143
+ /** El hueco `id` ha salido del DOM: libera lo que se pintó en él. */
144
+ unmount(id: string): void;
145
+ }
146
+
147
+ /** Crea el marcador de contenido delegado al framework anfitrión. */
148
+ export declare function hostSlot(node: unknown): HostSlotResult;
149
+
150
+ /**
151
+ * Marcador que puede devolver un slot cuando el contenido lo pinta el
152
+ * framework anfitrión (React, Vue…). La capa Preact NO interpreta `node`:
153
+ * solo reserva un hueco en el DOM y delega en el `hostBridge`.
154
+ */
155
+ export declare interface HostSlotResult {
156
+ readonly __rsvHost: true;
157
+ /** Nodo del framework anfitrión (opaco para esta capa). */
158
+ readonly node: unknown;
159
+ }
160
+
161
+ /** ¿El resultado de un slot delega el render en el anfitrión? */
162
+ export declare function isHostSlot(value: unknown): value is HostSlotResult;
163
+
108
164
  declare interface KeydownOptions {
109
165
  api: CalendarApi;
110
166
  event: EventDef;
111
167
  kind: GridKind;
112
168
  snap?: string | undefined;
169
+ /** Override de atajos (se mergea sobre `DEFAULT_SHORTCUTS` por acción). */
170
+ shortcuts?: Partial<Record<KeyboardAction, string[]>> | undefined;
113
171
  }
114
172
 
115
173
  export { listPlugin }
@@ -123,6 +181,21 @@ declare interface ListViewProps {
123
181
  options: ReserviCalendarOptions;
124
182
  }
125
183
 
184
+ /** "HH:mm" a partir de minutos desde medianoche. */
185
+ export declare function minutesToLabel(minutes: number): string;
186
+
187
+ /** "HH:mm:ss" a partir de minutos desde medianoche (sin envolver a 24h). */
188
+ export declare function minutesToTimeString(minutes: number): string;
189
+
190
+ /** Argumento del slot del botón "+N more" (popover de eventos ocultos). */
191
+ export declare interface MoreLinkContentArg {
192
+ date: Date;
193
+ moreCount: number;
194
+ allEvents: EventDef[];
195
+ hiddenEvents: EventDef[];
196
+ view: ViewArg;
197
+ }
198
+
126
199
  /**
127
200
  * Monta un calendario Reservi en un elemento del DOM. API agnóstica usada
128
201
  * directamente (vanilla/Preact) y por los wrappers de framework.
@@ -154,12 +227,22 @@ declare interface Props_2 {
154
227
  options: ReserviCalendarOptions;
155
228
  }
156
229
 
230
+ /** Rango en curso (minutos absolutos del dia) para dibujar el `selectMirror`. */
231
+ export declare interface RangePreview {
232
+ startMin: number;
233
+ endMin: number;
234
+ }
235
+
157
236
  /**
158
237
  * Resuelve un slot de contenido: si el usuario aportó una función, usa su
159
238
  * resultado; si no, usa el contenido por defecto. Unifica el contrato de los
160
239
  * render hooks para todos los frameworks (en wrappers se adapta a su idioma).
240
+ *
241
+ * Si el slot devuelve `hostSlot(node)`, se reserva un hueco en el DOM y el
242
+ * `bridge` del framework anfitrión pinta el contenido dentro (React usa
243
+ * portales). Sin bridge se cae al contenido por defecto.
161
244
  */
162
- export declare function renderSlot<Arg>(slot: ((arg: Arg) => SlotResult) | undefined, arg: Arg, fallback: ComponentChildren): ComponentChildren;
245
+ export declare function renderSlot<Arg>(slot: ((arg: Arg) => SlotResult) | undefined, arg: Arg, fallback: ComponentChildren, bridge?: HostBridge | undefined): ComponentChildren;
163
246
 
164
247
  export declare interface ReserviCalendarHandle {
165
248
  /** API del calendario (navegación, eventos, callbacks). */
@@ -171,7 +254,13 @@ export declare interface ReserviCalendarHandle {
171
254
  /** Opciones de la capa Preact = opciones de núcleo + presentación. */
172
255
  export declare interface ReserviCalendarOptions extends CalendarOptions {
173
256
  slots?: ReserviSlots;
257
+ hooks?: ReserviHooks;
174
258
  classNames?: ReserviClassNames;
259
+ /**
260
+ * Puente de render del framework anfitrión. Lo inyecta el wrapper; no es
261
+ * necesario configurarlo a mano en uso vanilla/Preact.
262
+ */
263
+ hostBridge?: HostBridge;
175
264
  /**
176
265
  * Vistas a mostrar como pestañas en la segunda fila de la toolbar
177
266
  * (p. ej. ["dayGridMonth", "timeGridWeek", "listWeek"]). Si se omite, se
@@ -185,19 +274,52 @@ export declare interface ReserviCalendarOptions extends CalendarOptions {
185
274
  onAddClick?: () => void;
186
275
  /** Texto del botón "Añadir" (def. "+" sin etiqueta). */
187
276
  addButtonText?: string;
277
+ /**
278
+ * Cambia de vista automáticamente al redimensionar el contenedor (p. ej.
279
+ * mes → lista en mobile). Se evalúa el `breakpoint` más alto que sea
280
+ * `<= ancho actual` (estilo media query `min-width`).
281
+ */
282
+ responsiveViews?: {
283
+ breakpoint: number;
284
+ view: string;
285
+ }[];
188
286
  }
189
287
 
190
288
  /** Clases por slot, fusionadas con las base. */
191
289
  export declare interface ReserviClassNames {
192
290
  root?: string;
193
291
  toolbar?: string;
292
+ /** Celda de día (dayGrid/multiMonth). */
194
293
  day?: string;
195
294
  event?: string;
295
+ /** Cabecera de día (nombre del día / columna). */
296
+ dayHeader?: string;
297
+ /** Etiqueta del eje horario (timeGrid). */
298
+ slotLabel?: string;
299
+ }
300
+
301
+ /**
302
+ * Hooks de ciclo de vida sobre el DOM ya montado (equivalentes a los
303
+ * `*DidMount` de FullCalendar). Se invocan UNA vez por elemento del DOM.
304
+ */
305
+ export declare interface ReserviHooks {
306
+ eventDidMount?: (arg: EventContentArg & {
307
+ el: HTMLElement;
308
+ }) => void;
309
+ dayCellDidMount?: (arg: DayCellContentArg & {
310
+ el: HTMLElement;
311
+ }) => void;
312
+ dayHeaderDidMount?: (arg: DayHeaderContentArg & {
313
+ el: HTMLElement;
314
+ }) => void;
315
+ slotLabelDidMount?: (arg: SlotLabelContentArg & {
316
+ el: HTMLElement;
317
+ }) => void;
196
318
  }
197
319
 
198
320
  /**
199
- * Slots de render (patrón de "content" de FullCalendar). En fases posteriores
200
- * se añaden los hooks *DidMount/*WillUnmount y el resto de elementos (PARITY §11).
321
+ * Slots de render (patrón de "content" de FullCalendar). Cada slot devuelve
322
+ * contenido Preact, una cadena, o `hostSlot(...)` para delegar en el anfitrión.
201
323
  */
202
324
  export declare interface ReserviSlots {
203
325
  eventContent?: (arg: EventContentArg) => SlotResult;
@@ -205,6 +327,12 @@ export declare interface ReserviSlots {
205
327
  dayHeaderContent?: (arg: DayHeaderContentArg) => SlotResult;
206
328
  /** Personaliza la etiqueta del eje horario (timeGrid). */
207
329
  slotLabelContent?: (arg: SlotLabelContentArg) => SlotResult;
330
+ /**
331
+ * Personaliza el contenido del botón "+N more" (dayGrid/multiMonth). El
332
+ * `<button>` que abre el popover se conserva; el slot solo reemplaza su
333
+ * contenido interno (mismo patrón que `dayCellContent`).
334
+ */
335
+ moreLinkContent?: (arg: MoreLinkContentArg) => SlotResult;
208
336
  /**
209
337
  * Contenido libre al inicio de la toolbar (zona "Filtrar/Personal" del diseño).
210
338
  * El usuario decide qué botones poner y qué hacen; si no se define, no se
@@ -247,14 +375,21 @@ export declare interface SlotLabelContentArg {
247
375
  minutes: number;
248
376
  /** Si es una marca mayor (etiquetada). */
249
377
  isMajor: boolean;
378
+ view: ViewArg;
250
379
  }
251
380
 
252
- export declare type SlotResult = ComponentChildren | string;
381
+ export declare type SlotResult = ComponentChildren | string | HostSlotResult;
253
382
 
254
383
  export declare function startEventDrag(ev: PointerEvent, options: DragOptions): void;
255
384
 
256
385
  export { themeToStyle }
257
386
 
387
+ /**
388
+ * Formateador de hora: usa `Intl` si hay opciones, y si no el 24h por defecto
389
+ * que ya produce el núcleo. Devuelve null si no hay que sobreescribir nada.
390
+ */
391
+ export declare function timeFormatter(locale: string, options: Intl.DateTimeFormatOptions | undefined): ((date: Date) => string) | null;
392
+
258
393
  export { timeGridPlugin }
259
394
 
260
395
  /** Vista con eje temporal vertical (semana/día). */
@@ -296,4 +431,9 @@ declare interface ToolbarProps {
296
431
  options: ReserviCalendarOptions;
297
432
  }
298
433
 
434
+ /** Vista activa tal como la reciben los slots y los hooks `*DidMount`. */
435
+ export declare interface ViewArg {
436
+ readonly type: string;
437
+ }
438
+
299
439
  export { }