labx-components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/index-Dw9X5FBB.js +1519 -0
  3. package/dist/cjs/index.cjs.js +7 -0
  4. package/dist/cjs/labx-button_3.cjs.entry.js +104 -0
  5. package/dist/cjs/labx-components.cjs.js +24 -0
  6. package/dist/cjs/loader.cjs.js +12 -0
  7. package/dist/collection/collection-manifest.json +15 -0
  8. package/dist/collection/components/labx-button/labx-button.css +74 -0
  9. package/dist/collection/components/labx-button/labx-button.js +135 -0
  10. package/dist/collection/components/labx-icon/labx-icon.css +26 -0
  11. package/dist/collection/components/labx-icon/labx-icon.js +87 -0
  12. package/dist/collection/components/labx-input/labx-input.css +117 -0
  13. package/dist/collection/components/labx-input/labx-input.js +183 -0
  14. package/dist/collection/index.js +10 -0
  15. package/dist/collection/utils/utils.js +3 -0
  16. package/dist/collection/utils/utils.unit.test.js +16 -0
  17. package/dist/components/index.d.ts +35 -0
  18. package/dist/components/index.js +1 -0
  19. package/dist/components/labx-button.d.ts +11 -0
  20. package/dist/components/labx-button.js +1 -0
  21. package/dist/components/labx-icon.d.ts +11 -0
  22. package/dist/components/labx-icon.js +1 -0
  23. package/dist/components/labx-input.d.ts +11 -0
  24. package/dist/components/labx-input.js +1 -0
  25. package/dist/components/p-DEM5hG4h.js +1 -0
  26. package/dist/esm/index-dLjo-EBs.js +1510 -0
  27. package/dist/esm/index.js +5 -0
  28. package/dist/esm/labx-button_3.entry.js +100 -0
  29. package/dist/esm/labx-components.js +20 -0
  30. package/dist/esm/loader.js +10 -0
  31. package/dist/index.cjs.js +1 -0
  32. package/dist/index.js +1 -0
  33. package/dist/labx-components/index.esm.js +1 -0
  34. package/dist/labx-components/labx-components.css +1 -0
  35. package/dist/labx-components/labx-components.esm.js +1 -0
  36. package/dist/labx-components/p-956be281.entry.js +1 -0
  37. package/dist/labx-components/p-dLjo-EBs.js +2 -0
  38. package/dist/types/components/labx-button/labx-button.d.ts +15 -0
  39. package/dist/types/components/labx-icon/labx-icon.d.ts +9 -0
  40. package/dist/types/components/labx-input/labx-input.d.ts +24 -0
  41. package/dist/types/components.d.ts +237 -0
  42. package/dist/types/index.d.ts +11 -0
  43. package/dist/types/stencil-public-runtime.d.ts +1860 -0
  44. package/dist/types/utils/utils.d.ts +1 -0
  45. package/dist/types/utils/utils.unit.test.d.ts +1 -0
  46. package/dist-angular/angular-component-lib/utils.ts +65 -0
  47. package/dist-angular/components.ts +94 -0
  48. package/dist-angular/index.ts +8 -0
  49. package/dist-angular/text-value-accessor.ts +24 -0
  50. package/dist-angular/value-accessor.ts +39 -0
  51. package/loader/cdn.js +1 -0
  52. package/loader/index.cjs.js +1 -0
  53. package/loader/index.d.ts +24 -0
  54. package/loader/index.es2017.js +1 -0
  55. package/loader/index.js +2 -0
  56. package/package.json +57 -0
  57. package/readme.md +111 -0
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ function format(first, middle, last) {
4
+ return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');
5
+ }
6
+
7
+ exports.format = format;
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-Dw9X5FBB.js');
4
+
5
+ const labxButtonCss = () => `:host{display:inline-block}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 20px;border:2px solid transparent;border-radius:8px;cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;line-height:1;text-decoration:none;white-space:nowrap;transition:background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease}.btn:focus-visible{outline:3px solid var(--color-primary-light);outline-offset:2px}.btn--primary{background-color:var(--color-primary);border-color:var(--color-primary);color:var(--color-bg-surface)}.btn--primary:hover:not(:disabled){background-color:var(--color-primary-hover);border-color:var(--color-primary-hover)}.btn--secondary{background-color:transparent;border-color:var(--color-primary);color:var(--color-primary)}.btn--secondary:hover:not(:disabled){background-color:var(--color-primary-light)}.btn--danger{background-color:var(--color-danger);border-color:var(--color-danger);color:var(--color-bg-surface)}.btn--danger:hover:not(:disabled){background-color:var(--color-danger-light);border-color:var(--color-danger);color:var(--color-danger)}.btn:disabled{background-color:var(--color-bg-subtle);border-color:var(--color-border);color:var(--color-disabled);cursor:not-allowed}`;
6
+
7
+ const LabxButton = class {
8
+ constructor(hostRef) {
9
+ index.registerInstance(this, hostRef);
10
+ this.labxClick = index.createEvent(this, "labxClick");
11
+ }
12
+ /** Texto del botón */
13
+ label = 'Button';
14
+ /** Estilo visual: primary | secondary | danger */
15
+ variant = 'primary';
16
+ /** Deshabilita el botón */
17
+ disabled = false;
18
+ /** Tipo HTML del botón */
19
+ type = 'button';
20
+ /** Se emite cuando el botón es clickeado */
21
+ labxClick;
22
+ handleClick() {
23
+ if (!this.disabled) {
24
+ this.labxClick.emit();
25
+ }
26
+ }
27
+ render() {
28
+ return (index.h(index.Host, { key: '76d607e0f7612ef141b30d884166181402e4e6a0' }, index.h("button", { key: 'cd3204b93d8791529784d04ccf80a566221aab74', type: this.type, disabled: this.disabled, class: `btn btn--${this.variant}`, onClick: () => this.handleClick() }, this.label)));
29
+ }
30
+ };
31
+ LabxButton.style = labxButtonCss();
32
+
33
+ const labxIconCss = () => `:host{display:inline-flex;align-items:center;justify-content:center;color:inherit}.icon{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:inherit;line-height:1;letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;direction:ltr;font-variation-settings:'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 20}.icon--filled{font-variation-settings:'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 20}`;
34
+
35
+ const LabxIcon = class {
36
+ constructor(hostRef) {
37
+ index.registerInstance(this, hostRef);
38
+ }
39
+ /** Nombre del ícono de Material Symbols (ej: "email", "search", "close") */
40
+ name;
41
+ /** Tamaño en px */
42
+ size = 20;
43
+ /** Filled (true) u Outlined (false) */
44
+ filled = false;
45
+ render() {
46
+ return (index.h(index.Host, { key: '30e38c191019432490921f13c23fc91f96952e90', style: { fontSize: `${this.size}px` } }, index.h("span", { key: '9ff64363cdb1fcb0f0eec24e13a2fc623506972f', class: { 'icon': true, 'icon--filled': this.filled } }, this.name)));
47
+ }
48
+ };
49
+ LabxIcon.style = labxIconCss();
50
+
51
+ const labxInputCss = () => `:host{display:block}.input-wrapper{position:relative;display:flex;align-items:center;background-color:var(--color-bg-surface);border:2px solid var(--color-border);border-radius:8px;transition:border-color 0.2s ease}.input-wrapper--focused{border-color:var(--color-primary)}.input-wrapper--error{border-color:var(--color-danger)}.input-wrapper--disabled{background-color:var(--color-bg-subtle);cursor:not-allowed}.input{width:100%;padding:20px 14px 6px 14px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;color:var(--color-text-default);cursor:inherit}.input:disabled{color:var(--color-disabled);cursor:not-allowed}.input-wrapper--icon-left .input{padding-left:40px}.input-wrapper--icon-right .input{padding-right:40px}.input-label{position:absolute;left:14px;top:50%;transform:translateY(-50%);font-size:14px;color:var(--color-text-muted);pointer-events:none;transition:top 0.2s ease, font-size 0.2s ease, color 0.2s ease}.input-label--floating{top:7px;transform:none;font-size:11px;color:var(--color-primary)}.input-wrapper--error .input-label--floating{color:var(--color-danger)}.input-wrapper--icon-left .input-label{left:40px}.input-icon{position:absolute;display:flex;align-items:center;justify-content:center;width:20px;height:20px;color:var(--color-text-muted);pointer-events:none}.input-icon--left{left:12px}.input-icon--right{right:12px}.input-error{display:block;margin-top:4px;padding-left:4px;font-size:12px;color:var(--color-danger)}`;
52
+
53
+ const LabxInput = class {
54
+ constructor(hostRef) {
55
+ index.registerInstance(this, hostRef);
56
+ this.labxChange = index.createEvent(this, "labxChange");
57
+ }
58
+ /** Texto del label flotante */
59
+ label;
60
+ /** Valor del input */
61
+ value = '';
62
+ /** Type HTML del input */
63
+ type = 'text';
64
+ /** Deshabilita el input */
65
+ disabled = false;
66
+ /** Mensaje de error */
67
+ error;
68
+ /** El input tiene foco actualmente */
69
+ focused = false;
70
+ /** true si el slot icon-left tiene contenido */
71
+ hasIconLeft = false;
72
+ /** true si el slot icon-right tiene contenido */
73
+ hasIconRight = false;
74
+ /** Se emite cuando el valor cambia */
75
+ labxChange;
76
+ handleInput(e) {
77
+ this.value = e.target.value;
78
+ this.labxChange.emit(this.value);
79
+ }
80
+ onSlotChange(side, e) {
81
+ const slot = e.target;
82
+ const hasContent = slot.assignedNodes().length > 0;
83
+ if (side === 'left')
84
+ this.hasIconLeft = hasContent;
85
+ else
86
+ this.hasIconRight = hasContent;
87
+ }
88
+ render() {
89
+ const isFloating = this.focused || this.value?.length > 0;
90
+ return (index.h(index.Host, { key: '357eb1c2b3c395801c8d7249c3e649f5ddd33bda' }, index.h("div", { key: '1bc8515582f79c560196c7631cef3de31344234e', class: {
91
+ 'input-wrapper': true,
92
+ 'input-wrapper--focused': this.focused,
93
+ 'input-wrapper--error': !!this.error,
94
+ 'input-wrapper--disabled': this.disabled,
95
+ 'input-wrapper--icon-left': this.hasIconLeft,
96
+ 'input-wrapper--icon-right': this.hasIconRight,
97
+ } }, index.h("span", { key: 'd3da76f5d96c55179870583faf5931c6008188ec', class: "input-icon input-icon--left" }, index.h("slot", { key: 'eeea94735ef34585bd88eef2e6d753f58733aeb7', name: "icon-left", onSlotchange: (e) => this.onSlotChange('left', e) })), index.h("input", { key: '2792b2634677fe2ebe272248bd75fbd0e993080a', class: "input", type: this.type, value: this.value, disabled: this.disabled, onInput: (e) => this.handleInput(e), onFocus: () => (this.focused = true), onBlur: () => (this.focused = false) }), this.label && (index.h("label", { key: '0d1ae4db30645f2a4a1927f0495b053620d5a3d5', class: { 'input-label': true, 'input-label--floating': isFloating } }, this.label)), index.h("span", { key: '4e25bc9f95998d3d94f36306a353859fa67fc5f3', class: "input-icon input-icon--right" }, index.h("slot", { key: '2492d04ec309a636128fd7da1729875e2c0c93d5', name: "icon-right", onSlotchange: (e) => this.onSlotChange('right', e) }))), this.error && index.h("span", { key: 'bfde298513f8d55f4b36b51afee6565d312f52d3', class: "input-error" }, this.error)));
98
+ }
99
+ };
100
+ LabxInput.style = labxInputCss();
101
+
102
+ exports.labx_button = LabxButton;
103
+ exports.labx_icon = LabxIcon;
104
+ exports.labx_input = LabxInput;
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-Dw9X5FBB.js');
4
+
5
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
6
+ /*
7
+ Stencil Client Patch Browser v4.43.3 | MIT Licensed | https://stenciljs.com
8
+ */
9
+
10
+ var patchBrowser = () => {
11
+ const importMeta = (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('labx-components.cjs.js', document.baseURI).href));
12
+ const opts = {};
13
+ if (importMeta !== "") {
14
+ opts.resourcesUrl = new URL(".", importMeta).href;
15
+ }
16
+ return index.promiseResolve(opts);
17
+ };
18
+
19
+ patchBrowser().then(async (options) => {
20
+ await index.globalScripts();
21
+ return index.bootstrapLazy([["labx-button_3.cjs",[[513,"labx-button",{"label":[1],"variant":[1],"disabled":[4],"type":[1]}],[513,"labx-icon",{"name":[1],"size":[2],"filled":[4]}],[769,"labx-input",{"label":[1],"value":[1537],"type":[1],"disabled":[4],"error":[1],"focused":[32],"hasIconLeft":[32],"hasIconRight":[32]}]]]], options);
22
+ });
23
+
24
+ exports.setNonce = index.setNonce;
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-Dw9X5FBB.js');
4
+
5
+ const defineCustomElements = async (win, options) => {
6
+ if (typeof window === 'undefined') return undefined;
7
+ await index.globalScripts();
8
+ return index.bootstrapLazy([["labx-button_3.cjs",[[513,"labx-button",{"label":[1],"variant":[1],"disabled":[4],"type":[1]}],[513,"labx-icon",{"name":[1],"size":[2],"filled":[4]}],[769,"labx-input",{"label":[1],"value":[1537],"type":[1],"disabled":[4],"error":[1],"focused":[32],"hasIconLeft":[32],"hasIconRight":[32]}]]]], options);
9
+ };
10
+
11
+ exports.setNonce = index.setNonce;
12
+ exports.defineCustomElements = defineCustomElements;
@@ -0,0 +1,15 @@
1
+ {
2
+ "entries": [
3
+ "components/labx-button/labx-button.js",
4
+ "components/labx-icon/labx-icon.js",
5
+ "components/labx-input/labx-input.js"
6
+ ],
7
+ "mixins": [],
8
+ "compiler": {
9
+ "name": "@stencil/core",
10
+ "version": "4.43.3",
11
+ "typescriptVersion": "5.8.3"
12
+ },
13
+ "collections": [],
14
+ "bundles": []
15
+ }
@@ -0,0 +1,74 @@
1
+ :host {
2
+ display: inline-block;
3
+ }
4
+
5
+ /* ─── Base ───────────────────────────────────────────── */
6
+ .btn {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ gap: 8px;
11
+
12
+ padding: 10px 20px;
13
+ border: 2px solid transparent;
14
+ border-radius: 8px;
15
+ cursor: pointer;
16
+
17
+ font-family: inherit;
18
+ font-size: 14px;
19
+ font-weight: 600;
20
+ line-height: 1;
21
+ text-decoration: none;
22
+ white-space: nowrap;
23
+
24
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
25
+ }
26
+
27
+ .btn:focus-visible {
28
+ outline: 3px solid var(--color-primary-light);
29
+ outline-offset: 2px;
30
+ }
31
+
32
+ /* ─── Variant: Primary ───────────────────────────────── */
33
+ .btn--primary {
34
+ background-color: var(--color-primary);
35
+ border-color: var(--color-primary);
36
+ color: var(--color-bg-surface);
37
+ }
38
+
39
+ .btn--primary:hover:not(:disabled) {
40
+ background-color: var(--color-primary-hover);
41
+ border-color: var(--color-primary-hover);
42
+ }
43
+
44
+ /* ─── Variant: Secondary ─────────────────────────────── */
45
+ .btn--secondary {
46
+ background-color: transparent;
47
+ border-color: var(--color-primary);
48
+ color: var(--color-primary);
49
+ }
50
+
51
+ .btn--secondary:hover:not(:disabled) {
52
+ background-color: var(--color-primary-light);
53
+ }
54
+
55
+ /* ─── Variant: Danger ────────────────────────────────── */
56
+ .btn--danger {
57
+ background-color: var(--color-danger);
58
+ border-color: var(--color-danger);
59
+ color: var(--color-bg-surface);
60
+ }
61
+
62
+ .btn--danger:hover:not(:disabled) {
63
+ background-color: var(--color-danger-light);
64
+ border-color: var(--color-danger);
65
+ color: var(--color-danger);
66
+ }
67
+
68
+ /* ─── Disabled ───────────────────────────────────────── */
69
+ .btn:disabled {
70
+ background-color: var(--color-bg-subtle);
71
+ border-color: var(--color-border);
72
+ color: var(--color-disabled);
73
+ cursor: not-allowed;
74
+ }
@@ -0,0 +1,135 @@
1
+ import { Host, h } from "@stencil/core";
2
+ export class LabxButton {
3
+ /** Texto del botón */
4
+ label = 'Button';
5
+ /** Estilo visual: primary | secondary | danger */
6
+ variant = 'primary';
7
+ /** Deshabilita el botón */
8
+ disabled = false;
9
+ /** Tipo HTML del botón */
10
+ type = 'button';
11
+ /** Se emite cuando el botón es clickeado */
12
+ labxClick;
13
+ handleClick() {
14
+ if (!this.disabled) {
15
+ this.labxClick.emit();
16
+ }
17
+ }
18
+ render() {
19
+ return (h(Host, { key: '76d607e0f7612ef141b30d884166181402e4e6a0' }, h("button", { key: 'cd3204b93d8791529784d04ccf80a566221aab74', type: this.type, disabled: this.disabled, class: `btn btn--${this.variant}`, onClick: () => this.handleClick() }, this.label)));
20
+ }
21
+ static get is() { return "labx-button"; }
22
+ static get encapsulation() { return "shadow"; }
23
+ static get originalStyleUrls() {
24
+ return {
25
+ "$": ["labx-button.css"]
26
+ };
27
+ }
28
+ static get styleUrls() {
29
+ return {
30
+ "$": ["labx-button.css"]
31
+ };
32
+ }
33
+ static get properties() {
34
+ return {
35
+ "label": {
36
+ "type": "string",
37
+ "mutable": false,
38
+ "complexType": {
39
+ "original": "string",
40
+ "resolved": "string",
41
+ "references": {}
42
+ },
43
+ "required": false,
44
+ "optional": false,
45
+ "docs": {
46
+ "tags": [],
47
+ "text": "Texto del bot\u00F3n"
48
+ },
49
+ "getter": false,
50
+ "setter": false,
51
+ "reflect": false,
52
+ "attribute": "label",
53
+ "defaultValue": "'Button'"
54
+ },
55
+ "variant": {
56
+ "type": "string",
57
+ "mutable": false,
58
+ "complexType": {
59
+ "original": "'primary' | 'secondary' | 'danger'",
60
+ "resolved": "\"danger\" | \"primary\" | \"secondary\"",
61
+ "references": {}
62
+ },
63
+ "required": false,
64
+ "optional": false,
65
+ "docs": {
66
+ "tags": [],
67
+ "text": "Estilo visual: primary | secondary | danger"
68
+ },
69
+ "getter": false,
70
+ "setter": false,
71
+ "reflect": false,
72
+ "attribute": "variant",
73
+ "defaultValue": "'primary'"
74
+ },
75
+ "disabled": {
76
+ "type": "boolean",
77
+ "mutable": false,
78
+ "complexType": {
79
+ "original": "boolean",
80
+ "resolved": "boolean",
81
+ "references": {}
82
+ },
83
+ "required": false,
84
+ "optional": false,
85
+ "docs": {
86
+ "tags": [],
87
+ "text": "Deshabilita el bot\u00F3n"
88
+ },
89
+ "getter": false,
90
+ "setter": false,
91
+ "reflect": false,
92
+ "attribute": "disabled",
93
+ "defaultValue": "false"
94
+ },
95
+ "type": {
96
+ "type": "string",
97
+ "mutable": false,
98
+ "complexType": {
99
+ "original": "'button' | 'submit' | 'reset'",
100
+ "resolved": "\"button\" | \"reset\" | \"submit\"",
101
+ "references": {}
102
+ },
103
+ "required": false,
104
+ "optional": false,
105
+ "docs": {
106
+ "tags": [],
107
+ "text": "Tipo HTML del bot\u00F3n"
108
+ },
109
+ "getter": false,
110
+ "setter": false,
111
+ "reflect": false,
112
+ "attribute": "type",
113
+ "defaultValue": "'button'"
114
+ }
115
+ };
116
+ }
117
+ static get events() {
118
+ return [{
119
+ "method": "labxClick",
120
+ "name": "labxClick",
121
+ "bubbles": true,
122
+ "cancelable": true,
123
+ "composed": true,
124
+ "docs": {
125
+ "tags": [],
126
+ "text": "Se emite cuando el bot\u00F3n es clickeado"
127
+ },
128
+ "complexType": {
129
+ "original": "void",
130
+ "resolved": "void",
131
+ "references": {}
132
+ }
133
+ }];
134
+ }
135
+ }
@@ -0,0 +1,26 @@
1
+ :host {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ color: inherit;
6
+ }
7
+
8
+ .icon {
9
+ font-family: 'Material Symbols Outlined';
10
+ font-weight: normal;
11
+ font-style: normal;
12
+ font-size: inherit;
13
+ line-height: 1;
14
+ letter-spacing: normal;
15
+ text-transform: none;
16
+ white-space: nowrap;
17
+ word-wrap: normal;
18
+ direction: ltr;
19
+
20
+ /* Sin relleno por defecto */
21
+ font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 20;
22
+ }
23
+
24
+ .icon--filled {
25
+ font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 20;
26
+ }
@@ -0,0 +1,87 @@
1
+ import { Host, h } from "@stencil/core";
2
+ export class LabxIcon {
3
+ /** Nombre del ícono de Material Symbols (ej: "email", "search", "close") */
4
+ name;
5
+ /** Tamaño en px */
6
+ size = 20;
7
+ /** Filled (true) u Outlined (false) */
8
+ filled = false;
9
+ render() {
10
+ return (h(Host, { key: '30e38c191019432490921f13c23fc91f96952e90', style: { fontSize: `${this.size}px` } }, h("span", { key: '9ff64363cdb1fcb0f0eec24e13a2fc623506972f', class: { 'icon': true, 'icon--filled': this.filled } }, this.name)));
11
+ }
12
+ static get is() { return "labx-icon"; }
13
+ static get encapsulation() { return "shadow"; }
14
+ static get originalStyleUrls() {
15
+ return {
16
+ "$": ["labx-icon.css"]
17
+ };
18
+ }
19
+ static get styleUrls() {
20
+ return {
21
+ "$": ["labx-icon.css"]
22
+ };
23
+ }
24
+ static get properties() {
25
+ return {
26
+ "name": {
27
+ "type": "string",
28
+ "mutable": false,
29
+ "complexType": {
30
+ "original": "string",
31
+ "resolved": "string",
32
+ "references": {}
33
+ },
34
+ "required": true,
35
+ "optional": false,
36
+ "docs": {
37
+ "tags": [],
38
+ "text": "Nombre del \u00EDcono de Material Symbols (ej: \"email\", \"search\", \"close\")"
39
+ },
40
+ "getter": false,
41
+ "setter": false,
42
+ "reflect": false,
43
+ "attribute": "name"
44
+ },
45
+ "size": {
46
+ "type": "number",
47
+ "mutable": false,
48
+ "complexType": {
49
+ "original": "number",
50
+ "resolved": "number",
51
+ "references": {}
52
+ },
53
+ "required": false,
54
+ "optional": false,
55
+ "docs": {
56
+ "tags": [],
57
+ "text": "Tama\u00F1o en px"
58
+ },
59
+ "getter": false,
60
+ "setter": false,
61
+ "reflect": false,
62
+ "attribute": "size",
63
+ "defaultValue": "20"
64
+ },
65
+ "filled": {
66
+ "type": "boolean",
67
+ "mutable": false,
68
+ "complexType": {
69
+ "original": "boolean",
70
+ "resolved": "boolean",
71
+ "references": {}
72
+ },
73
+ "required": false,
74
+ "optional": false,
75
+ "docs": {
76
+ "tags": [],
77
+ "text": "Filled (true) u Outlined (false)"
78
+ },
79
+ "getter": false,
80
+ "setter": false,
81
+ "reflect": false,
82
+ "attribute": "filled",
83
+ "defaultValue": "false"
84
+ }
85
+ };
86
+ }
87
+ }
@@ -0,0 +1,117 @@
1
+ :host {
2
+ display: block;
3
+ }
4
+
5
+ /* ─── Wrapper ────────────────────────────────────────── */
6
+ .input-wrapper {
7
+ position: relative;
8
+ display: flex;
9
+ align-items: center;
10
+
11
+ background-color: var(--color-bg-surface);
12
+ border: 2px solid var(--color-border);
13
+ border-radius: 8px;
14
+
15
+ transition: border-color 0.2s ease;
16
+ }
17
+
18
+ .input-wrapper--focused {
19
+ border-color: var(--color-primary);
20
+ }
21
+
22
+ .input-wrapper--error {
23
+ border-color: var(--color-danger);
24
+ }
25
+
26
+ .input-wrapper--disabled {
27
+ background-color: var(--color-bg-subtle);
28
+ cursor: not-allowed;
29
+ }
30
+
31
+ /* ─── Input ──────────────────────────────────────────── */
32
+ .input {
33
+ width: 100%;
34
+ padding: 20px 14px 6px 14px;
35
+ border: none;
36
+ outline: none;
37
+ background: transparent;
38
+
39
+ font-family: inherit;
40
+ font-size: 14px;
41
+ color: var(--color-text-default);
42
+
43
+ cursor: inherit;
44
+ }
45
+
46
+ .input:disabled {
47
+ color: var(--color-disabled);
48
+ cursor: not-allowed;
49
+ }
50
+
51
+ /* Ajuste de padding cuando hay íconos */
52
+ .input-wrapper--icon-left .input {
53
+ padding-left: 40px;
54
+ }
55
+
56
+ .input-wrapper--icon-right .input {
57
+ padding-right: 40px;
58
+ }
59
+
60
+ /* ─── Label flotante ─────────────────────────────────── */
61
+ .input-label {
62
+ position: absolute;
63
+ left: 14px;
64
+ top: 50%;
65
+ transform: translateY(-50%);
66
+
67
+ font-size: 14px;
68
+ color: var(--color-text-muted);
69
+ pointer-events: none;
70
+
71
+ transition: top 0.2s ease, font-size 0.2s ease, color 0.2s ease;
72
+ }
73
+
74
+ .input-label--floating {
75
+ top: 7px;
76
+ transform: none;
77
+ font-size: 11px;
78
+ color: var(--color-primary);
79
+ }
80
+
81
+ .input-wrapper--error .input-label--floating {
82
+ color: var(--color-danger);
83
+ }
84
+
85
+ /* Ajuste del label cuando hay ícono izquierdo */
86
+ .input-wrapper--icon-left .input-label {
87
+ left: 40px;
88
+ }
89
+
90
+ /* ─── Íconos ─────────────────────────────────────────── */
91
+ .input-icon {
92
+ position: absolute;
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ width: 20px;
97
+ height: 20px;
98
+ color: var(--color-text-muted);
99
+ pointer-events: none;
100
+ }
101
+
102
+ .input-icon--left {
103
+ left: 12px;
104
+ }
105
+
106
+ .input-icon--right {
107
+ right: 12px;
108
+ }
109
+
110
+ /* ─── Error ──────────────────────────────────────────── */
111
+ .input-error {
112
+ display: block;
113
+ margin-top: 4px;
114
+ padding-left: 4px;
115
+ font-size: 12px;
116
+ color: var(--color-danger);
117
+ }