@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,338 @@
1
+ /* OutfitKit — layout.css
2
+ *
3
+ * Primitivos de layout como CSS PLANO (sin web component). Para geometría pura
4
+ * (container, grid, sección de marketing) un custom element solo aporta costes:
5
+ * FOUC hasta `:defined`, shadow boundary que rompe el grid del padre y peso de
6
+ * registro/upgrade. Regla: comportamiento/estado → web component (ok-*);
7
+ * geometría/tipografía → clase CSS de este fichero.
8
+ *
9
+ * Reemplaza a los antiguos <ok-container>, <ok-container-full> y <ok-section>
10
+ * (eliminados del paquete). Complementa a Ionic: para el padding de página de
11
+ * un dashboard usa `.ion-padding` dentro de <ion-content>; aquí solo vive lo
12
+ * que Ionic NO tiene (grid de 12 col, container con max-width, secciones).
13
+ *
14
+ * Tokens: hereda --ok-container-max / --ok-spacing del tema (outfitkit-theme.css
15
+ * o equivalente) con los mismos fallbacks que usaban los componentes.
16
+ * Cargar después del tema. Export del paquete: `@erplora/outfitkit/layout.css`.
17
+ */
18
+
19
+ :root {
20
+ --ok-grid-gap: clamp(0.75rem, 1.5vw, 1.25rem);
21
+ --ok-section-pad-y: clamp(3rem, 7vw, 5.5rem);
22
+ }
23
+
24
+ /* ===== Container (web pública; en dashboard NO: ahí el ancho lo da el split-pane) ===== */
25
+
26
+ .ok-container {
27
+ width: 100%;
28
+ max-width: var(--ok-container-max, 1140px);
29
+ margin-inline: auto;
30
+ padding-inline: var(--ok-spacing, var(--ion-padding, 16px));
31
+ box-sizing: border-box;
32
+ }
33
+
34
+ .ok-container-fluid {
35
+ width: 100%;
36
+ min-width: 0;
37
+ padding-inline: var(--ok-spacing, var(--ion-padding, 16px));
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ /* ===== Grid de 12 columnas (compatible con ion-split-pane: minmax(0,1fr) +
42
+ min-width:0 evitan que el contenido fuerce el ancho cuando el menú está abierto).
43
+ Breakpoints = los de Ionic (md 768 / lg 992 / xl 1200). ===== */
44
+
45
+ .ok-grid {
46
+ display: grid;
47
+ grid-template-columns: repeat(12, minmax(0, 1fr));
48
+ gap: var(--ok-grid-gap);
49
+ }
50
+
51
+ .ok-col {
52
+ grid-column: span 12;
53
+ min-width: 0;
54
+ }
55
+
56
+ /* Grid de cards/KPIs sin clases de breakpoint: se adapta solo al ancho útil. */
57
+ .ok-grid-cards {
58
+ display: grid;
59
+ grid-template-columns: repeat(auto-fill, minmax(var(--ok-card-min, 260px), 1fr));
60
+ gap: var(--ok-grid-gap);
61
+ }
62
+
63
+ @media (min-width: 768px) {
64
+ .ok-md-3 { grid-column: span 3; }
65
+ .ok-md-4 { grid-column: span 4; }
66
+ .ok-md-6 { grid-column: span 6; }
67
+ .ok-md-8 { grid-column: span 8; }
68
+ .ok-md-9 { grid-column: span 9; }
69
+ .ok-md-12 { grid-column: span 12; }
70
+ }
71
+
72
+ @media (min-width: 992px) {
73
+ .ok-lg-3 { grid-column: span 3; }
74
+ .ok-lg-4 { grid-column: span 4; }
75
+ .ok-lg-6 { grid-column: span 6; }
76
+ .ok-lg-8 { grid-column: span 8; }
77
+ .ok-lg-9 { grid-column: span 9; }
78
+ .ok-lg-12 { grid-column: span 12; }
79
+ }
80
+
81
+ @media (min-width: 1200px) {
82
+ .ok-xl-3 { grid-column: span 3; }
83
+ .ok-xl-4 { grid-column: span 4; }
84
+ .ok-xl-6 { grid-column: span 6; }
85
+ .ok-xl-8 { grid-column: span 8; }
86
+ .ok-xl-9 { grid-column: span 9; }
87
+ .ok-xl-12 { grid-column: span 12; }
88
+ }
89
+
90
+ /* ===== Sección de marketing (antes <ok-section>) =====
91
+ *
92
+ * <section class="ok-section ok-section--center ok-section--divider">
93
+ * <header class="ok-section-head">
94
+ * <span class="ok-eyebrow">Plataforma</span>
95
+ * <h2 class="ok-section-title">Todo en uno</h2>
96
+ * <p class="ok-section-sub">…</p>
97
+ * </header>
98
+ * …contenido…
99
+ * </section>
100
+ *
101
+ * El centrado horizontal se hace con padding-inline:max(...) en el propio
102
+ * elemento (sin wrapper interno): así el divisor (border-top) ocupa el ancho
103
+ * completo igual que hacía el :host del componente.
104
+ */
105
+
106
+ .ok-section {
107
+ display: block;
108
+ width: 100%;
109
+ box-sizing: border-box;
110
+ padding-block: var(--ok-section-pad-y);
111
+ padding-inline: max(
112
+ var(--ok-spacing, 1.25rem),
113
+ calc((100% - var(--ok-container-max, 1140px)) / 2 + var(--ok-spacing, 1.25rem))
114
+ );
115
+ color: var(--ok-text, var(--ion-text-color, #18181b));
116
+ font-family: var(--ok-font, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif);
117
+ }
118
+
119
+ .ok-section--divider {
120
+ border-top: 1px solid color-mix(in oklab, var(--ok-text, var(--ion-text-color, #18181b)) 8%, transparent);
121
+ }
122
+
123
+ .ok-section-head {
124
+ display: flex;
125
+ flex-direction: column;
126
+ gap: 0.9rem;
127
+ margin-bottom: clamp(2rem, 4vw, 3rem);
128
+ max-width: 56ch;
129
+ }
130
+
131
+ .ok-section--center .ok-section-head {
132
+ align-items: center;
133
+ text-align: center;
134
+ margin-inline: auto;
135
+ }
136
+
137
+ .ok-eyebrow {
138
+ display: inline-flex;
139
+ align-items: center;
140
+ gap: 0.4rem;
141
+ align-self: flex-start;
142
+ padding: 0.28rem 0.7rem;
143
+ border-radius: 999px;
144
+ font-size: 0.72rem;
145
+ font-weight: 600;
146
+ letter-spacing: 0.04em;
147
+ text-transform: uppercase;
148
+ color: var(--ok-primary, var(--ion-color-primary, #1496d6));
149
+ background: color-mix(in oklab, var(--ok-primary, var(--ion-color-primary, #1496d6)) 12%, transparent);
150
+ border: 1px solid color-mix(in oklab, var(--ok-primary, var(--ion-color-primary, #1496d6)) 22%, transparent);
151
+ }
152
+
153
+ .ok-section--center .ok-eyebrow {
154
+ align-self: center;
155
+ }
156
+
157
+ .ok-section-title {
158
+ margin: 0;
159
+ font-size: clamp(1.75rem, 1.1rem + 2.6vw, 2.85rem);
160
+ line-height: 1.06;
161
+ letter-spacing: -0.025em;
162
+ font-weight: 650;
163
+ }
164
+
165
+ .ok-section-sub {
166
+ margin: 0;
167
+ font-size: clamp(1rem, 0.95rem + 0.3vw, 1.15rem);
168
+ line-height: 1.55;
169
+ color: var(--ok-muted, rgba(var(--ion-text-color-rgb, 24, 24, 27), 0.62));
170
+ }
171
+
172
+ /* ===== Tabla apilable (.ok-table-stack) — patrón «no more tables» =====
173
+ *
174
+ * Solo CSS, sin web component (para CRUDs ricos usa <ok-data-table>; esto es
175
+ * para tablas simples/estáticas). En escritorio se ve como tabla; bajo 768px
176
+ * (breakpoint md de Ionic) cada fila se convierte en una card apilada y cada
177
+ * celda pinta su etiqueta de columna delante con `content: attr(data-title)`.
178
+ *
179
+ * Funciona con tres tipos de markup:
180
+ * 1) <table class="ok-table-stack"> nativo:
181
+ * <td data-title="Precio">9,90 €</td>
182
+ * 2) divs (o cualquier elemento):
183
+ * .ok-table-stack > .ok-thead/.ok-trow > .ok-tcell[data-title]
184
+ * 3) Ionic:
185
+ * ion-grid.ok-table-stack > ion-row.ok-trow > ion-col.ok-tcell
186
+ * (los estilos del documento ganan al :host de Ionic, así que el grid
187
+ * propio sustituye al flex de ion-row; ::before sí renderiza en hosts
188
+ * con shadow DOM)
189
+ *
190
+ * Tokens: --ok-table-cols (columnas del markup no-<table>; por defecto
191
+ * partes iguales) · --ok-table-label-w (ancho de la etiqueta en móvil, 45%).
192
+ * Celdas sin data-title (p.ej. acciones) ocupan el ancho completo en móvil.
193
+ */
194
+
195
+ .ok-table-stack {
196
+ width: 100%;
197
+ box-sizing: border-box;
198
+ font-family: var(--ok-font, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif);
199
+ color: var(--ok-text, var(--ion-text-color, #18181b));
200
+ }
201
+
202
+ table.ok-table-stack {
203
+ border-collapse: collapse;
204
+ }
205
+
206
+ /* Markup no-<table>: cabecera y filas como grid de columnas iguales */
207
+ .ok-table-stack > .ok-thead,
208
+ .ok-table-stack > .ok-trow {
209
+ display: grid;
210
+ grid-template-columns: var(--ok-table-cols, repeat(auto-fit, minmax(0, 1fr)));
211
+ align-items: center;
212
+ }
213
+
214
+ .ok-table-stack :is(th, td, .ok-tcell) {
215
+ padding: 0.6rem 0.75rem;
216
+ text-align: left;
217
+ min-width: 0;
218
+ box-sizing: border-box;
219
+ }
220
+
221
+ .ok-table-stack :is(thead th, .ok-thead .ok-tcell) {
222
+ font-weight: 600;
223
+ font-size: 0.82rem;
224
+ letter-spacing: 0.02em;
225
+ color: var(--ok-muted, rgba(var(--ion-text-color-rgb, 24, 24, 27), 0.62));
226
+ }
227
+
228
+ .ok-table-stack :is(tr, .ok-trow, .ok-thead) {
229
+ border-bottom: 1px solid color-mix(in oklab, var(--ok-text, var(--ion-text-color, #18181b)) 10%, transparent);
230
+ }
231
+
232
+ @media (max-width: 767px) {
233
+ /* La tabla nativa deja de comportarse como tabla */
234
+ table.ok-table-stack,
235
+ table.ok-table-stack :is(thead, tbody, tfoot, tr, th, td),
236
+ .ok-table-stack > .ok-trow {
237
+ display: block;
238
+ }
239
+
240
+ /* Cabecera oculta visualmente, no para lectores de pantalla */
241
+ .ok-table-stack :is(thead, .ok-thead) {
242
+ position: absolute;
243
+ width: 1px;
244
+ height: 1px;
245
+ overflow: hidden;
246
+ clip-path: inset(50%);
247
+ white-space: nowrap;
248
+ border: 0;
249
+ }
250
+
251
+ /* Fila = card */
252
+ .ok-table-stack :is(tbody tr, .ok-trow) {
253
+ border: 1px solid color-mix(in oklab, var(--ok-text, var(--ion-text-color, #18181b)) 12%, transparent);
254
+ border-radius: 8px;
255
+ margin-bottom: 0.75rem;
256
+ overflow: hidden;
257
+ }
258
+
259
+ /* Celda = par etiqueta/valor (display/width explícitos: pisan el :host
260
+ flex de ion-col, que si no se queda con su sizing de columna) */
261
+ .ok-table-stack :is(td, .ok-tcell) {
262
+ display: block;
263
+ width: 100%;
264
+ max-width: 100%;
265
+ position: relative;
266
+ border: none;
267
+ border-bottom: 1px solid color-mix(in oklab, var(--ok-text, var(--ion-text-color, #18181b)) 7%, transparent);
268
+ padding: 0.55rem 0.75rem;
269
+ padding-inline-start: calc(var(--ok-table-label-w, 45%) + 0.75rem);
270
+ white-space: normal;
271
+ text-align: left;
272
+ }
273
+
274
+ .ok-table-stack :is(td, .ok-tcell):last-child {
275
+ border-bottom: none;
276
+ }
277
+
278
+ .ok-table-stack :is(td, .ok-tcell)::before {
279
+ content: attr(data-title);
280
+ position: absolute;
281
+ top: 0.55rem;
282
+ inset-inline-start: 0.75rem;
283
+ width: calc(var(--ok-table-label-w, 45%) - 1rem);
284
+ overflow: hidden;
285
+ white-space: nowrap;
286
+ text-overflow: ellipsis;
287
+ font-weight: 600;
288
+ font-size: 0.82rem;
289
+ color: var(--ok-muted, rgba(var(--ion-text-color-rgb, 24, 24, 27), 0.62));
290
+ }
291
+
292
+ /* Celdas sin etiqueta (acciones, etc.): ancho completo, sin ::before */
293
+ .ok-table-stack :is(td, .ok-tcell):not([data-title]),
294
+ .ok-table-stack :is(td, .ok-tcell)[data-title=''] {
295
+ padding-inline-start: 0.75rem;
296
+ }
297
+ }
298
+
299
+ /* ===== Masonry (columnas CSS, sin JS) — hueco de Ionic ===== */
300
+ /* Layout de columnas tipo Pinterest: los items fluyen por columnas con
301
+ * break-inside:avoid. Variantes 2..5 columnas; colapsa a 2 (768px) y 1 (480px).
302
+ * Para galerías de cards de altura desigual. (Antiguo ux-masonry.) */
303
+ .ok-masonry {
304
+ --_cols: 3;
305
+ column-count: var(--_cols);
306
+ column-gap: var(--ok-grid-gap, 1rem);
307
+ }
308
+ .ok-masonry-2 { --_cols: 2; }
309
+ .ok-masonry-3 { --_cols: 3; }
310
+ .ok-masonry-4 { --_cols: 4; }
311
+ .ok-masonry-5 { --_cols: 5; }
312
+ .ok-masonry > * {
313
+ break-inside: avoid;
314
+ margin-bottom: var(--ok-grid-gap, 1rem);
315
+ }
316
+ @media (max-width: 768px) {
317
+ .ok-masonry { column-count: 2; }
318
+ }
319
+ @media (max-width: 480px) {
320
+ .ok-masonry { column-count: 1; }
321
+ }
322
+
323
+ /* ===== Form actions (barra de acciones de pie de formulario/modal) — hueco de Ionic ===== */
324
+ /* Pie estandarizado de formularios: borde superior, gap y alineación de botones.
325
+ * Más barato como utilidad CSS que como web component. (Antiguo ux-form-actions.)
326
+ * Uso: <div class="ok-form-actions ok-form-actions-end"><ion-button…/></div> */
327
+ .ok-form-actions {
328
+ display: flex;
329
+ flex-wrap: wrap;
330
+ align-items: center;
331
+ gap: 0.5rem;
332
+ padding-top: 1rem;
333
+ margin-top: 1rem;
334
+ border-top: 1px solid var(--ok-border-color, var(--ion-border-color, rgba(0, 0, 0, 0.1)));
335
+ }
336
+ .ok-form-actions-end { justify-content: flex-end; }
337
+ .ok-form-actions-start { justify-content: flex-start; }
338
+ .ok-form-actions-between { justify-content: space-between; }