@erplora/outfitkit 0.1.1

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.
Files changed (210) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +457 -0
  3. package/dist/base/anchor.d.ts +13 -0
  4. package/dist/base/define.d.ts +1 -0
  5. package/dist/base/relay.d.ts +1 -0
  6. package/dist/cdn.d.ts +96 -0
  7. package/dist/components/ok-app-launcher/ok-app-launcher.d.ts +57 -0
  8. package/dist/components/ok-audio/ok-audio.d.ts +45 -0
  9. package/dist/components/ok-avatar/ok-avatar.d.ts +36 -0
  10. package/dist/components/ok-avatar-group/ok-avatar-group.d.ts +38 -0
  11. package/dist/components/ok-bar-list/ok-bar-list.d.ts +36 -0
  12. package/dist/components/ok-bento/ok-bento.d.ts +17 -0
  13. package/dist/components/ok-bento-item/ok-bento-item.d.ts +34 -0
  14. package/dist/components/ok-calculator/ok-calculator.d.ts +46 -0
  15. package/dist/components/ok-calendar/ok-calendar.d.ts +63 -0
  16. package/dist/components/ok-carousel/ok-carousel.d.ts +48 -0
  17. package/dist/components/ok-chart/ok-chart.d.ts +55 -0
  18. package/dist/components/ok-chat/ok-chat.d.ts +54 -0
  19. package/dist/components/ok-coachmark/ok-coachmark.d.ts +69 -0
  20. package/dist/components/ok-code/ok-code.d.ts +28 -0
  21. package/dist/components/ok-color-picker/ok-color-picker.d.ts +63 -0
  22. package/dist/components/ok-combo/ok-combo.d.ts +46 -0
  23. package/dist/components/ok-command-palette/ok-command-palette.d.ts +72 -0
  24. package/dist/components/ok-contact-form/ok-contact-form.d.ts +54 -0
  25. package/dist/components/ok-cropper/ok-cropper.d.ts +60 -0
  26. package/dist/components/ok-cta-band/ok-cta-band.d.ts +18 -0
  27. package/dist/components/ok-currency/ok-currency.d.ts +31 -0
  28. package/dist/components/ok-data-table/ok-data-table.d.ts +312 -0
  29. package/dist/components/ok-date-picker/ok-date-picker.d.ts +81 -0
  30. package/dist/components/ok-detail-list/ok-detail-list.d.ts +30 -0
  31. package/dist/components/ok-diff/ok-diff.d.ts +38 -0
  32. package/dist/components/ok-donut/ok-donut.d.ts +38 -0
  33. package/dist/components/ok-drawer/ok-drawer.d.ts +56 -0
  34. package/dist/components/ok-dropzone/ok-dropzone.d.ts +48 -0
  35. package/dist/components/ok-empty-state/ok-empty-state.d.ts +16 -0
  36. package/dist/components/ok-error-page/ok-error-page.d.ts +77 -0
  37. package/dist/components/ok-event-card/ok-event-card.d.ts +56 -0
  38. package/dist/components/ok-feature-card/ok-feature-card.d.ts +23 -0
  39. package/dist/components/ok-file-item/ok-file-item.d.ts +31 -0
  40. package/dist/components/ok-file-manager/ok-file-manager.d.ts +145 -0
  41. package/dist/components/ok-footer/ok-footer.d.ts +10 -0
  42. package/dist/components/ok-funnel/ok-funnel.d.ts +31 -0
  43. package/dist/components/ok-gallery/ok-gallery.d.ts +34 -0
  44. package/dist/components/ok-gauge/ok-gauge.d.ts +49 -0
  45. package/dist/components/ok-heatmap/ok-heatmap.d.ts +45 -0
  46. package/dist/components/ok-hero/ok-hero.d.ts +10 -0
  47. package/dist/components/ok-hover-card/ok-hover-card.d.ts +76 -0
  48. package/dist/components/ok-icon-tile/ok-icon-tile.d.ts +24 -0
  49. package/dist/components/ok-image/ok-image.d.ts +56 -0
  50. package/dist/components/ok-inline-feedback/ok-inline-feedback.d.ts +33 -0
  51. package/dist/components/ok-invoice/ok-invoice.d.ts +137 -0
  52. package/dist/components/ok-json-viewer/ok-json-viewer.d.ts +31 -0
  53. package/dist/components/ok-kanban/ok-kanban.d.ts +56 -0
  54. package/dist/components/ok-kbd/ok-kbd.d.ts +21 -0
  55. package/dist/components/ok-keyboard/ok-keyboard.d.ts +35 -0
  56. package/dist/components/ok-kpi/ok-kpi.d.ts +24 -0
  57. package/dist/components/ok-language-select/ok-language-select.d.ts +31 -0
  58. package/dist/components/ok-lightbox/ok-lightbox.d.ts +59 -0
  59. package/dist/components/ok-logo-cloud/ok-logo-cloud.d.ts +14 -0
  60. package/dist/components/ok-loyalty-card/ok-loyalty-card.d.ts +35 -0
  61. package/dist/components/ok-mail/ok-mail.d.ts +117 -0
  62. package/dist/components/ok-menu/ok-menu.d.ts +75 -0
  63. package/dist/components/ok-menubar/ok-menubar.d.ts +75 -0
  64. package/dist/components/ok-navbar/ok-navbar.d.ts +42 -0
  65. package/dist/components/ok-notification-center/ok-notification-center.d.ts +79 -0
  66. package/dist/components/ok-org-chart/ok-org-chart.d.ts +67 -0
  67. package/dist/components/ok-otp/ok-otp.d.ts +31 -0
  68. package/dist/components/ok-page-header/ok-page-header.d.ts +23 -0
  69. package/dist/components/ok-pagination/ok-pagination.d.ts +44 -0
  70. package/dist/components/ok-pdf/ok-pdf.d.ts +32 -0
  71. package/dist/components/ok-phone/ok-phone.d.ts +48 -0
  72. package/dist/components/ok-pinpad/ok-pinpad.d.ts +29 -0
  73. package/dist/components/ok-pricing-card/ok-pricing-card.d.ts +31 -0
  74. package/dist/components/ok-product-card/ok-product-card.d.ts +25 -0
  75. package/dist/components/ok-qr/ok-qr.d.ts +24 -0
  76. package/dist/components/ok-qty-stepper/ok-qty-stepper.d.ts +35 -0
  77. package/dist/components/ok-range-dual/ok-range-dual.d.ts +38 -0
  78. package/dist/components/ok-rating/ok-rating.d.ts +33 -0
  79. package/dist/components/ok-receipt/ok-receipt.d.ts +103 -0
  80. package/dist/components/ok-reveal/ok-reveal.d.ts +21 -0
  81. package/dist/components/ok-rich-text/ok-rich-text.d.ts +46 -0
  82. package/dist/components/ok-scheduler/ok-scheduler.d.ts +74 -0
  83. package/dist/components/ok-select-card/ok-select-card.d.ts +37 -0
  84. package/dist/components/ok-signature/ok-signature.d.ts +55 -0
  85. package/dist/components/ok-skeleton/ok-skeleton.d.ts +40 -0
  86. package/dist/components/ok-sparkline/ok-sparkline.d.ts +27 -0
  87. package/dist/components/ok-split-button/ok-split-button.d.ts +49 -0
  88. package/dist/components/ok-splitter/ok-splitter.d.ts +36 -0
  89. package/dist/components/ok-stat/ok-stat.d.ts +16 -0
  90. package/dist/components/ok-status-dot/ok-status-dot.d.ts +24 -0
  91. package/dist/components/ok-status-pill/ok-status-pill.d.ts +22 -0
  92. package/dist/components/ok-stepper/ok-stepper.d.ts +33 -0
  93. package/dist/components/ok-store/ok-store.d.ts +33 -0
  94. package/dist/components/ok-tag-input/ok-tag-input.d.ts +39 -0
  95. package/dist/components/ok-testimonial/ok-testimonial.d.ts +21 -0
  96. package/dist/components/ok-time-picker/ok-time-picker.d.ts +50 -0
  97. package/dist/components/ok-timeline/ok-timeline.d.ts +33 -0
  98. package/dist/components/ok-tree/ok-tree.d.ts +46 -0
  99. package/dist/components/ok-video/ok-video.d.ts +49 -0
  100. package/dist/components/ok-widget-board/ok-widget-board.d.ts +71 -0
  101. package/dist/components/ok-wizard/ok-wizard.d.ts +30 -0
  102. package/dist/define.js +8 -0
  103. package/dist/erplora.css +112 -0
  104. package/dist/index.d.ts +158 -0
  105. package/dist/index.js +197 -0
  106. package/dist/layout.css +338 -0
  107. package/dist/ok-app-launcher.js +396 -0
  108. package/dist/ok-audio.js +308 -0
  109. package/dist/ok-avatar-group.js +158 -0
  110. package/dist/ok-avatar.js +179 -0
  111. package/dist/ok-bar-list.js +189 -0
  112. package/dist/ok-bento-item.js +168 -0
  113. package/dist/ok-bento.js +63 -0
  114. package/dist/ok-calculator.js +406 -0
  115. package/dist/ok-calendar.js +541 -0
  116. package/dist/ok-carousel.js +352 -0
  117. package/dist/ok-chart.js +325 -0
  118. package/dist/ok-chat.js +320 -0
  119. package/dist/ok-coachmark.js +500 -0
  120. package/dist/ok-code.js +190 -0
  121. package/dist/ok-color-picker.js +569 -0
  122. package/dist/ok-combo.js +294 -0
  123. package/dist/ok-command-palette.js +448 -0
  124. package/dist/ok-contact-form.js +288 -0
  125. package/dist/ok-cropper.js +404 -0
  126. package/dist/ok-cta-band.js +134 -0
  127. package/dist/ok-currency.js +172 -0
  128. package/dist/ok-data-table.js +1281 -0
  129. package/dist/ok-date-picker.js +736 -0
  130. package/dist/ok-detail-list.js +156 -0
  131. package/dist/ok-diff.js +200 -0
  132. package/dist/ok-donut.js +280 -0
  133. package/dist/ok-drawer.js +357 -0
  134. package/dist/ok-dropzone.js +376 -0
  135. package/dist/ok-empty-state.js +104 -0
  136. package/dist/ok-error-page.js +547 -0
  137. package/dist/ok-event-card.js +384 -0
  138. package/dist/ok-feature-card.js +152 -0
  139. package/dist/ok-file-item.js +259 -0
  140. package/dist/ok-file-manager.js +1116 -0
  141. package/dist/ok-footer.js +67 -0
  142. package/dist/ok-funnel.js +181 -0
  143. package/dist/ok-gallery.js +293 -0
  144. package/dist/ok-gauge.js +385 -0
  145. package/dist/ok-heatmap.js +268 -0
  146. package/dist/ok-hero.js +43 -0
  147. package/dist/ok-hover-card.js +480 -0
  148. package/dist/ok-icon-tile.js +123 -0
  149. package/dist/ok-image.js +471 -0
  150. package/dist/ok-inline-feedback.js +221 -0
  151. package/dist/ok-invoice.js +229 -0
  152. package/dist/ok-json-viewer.js +330 -0
  153. package/dist/ok-kanban.js +427 -0
  154. package/dist/ok-kbd.js +159 -0
  155. package/dist/ok-keyboard.js +402 -0
  156. package/dist/ok-kpi.js +147 -0
  157. package/dist/ok-language-select.js +188 -0
  158. package/dist/ok-lightbox.js +490 -0
  159. package/dist/ok-logo-cloud.js +92 -0
  160. package/dist/ok-loyalty-card.js +353 -0
  161. package/dist/ok-mail.js +562 -0
  162. package/dist/ok-menu.js +529 -0
  163. package/dist/ok-menubar.js +628 -0
  164. package/dist/ok-navbar.js +306 -0
  165. package/dist/ok-notification-center.js +545 -0
  166. package/dist/ok-org-chart.js +619 -0
  167. package/dist/ok-otp.js +199 -0
  168. package/dist/ok-page-header.js +202 -0
  169. package/dist/ok-pagination.js +366 -0
  170. package/dist/ok-pdf.js +160 -0
  171. package/dist/ok-phone.js +225 -0
  172. package/dist/ok-pinpad.js +171 -0
  173. package/dist/ok-pricing-card.js +184 -0
  174. package/dist/ok-product-card.js +178 -0
  175. package/dist/ok-qr.js +652 -0
  176. package/dist/ok-qty-stepper.js +212 -0
  177. package/dist/ok-range-dual.js +280 -0
  178. package/dist/ok-rating.js +199 -0
  179. package/dist/ok-receipt.js +183 -0
  180. package/dist/ok-reveal.js +94 -0
  181. package/dist/ok-rich-text.js +538 -0
  182. package/dist/ok-scheduler.js +518 -0
  183. package/dist/ok-select-card.js +231 -0
  184. package/dist/ok-signature.js +267 -0
  185. package/dist/ok-skeleton.js +345 -0
  186. package/dist/ok-sparkline.js +150 -0
  187. package/dist/ok-split-button.js +251 -0
  188. package/dist/ok-splitter.js +289 -0
  189. package/dist/ok-stat.js +77 -0
  190. package/dist/ok-status-dot.js +163 -0
  191. package/dist/ok-status-pill.js +123 -0
  192. package/dist/ok-stepper.js +299 -0
  193. package/dist/ok-store.js +83 -0
  194. package/dist/ok-tag-input.js +358 -0
  195. package/dist/ok-testimonial.js +136 -0
  196. package/dist/ok-time-picker.js +472 -0
  197. package/dist/ok-timeline.js +251 -0
  198. package/dist/ok-tree.js +266 -0
  199. package/dist/ok-video.js +362 -0
  200. package/dist/ok-widget-board.js +265 -0
  201. package/dist/ok-wizard.js +153 -0
  202. package/dist/outfitkit.js +96 -0
  203. package/dist/shared/anchor.js +14 -0
  204. package/dist/store/controller.d.ts +17 -0
  205. package/dist/store/idb.d.ts +16 -0
  206. package/dist/store/store.d.ts +39 -0
  207. package/dist/store-controller.js +31 -0
  208. package/dist/store.js +182 -0
  209. package/dist/theme.example.css +70 -0
  210. package/package.json +147 -0
