@dropi/ui 0.1.3 → 0.1.4

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  var index = require('./index-CuGLZVqo.js');
4
4
 
5
- const dropiRadioButtonCss = () => `:host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;width:20px;height:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;display:flex;justify-content:center;align-items:center}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}`;
5
+ const dropiRadioButtonCss = () => `:host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;-webkit-appearance:none;width:20px;height:20px;min-width:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;align-self:center;vertical-align:middle;margin:0}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}`;
6
6
 
7
7
  const DropiRadioButton = class {
8
8
  constructor(hostRef) {
@@ -13,6 +13,7 @@
13
13
 
14
14
  label {
15
15
  display: flex;
16
+ flex-direction: row;
16
17
  align-items: center;
17
18
  gap: 8px;
18
19
  cursor: pointer;
@@ -24,8 +25,10 @@ label {
24
25
 
25
26
  input[type='radio'] {
26
27
  appearance: none;
28
+ -webkit-appearance: none;
27
29
  width: 20px;
28
30
  height: 20px;
31
+ min-width: 20px;
29
32
  border: 2px solid var(--Gray-Gray-200, #c3c9d9);
30
33
  border-radius: 50%;
31
34
  background-color: transparent;
@@ -33,9 +36,9 @@ input[type='radio'] {
33
36
  cursor: pointer;
34
37
  outline: none;
35
38
  flex-shrink: 0;
36
- display: flex;
37
- justify-content: center;
38
- align-items: center;
39
+ align-self: center;
40
+ vertical-align: middle;
41
+ margin: 0;
39
42
  }
40
43
 
41
44
  input[type='radio']::before {
@@ -1 +1 @@
1
- import{t as e,p as t,H as r,c as i,h as o}from"./index.js";const n=t(class extends r{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.dropiChange=i(this,"dropiChange")}label="";name="radio";inputId="radioButton";checked=!1;resetTrigger=!1;dropiChange;onResetTrigger(e){e&&(this.checked=!1)}handleChange(e){this.checked=e.target.checked,this.dropiChange.emit(e)}render(){return o("div",{key:"3b31699bf088bee52465981074c0aea48b6fe112",class:"dropi-radio-button"},o("label",{key:"072d19bd9c88739b849db0e264c65183eaab2132",htmlFor:this.inputId},o("input",{key:"82d1600002e9dc2795cdc5c731997742adc8e2db",id:this.inputId,type:"radio",name:this.name,checked:this.checked,onChange:e=>this.handleChange(e)}),this.label))}static get formAssociated(){return!0}static get watchers(){return{resetTrigger:[{onResetTrigger:0}]}}static get style(){return":host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;width:20px;height:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;display:flex;justify-content:center;align-items:center}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}"}},[577,"dropi-radio-button",{label:[1],name:[1],inputId:[1,"input-id"],checked:[1540],resetTrigger:[4,"reset-trigger"]},void 0,{resetTrigger:[{onResetTrigger:0}]}]);function a(){"undefined"!=typeof customElements&&["dropi-radio-button"].forEach((t=>{"dropi-radio-button"===t&&(customElements.get(e(t))||customElements.define(e(t),n))}))}a();const s=n,d=a;export{s as DropiRadioButton,d as defineCustomElement}
1
+ import{t as e,p as r,H as t,c as i,h as o}from"./index.js";const n=r(class extends t{constructor(e){super(),!1!==e&&this.__registerHost(),this.__attachShadow(),this.dropiChange=i(this,"dropiChange")}label="";name="radio";inputId="radioButton";checked=!1;resetTrigger=!1;dropiChange;onResetTrigger(e){e&&(this.checked=!1)}handleChange(e){this.checked=e.target.checked,this.dropiChange.emit(e)}render(){return o("div",{key:"3b31699bf088bee52465981074c0aea48b6fe112",class:"dropi-radio-button"},o("label",{key:"072d19bd9c88739b849db0e264c65183eaab2132",htmlFor:this.inputId},o("input",{key:"82d1600002e9dc2795cdc5c731997742adc8e2db",id:this.inputId,type:"radio",name:this.name,checked:this.checked,onChange:e=>this.handleChange(e)}),this.label))}static get formAssociated(){return!0}static get watchers(){return{resetTrigger:[{onResetTrigger:0}]}}static get style(){return":host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;-webkit-appearance:none;width:20px;height:20px;min-width:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;align-self:center;vertical-align:middle;margin:0}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}"}},[577,"dropi-radio-button",{label:[1],name:[1],inputId:[1,"input-id"],checked:[1540],resetTrigger:[4,"reset-trigger"]},void 0,{resetTrigger:[{onResetTrigger:0}]}]);function a(){"undefined"!=typeof customElements&&["dropi-radio-button"].forEach((r=>{"dropi-radio-button"===r&&(customElements.get(e(r))||customElements.define(e(r),n))}))}a();const s=n,d=a;export{s as DropiRadioButton,d as defineCustomElement}
@@ -1 +1 @@
1
- import{p as e,g as o,b as t}from"./p-DFz-gwFP.js";export{s as setNonce}from"./p-DFz-gwFP.js";(()=>{const o=import.meta.url,t={};return""!==o&&(t.resourcesUrl=new URL(".",o).href),e(t)})().then((async e=>(await o(),t([["p-6f0aa619",[[513,"dropi-icon",{name:[1],width:[1],height:[1],color:[1]},null,{color:[{colorChanged:0}]}]]],["p-21abf91a",[[769,"dropi-button",{type:[1],severity:[1],size:[1],state:[1],preIcon:[1,"pre-icon"],postIcon:[1,"post-icon"],text:[1]}]]],["p-a46a05a6",[[577,"dropi-input",{inputId:[1,"input-id"],name:[1],label:[1],placeholder:[1],value:[1025],maxlength:[2],disabled:[516],required:[516],showAsterisk:[4,"show-asterisk"],fixedLabel:[4,"fixed-label"],inputMode:[1,"input-mode"],passwordInput:[4,"password-input"],moneyFormat:[4,"money-format"],thousandSeparator:[4,"thousand-separator"],onlyNumbers:[4,"only-numbers"],allowDecimals:[4,"allow-decimals"],onlyLetters:[4,"only-letters"],icon:[1],iconColor:[1,"icon-color"],invalid:[4],helperText:[1,"helper-text"],showHelperOnlyOnError:[4,"show-helper-only-on-error"],showPassword:[32],touched:[32]},null,{value:[{valueChanged:0}],disabled:[{disabledChanged:0}]}]]],["p-c7b9cbda",[[577,"dropi-select",{label:[1],placeholder:[1],options:[1040],name:[1],disabled:[516],invalid:[4],errorText:[1,"error-text"],helperText:[1,"helper-text"],showObligatory:[4,"show-obligatory"],searchEnabled:[4,"search-enabled"],multiSelect:[4,"multi-select"],dropdownType:[4,"dropdown-type"],showCountryFlags:[4,"show-country-flags"],radioOptions:[4,"radio-options"],placeHolderSearch:[1,"place-holder-search"],preIcon:[1,"pre-icon"],defaultSelectedId:[1032,"default-selected-id"],value:[1040],isOpen:[32],selectedOption:[32],multiSelected:[32],filteredOptions:[32],searchTerm:[32],dropdownStyle:[32],setById:[64],setByLabel:[64],clearSelection:[64],resetMultiSelect:[64]},[[4,"click","handleOutsideClick"]],{options:[{optionsChanged:0}],defaultSelectedId:[{defaultChanged:0}],value:[{valueChanged:0}]}]]],["p-52291024",[[513,"dropi-tag",{type:[1],state:[1],showIcon:[4,"show-icon"],icon:[1],text:[1]},null,{type:[{propsChanged:0}],state:[{propsChanged:0}]}]]],["p-9c7076d3",[[577,"dropi-text-area",{inputId:[1,"input-id"],name:[1],label:[1],placeholder:[1],value:[1025],maxlength:[2],minlength:[2],rows:[2],resize:[1],disabled:[516],required:[516],showAsterisk:[4,"show-asterisk"],helperText:[1,"helper-text"],invalid:[4],touched:[32]},null,{value:[{valueChanged:0}]}]]],["p-f785011f",[[513,"dropi-badge",{state:[1]}]]],["p-dd089a60",[[577,"dropi-checkbox",{checked:[1540],disabled:[516]}]]],["p-54502c46",[[577,"dropi-radio-button",{label:[1],name:[1],inputId:[1,"input-id"],checked:[1540],resetTrigger:[4,"reset-trigger"]},null,{resetTrigger:[{onResetTrigger:0}]}]]],["p-a1944f3d",[[577,"dropi-switch",{isChecked:[1540,"is-checked"],disabled:[516]}]]]],e))));
1
+ import{p as e,g as o,b as t}from"./p-DFz-gwFP.js";export{s as setNonce}from"./p-DFz-gwFP.js";(()=>{const o=import.meta.url,t={};return""!==o&&(t.resourcesUrl=new URL(".",o).href),e(t)})().then((async e=>(await o(),t([["p-6f0aa619",[[513,"dropi-icon",{name:[1],width:[1],height:[1],color:[1]},null,{color:[{colorChanged:0}]}]]],["p-21abf91a",[[769,"dropi-button",{type:[1],severity:[1],size:[1],state:[1],preIcon:[1,"pre-icon"],postIcon:[1,"post-icon"],text:[1]}]]],["p-a46a05a6",[[577,"dropi-input",{inputId:[1,"input-id"],name:[1],label:[1],placeholder:[1],value:[1025],maxlength:[2],disabled:[516],required:[516],showAsterisk:[4,"show-asterisk"],fixedLabel:[4,"fixed-label"],inputMode:[1,"input-mode"],passwordInput:[4,"password-input"],moneyFormat:[4,"money-format"],thousandSeparator:[4,"thousand-separator"],onlyNumbers:[4,"only-numbers"],allowDecimals:[4,"allow-decimals"],onlyLetters:[4,"only-letters"],icon:[1],iconColor:[1,"icon-color"],invalid:[4],helperText:[1,"helper-text"],showHelperOnlyOnError:[4,"show-helper-only-on-error"],showPassword:[32],touched:[32]},null,{value:[{valueChanged:0}],disabled:[{disabledChanged:0}]}]]],["p-c7b9cbda",[[577,"dropi-select",{label:[1],placeholder:[1],options:[1040],name:[1],disabled:[516],invalid:[4],errorText:[1,"error-text"],helperText:[1,"helper-text"],showObligatory:[4,"show-obligatory"],searchEnabled:[4,"search-enabled"],multiSelect:[4,"multi-select"],dropdownType:[4,"dropdown-type"],showCountryFlags:[4,"show-country-flags"],radioOptions:[4,"radio-options"],placeHolderSearch:[1,"place-holder-search"],preIcon:[1,"pre-icon"],defaultSelectedId:[1032,"default-selected-id"],value:[1040],isOpen:[32],selectedOption:[32],multiSelected:[32],filteredOptions:[32],searchTerm:[32],dropdownStyle:[32],setById:[64],setByLabel:[64],clearSelection:[64],resetMultiSelect:[64]},[[4,"click","handleOutsideClick"]],{options:[{optionsChanged:0}],defaultSelectedId:[{defaultChanged:0}],value:[{valueChanged:0}]}]]],["p-52291024",[[513,"dropi-tag",{type:[1],state:[1],showIcon:[4,"show-icon"],icon:[1],text:[1]},null,{type:[{propsChanged:0}],state:[{propsChanged:0}]}]]],["p-9c7076d3",[[577,"dropi-text-area",{inputId:[1,"input-id"],name:[1],label:[1],placeholder:[1],value:[1025],maxlength:[2],minlength:[2],rows:[2],resize:[1],disabled:[516],required:[516],showAsterisk:[4,"show-asterisk"],helperText:[1,"helper-text"],invalid:[4],touched:[32]},null,{value:[{valueChanged:0}]}]]],["p-f785011f",[[513,"dropi-badge",{state:[1]}]]],["p-dd089a60",[[577,"dropi-checkbox",{checked:[1540],disabled:[516]}]]],["p-bda1427f",[[577,"dropi-radio-button",{label:[1],name:[1],inputId:[1,"input-id"],checked:[1540],resetTrigger:[4,"reset-trigger"]},null,{resetTrigger:[{onResetTrigger:0}]}]]],["p-a1944f3d",[[577,"dropi-switch",{isChecked:[1540,"is-checked"],disabled:[516]}]]]],e))));
@@ -0,0 +1 @@
1
+ import{r as e,c as r,h as i}from"./p-DFz-gwFP.js";const t=class{constructor(i){e(this,i),this.dropiChange=r(this,"dropiChange")}label="";name="radio";inputId="radioButton";checked=!1;resetTrigger=!1;dropiChange;onResetTrigger(e){e&&(this.checked=!1)}handleChange(e){this.checked=e.target.checked,this.dropiChange.emit(e)}render(){return i("div",{key:"3b31699bf088bee52465981074c0aea48b6fe112",class:"dropi-radio-button"},i("label",{key:"072d19bd9c88739b849db0e264c65183eaab2132",htmlFor:this.inputId},i("input",{key:"82d1600002e9dc2795cdc5c731997742adc8e2db",id:this.inputId,type:"radio",name:this.name,checked:this.checked,onChange:e=>this.handleChange(e)}),this.label))}static get formAssociated(){return!0}static get watchers(){return{resetTrigger:[{onResetTrigger:0}]}}};t.style=":host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;-webkit-appearance:none;width:20px;height:20px;min-width:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;align-self:center;vertical-align:middle;margin:0}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}";export{t as dropi_radio_button}
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, c as createEvent, h } from './index-DFz-gwFP.js';
2
2
 
3
- const dropiRadioButtonCss = () => `:host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;width:20px;height:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;display:flex;justify-content:center;align-items:center}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}`;
3
+ const dropiRadioButtonCss = () => `:host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;flex-direction:row;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;-webkit-appearance:none;width:20px;height:20px;min-width:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;align-self:center;vertical-align:middle;margin:0}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}`;
4
4
 
5
5
  const DropiRadioButton = class {
6
6
  constructor(hostRef) {
@@ -5,3 +5,4 @@
5
5
  */
6
6
  export type * from './components.d.ts';
7
7
  export type { BadgeState } from './components/dropi-badge/dropi-badge';
8
+ export type { SelectOption, SelectOptionGroup } from './components/dropi-select/select.types';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dropi/ui",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Dropi Design System — Web Components for Angular, React and Vue",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
@@ -33,7 +33,7 @@
33
33
  "scripts/"
34
34
  ],
35
35
  "scripts": {
36
- "build": "stencil build",
36
+ "build": "stencil build && cd ../dropi-ui-react && npm run build",
37
37
  "start": "stencil build --dev --watch --serve",
38
38
  "test": "stencil-test",
39
39
  "test:watch": "stencil-test --watch",
package/readme.md CHANGED
@@ -1,107 +1,483 @@
1
- [![Built With Stencil](https://img.shields.io/badge/-Built%20With%20Stencil-16161d.svg?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MTIgNTEyOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI%2BCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI%2BCgkuc3Qwe2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU%2BCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MjQuNywzNzMuOWMwLDM3LjYtNTUuMSw2OC42LTkyLjcsNjguNkgxODAuNGMtMzcuOSwwLTkyLjctMzAuNy05Mi43LTY4LjZ2LTMuNmgzMzYuOVYzNzMuOXoiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTQyNC43LDI5Mi4xSDE4MC40Yy0zNy42LDAtOTIuNy0zMS05Mi43LTY4LjZ2LTMuNkgzMzJjMzcuNiwwLDkyLjcsMzEsOTIuNyw2OC42VjI5Mi4xeiIvPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDI0LjcsMTQxLjdIODcuN3YtMy42YzAtMzcuNiw1NC44LTY4LjYsOTIuNy02OC42SDMzMmMzNy45LDAsOTIuNywzMC43LDkyLjcsNjguNlYxNDEuN3oiLz4KPC9zdmc%2BCg%3D%3D&colorA=16161d&style=flat-square)](https://stenciljs.com)
1
+ # @dropi/ui
2
2
 
3
- # Stencil Component Starter
3
+ Librería de Web Components del Design System de Dropi, construida con **Stencil.js v4**.
4
+ Genera componentes reutilizables para Angular, React y Vue desde una única base de código.
4
5
 
5
- > This is a starter project for building a standalone Web Components using Stencil.
6
+ - **Paquete npm:** `@dropi/ui` (v0.1.0)
7
+ - **React wrappers:** `@dropi/ui-react`
6
8
 
7
- Stencil is a compiler for building fast web apps using Web Components.
9
+ ---
8
10
 
9
- Stencil combines the best concepts of the most popular frontend frameworks into a compile-time rather than runtime tool. Stencil takes TypeScript, JSX, a tiny virtual DOM layer, efficient one-way data binding, an asynchronous rendering pipeline (similar to React Fiber), and lazy-loading out of the box, and generates 100% standards-based Web Components that run in any browser supporting the Custom Elements specification.
11
+ ## Instalación
10
12
 
11
- Stencil components are just Web Components, so they work in any major framework or with no framework at all.
13
+ ```bash
14
+ npm install @dropi/ui
15
+ ```
12
16
 
13
- ## Getting Started
17
+ ---
14
18
 
15
- To start building a new web component using Stencil, clone this repo to a new directory:
19
+ ## Setup
16
20
 
17
- ```bash
18
- git clone https://github.com/stenciljs/component-starter.git my-component
19
- cd my-component
20
- git remote rm origin
21
+ ### React (`main.tsx`)
22
+
23
+ ```typescript
24
+ import { defineCustomElements } from '@dropi/ui/loader'
25
+ import '@dropi/ui/dist/dropi-ui/dropi-ui.css'
26
+
27
+ defineCustomElements()
21
28
  ```
22
29
 
23
- and run:
30
+ ### Angular (`main.ts`)
24
31
 
25
- ```bash
26
- npm install
27
- npm start
32
+ ```typescript
33
+ import { defineCustomElements } from '@dropi/ui/loader'
34
+ import '@dropi/ui/dist/dropi-ui/dropi-ui.css'
35
+
36
+ defineCustomElements()
37
+ bootstrapApplication(AppComponent, appConfig)
28
38
  ```
29
39
 
30
- To build the component for production, run:
40
+ En módulos o componentes Angular que usen tags `<dropi-*>`, agregar el schema:
31
41
 
32
- ```bash
33
- npm run build
42
+ ```typescript
43
+ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
44
+
45
+ @NgModule({ schemas: [CUSTOM_ELEMENTS_SCHEMA] })
46
+ // o en standalone:
47
+ @Component({ schemas: [CUSTOM_ELEMENTS_SCHEMA] })
34
48
  ```
35
49
 
36
- To run the unit tests for the components, run:
50
+ ### Assets (íconos)
37
51
 
38
- ```bash
39
- npm test
52
+ El componente `<dropi-icon>` requiere el sprite en `/assets/icons/symbol/svg/sprite.css.svg`.
53
+
54
+ **Angular** — en `angular.json`:
55
+ ```json
56
+ "assets": [
57
+ { "glob": "sprite.css.svg", "input": "node_modules/@dropi/ui/dist/dropi-ui/assets/icons/symbol/svg/", "output": "assets/icons/symbol/svg/" }
58
+ ]
40
59
  ```
41
60
 
42
- Need help? Check out our docs [here](https://stenciljs.com/docs/my-first-component).
61
+ **React/Vite** copiar a `public/assets/icons/symbol/svg/`.
43
62
 
44
- ## Naming Components
63
+ ---
45
64
 
46
- When creating new component tags, we recommend _not_ using `stencil` in the component name (ex: `<stencil-datepicker>`). This is because the generated component has little to nothing to do with Stencil; it's just a web component!
65
+ ## Nota importante sobre eventos
47
66
 
48
- Instead, use a prefix that fits your company or any name for a group of related components. For example, all of the [Ionic-generated](https://ionicframework.com/) web components use the prefix `ion`.
67
+ Todos los eventos son `CustomEvent`. El valor emitido **siempre viene en `e.detail`**, no en `e` directamente.
49
68
 
50
- ## Using this component
69
+ ```typescript
70
+ // ❌ Incorrecto — e es el CustomEvent completo
71
+ onDropiChange={(e) => console.log(e)}
51
72
 
52
- There are two strategies we recommend for using web components built with Stencil.
73
+ // Correcto
74
+ onDropiChange={(e) => console.log(e.detail)}
75
+ ```
53
76
 
54
- The first step for all two of these strategies is to [publish to NPM](https://docs.npmjs.com/getting-started/publishing-npm-packages).
77
+ ---
55
78
 
56
- You can read more about these different approaches in the [Stencil docs](https://stenciljs.com/docs/publishing).
79
+ ## Componentes
57
80
 
58
- ### Lazy Loading
81
+ ---
59
82
 
60
- If your Stencil project is built with the [`dist`](https://stenciljs.com/docs/distribution) output target, you can import a small bootstrap script that registers all components and allows you to load individual component scripts lazily.
83
+ ### `<dropi-button>`
61
84
 
62
- For example, given your Stencil project namespace is called `my-design-system`, to use `my-component` on any website, inject this into your HTML:
85
+ Botón de acción principal con múltiples variantes de tipo, apariencia, tamaño y estado.
63
86
 
87
+ **Props**
88
+
89
+ | Prop | Tipo | Default | Descripción |
90
+ |---|---|---|---|
91
+ | `type` | `'legacy' \| 'default' \| 'success' \| 'info' \| 'error' \| 'warning' \| 'dropdown'` | `'default'` | Paleta de color |
92
+ | `severity` | `'primary' \| 'secondary' \| 'tertiary'` | `'primary'` | Relleno: filled / outlined / ghost |
93
+ | `size` | `'large' \| 'normal' \| 'small'` | `'normal'` | Tamaño |
94
+ | `state` | `'default' \| 'disabled' \| 'loading'` | `'default'` | Estado |
95
+ | `text` | `string` | `''` | Texto del label |
96
+ | `preIcon` | `string` | `''` | Ícono antes del texto |
97
+ | `postIcon` | `string` | `''` | Ícono después del texto |
98
+
99
+ **Eventos**
100
+
101
+ | Evento | `e.detail` | Cuándo |
102
+ |---|---|---|
103
+ | `dropiClick` | `MouseEvent` | Al hacer click (no se emite si `state` es `disabled` o `loading`) |
104
+
105
+ **Ejemplo React**
106
+ ```tsx
107
+ <DropiButton
108
+ text="Guardar"
109
+ severity="primary"
110
+ size="normal"
111
+ onDropiClick={(e) => console.log(e.detail)}
112
+ />
113
+ ```
114
+
115
+ **Ejemplo Angular**
64
116
  ```html
65
- <script type="module" src="https://unpkg.com/my-design-system"></script>
66
- <!--
67
- To avoid unpkg.com redirects to the actual file, you can also directly import:
68
- https://unpkg.com/foobar-design-system@0.0.1/dist/foobar-design-system/foobar-design-system.esm.js
69
- -->
70
- <my-component first="Stencil" middle="'Don't call me a framework'" last="JS"></my-component>
117
+ <dropi-button text="Guardar" severity="primary" (dropiClick)="onSave($event)"></dropi-button>
71
118
  ```
72
119
 
73
- This will only load the necessary scripts needed to render `<my-component />`. Once more components of this package are used, they will automatically be loaded lazily.
120
+ ---
121
+
122
+ ### `<dropi-checkbox>`
123
+
124
+ Checkbox estilizado con soporte para formularios nativos.
125
+
126
+ **Props**
127
+
128
+ | Prop | Tipo | Default | Descripción |
129
+ |---|---|---|---|
130
+ | `checked` | `boolean` | `false` | Estado del checkbox |
131
+ | `disabled` | `boolean` | `false` | Deshabilita el checkbox |
74
132
 
75
- You can also import the script as part of your `node_modules` in your applications entry file:
133
+ **Eventos**
76
134
 
135
+ | Evento | `e.detail` | Cuándo |
136
+ |---|---|---|
137
+ | `dropiChange` | `boolean` | Al cambiar el estado (`true` = marcado, `false` = desmarcado) |
138
+
139
+ > `e.detail` es el boolean directamente. Si ves "el objeto completo" es porque estás leyendo `e` en vez de `e.detail`.
140
+
141
+ **Ejemplo React**
77
142
  ```tsx
78
- import 'foobar-design-system/dist/foobar-design-system/foobar-design-system.esm.js';
143
+ const [checked, setChecked] = useState(false)
144
+
145
+ <DropiCheckbox
146
+ checked={checked}
147
+ onDropiChange={(e) => setChecked(e.detail)}
148
+ />
149
+ ```
150
+
151
+ **Ejemplo Angular**
152
+ ```html
153
+ <dropi-checkbox [checked]="checked" (dropiChange)="checked = $event.detail"></dropi-checkbox>
79
154
  ```
80
155
 
81
- Check out this [Live Demo](https://stackblitz.com/edit/vitejs-vite-y6v26a?file=src%2Fmain.tsx).
156
+ ---
157
+
158
+ ### `<dropi-switch>`
159
+
160
+ Toggle switch on/off.
161
+
162
+ **Props**
163
+
164
+ | Prop | Tipo | Default | Descripción |
165
+ |---|---|---|---|
166
+ | `isChecked` | `boolean` | `false` | Estado del switch |
167
+ | `disabled` | `boolean` | `false` | Deshabilita el switch |
168
+
169
+ **Eventos**
82
170
 
83
- ### Standalone
171
+ | Evento | `e.detail` | Cuándo |
172
+ |---|---|---|
173
+ | `dropiChange` | `boolean` | Al togglear (`true` = encendido, `false` = apagado) |
84
174
 
85
- If you are using a Stencil component library with `dist-custom-elements`, we recommend importing Stencil components individually in those files where they are needed.
175
+ **Ejemplo React**
176
+ ```tsx
177
+ const [on, setOn] = useState(false)
86
178
 
87
- To export Stencil components as standalone components make sure you have the [`dist-custom-elements`](https://stenciljs.com/docs/custom-elements) output target defined in your `stencil.config.ts`.
179
+ <DropiSwitch isChecked={on} onDropiChange={(e) => setOn(e.detail)} />
180
+ ```
88
181
 
89
- For example, given you'd like to use `<my-component />` as part of a React component, you can import the component directly via:
182
+ ---
183
+
184
+ ### `<dropi-input>`
185
+
186
+ Campo de texto con label flotante, validación, ícono, toggle de contraseña, formato monetario y asociación nativa a formularios.
187
+
188
+ **Props**
189
+
190
+ | Prop | Tipo | Default | Descripción |
191
+ |---|---|---|---|
192
+ | `value` | `string` | `''` | Valor controlado |
193
+ | `label` | `string` | `''` | Label flotante o fija |
194
+ | `placeholder` | `string` | `' '` | Placeholder |
195
+ | `name` | `string` | `''` | Nombre para formularios nativos |
196
+ | `inputId` | `string` | `''` | ID del input (default: valor del label) |
197
+ | `disabled` | `boolean` | `false` | Deshabilita el campo |
198
+ | `required` | `boolean` | `false` | Marca como requerido |
199
+ | `showAsterisk` | `boolean` | `true` | Muestra asterisco cuando `required` |
200
+ | `fixedLabel` | `boolean` | `false` | Label fija arriba en vez de flotante |
201
+ | `inputMode` | `'text' \| 'numeric' \| 'decimal' \| 'tel' \| 'email' \| 'url' \| 'search'` | `'text'` | Teclado en móvil |
202
+ | `maxlength` | `number` | — | Longitud máxima |
203
+ | `invalid` | `boolean` | `false` | Marca el campo como inválido |
204
+ | `helperText` | `string` | `''` | Texto de ayuda o error debajo |
205
+ | `showHelperOnlyOnError` | `boolean` | `false` | Solo muestra helperText cuando inválido |
206
+ | `passwordInput` | `boolean` | `false` | Modo contraseña con toggle ojo |
207
+ | `moneyFormat` | `boolean` | `false` | Formato `$1,000,000` |
208
+ | `thousandSeparator` | `boolean` | `false` | Formato `1,000,000` sin símbolo |
209
+ | `onlyNumbers` | `boolean` | `false` | Solo permite números |
210
+ | `allowDecimals` | `boolean` | `false` | Permite decimales (con `onlyNumbers`) |
211
+ | `onlyLetters` | `boolean` | `false` | Solo permite letras |
212
+ | `icon` | `string` | `''` | Nombre del ícono (visible solo si hay valor) |
213
+ | `iconColor` | `string` | `'Gray-Gray-400'` | Token de color del ícono |
214
+
215
+ **Eventos**
216
+
217
+ | Evento | `e.detail` | Cuándo |
218
+ |---|---|---|
219
+ | `dropiInput` | `string` | En cada tecla (keystroke) |
220
+ | `dropiChange` | `string` | Al perder el foco (blur) |
221
+ | `dropiFocus` | `void` | Al enfocar el campo |
222
+ | `dropiBlur` | `void` | Al desenfocar el campo |
223
+
224
+ **Ejemplo React**
225
+ ```tsx
226
+ const [value, setValue] = useState('')
227
+
228
+ <DropiInput
229
+ label="Nombre"
230
+ value={value}
231
+ onDropiInput={(e) => setValue(e.detail)}
232
+ onDropiChange={(e) => console.log('blur:', e.detail)}
233
+ required
234
+ invalid={value.length < 3}
235
+ helperText="Mínimo 3 caracteres"
236
+ />
237
+ ```
90
238
 
239
+ ---
240
+
241
+ ### `<dropi-text-area>`
242
+
243
+ Área de texto multi-línea con label, contador de caracteres, validación y asociación nativa a formularios.
244
+
245
+ **Props**
246
+
247
+ | Prop | Tipo | Default | Descripción |
248
+ |---|---|---|---|
249
+ | `value` | `string` | `''` | Valor controlado |
250
+ | `label` | `string` | `''` | Label superior |
251
+ | `placeholder` | `string` | `''` | Placeholder |
252
+ | `name` | `string` | `''` | Nombre para formularios nativos |
253
+ | `inputId` | `string` | `''` | ID del textarea |
254
+ | `rows` | `number` | `4` | Número de filas visibles |
255
+ | `maxlength` | `number` | — | Longitud máxima (muestra contador) |
256
+ | `minlength` | `number` | `0` | Longitud mínima |
257
+ | `resize` | `'none' \| 'both' \| 'horizontal' \| 'vertical'` | `'vertical'` | Comportamiento de resize |
258
+ | `disabled` | `boolean` | `false` | Deshabilita el campo |
259
+ | `required` | `boolean` | `false` | Marca como requerido |
260
+ | `showAsterisk` | `boolean` | `false` | Muestra asterisco cuando `required` |
261
+ | `invalid` | `boolean` | `false` | Marca el campo como inválido |
262
+ | `helperText` | `string` | `''` | Texto de ayuda o error |
263
+
264
+ **Eventos**
265
+
266
+ | Evento | `e.detail` | Cuándo |
267
+ |---|---|---|
268
+ | `dropiInput` | `string` | En cada tecla (keystroke) |
269
+ | `dropiChange` | `string` | Al perder el foco (blur) |
270
+ | `dropiFocus` | `void` | Al enfocar el campo |
271
+ | `dropiBlur` | `void` | Al desenfocar el campo |
272
+
273
+ **Ejemplo React**
91
274
  ```tsx
92
- import 'foobar-design-system/my-component';
93
-
94
- function App() {
95
- return (
96
- <>
97
- <div>
98
- <my-component first="Stencil" middle="'Don't call me a framework'" last="JS"></my-component>
99
- </div>
100
- </>
101
- );
275
+ const [text, setText] = useState('')
276
+
277
+ <DropiTextArea
278
+ label="Descripción"
279
+ value={text}
280
+ maxlength={200}
281
+ rows={5}
282
+ onDropiInput={(e) => setText(e.detail)}
283
+ />
284
+ ```
285
+
286
+ ---
287
+
288
+ ### `<dropi-select>`
289
+
290
+ Select avanzado con búsqueda, multi-selección, opciones agrupadas, flags de países y opciones radio con imagen.
291
+
292
+ **Tipos**
293
+
294
+ ```typescript
295
+ interface SelectOption {
296
+ id: string | number
297
+ label: string
298
+ shortLabel?: string // para showCountryFlags
299
+ secondLabel?: string // subtítulo en radioOptions
300
+ countryCode?: string // código de país para flags
301
+ imageUrl?: string // imagen en radioOptions
302
+ preIcon?: string // ícono izquierdo
303
+ disabled?: boolean
304
+ }
305
+
306
+ interface SelectOptionGroup {
307
+ category: string // título del grupo
308
+ options: SelectOption[]
102
309
  }
310
+ ```
103
311
 
104
- export default App;
312
+ **Props**
313
+
314
+ | Prop | Tipo | Default | Descripción |
315
+ |---|---|---|---|
316
+ | `options` | `SelectOption[] \| SelectOptionGroup[]` | `[]` | Lista de opciones |
317
+ | `label` | `string` | `''` | Label superior |
318
+ | `placeholder` | `string` | `'Seleccionar'` | Texto sin selección |
319
+ | `name` | `string` | `''` | Nombre para formularios nativos |
320
+ | `value` | `SelectOption \| null` | `null` | Opción seleccionada (controlado) |
321
+ | `defaultSelectedId` | `string \| number` | `''` | Pre-seleccionar por id |
322
+ | `disabled` | `boolean` | `false` | Deshabilita el select |
323
+ | `invalid` | `boolean` | `false` | Estado inválido |
324
+ | `errorText` | `string` | `''` | Texto de error |
325
+ | `helperText` | `string` | `''` | Texto de ayuda |
326
+ | `showObligatory` | `boolean` | `false` | Muestra asterisco de obligatorio |
327
+ | `searchEnabled` | `boolean` | `false` | Habilita búsqueda en el dropdown |
328
+ | `multiSelect` | `boolean` | `false` | Permite múltiples selecciones |
329
+ | `dropdownType` | `boolean` | `false` | Trigger sin borde (inline) |
330
+ | `showCountryFlags` | `boolean` | `false` | Muestra flag de país |
331
+ | `radioOptions` | `boolean` | `false` | Opciones estilo radio con imagen |
332
+ | `placeHolderSearch` | `string` | `'Buscar'` | Placeholder del buscador |
333
+ | `preIcon` | `string` | `''` | Ícono antes del label del trigger |
334
+
335
+ **Métodos públicos**
336
+
337
+ | Método | Descripción |
338
+ |---|---|
339
+ | `setById(id)` | Selecciona una opción por su id |
340
+ | `setByLabel(label)` | Selecciona una opción por su label |
341
+ | `clearSelection()` | Limpia la selección actual |
342
+ | `resetMultiSelect()` | Limpia la selección múltiple |
343
+
344
+ **Eventos**
345
+
346
+ | Evento | `e.detail` | Cuándo |
347
+ |---|---|---|
348
+ | `dropiChange` | `SelectOption` (single) o `SelectOption[]` (multi) | Al seleccionar una opción |
349
+ | `dropiClear` | `void` | Al limpiar la selección |
350
+ | `dropiSearch` | `string` | Al escribir en el buscador |
351
+ | `dropiScrollEnd` | `void` | Al llegar al final del scroll (paginación) |
352
+ | `dropiKeyEnter` | `KeyboardEvent` | Al presionar Enter en el buscador |
353
+
354
+ **Ejemplo React**
355
+ ```tsx
356
+ const [selected, setSelected] = useState(null)
357
+
358
+ const options = [
359
+ { id: 1, label: 'Colombia' },
360
+ { id: 2, label: 'México' },
361
+ ]
362
+
363
+ <DropiSelect
364
+ label="País"
365
+ options={options}
366
+ searchEnabled
367
+ onDropiChange={(e) => setSelected(e.detail)}
368
+ />
105
369
  ```
106
370
 
107
- Check out this [Live Demo](https://stackblitz.com/edit/vitejs-vite-b6zuds?file=src%2FApp.tsx).# dropi-ui
371
+ ---
372
+
373
+ ### `<dropi-radio-button>`
374
+
375
+ Radio button estilizado con label y soporte para grupos.
376
+
377
+ **Props**
378
+
379
+ | Prop | Tipo | Default | Descripción |
380
+ |---|---|---|---|
381
+ | `label` | `string` | `''` | Texto del label |
382
+ | `name` | `string` | `'radio'` | Nombre para agrupar radios |
383
+ | `inputId` | `string` | `'radioButton'` | ID del input |
384
+ | `checked` | `boolean` | `false` | Estado seleccionado |
385
+ | `resetTrigger` | `boolean` | `false` | Al poner `true` resetea a desmarcado |
386
+
387
+ **Eventos**
388
+
389
+ | Evento | `e.detail` | Cuándo |
390
+ |---|---|---|
391
+ | `dropiChange` | `Event` (evento nativo) | Al seleccionar el radio |
392
+
393
+ > A diferencia del checkbox, emite el `Event` nativo. Para controlar el estado, maneja la prop `checked` desde el padre.
394
+
395
+ **Ejemplo React**
396
+ ```tsx
397
+ const [selected, setSelected] = useState('a')
398
+
399
+ <DropiRadioButton label="Opción A" name="grupo" inputId="opt-a" checked={selected === 'a'} onDropiChange={() => setSelected('a')} />
400
+ <DropiRadioButton label="Opción B" name="grupo" inputId="opt-b" checked={selected === 'b'} onDropiChange={() => setSelected('b')} />
401
+ ```
402
+
403
+ ---
404
+
405
+ ### `<dropi-badge>`
406
+
407
+ Badge de estado para cuentas o usuarios. Sin eventos.
408
+
409
+ **Props**
410
+
411
+ | Prop | Tipo | Default | Descripción |
412
+ |---|---|---|---|
413
+ | `state` | `'pending' \| 'active' \| 'canceled' \| 'frozen'` | `'pending'` | Estado a mostrar |
414
+
415
+ | State | Texto mostrado |
416
+ |---|---|
417
+ | `pending` | Pendiente |
418
+ | `active` | Activo |
419
+ | `canceled` | Cancelado |
420
+ | `frozen` | Congelado |
421
+
422
+ **Ejemplo React**
423
+ ```tsx
424
+ <DropiBadge state="active" />
425
+ <DropiBadge state="pending" />
426
+ ```
427
+
428
+ ---
429
+
430
+ ### `<dropi-tag>`
431
+
432
+ Tag/chip de color para categorías, estados o etiquetas. Sin eventos.
433
+
434
+ **Props**
435
+
436
+ | Prop | Tipo | Default | Descripción |
437
+ |---|---|---|---|
438
+ | `type` | `'primary' \| 'secondary'` | `'primary'` | `primary` = relleno, `secondary` = suave |
439
+ | `state` | `'default' \| 'success' \| 'info' \| 'warning' \| 'error' \| 'legacy'` | `'default'` | Color del tag |
440
+ | `text` | `string` | `''` | Texto del tag |
441
+ | `showIcon` | `boolean` | `false` | Mostrar ícono |
442
+ | `icon` | `string` | `''` | Nombre del ícono del sprite |
443
+
444
+ **Ejemplo React**
445
+ ```tsx
446
+ <DropiTag text="Activo" state="success" type="primary" />
447
+ <DropiTag text="Pendiente" state="warning" type="secondary" />
448
+ <DropiTag text="Error" state="error" showIcon icon="Warning-circle" />
449
+ ```
450
+
451
+ ---
452
+
453
+ ### `<dropi-icon>`
454
+
455
+ Renderiza íconos SVG desde el sprite de Dropi. Sin eventos.
456
+
457
+ **Props**
458
+
459
+ | Prop | Tipo | Default | Descripción |
460
+ |---|---|---|---|
461
+ | `name` | `string` | `''` | Nombre del ícono en el sprite (ej. `'Home'`, `'Search'`) |
462
+ | `width` | `string` | `'24px'` | Ancho (valor CSS) |
463
+ | `height` | `string` | `'24px'` | Alto (valor CSS) |
464
+ | `color` | `string` | `'currentColor'` | Hex `#ff0000`, token sin `--` (`Primary-Primary-500`), o `currentColor` |
465
+
466
+ > Requiere el sprite en `/assets/icons/symbol/svg/sprite.css.svg` de la app consumidora.
467
+
468
+ **Ejemplo React**
469
+ ```tsx
470
+ <DropiIcon name="Home" width="24px" height="24px" color="Primary-Primary-500" />
471
+ <DropiIcon name="Search" color="#333333" />
472
+ <DropiIcon name="Warning-circle" color="Error-Error-500" />
473
+ ```
474
+
475
+ ---
476
+
477
+ ## Build (desarrollo)
478
+
479
+ ```bash
480
+ npm run build # compilar
481
+ npm run start # dev con watch
482
+ npm test # unit tests
483
+ ```
@@ -163,7 +163,7 @@ if (isVite) {
163
163
  const p = path.join(projectRoot, f);
164
164
  if (!fs.existsSync(p)) continue;
165
165
  const content = fs.readFileSync(p, 'utf8');
166
- if (content.includes('@dropi/ui')) { vitePatchDone = 'ya'; break; }
166
+ if (content.includes('@dropi/ui/loader') && content.includes("exclude")) { vitePatchDone = 'ya'; break; }
167
167
  const patch = `\n optimizeDeps: {\n exclude: ['@dropi/ui/loader', '@dropi/ui'],\n },`;
168
168
  const updated = content.replace(/defineConfig\(\{/, `defineConfig({${patch}`);
169
169
  if (updated !== content) { fs.writeFileSync(p, updated, 'utf8'); vitePatchDone = true; }
@@ -197,7 +197,11 @@ Errores comunes y solución:
197
197
  - Sprite: [ruta destino] ✓
198
198
  - skipLibCheck: true ✓
199
199
 
200
- Prueba rápida:
200
+ Prueba rápida (React):
201
+ import { DropiButton } from '@dropi/ui-react'
202
+ <DropiButton text="Hola Dropi" type="default" severity="primary" size="normal" />
203
+
204
+ Prueba rápida (Angular/Vue):
201
205
  <dropi-button text="Hola Dropi" type="default" severity="primary" size="normal"></dropi-button>
202
206
  ```
203
207
 
@@ -1 +0,0 @@
1
- import{r as e,c as r,h as t}from"./p-DFz-gwFP.js";const i=class{constructor(t){e(this,t),this.dropiChange=r(this,"dropiChange")}label="";name="radio";inputId="radioButton";checked=!1;resetTrigger=!1;dropiChange;onResetTrigger(e){e&&(this.checked=!1)}handleChange(e){this.checked=e.target.checked,this.dropiChange.emit(e)}render(){return t("div",{key:"3b31699bf088bee52465981074c0aea48b6fe112",class:"dropi-radio-button"},t("label",{key:"072d19bd9c88739b849db0e264c65183eaab2132",htmlFor:this.inputId},t("input",{key:"82d1600002e9dc2795cdc5c731997742adc8e2db",id:this.inputId,type:"radio",name:this.name,checked:this.checked,onChange:e=>this.handleChange(e)}),this.label))}static get formAssociated(){return!0}static get watchers(){return{resetTrigger:[{onResetTrigger:0}]}}};i.style=":host{display:inline-block}*,*::before,*::after{box-sizing:border-box}.dropi-radio-button{display:flex;align-items:center;justify-content:flex-start;gap:20px}label{display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--Gray-Gray-700, #32394d);font-size:var(--font-size-s, 12px);font-weight:var(--font-weight-regular, 400);line-height:1.5}input[type='radio']{appearance:none;width:20px;height:20px;border:2px solid var(--Gray-Gray-200, #c3c9d9);border-radius:50%;background-color:transparent;position:relative;cursor:pointer;outline:none;flex-shrink:0;display:flex;justify-content:center;align-items:center}input[type='radio']::before{content:'';position:absolute;top:3px;left:3px;width:10px;height:10px;background-color:var(--Primary-Primary-400, #f7b46f);border-radius:50%;display:none}input[type='radio']:checked{border:2px solid var(--Primary-Primary-500, #f49a3d)}input[type='radio']:checked::before{display:block}";export{i as dropi_radio_button}