@erplora/outfitkit 0.1.17 → 0.1.19

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 CHANGED
@@ -89,7 +89,7 @@ El bundle `outfitkit.js` deja `lit` external, así que necesitas un **import-map
89
89
 
90
90
  ## Inventario de componentes
91
91
 
92
- 95 web components rellena-huecos (todos registran su tag `ok-*` vía `define()`). Abajo el qué-hace y
92
+ 97 web components rellena-huecos (todos registran su tag `ok-*` vía `define()`). Abajo el qué-hace y
93
93
  los **eventos `ok-*`** que emite cada uno (`—` = presentacional, sin eventos). La **referencia viva
94
94
  de props/slots** es el [showcase](https://erplora.github.io/outfitkit/).
95
95
 
@@ -167,6 +167,7 @@ de props/slots** es el [showcase](https://erplora.github.io/outfitkit/).
167
167
  | `ok-time-picker` | Pastilla HH:MM + popover de listas (horas/minutos/AM-PM), canónico 24h. | `ok-change` |
168
168
  | `ok-range-dual` | Slider min-max de doble thumb con readout. | `ok-change` |
169
169
  | `ok-color-picker` | Selector de color (SV + hue + hex + presets). | `ok-change`, `ok-open` |
170
+ | `ok-theme-picker` | Selector de tema compartido Cloud↔Hub: paleta de marca (swatches) + modo claro/oscuro/sistema. | `ok-change` |
170
171
  | `ok-rich-text` | Editor WYSIWYG con toolbar y contador de palabras. | `ok-input` |
171
172
  | `ok-signature` | Pad de firma sobre canvas con limpiar/exportar. | `ok-change`, `ok-clear` |
172
173
  | `ok-calculator` | Calculadora con teclado 4×4 y máquina de estados. | `ok-input`, `ok-change` |
@@ -182,6 +183,7 @@ de props/slots** es el [showcase](https://erplora.github.io/outfitkit/).
182
183
  | `ok-menu` | Menú desplegable/contextual con submenús, checkbox/radio, divisores. | `ok-select`, `ok-open` |
183
184
  | `ok-menubar` | Barra de menús de app (Archivo/Editar/Ver) con dropdowns. | `ok-select`, `ok-open` |
184
185
  | `ok-drawer` | Panel lateral deslizante (slide-over) modal con focus-trap y cierre por ESC/scrim. | `ok-open`, `ok-close` |
186
+ | `ok-spotlight-search` | Buscador overlay estilo Spotlight (macOS): `<dialog>` top-layer translúcido, chrome solo (input+✕+panel); resultados los pone el consumidor por slot. | `ok-input`, `ok-open` |
185
187
 
186
188
  ### Media y archivos
187
189
 
package/dist/cdn.d.ts CHANGED
@@ -38,6 +38,7 @@ import './components/ok-invoice/ok-invoice.js';
38
38
  import './components/ok-timeline/ok-timeline.js';
39
39
  import './components/ok-qty-stepper/ok-qty-stepper.js';
40
40
  import './components/ok-command-palette/ok-command-palette.js';
41
+ import './components/ok-spotlight-search/ok-spotlight-search.js';
41
42
  import './components/ok-color-picker/ok-color-picker.js';
42
43
  import './components/ok-avatar/ok-avatar.js';
43
44
  import './components/ok-status-pill/ok-status-pill.js';
@@ -1,6 +1,17 @@
1
1
  import { LitElement } from 'lit';
2
+ export type OkHeroAlign = 'center' | 'split';
3
+ export type OkHeroTone = 'neutral' | 'soft' | 'gradient';
2
4
  export declare class OkHero extends LitElement {
5
+ align: OkHeroAlign;
6
+ tone: OkHeroTone;
7
+ compact: boolean;
8
+ private hasEyebrow;
9
+ private hasActions;
10
+ private hasMedia;
3
11
  static styles: import("lit").CSSResult;
12
+ connectedCallback(): void;
13
+ private refreshSlotState;
14
+ private onSlotChange;
4
15
  render(): unknown;
5
16
  }
6
17
  declare global {
@@ -0,0 +1 @@
1
+ import './ok-hero.js';
@@ -0,0 +1,27 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class OkSpotlightSearch extends LitElement {
3
+ static styles: import("lit").CSSResult;
4
+ /** Abierto/cerrado (reflejado para CSS externo). */
5
+ open: boolean;
6
+ /** Texto guía del input de búsqueda. */
7
+ placeholder: string;
8
+ /** Texto de búsqueda actual (el consumidor puede resetearlo). */
9
+ value: string;
10
+ /** Icono (Iconify/ionicon) del botón-trigger propio; si vacío, no se pinta trigger. */
11
+ triggerIcon: string;
12
+ /** Nombre accesible del botón-trigger (aria-label). */
13
+ triggerLabel: string;
14
+ private input?;
15
+ openSearch(): void;
16
+ close(): void;
17
+ toggle(): void;
18
+ private emitOpen;
19
+ private onInput;
20
+ protected updated(): void;
21
+ render(): unknown;
22
+ }
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ 'ok-spotlight-search': OkSpotlightSearch;
26
+ }
27
+ }
@@ -0,0 +1 @@
1
+ import './ok-spotlight-search.js';
package/dist/index.d.ts CHANGED
@@ -59,6 +59,7 @@ export type { OkTimelineItem } from './components/ok-timeline/ok-timeline.js';
59
59
  export { OkQtyStepper } from './components/ok-qty-stepper/ok-qty-stepper.js';
60
60
  export { OkCommandPalette } from './components/ok-command-palette/ok-command-palette.js';
61
61
  export type { OkCommand } from './components/ok-command-palette/ok-command-palette.js';
62
+ export { OkSpotlightSearch } from './components/ok-spotlight-search/ok-spotlight-search.js';
62
63
  export { OkColorPicker } from './components/ok-color-picker/ok-color-picker.js';
63
64
  export type { OkRgb } from './components/ok-color-picker/ok-color-picker.js';
64
65
  export { OkAvatar } from './components/ok-avatar/ok-avatar.js';
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ import { OkInvoice } from "./ok-invoice.js";
39
39
  import { OkTimeline } from "./ok-timeline.js";
40
40
  import { OkQtyStepper } from "./ok-qty-stepper.js";
41
41
  import { OkCommandPalette } from "./ok-command-palette.js";
42
+ import { OkSpotlightSearch } from "./ok-spotlight-search.js";
42
43
  import { OkColorPicker } from "./ok-color-picker.js";
43
44
  import { OkAvatar } from "./ok-avatar.js";
44
45
  import { OkStatusPill } from "./ok-status-pill.js";
@@ -180,6 +181,7 @@ export {
180
181
  OkSparkline,
181
182
  OkSplitButton,
182
183
  OkSplitter,
184
+ OkSpotlightSearch,
183
185
  OkStat,
184
186
  OkStatusDot,
185
187
  OkStatusPill,
package/dist/ok-hero.js CHANGED
@@ -1,42 +1,234 @@
1
1
  import { LitElement, css, html } from "lit";
2
+ import { property, state } from "lit/decorators.js";
2
3
  import { define } from "./define.js";
4
+ var __defProp = Object.defineProperty;
5
+ var __decorateClass = (decorators, target, key, kind) => {
6
+ var result = void 0;
7
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
8
+ if (decorator = decorators[i])
9
+ result = decorator(target, key, result) || result;
10
+ if (result) __defProp(target, key, result);
11
+ return result;
12
+ };
3
13
  class OkHero extends LitElement {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.align = "center";
17
+ this.tone = "soft";
18
+ this.compact = false;
19
+ this.hasEyebrow = false;
20
+ this.hasActions = false;
21
+ this.hasMedia = false;
22
+ this.onSlotChange = () => this.refreshSlotState();
23
+ }
4
24
  static {
5
25
  this.styles = css`
6
26
  :host {
7
27
  --color: var(--ok-text, var(--ion-text-color, #1c1b17));
8
- --color-muted: var(--ok-muted, rgba(var(--ion-text-color-rgb, 24, 24, 27), 0.55));
28
+ --color-muted: var(--ok-muted, rgba(var(--ion-text-color-rgb, 24, 24, 27), 0.68));
29
+ --surface: var(--ok-surface, var(--ion-background-color, #fff));
30
+ --surface-soft: var(--ok-surface-soft, var(--ion-color-light, #f4f5f8));
31
+ --primary: var(--ok-primary, var(--ion-color-primary, #3880ff));
9
32
  --max-width: var(--ok-container-max, 1140px);
10
33
  --padding: var(--ok-spacing, var(--ion-padding, 16px));
11
34
  --font: var(--ok-font, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif);
35
+ --font-display: var(--ok-font-display, var(--font));
12
36
 
13
37
  display: block;
14
38
  color: var(--color);
15
39
  font-family: var(--font);
40
+ overflow: hidden;
41
+ border-bottom: 1px solid color-mix(in oklab, var(--color) 8%, transparent);
42
+ }
43
+ :host([tone='neutral']) { background: var(--surface); }
44
+ :host([tone='soft']) {
45
+ background: color-mix(in oklab, var(--surface-soft) 54%, var(--surface));
16
46
  }
17
- .h {
47
+ :host([tone='gradient']) {
48
+ background:
49
+ radial-gradient(circle at 20% 0%, color-mix(in oklab, var(--primary) 14%, transparent), transparent 42%),
50
+ color-mix(in oklab, var(--surface-soft) 42%, var(--surface));
51
+ }
52
+
53
+ .layout {
18
54
  max-width: var(--max-width);
19
55
  margin-inline: auto;
20
- padding: clamp(2rem, 6vw, 5rem) var(--padding);
56
+ padding: clamp(3.5rem, 7vw, 6rem) var(--padding);
21
57
  display: grid;
22
- gap: 1rem;
58
+ align-items: center;
59
+ }
60
+ :host([compact]) .layout {
61
+ padding-block: clamp(2.5rem, 5vw, 4rem);
62
+ }
63
+ .copy {
64
+ min-width: 0;
65
+ max-width: 52rem;
66
+ display: flex;
67
+ flex-direction: column;
68
+ align-items: flex-start;
69
+ }
70
+ :host([align='center']) .copy {
71
+ align-items: center;
72
+ text-align: center;
73
+ margin-inline: auto;
74
+ }
75
+ :host([align='split']) .layout {
76
+ grid-template-columns: minmax(0, 1fr) minmax(18rem, 0.8fr);
77
+ gap: clamp(2rem, 6vw, 5rem);
78
+ }
79
+ .eyebrow {
80
+ display: inline-flex;
81
+ align-items: center;
82
+ align-self: flex-start;
83
+ margin: 0 0 1.25rem;
84
+ padding: 0.28rem 0.7rem;
85
+ border: 1px solid color-mix(in oklab, var(--primary) 22%, transparent);
86
+ border-radius: 999px;
87
+ color: var(--primary);
88
+ background: color-mix(in oklab, var(--primary) 12%, transparent);
89
+ font-size: 0.72rem;
90
+ font-weight: 600;
91
+ line-height: 1.2;
92
+ letter-spacing: 0.04em;
93
+ text-transform: uppercase;
94
+ }
95
+ .eyebrow.empty { display: none; }
96
+ :host([align='center']) .eyebrow {
97
+ align-self: center;
98
+ }
99
+ .eyebrow ::slotted([slot='eyebrow']) {
100
+ margin: 0 !important;
101
+ padding: 0 !important;
102
+ border: 0 !important;
103
+ color: inherit !important;
104
+ background: transparent !important;
105
+ font: inherit !important;
106
+ letter-spacing: inherit !important;
107
+ line-height: inherit !important;
108
+ text-transform: inherit !important;
109
+ }
110
+ .title {
111
+ max-width: 52rem;
112
+ margin: 0;
113
+ font-family: var(--font-display);
114
+ font-size: clamp(2.35rem, 1.75rem + 2.6vw, 4rem);
115
+ font-weight: 650;
116
+ line-height: 1.04;
117
+ letter-spacing: -0.045em;
118
+ text-wrap: balance;
119
+ }
120
+ :host([compact]) .title {
121
+ font-size: clamp(2rem, 1.55rem + 2vw, 3.25rem);
122
+ }
123
+ .title ::slotted([slot='title']) {
124
+ margin: 0 !important;
125
+ padding: 0 !important;
126
+ border: 0 !important;
127
+ color: inherit !important;
128
+ background: transparent !important;
129
+ font: inherit !important;
130
+ letter-spacing: inherit !important;
131
+ line-height: inherit !important;
132
+ text-wrap: inherit !important;
133
+ }
134
+ .subtitle {
135
+ max-width: 46rem;
136
+ margin: 1.5rem 0 0;
137
+ color: var(--color-muted);
138
+ font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
139
+ line-height: 1.6;
140
+ text-wrap: pretty;
141
+ }
142
+ .subtitle ::slotted([slot='subtitle']) {
143
+ margin: 0 !important;
144
+ padding: 0 !important;
145
+ border: 0 !important;
146
+ color: inherit !important;
147
+ background: transparent !important;
148
+ font: inherit !important;
149
+ letter-spacing: inherit !important;
150
+ line-height: inherit !important;
151
+ text-wrap: inherit !important;
152
+ }
153
+ .actions {
154
+ display: flex;
155
+ flex-wrap: wrap;
156
+ gap: 0.5rem;
157
+ margin-top: 1.5rem;
158
+ }
159
+ :host([align='center']) .actions { justify-content: center; }
160
+ .actions.empty,
161
+ .media.empty { display: none; }
162
+ .media {
163
+ min-width: 0;
164
+ width: 100%;
165
+ margin-top: 2rem;
166
+ }
167
+ :host([align='split']) .media { margin-top: 0; }
168
+
169
+ @media (max-width: 767px) {
170
+ .layout { padding-block: 2.75rem 3rem; }
171
+ :host([compact]) .layout { padding-block: 2.25rem 2.5rem; }
172
+ :host([align='split']) .layout {
173
+ grid-template-columns: 1fr;
174
+ gap: 2rem;
175
+ }
176
+ .eyebrow { margin-bottom: 1rem; }
177
+ .subtitle { margin-top: 1.25rem; line-height: 1.5; }
178
+ .actions { width: 100%; }
23
179
  }
24
- ::slotted([slot='title']) { font-size: clamp(1.8rem, 4vw, 3rem); line-height: 1.1; margin: 0; }
25
- ::slotted([slot='subtitle']) { font-size: clamp(1rem, 2vw, 1.25rem); color: var(--color-muted); margin: 0; max-width: 42ch; }
26
- .actions { display: flex; gap: 0.75rem; flex-wrap: wrap; margin-top: 0.5rem; }
27
180
  `;
28
181
  }
182
+ connectedCallback() {
183
+ super.connectedCallback();
184
+ this.refreshSlotState();
185
+ }
186
+ refreshSlotState() {
187
+ this.hasEyebrow = this.querySelector('[slot="eyebrow"]') !== null;
188
+ this.hasActions = this.querySelector('[slot="actions"]') !== null;
189
+ this.hasMedia = [...this.childNodes].some((node) => {
190
+ if (node.nodeType === Node.TEXT_NODE) return (node.textContent ?? "").trim().length > 0;
191
+ return node.nodeType === Node.ELEMENT_NODE && !node.hasAttribute("slot");
192
+ });
193
+ }
29
194
  render() {
30
195
  return html`
31
- <section class="h">
32
- <slot name="title"></slot>
33
- <slot name="subtitle"></slot>
34
- <div class="actions"><slot name="actions"></slot></div>
35
- <slot></slot>
196
+ <section class="layout">
197
+ <header class="copy">
198
+ <div class=${this.hasEyebrow ? "eyebrow" : "eyebrow empty"}>
199
+ <slot name="eyebrow" @slotchange=${this.onSlotChange}></slot>
200
+ </div>
201
+ <div class="title"><slot name="title" @slotchange=${this.onSlotChange}></slot></div>
202
+ <div class="subtitle"><slot name="subtitle" @slotchange=${this.onSlotChange}></slot></div>
203
+ <div class=${this.hasActions ? "actions" : "actions empty"}>
204
+ <slot name="actions" @slotchange=${this.onSlotChange}></slot>
205
+ </div>
206
+ </header>
207
+ <div class=${this.hasMedia ? "media" : "media empty"}>
208
+ <slot @slotchange=${this.onSlotChange}></slot>
209
+ </div>
36
210
  </section>
37
211
  `;
38
212
  }
39
213
  }
214
+ __decorateClass([
215
+ property({ reflect: true })
216
+ ], OkHero.prototype, "align");
217
+ __decorateClass([
218
+ property({ reflect: true })
219
+ ], OkHero.prototype, "tone");
220
+ __decorateClass([
221
+ property({ type: Boolean, reflect: true })
222
+ ], OkHero.prototype, "compact");
223
+ __decorateClass([
224
+ state()
225
+ ], OkHero.prototype, "hasEyebrow");
226
+ __decorateClass([
227
+ state()
228
+ ], OkHero.prototype, "hasActions");
229
+ __decorateClass([
230
+ state()
231
+ ], OkHero.prototype, "hasMedia");
40
232
  define("ok-hero", OkHero);
41
233
  export {
42
234
  OkHero
@@ -0,0 +1,211 @@
1
+ import { LitElement, css, nothing, html } from "lit";
2
+ import { property, query } from "lit/decorators.js";
3
+ import { define } from "./define.js";
4
+ import { L as iconSearchOutline, v as iconCloseOutline, o as okIcon } from "./shared/icons.js";
5
+ var __defProp = Object.defineProperty;
6
+ var __decorateClass = (decorators, target, key, kind) => {
7
+ var result = void 0;
8
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
+ if (decorator = decorators[i])
10
+ result = decorator(target, key, result) || result;
11
+ if (result) __defProp(target, key, result);
12
+ return result;
13
+ };
14
+ class OkSpotlightSearch extends LitElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.open = false;
18
+ this.placeholder = "";
19
+ this.value = "";
20
+ this.triggerIcon = "";
21
+ this.triggerLabel = "";
22
+ }
23
+ static {
24
+ this.styles = css`
25
+ :host {
26
+ --color: var(--ok-text, var(--ion-text-color, #1c1b17));
27
+ --color-muted: var(--ok-text-muted, rgba(var(--ion-text-color-rgb, 28, 27, 23), 0.6));
28
+ --panel-bg: var(--ok-surface, var(--ion-background-color, #ffffff));
29
+ --scrim-bg: var(--ok-scrim, rgba(0, 0, 0, 0.28));
30
+ --border-soft: var(--ok-border-soft, rgba(var(--ion-text-color-rgb, 28, 27, 23), 0.1));
31
+ --radius: var(--ok-radius, 16px);
32
+ --shadow: var(--ok-shadow, 0 24px 80px rgba(0, 0, 0, 0.35));
33
+ --font: var(--ok-font, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif);
34
+ display: contents;
35
+ }
36
+
37
+ /* Botón-trigger opcional (icon-only). */
38
+ button.trigger {
39
+ display: inline-flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ width: 2.4rem;
43
+ height: 2.4rem;
44
+ padding: 0;
45
+ border: 0;
46
+ border-radius: 10px;
47
+ background: none;
48
+ color: var(--color-muted);
49
+ cursor: pointer;
50
+ }
51
+ button.trigger[data-assigned] { color: var(--ok-primary, var(--ion-color-primary, #3880ff)); }
52
+ button.trigger ion-icon { font-size: 1.35rem; }
53
+
54
+ /* El <dialog> flota arriba-centro, translúcido con blur (Spotlight). El top layer lo saca de
55
+ cualquier containing block. */
56
+ dialog {
57
+ margin: 10vh auto auto;
58
+ width: min(92vw, 36rem);
59
+ max-height: 72vh;
60
+ padding: 0;
61
+ border: none;
62
+ border-radius: var(--radius);
63
+ overflow: hidden;
64
+ color: var(--color);
65
+ font-family: var(--font);
66
+ background: color-mix(in srgb, var(--panel-bg) 80%, transparent);
67
+ -webkit-backdrop-filter: blur(22px) saturate(180%);
68
+ backdrop-filter: blur(22px) saturate(180%);
69
+ box-shadow: var(--shadow), 0 0 0 1px rgba(128, 128, 128, 0.18);
70
+ }
71
+ dialog::backdrop {
72
+ background: var(--scrim-bg);
73
+ -webkit-backdrop-filter: blur(3px);
74
+ backdrop-filter: blur(3px);
75
+ }
76
+
77
+ /* Fila del input hero + cierre. */
78
+ .top {
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 0.5rem;
82
+ padding: 0.7rem 0.85rem;
83
+ border-bottom: 1px solid var(--border-soft);
84
+ }
85
+ .top .lupa { flex: 0 0 auto; font-size: 1.25rem; color: var(--color-muted); }
86
+ .top input {
87
+ flex: 1 1 auto;
88
+ min-width: 0;
89
+ border: 0;
90
+ outline: none;
91
+ background: none;
92
+ color: inherit;
93
+ font: inherit;
94
+ font-size: 1.05rem;
95
+ }
96
+ .top input::placeholder { color: var(--color-muted); }
97
+ .top .close {
98
+ flex: 0 0 auto;
99
+ display: inline-flex;
100
+ align-items: center;
101
+ justify-content: center;
102
+ width: 2rem;
103
+ height: 2rem;
104
+ padding: 0;
105
+ border: 0;
106
+ border-radius: 8px;
107
+ background: none;
108
+ color: var(--color-muted);
109
+ cursor: pointer;
110
+ }
111
+ .top .close ion-icon { font-size: 1.2rem; }
112
+
113
+ /* Cuerpo scrollable: aquí caen los resultados del consumidor (slot por defecto). */
114
+ .results { max-height: 56vh; overflow-y: auto; padding: 0.35rem; }
115
+ .footer:not(:empty) { border-top: 1px solid var(--border-soft); padding: 0.3rem 0.6rem; }
116
+
117
+ @media (max-width: 560px) {
118
+ dialog { margin: 0 auto auto; width: 100vw; max-width: 100vw; max-height: 100vh; height: auto; border-radius: 0; }
119
+ }
120
+ `;
121
+ }
122
+ // ── API pública ──────────────────────────────────────────────────────────
123
+ openSearch() {
124
+ if (this.open) return;
125
+ this.open = true;
126
+ this.emitOpen(true);
127
+ }
128
+ close() {
129
+ if (!this.open) return;
130
+ this.open = false;
131
+ this.emitOpen(false);
132
+ }
133
+ toggle() {
134
+ this.open ? this.close() : this.openSearch();
135
+ }
136
+ emitOpen(open) {
137
+ this.dispatchEvent(new CustomEvent("ok-open", { detail: { open }, bubbles: true, composed: true }));
138
+ }
139
+ onInput(e) {
140
+ this.value = e.target.value;
141
+ this.dispatchEvent(new CustomEvent("ok-input", { detail: { value: this.value }, bubbles: true, composed: true }));
142
+ }
143
+ // Sincroniza `open` ↔ el <dialog> nativo (top layer). try/catch porque happy-dom (tests) no
144
+ // implementa showModal/close; ahí `open` sigue siendo la verdad.
145
+ updated() {
146
+ const d = this.renderRoot.querySelector("dialog");
147
+ if (!d) return;
148
+ try {
149
+ if (this.open && !d.open) {
150
+ d.showModal();
151
+ this.input?.focus();
152
+ } else if (!this.open && d.open) {
153
+ d.close();
154
+ }
155
+ } catch {
156
+ }
157
+ }
158
+ render() {
159
+ return html`
160
+ ${this.triggerIcon ? html`<button class="trigger" ?data-assigned=${this.open} aria-label=${this.triggerLabel || this.placeholder}
161
+ title=${this.triggerLabel || this.placeholder} @click=${() => this.openSearch()}>
162
+ <ion-icon .icon=${okIcon(this.triggerIcon)}></ion-icon>
163
+ </button>` : nothing}
164
+
165
+ <dialog aria-label=${this.triggerLabel || this.placeholder}
166
+ @close=${() => {
167
+ if (this.open) {
168
+ this.open = false;
169
+ this.emitOpen(false);
170
+ }
171
+ }}
172
+ @click=${(e) => {
173
+ if (e.target === e.currentTarget) this.close();
174
+ }}>
175
+ <div class="top">
176
+ <ion-icon class="lupa" .icon=${iconSearchOutline}></ion-icon>
177
+ <input type="text" .value=${this.value} placeholder=${this.placeholder}
178
+ aria-label=${this.placeholder} autocomplete="off" spellcheck="false"
179
+ @input=${(e) => this.onInput(e)} />
180
+ <button class="close" aria-label="Cerrar" @click=${() => this.close()}>
181
+ <ion-icon .icon=${iconCloseOutline}></ion-icon>
182
+ </button>
183
+ </div>
184
+ <div class="results"><slot></slot></div>
185
+ <div class="footer"><slot name="footer"></slot></div>
186
+ </dialog>
187
+ `;
188
+ }
189
+ }
190
+ __decorateClass([
191
+ property({ type: Boolean, reflect: true })
192
+ ], OkSpotlightSearch.prototype, "open");
193
+ __decorateClass([
194
+ property()
195
+ ], OkSpotlightSearch.prototype, "placeholder");
196
+ __decorateClass([
197
+ property()
198
+ ], OkSpotlightSearch.prototype, "value");
199
+ __decorateClass([
200
+ property({ attribute: "trigger-icon" })
201
+ ], OkSpotlightSearch.prototype, "triggerIcon");
202
+ __decorateClass([
203
+ property({ attribute: "trigger-label" })
204
+ ], OkSpotlightSearch.prototype, "triggerLabel");
205
+ __decorateClass([
206
+ query(".top input")
207
+ ], OkSpotlightSearch.prototype, "input");
208
+ define("ok-spotlight-search", OkSpotlightSearch);
209
+ export {
210
+ OkSpotlightSearch
211
+ };