@@ -0,0 +1,46 @@
1
+ import { LitElement } from 'lit';
2
+ export interface OkComboOption {
3
+ /** Valor interno (lo que se fija en `value`). */
4
+ value: string;
5
+ /** Texto visible en el input y en el dropdown. */
6
+ label: string;
7
+ }
8
+ export interface OkComboLabels {
9
+ /** Texto guía del campo de búsqueda. */
10
+ placeholder: string;
11
+ /** Texto mostrado cuando ninguna opción casa con la búsqueda. */
12
+ empty: string;
13
+ }
14
+ export declare class OkCombo extends LitElement {
15
+ static styles: import("lit").CSSResult;
16
+ /** Opciones disponibles. */
17
+ options: OkComboOption[];
18
+ /** Valor seleccionado actual. */
19
+ value: string;
20
+ /** Texto guía del campo. Si se deja vacío, usa `labels.placeholder` (inglés por defecto). */
21
+ placeholder: string;
22
+ /** Etiqueta opcional mostrada sobre el campo. */
23
+ label?: string;
24
+ /** Textos i18n (default inglés); pasa solo las claves que quieras sobreescribir. */
25
+ labels: Partial<OkComboLabels>;
26
+ private get t();
27
+ private get effectivePlaceholder();
28
+ private query;
29
+ private open;
30
+ private activeIndex;
31
+ private onDocClick;
32
+ connectedCallback(): void;
33
+ disconnectedCallback(): void;
34
+ private get displayText();
35
+ private get filtered();
36
+ private close;
37
+ private handleInput;
38
+ private choose;
39
+ private handleKeydown;
40
+ render(): unknown;
41
+ }
42
+ declare global {
43
+ interface HTMLElementTagNameMap {
44
+ 'ok-combo': OkCombo;
45
+ }
46
+ }
@@ -0,0 +1,72 @@
1
+ import { LitElement } from 'lit';
2
+ export interface OkCommand {
3
+ /** Identificador único del comando (clave de selección). */
4
+ id: string;
5
+ /** Texto visible principal del comando. */
6
+ label: string;
7
+ /** Texto secundario tenue a la derecha del label (descripción corta). */
8
+ hint?: string;
9
+ /** Nombre de un ionicon opcional, mostrado a la izquierda. */
10
+ icon?: string;
11
+ /** Grupo bajo el que se agrupa el comando (cabecera de sección). */
12
+ group?: string;
13
+ /** Atajo de teclado a mostrar a la derecha (decorativo, p.ej. "Cmd N"). */
14
+ shortcut?: string;
15
+ /** Palabras clave extra que también casan con la búsqueda (además del label). */
16
+ keywords?: string[];
17
+ }
18
+ /** Textos humanos de ok-command-palette (i18n; default inglés, override vía prop `labels`). */
19
+ export interface OkCommandPaletteLabels {
20
+ /** Placeholder del input de búsqueda. */
21
+ searchPlaceholder: string;
22
+ /** aria-label del overlay (dialog). */
23
+ dialogLabel: string;
24
+ /** Pista visual del atajo para cerrar (tecla Escape). */
25
+ escHint: string;
26
+ /** Estado vacío: ningún comando coincide. */
27
+ noMatches: string;
28
+ }
29
+ export declare class OkCommandPalette extends LitElement {
30
+ static styles: import("lit").CSSResult;
31
+ /** Comandos disponibles en la paleta. */
32
+ commands: OkCommand[];
33
+ /** Abierto/cerrado (reflejado a atributo para CSS externo). */
34
+ open: boolean;
35
+ /** Texto guía del input de búsqueda. Si vacío, se deriva de `labels.searchPlaceholder`. */
36
+ placeholder: string;
37
+ /** Si true, Cmd/Ctrl+K abre/cierra la paleta globalmente. */
38
+ hotkey: boolean;
39
+ /** Overrides de textos humanos (i18n). Se fusionan sobre los defaults en inglés. */
40
+ labels: Partial<OkCommandPaletteLabels>;
41
+ /** Textos efectivos (defaults inglés + overrides). */
42
+ private get t();
43
+ /** Placeholder efectivo: prop explícita o el de labels. */
44
+ private get effectivePlaceholder();
45
+ private queryText;
46
+ private activeIndex;
47
+ private searchInput?;
48
+ private readonly onGlobalKey;
49
+ connectedCallback(): void;
50
+ disconnectedCallback(): void;
51
+ /** Abre la paleta (resetea búsqueda y resaltado, enfoca el input). */
52
+ openPalette(): void;
53
+ /** Cierra la paleta. */
54
+ close(): void;
55
+ /** Alterna abierto/cerrado. */
56
+ toggle(): void;
57
+ private emitOpen;
58
+ private commandMatches;
59
+ private filtered;
60
+ private grouped;
61
+ private onInput;
62
+ private onPanelKey;
63
+ private execute;
64
+ private onScrimClick;
65
+ private renderItem;
66
+ render(): unknown;
67
+ }
68
+ declare global {
69
+ interface HTMLElementTagNameMap {
70
+ 'ok-command-palette': OkCommandPalette;
71
+ }
72
+ }
@@ -0,0 +1,54 @@
1
+ import { LitElement } from 'lit';
2
+ export interface OkContactFormLabels {
3
+ /** Label del campo Nombre. */
4
+ nameLabel: string;
5
+ /** Label del campo Email. */
6
+ emailLabel: string;
7
+ /** Label del campo Asunto (opcional). */
8
+ subjectLabel: string;
9
+ /** Label del campo Mensaje. */
10
+ messageLabel: string;
11
+ /** Texto del botón mientras se envía. */
12
+ sending: string;
13
+ /** Error: nombre obligatorio. */
14
+ errorNameRequired: string;
15
+ /** Error: email obligatorio. */
16
+ errorEmailRequired: string;
17
+ /** Error: email con formato inválido. */
18
+ errorEmailInvalid: string;
19
+ /** Error: mensaje obligatorio. */
20
+ errorMessageRequired: string;
21
+ /** Error: el POST falló (respuesta no-ok). */
22
+ errorSendFailed: string;
23
+ /** Error: el POST falló por red/conexión. */
24
+ errorNetwork: string;
25
+ }
26
+ export declare class OkContactForm extends LitElement {
27
+ static styles: import("lit").CSSResult;
28
+ /** Título opcional sobre el formulario. */
29
+ heading?: string;
30
+ /** Texto del botón de envío. */
31
+ submitLabel: string;
32
+ /** URL opcional: si se da, el envío válido hace además POST nativo (fetch). */
33
+ action?: string;
34
+ /** Texto mostrado tras un envío correcto. */
35
+ successMessage: string;
36
+ /** Textos i18n (default inglés); pasa solo las claves que quieras sobreescribir. */
37
+ labels: Partial<OkContactFormLabels>;
38
+ private get t();
39
+ private values;
40
+ private errors;
41
+ private sent;
42
+ private sending;
43
+ private static EMAIL_RE;
44
+ private onInput;
45
+ private validate;
46
+ private onSubmit;
47
+ private markSent;
48
+ render(): unknown;
49
+ }
50
+ declare global {
51
+ interface HTMLElementTagNameMap {
52
+ 'ok-contact-form': OkContactForm;
53
+ }
54
+ }
@@ -0,0 +1,60 @@
1
+ import { LitElement } from 'lit';
2
+ /** Relaciones de aspecto admitidas para el recorte. */
3
+ export type OkCropperAspect = 'free' | '1:1' | '4:3' | '16:9';
4
+ /** Rectángulo de recorte en porcentaje del viewport (0..100). */
5
+ export interface OkCropRect {
6
+ /** Borde izquierdo (% del ancho). */
7
+ x: number;
8
+ /** Borde superior (% del alto). */
9
+ y: number;
10
+ /** Ancho (% del ancho del viewport). */
11
+ width: number;
12
+ /** Alto (% del alto del viewport). */
13
+ height: number;
14
+ }
15
+ /** Detalle del evento `ok-crop`. */
16
+ export interface OkCropDetail {
17
+ rect: OkCropRect;
18
+ }
19
+ export declare class OkCropper extends LitElement {
20
+ static styles: import("lit").CSSResult;
21
+ /** URL de la imagen a recortar. */
22
+ src?: string;
23
+ /** Relación de aspecto forzada del recorte. */
24
+ aspect: OkCropperAspect;
25
+ /** Rect de recorte inicial (en % del viewport). Si no se da, se usa un recorte centrado. */
26
+ value?: OkCropRect;
27
+ /** Texto del botón de cancelar. */
28
+ cancelLabel: string;
29
+ /** Texto del botón de recortar. */
30
+ cropLabel: string;
31
+ private rect;
32
+ private dragMode;
33
+ private startX;
34
+ private startY;
35
+ private startRect;
36
+ private vpRect;
37
+ private activePointer;
38
+ willUpdate(changed: Map<string, unknown>): void;
39
+ /** Limita un rect a los bordes [0..100] del viewport. */
40
+ private clampRect;
41
+ /** Aspect ratio del viewport en px (para convertir proporciones de imagen ↔ % de viewport). */
42
+ private vpAspect;
43
+ /** Re-encaja un rect para cumplir el aspect ratio activo (anclado en su esquina top-left). */
44
+ private applyAspect;
45
+ private onPointerDown;
46
+ private onPointerMove;
47
+ /** Redimensiona desde una esquina, respetando mínimo, bordes y aspect ratio. */
48
+ private resize;
49
+ private onPointerUp;
50
+ disconnectedCallback(): void;
51
+ private setAspect;
52
+ private emitCrop;
53
+ private emitCancel;
54
+ render(): unknown;
55
+ }
56
+ declare global {
57
+ interface HTMLElementTagNameMap {
58
+ 'ok-cropper': OkCropper;
59
+ }
60
+ }
@@ -0,0 +1,18 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class OkCtaBand extends LitElement {
3
+ static styles: import("lit").CSSResult;
4
+ /** Eyebrow opcional. */
5
+ eyebrow?: string;
6
+ /** Título. Para markup rico usa slot="heading". */
7
+ heading?: string;
8
+ /** Subtítulo. */
9
+ subheading?: string;
10
+ /** Estilo: 'solid' (def, degradado de marca) | 'soft' | 'glass'. */
11
+ variant: 'solid' | 'soft' | 'glass';
12
+ render(): unknown;
13
+ }
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ 'ok-cta-band': OkCtaBand;
17
+ }
18
+ }
@@ -0,0 +1,31 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class OkCurrency extends LitElement {
3
+ static styles: import("lit").CSSResult;
4
+ /** Importe numérico actual. */
5
+ value?: number;
6
+ /** Código ISO 4217 de la moneda. */
7
+ currency: string;
8
+ /** Locale BCP-47 para el formato (def: navegador o 'es-ES'). */
9
+ locale: string;
10
+ /** Placeholder cuando el campo está vacío. */
11
+ placeholder: string;
12
+ /** Etiqueta opcional sobre el campo. */
13
+ label?: string;
14
+ private display;
15
+ private focused;
16
+ private currencyFormatter;
17
+ private decimalSeparator;
18
+ private sanitize;
19
+ private parse;
20
+ private syncDisplayFromValue;
21
+ protected willUpdate(changed: Map<string, unknown>): void;
22
+ private onInput;
23
+ private onFocus;
24
+ private onBlur;
25
+ render(): unknown;
26
+ }
27
+ declare global {
28
+ interface HTMLElementTagNameMap {
29
+ 'ok-currency': OkCurrency;
30
+ }
31
+ }
@@ -0,0 +1,312 @@
1
+ import { LitElement } from 'lit';
2
+ export interface DataTableColumn {
3
+ /** Clave del campo en la fila (o id lógico si se usa `format`). */
4
+ key: string;
5
+ /** Cabecera de la columna. */
6
+ header: string;
7
+ /** Formateador → string a mostrar. Si se omite, se usa row[key]. */
8
+ format?: (row: Record<string, unknown>) => string;
9
+ /** Alineación del contenido de la celda. */
10
+ align?: 'left' | 'right' | 'center';
11
+ /** (server) La columna es ordenable: cabecera clicable que emite `sortChange`. */
12
+ sortable?: boolean;
13
+ /** (server) La columna es filtrable: añade un control en la fila de filtros. */
14
+ filterable?: boolean;
15
+ /** (server) Tipo de control de filtro. Por defecto 'text'. */
16
+ filterType?: 'text' | 'select' | 'multiselect' | 'number' | 'date' | 'range' | 'daterange';
17
+ /** (server) Opciones para `filterType: 'select'` / `'multiselect'`. */
18
+ options?: {
19
+ value: string;
20
+ label: string;
21
+ }[];
22
+ /** Render de celda a medida (devuelve un TemplateResult de Lit, p.ej. un `ok-toggle` o un chip).
23
+ * Tiene prioridad sobre `format`/valor crudo. El módulo lo crea con su `html` (lit deduplicado). */
24
+ render?: (row: Record<string, unknown>) => unknown;
25
+ /** Oculta la columna por defecto (el usuario la reactiva en el selector de columnas). */
26
+ hidden?: boolean;
27
+ /** (opcional) Ancho CSS de la columna en la vista lista en grid (p.ej. '8rem', '20%', 'minmax(8rem,1fr)').
28
+ * Si se omite, la columna ocupa `minmax(8rem,1fr)`. Sin efecto en el fallback con <table>. */
29
+ width?: string;
30
+ }
31
+ /** Vista de presentación de las filas (lista/tarjetas). */
32
+ export type DataTableView = 'table' | 'cards';
33
+ export interface DataTableAction {
34
+ /** Id que se emite en `rowAction`. */
35
+ id: string;
36
+ /** Texto del botón (o aria-label si solo hay icono). */
37
+ label: string;
38
+ /** Nombre de un ion-icon opcional. */
39
+ icon?: string;
40
+ /** Color Ionic del botón (p.ej. 'danger', 'primary'). */
41
+ color?: string;
42
+ }
43
+ /** Acción primaria de la topbar (botón destacado). Emite el evento `primaryAction`. */
44
+ export interface DataTablePrimaryAction {
45
+ /** Texto / aria-label del botón. */
46
+ label: string;
47
+ /** Nombre de un ion-icon opcional (por defecto 'add'). */
48
+ icon?: string;
49
+ }
50
+ /** Clave estable de fila: nombre de campo o función que la devuelve. */
51
+ export type DataTableRowKey = string | ((row: Record<string, unknown>) => string);
52
+ /** (NUEVO, additivo) Todos los textos humanos del data-table, para i18n. Default en INGLÉS.
53
+ * Se pasan desde fuera vía la prop `.labels` (parcial); lo no pasado cae al default inglés.
54
+ * El contenido data-driven (columns/rows/options) NO va aquí — ya es externo. */
55
+ export interface OkDataTableLabels {
56
+ /** Placeholder del buscador. */
57
+ search: string;
58
+ /** Estado vacío / "sin resultados". */
59
+ empty: string;
60
+ /** Título del botón/panel de filtros + aria del drawer de filtros. */
61
+ filters: string;
62
+ /** Botón "Limpiar" (selección y filtros). */
63
+ clear: string;
64
+ /** Botón "Aplicar" (filtros). */
65
+ apply: string;
66
+ /** Barra de selección: "{n} seleccionados" ({n} = nº filas). */
67
+ selected: string;
68
+ /** Botón "Importar CSV". */
69
+ importCsv: string;
70
+ /** Botón "Exportar CSV". */
71
+ exportCsv: string;
72
+ /** Botón "Añadir" (alta). */
73
+ add: string;
74
+ /** Aria del botón de menú overflow (⋮). */
75
+ moreActions: string;
76
+ /** Aria del selector de "filas por página". */
77
+ rowsPerPage: string;
78
+ /** Sufijo del selector compacto de tamaño de página (p.ej. "10 / pág."). */
79
+ perPageShort: string;
80
+ /** Aria del botón de vista lista. */
81
+ viewList: string;
82
+ /** Aria del botón de vista tarjetas. */
83
+ viewCards: string;
84
+ /** Aria del selector de columnas. */
85
+ columnsVisible: string;
86
+ /** Texto resumido del selector de columnas. */
87
+ columns: string;
88
+ /** Cabecera de la columna de acciones de fila. */
89
+ actions: string;
90
+ /** Aria del botón "Cerrar" (drawer). */
91
+ close: string;
92
+ /** Título del drawer de alta. */
93
+ newRecord: string;
94
+ /** Aria del drawer del formulario de alta/edición. */
95
+ form: string;
96
+ /** Placeholder del input de filtro de texto. */
97
+ filterPlaceholder: string;
98
+ /** Etiqueta/placeholder "Desde" (rango de fechas). */
99
+ from: string;
100
+ /** Etiqueta/placeholder "Hasta" (rango de fechas). */
101
+ to: string;
102
+ /** Sufijo aria "{label} desde" (rango de fechas en línea); {label} = cabecera de columna. */
103
+ fromOf: string;
104
+ /** Sufijo aria "{label} hasta" (rango de fechas en línea); {label} = cabecera de columna. */
105
+ toOf: string;
106
+ /** Placeholder "≥" (rango numérico, borde inferior). */
107
+ gte: string;
108
+ /** Placeholder "≤" (rango numérico, borde superior). */
109
+ lte: string;
110
+ /** Texto cuando una columna no tiene valores distintos (chips de filtro). */
111
+ noValues: string;
112
+ /** Aria "Seleccionar todo" (checkbox de cabecera). */
113
+ selectAll: string;
114
+ /** Aria "Seleccionar fila" (checkbox de fila, vista lista). */
115
+ selectRow: string;
116
+ /** Aria "Seleccionar" (checkbox de tarjeta). */
117
+ select: string;
118
+ /** Pager: "Mostrando {from}–{to} de" ({from}/{to} ya interpolados por el componente). */
119
+ showing: string;
120
+ /** Pager: singular "registro" (cuando count === 1). */
121
+ recordSingular: string;
122
+ /** Pager: plural "registros" (cuando count !== 1). */
123
+ recordPlural: string;
124
+ }
125
+ export declare class OkDataTable extends LitElement {
126
+ static styles: import("lit").CSSResult;
127
+ /** Columnas a renderizar. */
128
+ columns: DataTableColumn[];
129
+ /** Filas (objetos planos). En modo servidor, solo las de la página actual. */
130
+ rows: Record<string, unknown>[];
131
+ /** (cliente) Campos sobre los que filtra el buscador en memoria. Vacío = sin buscador. */
132
+ searchKeys: string[];
133
+ /** Campo usado como key estable de fila. */
134
+ rowKeyField: string;
135
+ /** (NUEVO, opcional) Clave estable de fila: nombre de campo o función. Tiene prioridad sobre
136
+ * `rowKeyField`; por defecto usa `row.id` (vía `rowKeyField`). Se usa para selección y `repeat`. */
137
+ rowKey?: DataTableRowKey;
138
+ /** Filas por página. */
139
+ pageSize: number;
140
+ /** Mensaje cuando no hay filas. Si no se pasa, deriva de `this.t.empty` (inglés por defecto). */
141
+ emptyMessage?: string;
142
+ /** Placeholder del buscador. Si no se pasa, deriva de `this.t.search` (inglés por defecto). */
143
+ searchPlaceholder?: string;
144
+ /** (NUEVO, additivo) Textos humanos del data-table para i18n (parcial). Lo no pasado cae al
145
+ * default inglés (`DEFAULT_LABELS`). No afecta a columns/rows/options (ya externos). */
146
+ labels: Partial<OkDataTableLabels>;
147
+ /** Acciones por fila (botones). */
148
+ actions: DataTableAction[];
149
+ /** Muestra el botón "+" que despliega un acordeón con el slot `create` (formulario de alta). */
150
+ addable: boolean;
151
+ /** Opciones del selector de "filas por página". Vacío = sin selector. */
152
+ pageSizeOptions: number[];
153
+ /** Modo "llenar el contenedor": la tabla ocupa el alto disponible, las filas hacen scroll DENTRO
154
+ * (cabecera sticky) y el pager queda SIEMPRE visible. Requiere que el contenedor tenga alto. */
155
+ fill: boolean;
156
+ /** Muestra un multiselect (ion-select) en la barra para elegir qué columnas se ven.
157
+ * Default ON (2026-06-14): toda tabla trae el selector de columnas. Para ocultarlo,
158
+ * pon la PROPIEDAD a false (`el.columnPicker = false`); el atributo booleano no puede
159
+ * apagar un default true (cualquier valor presente cuenta como true en Lit). */
160
+ columnPicker: boolean;
161
+ /** Muestra botones de import/export CSV en la barra. Export vacío = solo cabeceras (estructura). */
162
+ csv: boolean;
163
+ /** Nombre del fichero de export CSV. */
164
+ csvName: string;
165
+ /** Activa el modo servidor: no filtra/pagina en memoria, solo emite eventos. */
166
+ serverSide: boolean;
167
+ /** (server) Total de filas filtradas (lo da el runtime) para calcular el nº de páginas. */
168
+ total: number;
169
+ /** (server) Página actual (0-based), controlada por el padre. */
170
+ page: number;
171
+ /** (server) Muestra el buscador aunque no haya `searchKeys` (búsqueda server-side). */
172
+ searchable: boolean;
173
+ /** (server) Columna de orden activa. */
174
+ sort?: string;
175
+ /** (server) Dirección del orden activo. */
176
+ sortDir: 'asc' | 'desc';
177
+ /** (NUEVO) Título de la cabecera (a la izquierda, junto al contador de registros).
178
+ * Tipo `string` (no opcional) para no chocar con `HTMLElement.title`; '' = sin título. */
179
+ title: string;
180
+ /** (NUEVO) Conmutador de vista lista/tarjetas. Acepta `true` (= ['table','cards']) o un array de
181
+ * vistas. La presencia de 'cards' (o 'card') habilita la vista tarjetas. Compatibilidad: el
182
+ * antiguo valor booleano sigue funcionando. */
183
+ views: boolean | string[];
184
+ /** (NUEVO, alias documentado) Habilita import/export CSV (equivalente a `exportable`+`importable`
185
+ * / `csv`). Mostrar el botón de Exportar. */
186
+ exportable: boolean;
187
+ /** (NUEVO) Mostrar el botón de Importar CSV. */
188
+ importable: boolean;
189
+ /** (NUEVO, alias) Selector de columnas (equivalente a `columnPicker`). */
190
+ columnSelector: boolean;
191
+ /** (NUEVO, alias) Opciones del selector de "filas por página" (equivalente a `pageSizeOptions`). */
192
+ pageSizes?: number[];
193
+ /** (NUEVO) Selección de filas con checkbox por fila + seleccionar-todo + barra contextual. */
194
+ selectable: boolean;
195
+ /** (NUEVO) Conjunto de keys seleccionadas (controlado por el padre o interno). */
196
+ selectedKeys?: Set<string>;
197
+ /** (NUEVO) Acción primaria de la topbar (botón destacado). Emite `primaryAction`. */
198
+ primaryAction?: DataTablePrimaryAction;
199
+ /** (NUEVO) Filtros EN LÍNEA en la toolbar (selects/daterange/text compactos) en vez del botón
200
+ * funnel + drawer. Opt-in (por defecto `false` → se conserva el drawer). Look del screenshot:
201
+ * «Todos los Estados» · «Todos los tipos» · rango de fechas, todo en una línea con el buscador.
202
+ * Emite `filterChange` igual que el drawer. */
203
+ inlineFilters: boolean;
204
+ /** (NUEVO) Acciones del menú overflow (botón «⋮»). Emite `menuAction` con `{ actionId }`. */
205
+ menuActions: DataTableAction[];
206
+ /** (NUEVO) Cabecera de la tarjeta: título (string/HTML). Si se omite, no hay cabecera de título. */
207
+ cardTitle?: (row: Record<string, unknown>) => unknown;
208
+ /** (NUEVO) Cabecera de la tarjeta: nombre de un ion-icon o TemplateResult. */
209
+ cardIcon?: (row: Record<string, unknown>) => unknown;
210
+ /** (NUEVO) Cuerpo a medida de la tarjeta (string/HTML). Si se omite, se listan los campos. */
211
+ renderCard?: (row: Record<string, unknown>) => unknown;
212
+ private q;
213
+ private clientPage;
214
+ private clientPageSize;
215
+ private clientSort;
216
+ private clientSortDir;
217
+ private clientFilters;
218
+ private filterDraft;
219
+ private panel;
220
+ private viewMode;
221
+ private hiddenKeys;
222
+ private internalSelection;
223
+ private menuOpen;
224
+ private menuEv?;
225
+ private get t();
226
+ /** Placeholder efectivo del buscador (prop explícita → label i18n → default inglés). */
227
+ private get effSearchPlaceholder();
228
+ /** Mensaje efectivo de estado vacío (prop explícita → label i18n → default inglés). */
229
+ private get effEmptyMessage();
230
+ private get effPageSizes();
231
+ private get effColumnPicker();
232
+ private get effExport();
233
+ private get effImport();
234
+ /** ¿Está habilitado el conmutador de vista lista/tarjetas? */
235
+ private get viewToggle();
236
+ /** ¿Está disponible la vista tarjetas? (presente en `views` o `views === true`). */
237
+ private get cardViewEnabled();
238
+ /** Columnas actualmente visibles (respeta el column chooser). */
239
+ private get visibleColumns();
240
+ private setVisibleColumns;
241
+ private keyOf;
242
+ private get selection();
243
+ private setSelection;
244
+ private toggleRow;
245
+ private toggleAll;
246
+ private csvEscape;
247
+ /** Exporta las filas a CSV (cabeceras = column.key). Si no hay filas, exporta solo la estructura. */
248
+ private exportCsv;
249
+ private parseCsv;
250
+ private onImportFile;
251
+ private toggle;
252
+ private cloneFilters;
253
+ private toggleFilterValue;
254
+ private setFilterRange;
255
+ private applyFilters;
256
+ private clearFilters;
257
+ private serializeFilters;
258
+ /** Abre el panel lateral (API pública para el módulo, p.ej. "editar" abre el form pre-rellenado). */
259
+ open(panel?: 'filters' | 'create'): void;
260
+ /** Cierra el panel lateral. */
261
+ close(): void;
262
+ private emit;
263
+ private get hasSearch();
264
+ /** Columnas filtrables (con control en el panel de filtros). En cliente y en servidor. */
265
+ private get filterColumns();
266
+ /** ¿Hay que mostrar el botón de Filtros? (cualquier columna filtrable). */
267
+ private get hasFilterRow();
268
+ /** Nº de filtros activos (modo cliente) → badge del botón Filtros. */
269
+ private get activeFilterCount();
270
+ /** Valor crudo de una columna para ordenar/filtrar (usa format si lo hay, si no row[key]). */
271
+ private rawValue;
272
+ /** Valores distintos de una columna (para los chips del filtro multi-select). */
273
+ private distinctValues;
274
+ /** Filas tras buscar + filtrar + ordenar EN MEMORIA (solo modo cliente). */
275
+ private get clientFiltered();
276
+ private cell;
277
+ private onSearch;
278
+ /** ¿Es ordenable la columna? Servidor: opt-in (`sortable`). Cliente: por defecto SÍ (como el Hub),
279
+ * salvo `sortable: false` explícito. */
280
+ private isSortable;
281
+ private onHeaderClick;
282
+ private onFilterInput;
283
+ private onRangeInput;
284
+ private onDateRangeInput;
285
+ private setClientFilter;
286
+ private onFilterSelect;
287
+ private onInlineRange;
288
+ private openMenu;
289
+ private setViewMode;
290
+ private renderFilterControl;
291
+ private renderInlineFilters;
292
+ private renderInlineFilter;
293
+ private renderOverflowMenu;
294
+ private actionButtons;
295
+ private toolButton;
296
+ /** Plantilla de columnas del grid de la vista lista: [checkbox] [columnas…] [acciones]. */
297
+ private gridTemplate;
298
+ /** Lista de páginas a mostrar en el pager numerado (1-based): primera, última, vecinas de la
299
+ * actual y «…» donde haya saltos. P.ej. en página 1 de 52 → [1,2,3,'…',52]. */
300
+ private pageList;
301
+ render(): unknown;
302
+ private renderDrawer;
303
+ private renderClientFilter;
304
+ private emptyState;
305
+ private renderTable;
306
+ private renderCards;
307
+ }
308
+ declare global {
309
+ interface HTMLElementTagNameMap {
310
+ 'ok-data-table': OkDataTable;
311
+ }
312
+ }
@@ -0,0 +1,81 @@
1
+ import { LitElement } from 'lit';
2
+ export type OkDatePickerMode = 'single' | 'range';
3
+ export interface OkDateRange {
4
+ start: string | null;
5
+ end: string | null;
6
+ }
7
+ export type OkDatePickerValue = string | OkDateRange | null;
8
+ export interface OkDatePreset {
9
+ /** Clave estable del preset. */
10
+ id: string;
11
+ /** Texto visible en el chip. */
12
+ label: string;
13
+ }
14
+ export interface OkDatePickerLabels {
15
+ /** aria-label del botón anterior. */
16
+ prev: string;
17
+ /** aria-label del botón siguiente. */
18
+ next: string;
19
+ /** aria-label del botón disparador cuando no hay valor. */
20
+ open: string;
21
+ }
22
+ export declare class OkDatePicker extends LitElement {
23
+ static styles: import("lit").CSSResult;
24
+ /** Modo: una fecha ('single') o un rango ('range'). */
25
+ mode: OkDatePickerMode;
26
+ /** Valor actual: ISO `YYYY-MM-DD` (single) o {start,end} (range). */
27
+ value: OkDatePickerValue;
28
+ /** Fecha mínima seleccionable (ISO `YYYY-MM-DD`). */
29
+ min?: string;
30
+ /** Fecha máxima seleccionable (ISO `YYYY-MM-DD`). */
31
+ max?: string;
32
+ /** Chips de preset; pasa `[]` para ocultar la fila. */
33
+ presets: OkDatePreset[];
34
+ /** Locale para el nombre del mes (Intl). Default = es-ES. */
35
+ locale: string;
36
+ /** Texto del campo cuando no hay valor. */
37
+ placeholder: string;
38
+ /** Número de meses visibles en el popover (1 o 2). */
39
+ months: 1 | 2;
40
+ /** Textos traducibles (merge sobre los defaults en español). */
41
+ labels: Partial<OkDatePickerLabels>;
42
+ private open;
43
+ private side;
44
+ private viewDate;
45
+ private hoverDate;
46
+ private get t();
47
+ private readonly onDocPointer;
48
+ private readonly onKeydown;
49
+ disconnectedCallback(): void;
50
+ private get fieldEl();
51
+ willUpdate(changed: Map<string, unknown>): void;
52
+ private bind;
53
+ private unbind;
54
+ private toggle;
55
+ private openPopover;
56
+ private close;
57
+ private get rangeValue();
58
+ private get singleValue();
59
+ private anchorDateFromValue;
60
+ private get minDate();
61
+ private get maxDate();
62
+ private isDisabled;
63
+ private selectDay;
64
+ private emit;
65
+ private prevMonth;
66
+ private nextMonth;
67
+ private applyPreset;
68
+ private isPresetActive;
69
+ private presetValue;
70
+ private fieldLabel;
71
+ render(): unknown;
72
+ private renderMonth;
73
+ private renderDay;
74
+ private onDayHover;
75
+ private dayRangeFlags;
76
+ }
77
+ declare global {
78
+ interface HTMLElementTagNameMap {
79
+ 'ok-date-picker': OkDatePicker;
80
+ }
81
+ }