@salesql/sql_components_vue3 0.2.0 → 0.3.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.
package/README.md ADDED
@@ -0,0 +1,252 @@
1
+ # @salesql/sql_components_vue3
2
+
3
+ Librería de componentes Vue 3 (TypeScript) para SalesQL.
4
+ Estilos con **SCSS** (variables centralizadas en `colors.scss`).
5
+ Visor de componentes y playground con **Histoire**.
6
+
7
+ ---
8
+
9
+ ## 🚀 Requisitos
10
+
11
+ > ⚠️ **Node:** Vite 7 requiere **Node ≥ 20.19** (recomendado **22.12.0**).
12
+ > Con Node 18 fallará con `crypto.hash is not a function`.
13
+
14
+ | Tool / lib | Versión recomendada |
15
+ | ---------------------- | ---------------------- |
16
+ | **Node** | **22.12.0** (o ≥20.19) |
17
+ | **pnpm** | 10.17.0 |
18
+ | **Vue** | 3.5.22 |
19
+ | **Vite** | 7.1.7 |
20
+ | **@vitejs/plugin-vue** | 6.0.1 |
21
+ | **TypeScript** | 5.9.2 |
22
+ | **vue-tsc** | 2.2.12 |
23
+ | **Histoire** | 1.0.0-alpha.3 |
24
+ | **Sass (dart-sass)** | 1.93.2 |
25
+ | **Changesets** | 2.29.7 |
26
+
27
+ ### Preparación de entorno
28
+
29
+ ```bash
30
+ # Node
31
+ nvm install 22.12.0
32
+ nvm use 22.12.0
33
+ node -v # v22.12.0
34
+
35
+ # Instalar dependencias del monorepo
36
+ pnpm install
37
+
38
+ # (Primera vez con Vite/Histoire)
39
+ pnpm approve-builds # marca @parcel/watcher y confirma
40
+ ```
41
+
42
+ ---
43
+
44
+ ## 📂 Estructura
45
+
46
+ ```
47
+ salesql-components-library-vue3/
48
+ ├─ package.json # raíz del monorepo
49
+ ├─ pnpm-workspace.yaml
50
+ ├─ tsconfig.base.json
51
+ └─ components/ # paquete de la librería
52
+ ├─ package.json
53
+ ├─ tsconfig.json # solo src/*
54
+ ├─ tsconfig.build.json # build de la lib
55
+ ├─ tsconfig.node.json # configs: vite/histoire
56
+ ├─ vite.config.ts
57
+ ├─ histoire.config.ts
58
+ ├─ src/
59
+ │ ├─ index.ts # exporta componentes (+ importa estilos base)
60
+ │ ├─ env.d.ts
61
+ │ ├─ stories.setup.ts
62
+ │ ├─ assets/css/
63
+ │ │ ├─ base.scss
64
+ │ │ ├─ colors.scss
65
+ │ │ └─ spacing.scss
66
+ │ ├─ constants/sql-components.ts
67
+ │ └─ components/
68
+ │ ├─ SqlButton.vue
69
+ │ ├─ SqlButton.story.vue
70
+ │ ├─ SqlSpinner.vue
71
+ │ └─ SqlSpinner.story.vue
72
+ └─ dist/ # salida de build
73
+ ```
74
+
75
+ ---
76
+
77
+ ## 📦 Scripts principales
78
+
79
+ Desde la raíz:
80
+
81
+ ```bash
82
+ pnpm build # build de la librería
83
+ pnpm dev:stories # arranca Histoire
84
+ pnpm typecheck # chequeo estricto de tipos
85
+ pnpm changeset # crear un changeset
86
+ pnpm release:version # aplicar changeset y subir versión
87
+ pnpm release:publish # publicar a npm
88
+ pnpm reset # limpiar node_modules + reinstalar + aprobar builds
89
+ ```
90
+
91
+ ---
92
+
93
+ ## 🔎 Histoire (visualización y testeo)
94
+
95
+ Para arrancar el entorno de historias:
96
+
97
+ ```bash
98
+ pnpm dev:stories
99
+ ```
100
+
101
+ - Abre http://localhost:6006
102
+ - Historias junto al componente, ej: `SqlButton.story.vue`
103
+ - Usa `<Story>` / `<Variant>` / `<Controls>` para mostrar variantes e interactuar
104
+
105
+ ---
106
+
107
+ ## 📥 Uso en apps consumidoras
108
+
109
+ ```bash
110
+ pnpm add @salesql/sql_components_vue3
111
+ ```
112
+
113
+ Ejemplo:
114
+
115
+ ```vue
116
+ <script setup lang="ts">
117
+ import { SqlButton } from '@salesql/sql_components_vue3';
118
+ </script>
119
+
120
+ <template>
121
+ <SqlButton class="sql-button--primary sql-button--large"> Guardar </SqlButton>
122
+ </template>
123
+ ```
124
+
125
+ Los estilos base se importan automáticamente desde la librería (`base.scss`).
126
+
127
+ ---
128
+
129
+ ## 🛠️ Añadir un nuevo componente (Checklist)
130
+
131
+ > Convención de nombres: archivos **PascalCase** (`SqlX.vue`, `SqlX.story.vue`).
132
+
133
+ ### 1. Crear el componente
134
+
135
+ `components/src/components/SqlX.vue`:
136
+
137
+ ```vue
138
+ <script setup lang="ts">
139
+ // lógica/props
140
+ </script>
141
+
142
+ <template>
143
+ <div class="sql-x">
144
+ <slot />
145
+ </div>
146
+ </template>
147
+
148
+ <style lang="scss" scoped>
149
+ @use '../assets/css/colors.scss' as colors;
150
+ @use '../assets/css/spacing.scss' as s;
151
+
152
+ .sql-x {
153
+ color: colors.$primary-main;
154
+ padding: s.spacing(2);
155
+ }
156
+ </style>
157
+ ```
158
+
159
+ ### 2. Crear la historia
160
+
161
+ `components/src/components/SqlX.story.vue`:
162
+
163
+ ```vue
164
+ <script setup lang="ts">
165
+ import SqlX from './SqlX.vue';
166
+ </script>
167
+
168
+ <template>
169
+ <Story title="SqlX/Básico">
170
+ <Variant title="Default">
171
+ <SqlX>Contenido</SqlX>
172
+ </Variant>
173
+ <Variant title="Playground">
174
+ <Controls :data="{ text: { type: 'text', default: 'Hola' } }">
175
+ <template #default="{ state }">
176
+ <SqlX>{{ state.text }}</SqlX>
177
+ </template>
178
+ </Controls>
179
+ </Variant>
180
+ </Story>
181
+ </template>
182
+ ```
183
+
184
+ ### 3. Exportarlo
185
+
186
+ En `components/src/index.ts`:
187
+
188
+ ```ts
189
+ import './assets/css/base.scss';
190
+
191
+ export { default as SqlButton } from './components/SqlButton.vue';
192
+ export { default as SqlSpinner } from './components/SqlSpinner.vue';
193
+ export { default as SqlX } from './components/SqlX.vue';
194
+ ```
195
+
196
+ ### 4. Probar con Histoire
197
+
198
+ ```bash
199
+ pnpm dev:stories
200
+ ```
201
+
202
+ ### 5. Chequear y build
203
+
204
+ ```bash
205
+ pnpm typecheck
206
+ pnpm build
207
+ ```
208
+
209
+ ### 6. Versionado
210
+
211
+ ```bash
212
+ pnpm changeset
213
+ pnpm release:version
214
+ ```
215
+
216
+ ### 7. Publicación
217
+
218
+ ```bash
219
+ pnpm release:publish
220
+ ```
221
+
222
+ ---
223
+
224
+ ## 🔧 Convenciones
225
+
226
+ - **Archivos:** PascalCase para `.vue` y `.story.vue`.
227
+ - **Estilos:** `@use '../assets/css/colors.scss' as colors;`.
228
+ - **Spacing:** `spacing.scss` con `map.get(...)`.
229
+ - **Enums/constantes:**
230
+ ```ts
231
+ export const SQL_SPINNER_SIZES = {
232
+ SMALL: 'small',
233
+ MEDIUM: 'medium',
234
+ LARGE: 'large',
235
+ } as const;
236
+ export type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];
237
+ ```
238
+
239
+ ---
240
+
241
+ ## 🐛 Troubleshooting
242
+
243
+ - **`crypto.hash is not a function` / “Vite requires Node 20.19+ or 22.12+”**
244
+ → Actualiza Node a **22.12.0** y reinstala dependencias.
245
+
246
+ - **VSCode marca “Cannot find module 'vue'”**
247
+ → Asegúrate de que `vue` está en **peerDependencies** y **devDependencies** en `components/package.json`.
248
+ Reinicia TS server.
249
+
250
+ - **pnpm pide aprobar `@parcel/watcher`**
251
+ → `pnpm approve-builds` (marca `@parcel/watcher`).
252
+ Para global: `pnpm approve-builds --global`.
@@ -0,0 +1,2 @@
1
+ export declare const CLICK: "click";
2
+ export type ClickEventName = typeof CLICK;
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("vue"),d={DEFAULT:"default",PRIMARY:"primary"},b={LARGE:"large"},y={BUTTON:"button"},s={LIGHT:"light",DARK:"dark"},S={MEDIUM:"medium"},m=["aria-label","aria-live","aria-hidden"],B={key:0,class:"sr-only"},f=t.defineComponent({__name:"SqlSpinner",props:{type:{type:String,default:s.DARK},size:{type:String,default:S.MEDIUM},label:{type:String,default:""}},setup(e){const n=e,l=t.computed(()=>n.label&&n.label.length>0);return(o,a)=>(t.openBlock(),t.createElementBlock("span",{class:t.normalizeClass(["sql-spinner",[`theme-${e.type}`,`sql-spinner--${e.size}`]]),role:"status","aria-label":l.value?e.label:void 0,"aria-live":l.value?"polite":void 0,"aria-hidden":l.value?void 0:"true"},[a[0]||(a[0]=t.createElementVNode("span",{class:"ring"},null,-1)),l.value?(t.openBlock(),t.createElementBlock("span",B,t.toDisplayString(e.label),1)):t.createCommentVNode("",!0)],10,m))}}),c=(e,n)=>{const l=e.__vccOpts||e;for(const[o,a]of n)l[o]=a;return l},u=c(f,[["__scopeId","data-v-bdd073d8"]]),g="click",v=["type","disabled","autofocus","aria-busy","aria-disabled","aria-pressed"],E={key:1,class:"slotted-content"},T=t.defineComponent({__name:"SqlButton",props:{type:{type:String,default:d.DEFAULT},size:{type:String,default:b.LARGE},nativeType:{type:String,default:y.BUTTON},selected:{type:Boolean,default:null},loading:Boolean,disabled:Boolean,plain:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean},setup(e,{emit:n}){const l=e,o=n,a=t.computed(()=>l.type===d.PRIMARY?s.LIGHT:s.DARK);function r(i){l.disabled||l.loading||o(g,i)}return(i,N)=>(t.openBlock(),t.createElementBlock("button",{class:t.normalizeClass(["sql-button",[e.type?`sql-button--${e.type}`:"",e.size?`sql-button--${e.size}`:"",{"is-disabled":e.disabled,"is-loading":e.loading,"is-circle":e.circle,"is-plain":e.plain,"is-round":e.round,"selectable-button":e.selected!==null,"is-selected":e.selected}]]),type:e.nativeType,disabled:e.disabled||e.loading,autofocus:e.autofocus,"aria-busy":e.loading||void 0,"aria-disabled":e.disabled||e.loading||void 0,"aria-pressed":e.selected!==null?!!e.selected:void 0,onClick:r},[t.createElementVNode("span",{class:t.normalizeClass(["slot-container",{"is-loading":e.loading}])},[e.loading?(t.openBlock(),t.createBlock(u,{key:0,class:"sql-spinner",type:a.value},null,8,["type"])):t.createCommentVNode("",!0),i.$slots.default?(t.openBlock(),t.createElementBlock("div",E,[t.renderSlot(i.$slots,"default",{},void 0,!0)])):t.createCommentVNode("",!0)],2)],10,v))}}),k=c(T,[["__scopeId","data-v-bd5f8a62"]]);exports.sqlButton=k;exports.sqlSpinner=u;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),r={LIGHT:"light",DARK:"dark"},E={SMALL:"small",MEDIUM:"medium",LARGE:"large"},b=["aria-label","aria-live","aria-hidden"],B={key:0,class:"sr-only"},T=e.defineComponent({__name:"SqlSpinner",props:{type:{type:String,default:r.DARK},size:{type:String,default:E.SMALL},label:{type:String,default:""}},setup(t){const s=t,n=e.computed(()=>s.label&&s.label.length>0);return(l,a)=>(e.openBlock(),e.createElementBlock("span",{class:e.normalizeClass(["sql-spinner",[`theme-${t.type}`,`sql-spinner--${t.size}`]]),role:"status","aria-label":n.value?t.label:void 0,"aria-live":n.value?"polite":void 0,"aria-hidden":n.value?void 0:"true"},[a[0]||(a[0]=e.createElementVNode("span",{class:"ring"},null,-1)),n.value?(e.openBlock(),e.createElementBlock("span",B,e.toDisplayString(t.label),1)):e.createCommentVNode("",!0)],10,b))}}),u=(t,s)=>{const n=t.__vccOpts||t;for(const[l,a]of s)n[l]=a;return n},S=u(T,[["__scopeId","data-v-9694500e"]]),c={DEFAULT:"default",PRIMARY:"primary",SECONDARY:"secondary",TERTIARY:"tertiary",SPECIAL:"special",SPECIAL2:"special2",SPECIAL3:"special3",DOTTED:"dotted",DANGER:"danger",GRADIENT:"gradient"},m={SMALL:"small",SMALL_SQUARE:"small-square",SMALL_SQUARE_NO_PADDING:"small-square-no-padding",MEDIUM:"medium",MEDIUM_SQUARE:"medium-square",LARGE:"large",LARGE_SQUARE:"large-square",XLARGE:"xlarge",XLARGE_SQUARE:"xlarge-square"},y={BUTTON:"button",SUBMIT:"submit",RESET:"reset"},g="click",L=["type","disabled","autofocus","aria-busy","aria-disabled","aria-pressed"],k={key:1,class:"slotted-content"},A=e.defineComponent({__name:"SqlButton",props:{type:{type:String,default:c.DEFAULT},size:{type:String,default:m.LARGE},nativeType:{type:String,default:y.BUTTON},selected:{type:Boolean,default:null},loading:Boolean,disabled:Boolean,plain:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean},setup(t,{emit:s}){const n=t,l=s,a=e.computed(()=>n.type===c.PRIMARY||n.type===c.DANGER?r.LIGHT:r.DARK);function o(i){n.disabled||n.loading||l(g,i)}return(i,_)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["sql-button",[t.type?`sql-button--${t.type}`:"",t.size?`sql-button--${t.size}`:"",{"is-disabled":t.disabled,"is-loading":t.loading,"is-circle":t.circle,"is-plain":t.plain,"is-round":t.round,"selectable-button":t.selected!==null,"is-selected":t.selected}]]),type:t.nativeType,disabled:t.disabled||t.loading,autofocus:t.autofocus,"aria-busy":t.loading||void 0,"aria-disabled":t.disabled||t.loading||void 0,"aria-pressed":t.selected!==null?!!t.selected:void 0,onClick:o},[e.createElementVNode("span",{class:e.normalizeClass(["slot-container",{"is-loading":t.loading}])},[t.loading?(e.openBlock(),e.createBlock(e.unref(S),{key:0,class:"sql-spinner",type:a.value},null,8,["type"])):e.createCommentVNode("",!0),i.$slots.default?(e.openBlock(),e.createElementBlock("div",k,[e.renderSlot(i.$slots,"default",{},void 0,!0)])):e.createCommentVNode("",!0)],2)],10,L))}}),N=u(A,[["__scopeId","data-v-9eeb1a72"]]),d={LEFT:"left",CENTER:"center",RIGHT:"right"},p={class:"basic-table"},I={class:"basic-table__wrapper"},f={class:"basic-table__table"},R={key:0},v=["colspan"],h=e.defineComponent({__name:"BasicTable",props:{columns:{type:Array,required:!0},rows:{type:Array,required:!0},emptyMessage:{type:String,default:""}},setup(t){return(s,n)=>(e.openBlock(),e.createElementBlock("div",p,[e.createElementVNode("div",I,[e.createElementVNode("table",f,[e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,l=>{var a;return e.openBlock(),e.createElementBlock("th",{key:l.key,class:e.normalizeClass(`basic-table__th--${(a=l.align)!=null?a:e.unref(d).LEFT}`),style:e.normalizeStyle(l.width?{width:l.width}:void 0)},e.toDisplayString(l.label),7)}),128))])]),e.createElementVNode("tbody",null,[t.rows.length===0?(e.openBlock(),e.createElementBlock("tr",R,[e.createElementVNode("td",{class:"basic-table__empty",colspan:t.columns.length,"data-testid":"basic-table-empty"},[e.renderSlot(s.$slots,"empty",{},()=>[e.createTextVNode(e.toDisplayString(t.emptyMessage),1)],!0)],8,v)])):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.rows,l=>(e.openBlock(),e.createElementBlock("tr",{key:l.id,"data-testid":"basic-table-row"},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,a=>{var o;return e.openBlock(),e.createElementBlock("td",{key:a.key,class:e.normalizeClass(`basic-table__td--${(o=a.align)!=null?o:e.unref(d).LEFT}`)},[e.renderSlot(s.$slots,`cell-${a.key}`,{row:l},()=>[e.createTextVNode(e.toDisplayString(l[a.key]),1)],!0)],2)}),128))]))),128))])])])]))}}),C=u(h,[["__scopeId","data-v-8f713759"]]);exports.BASIC_TABLE_ALIGN=d;exports.BasicTable=C;exports.SQL_BUTTON_NATIVE_TYPES=y;exports.SQL_BUTTON_SIZES=m;exports.SQL_BUTTON_TYPES=c;exports.SQL_SPINNER_SIZES=E;exports.SQL_SPINNER_THEME_MODES=r;exports.SqlButton=N;exports.SqlSpinner=S;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/constants/sql-components.ts","../src/components/SqlSpinner.vue","../src/constants/events.ts","../src/components/SqlButton.vue"],"sourcesContent":["// Tipos de botón (clases: sql-button--<type>)\nexport const SQL_BUTTON_TYPES = {\n DEFAULT: 'default',\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SPECIAL: 'special',\n SPECIAL2: 'special2',\n DOTTED: 'dotted',\n} as const\nexport type SqlButtonType = typeof SQL_BUTTON_TYPES[keyof typeof SQL_BUTTON_TYPES]\n\n// Tamaños de botón (clases: sql-button--<size>)\nexport const SQL_BUTTON_SIZES = {\n SMALL: 'small',\n SMALL_SQUARE: 'small-square',\n SMALL_SQUARE_NO_PADDING: 'small-square-no-padding',\n MEDIUM: 'medium',\n MEDIUM_SQUARE: 'medium-square',\n LARGE: 'large',\n LARGE_SQUARE: 'large-square',\n XLARGE: 'xlarge',\n XLARGE_SQUARE: 'xlarge-square',\n} as const\nexport type SqlButtonSize = typeof SQL_BUTTON_SIZES[keyof typeof SQL_BUTTON_SIZES]\n\n// type nativo del <button>\nexport const SQL_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const\nexport type SqlButtonNativeType = typeof SQL_BUTTON_NATIVE_TYPES[keyof typeof SQL_BUTTON_NATIVE_TYPES]\n\n// Tema del spinner (lo usas en el computed del botón)\nexport const SQL_SPINNER_THEME_MODES = {\n LIGHT: 'light', // para botones oscuros: spinner claro\n DARK: 'dark', // para botones claros: spinner oscuro\n} as const\nexport type SqlSpinnerThemeMode = typeof SQL_SPINNER_THEME_MODES[keyof typeof SQL_SPINNER_THEME_MODES]\n\nexport const SQL_SPINNER_SIZES = {\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n} as const;\n\nexport type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];\n","<script setup lang=\"ts\">\n import { type PropType, computed } from \"vue\";\n import {\n SQL_SPINNER_SIZES,\n SQL_SPINNER_THEME_MODES,\n type SqlSpinnerSize,\n type SqlSpinnerThemeMode,\n } from \"../constants/sql-components\";\n\n const props = defineProps({\n type: {\n type: String as PropType<SqlSpinnerThemeMode>,\n default: SQL_SPINNER_THEME_MODES.DARK,\n },\n size: {\n type: String as PropType<SqlSpinnerSize>,\n default: SQL_SPINNER_SIZES.MEDIUM,\n },\n // Opcional: texto accesible (si no hay, marcamos aria-hidden)\n label: {\n type: String,\n default: \"\",\n },\n });\n\n const hasLabel = computed(() => props.label && props.label.length > 0);\n</script>\n\n<template>\n <span\n class=\"sql-spinner\"\n :class=\"[`theme-${type}`, `sql-spinner--${size}`]\"\n role=\"status\"\n :aria-label=\"hasLabel ? label : undefined\"\n :aria-live=\"hasLabel ? 'polite' : undefined\"\n :aria-hidden=\"hasLabel ? undefined : 'true'\"\n >\n <span class=\"ring\" />\n <span v-if=\"hasLabel\" class=\"sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<style lang=\"scss\" scoped>\n @use \"../assets/css/colors.scss\" as colors;\n\n /* Accesibilidad (solo-lectura visual) */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n @keyframes sql-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .sql-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n /* Tamaños por clase */\n &.sql-spinner--small {\n width: 12px;\n height: 12px;\n }\n &.sql-spinner--medium {\n width: 16px;\n height: 16px;\n }\n &.sql-spinner--large {\n width: 24px;\n height: 24px;\n }\n\n .ring {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border-style: solid;\n border-width: 2px;\n animation: sql-spin 0.8s linear infinite;\n }\n\n /* Temas */\n &.theme-light .ring {\n /* 3 lados visibles, 1 transparente para efecto “spinner” */\n border-color: colors.$white colors.$white colors.$white transparent;\n }\n\n &.theme-dark .ring {\n border-color: colors.$primary-main colors.$primary-main\n colors.$primary-main transparent;\n }\n }\n</style>\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const\nexport type ClickEventName = typeof CLICK\n","<template>\n <button\n class=\"sql-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-pressed=\"selected !== null ? !!selected : undefined\"\n :class=\"[\n type ? `sql-button--${type}` : '',\n size ? `sql-button--${size}` : '',\n {\n 'is-disabled': disabled,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-plain': plain,\n 'is-round': round,\n 'selectable-button': selected !== null,\n 'is-selected': selected,\n },\n ]\"\n @click=\"handleClick\"\n >\n <!-- Siempre renderizamos el contenedor para que el spinner funcione con o sin texto -->\n <span class=\"slot-container\" :class=\"{ 'is-loading': loading }\">\n <!-- Spinner superpuesto cuando loading -->\n <SqlSpinner v-if=\"loading\" class=\"sql-spinner\" :type=\"spinnerType\" />\n\n <!-- Texto/slot (se oculta visualmente cuando loading) -->\n <div v-if=\"$slots.default\" class=\"slotted-content\">\n <slot />\n </div>\n </span>\n </button>\n</template>\n<script setup lang=\"ts\">\n import { computed, type PropType } from \"vue\";\n import SqlSpinner from \"@shared/components/SqlSpinner.vue\";\n import {\n SQL_BUTTON_NATIVE_TYPES,\n SQL_BUTTON_SIZES,\n SQL_BUTTON_TYPES,\n SQL_SPINNER_THEME_MODES,\n type SqlButtonNativeType,\n type SqlButtonSize,\n type SqlButtonType,\n } from \"@shared/constants/sql-components\";\n import { CLICK } from \"@shared/constants/events\";\n\n const props = defineProps({\n type: {\n type: String as PropType<SqlButtonType>,\n default: SQL_BUTTON_TYPES.DEFAULT,\n },\n size: {\n type: String as PropType<SqlButtonSize>,\n default: SQL_BUTTON_SIZES.LARGE,\n },\n nativeType: {\n type: String as PropType<SqlButtonNativeType>,\n default: SQL_BUTTON_NATIVE_TYPES.BUTTON,\n },\n selected: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean,\n });\n\n const emit = defineEmits<{\n (e: typeof CLICK, event: MouseEvent): void;\n }>();\n\n const spinnerType = computed(() =>\n props.type === SQL_BUTTON_TYPES.PRIMARY\n ? SQL_SPINNER_THEME_MODES.LIGHT\n : SQL_SPINNER_THEME_MODES.DARK\n );\n\n function handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return; // guard\n emit(CLICK, event);\n }\n</script>\n\n<style lang=\"scss\" scoped>\n @use \"../assets/css/colors.scss\" as colors;\n @use \"../assets/css/spacing.scss\" as s;\n\n /* keyframes a nivel raíz */\n @keyframes rotating {\n 0% {\n transform: rotateZ(360deg);\n }\n 100% {\n transform: rotateZ(0deg);\n }\n }\n\n $default-background: colors.$white;\n\n .sql-button {\n padding: 0;\n\n color: colors.$primary-main;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n\n border-width: 0;\n border-radius: 4px;\n outline: none;\n\n cursor: pointer;\n transition: background 0.2s, color 0.2s, border-color 0.2s;\n\n &:active,\n &:hover {\n outline: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n }\n\n &.is-circle {\n padding: s.spacing(1);\n border-radius: 50%;\n }\n\n .slot-container {\n position: relative;\n\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .slotted-content {\n display: inline-flex;\n align-items: center;\n }\n\n &.is-loading {\n .slotted-content {\n visibility: hidden;\n } /* el contenido sigue en el flujo para no cambiar ancho/alto */\n }\n\n .sql-spinner {\n position: absolute;\n inset: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 1em;\n height: 1em;\n margin: auto;\n\n pointer-events: none;\n }\n }\n\n /* Types */\n &.sql-button--default {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.sql-button--primary {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n\n &:hover {\n background-color: colors.$primary-accent-shadow;\n }\n &.is-disabled {\n background-color: colors.$primary-accent-mid;\n }\n }\n\n &.sql-button--secondary {\n color: colors.$primary-main;\n background-color: colors.$secondary-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &.is-disabled {\n color: colors.$primary-secondary-text;\n background-color: colors.$primary-tint;\n }\n }\n\n &.sql-button--tertiary {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &:active {\n color: $default-background;\n background-color: colors.$primary-secondary-text;\n }\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n &:active {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.selectable-button {\n &:active {\n color: colors.$primary-accent-main !important;\n background: colors.$primary-accent-background !important;\n }\n\n &.is-selected {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-main;\n background: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-mid;\n background-color: $default-background;\n\n &:hover {\n border: 1px solid colors.$primary-accent-main;\n }\n &:active {\n border: 1px solid colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n\n &:active {\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n }\n }\n }\n\n &.sql-button--special2 {\n color: colors.$primary-accent-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-accent-background;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--dotted {\n color: colors.$primary-mid;\n font-weight: bold;\n\n border: 1px dashed colors.$primary-mid;\n border-radius: s.spacing(3);\n\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$primary-accent-main;\n border: 1px dashed colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n }\n\n /* Sizes */\n &.sql-button--small {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n\n .slot-container {\n padding: 0 s.spacing(1);\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n\n .sql-spinner .spinner {\n height: s.spacing(2);\n }\n }\n\n &.sql-button--small-square {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 4px;\n }\n }\n\n &.sql-button--small-square-no-padding {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 0;\n }\n }\n\n &.sql-button--medium {\n height: s.spacing(4);\n\n .slot-container {\n padding: 0 12px;\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n }\n\n &.sql-button--medium-square {\n height: s.spacing(4);\n .slot-container {\n padding: 6px;\n }\n }\n\n &.sql-button--large {\n height: 36px;\n\n .slot-container {\n padding: 0 s.spacing(2);\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--large-square {\n height: 36px;\n .slot-container {\n padding: s.spacing(1);\n }\n }\n\n &.sql-button--xlarge {\n height: s.spacing(6);\n\n .slot-container {\n padding: 0 22px;\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--xlarge-square {\n height: s.spacing(6);\n .slot-container {\n padding: s.spacing(2);\n }\n }\n }\n</style>\n"],"names":["SQL_BUTTON_TYPES","SQL_BUTTON_SIZES","SQL_BUTTON_NATIVE_TYPES","SQL_SPINNER_THEME_MODES","SQL_SPINNER_SIZES","props","__props","hasLabel","computed","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_toDisplayString","CLICK","emit","__emit","spinnerType","handleClick","event","_createBlock","SqlSpinner","$slots","_openBlock","_renderSlot","_ctx"],"mappings":"uGACaA,EAAmB,CAC9B,QAAS,UACT,QAAS,SAMX,EAIaC,EAAmB,CAM9B,MAAO,OAIT,EAIaC,EAA0B,CACrC,OAAQ,QAGV,EAIaC,EAA0B,CACrC,MAAO,QACP,KAAM,MACR,EAGaC,EAAoB,CAE/B,OAAQ,QAEV,sOCpCE,MAAMC,EAAQC,EAgBRC,EAAWC,EAAAA,SAAS,IAAMH,EAAM,OAASA,EAAM,MAAM,OAAS,CAAC,8BAIrEI,EAAAA,mBAUO,OAAA,CATL,MAAKC,EAAAA,eAAA,CAAC,cAAa,CAAA,SACDJ,EAAA,IAAI,mBAAoBA,EAAA,IAAI,EAAA,CAAA,CAAA,EAC9C,KAAK,SACJ,aAAYC,EAAA,MAAWD,EAAA,MAAQ,OAC/B,YAAWC,EAAA,MAAQ,SAAc,OACjC,cAAaA,EAAA,MAAW,OAAS,MAAA,eAElCI,EAAAA,mBAAqB,OAAA,CAAf,MAAM,MAAA,EAAM,KAAA,EAAA,GACNJ,EAAA,qBAAZE,EAAAA,mBAAwD,OAAxDG,EAAwDC,EAAAA,gBAAfP,EAAA,KAAK,EAAA,CAAA,wJCrCrCQ,EAAQ,8aCiDnB,MAAMT,EAAQC,EAyBRS,EAAOC,EAIPC,EAAcT,EAAAA,SAAS,IAC3BH,EAAM,OAASL,EAAiB,QAC5BG,EAAwB,MACxBA,EAAwB,IAAA,EAG9B,SAASe,EAAYC,EAAmB,CAClCd,EAAM,UAAYA,EAAM,SAC5BU,EAAKD,EAAOK,CAAK,CACnB,6BAvFAV,EAAAA,mBAiCS,SAAA,CAhCP,wBAAM,aAAY,CAOFH,EAAA,oBAAsBA,EAAA,IAAI,GAAA,GAAeA,EAAA,oBAAsBA,EAAA,IAAI,GAAA,kBAAwCA,EAAA,sBAAgCA,EAAA,oBAA8BA,EAAA,kBAA4BA,EAAA,iBAA2BA,EAAA,0BAAoCA,EAAA,WAAQ,mBAAkCA,EAAA,QAAA,KAN7T,KAAMA,EAAA,WACN,SAAUA,EAAA,UAAYA,EAAA,QACtB,UAAWA,EAAA,UACX,YAAWA,EAAA,SAAW,OACtB,gBAAeA,EAAA,UAAYA,EAAA,SAAW,OACtC,eAAcA,EAAA,WAAQ,KAAA,CAAA,CAAcA,EAAA,SAAW,OAc/C,QAAOY,CAAA,GAGRP,EAAAA,mBAQO,OAAA,CARD,MAAKD,EAAAA,eAAA,CAAC,iBAAgB,CAAA,aAAyBJ,EAAA,QAAO,CAAA,CAAA,GAExCA,EAAA,uBAAlBc,EAAAA,YAAqEC,EAAA,OAA1C,MAAM,cAAe,KAAMJ,EAAA,KAAA,gDAG3CK,EAAAA,OAAO,SAAlBC,EAAAA,YAAAd,EAAAA,mBAEM,MAFNG,EAEM,CADJY,EAAAA,WAAQC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/ui/SqlSpinner/SqlSpinner.types.ts","../src/ui/SqlSpinner/SqlSpinner.vue","../src/ui/SqlButton/SqlButton.types.ts","../src/constants/events.ts","../src/ui/SqlButton/SqlButton.vue","../src/ui/BasicTable/BasicTable.types.ts","../src/ui/BasicTable/BasicTable.vue"],"sourcesContent":["// Tema del spinner (clases: theme-<mode>)\nexport const SQL_SPINNER_THEME_MODES = {\n LIGHT: 'light', // para fondos oscuros: spinner claro\n DARK: 'dark', // para fondos claros: spinner oscuro\n} as const;\nexport type SqlSpinnerThemeMode =\n (typeof SQL_SPINNER_THEME_MODES)[keyof typeof SQL_SPINNER_THEME_MODES];\n\n// Tamaños (clases: sql-spinner--<size>)\nexport const SQL_SPINNER_SIZES = {\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n} as const;\nexport type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];\n","<script setup lang=\"ts\">\nimport { type PropType, computed } from 'vue';\nimport {\n SQL_SPINNER_SIZES,\n SQL_SPINNER_THEME_MODES,\n type SqlSpinnerSize,\n type SqlSpinnerThemeMode,\n} from './SqlSpinner.types';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlSpinnerThemeMode>,\n default: SQL_SPINNER_THEME_MODES.DARK,\n },\n size: {\n type: String as PropType<SqlSpinnerSize>,\n default: SQL_SPINNER_SIZES.SMALL,\n },\n // Opcional: texto accesible (si no hay, marcamos aria-hidden)\n label: {\n type: String,\n default: '',\n },\n});\n\nconst hasLabel = computed(() => props.label && props.label.length > 0);\n</script>\n\n<template>\n <span\n class=\"sql-spinner\"\n :class=\"[`theme-${type}`, `sql-spinner--${size}`]\"\n role=\"status\"\n :aria-label=\"hasLabel ? label : undefined\"\n :aria-live=\"hasLabel ? 'polite' : undefined\"\n :aria-hidden=\"hasLabel ? undefined : 'true'\"\n >\n <span class=\"ring\" />\n <span v-if=\"hasLabel\" class=\"sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n\n/* Accesibilidad (solo-lectura visual) */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n@keyframes sql-spin {\n to {\n transform: rotate(1turn);\n }\n}\n\n.sql-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n /* color del anillo por tema (paridad con los PNG de frontend-app) */\n --sql-spinner-color: #{colors.$primary-accent-main};\n\n /* Tamaños (paridad con frontend-app: small=20, medium=36, large=64) */\n &.sql-spinner--small {\n width: 20px;\n height: 20px;\n }\n &.sql-spinner--medium {\n width: 36px;\n height: 36px;\n }\n &.sql-spinner--large {\n width: 64px;\n height: 64px;\n }\n\n .ring {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n\n /* Anillo con gradiente cónico transparente → color (arco que se desvanece) */\n background: conic-gradient(from 90deg, transparent 8%, var(--sql-spinner-color) 100%);\n\n /* Recorta el centro para dejar solo el anillo (grosor ~16% del radio ≈ 8% del diámetro,\n medido sobre los PNG de frontend-app) */\n mask: radial-gradient(farthest-side, transparent calc(100% - 16%), #000 calc(100% - 16%));\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-mask: radial-gradient(\n farthest-side,\n transparent calc(100% - 16%),\n #000 calc(100% - 16%)\n );\n\n animation: sql-spin 1s linear infinite;\n }\n\n /* Temas */\n &.theme-dark {\n --sql-spinner-color: #{colors.$primary-accent-main};\n }\n &.theme-light {\n --sql-spinner-color: #{colors.$white};\n }\n}\n</style>\n","// Tipos de botón (clases: sql-button--<type>)\nexport const SQL_BUTTON_TYPES = {\n DEFAULT: 'default',\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SPECIAL: 'special',\n SPECIAL2: 'special2',\n SPECIAL3: 'special3',\n DOTTED: 'dotted',\n DANGER: 'danger',\n GRADIENT: 'gradient',\n} as const;\nexport type SqlButtonType = (typeof SQL_BUTTON_TYPES)[keyof typeof SQL_BUTTON_TYPES];\n\n// Tamaños de botón (clases: sql-button--<size>)\nexport const SQL_BUTTON_SIZES = {\n SMALL: 'small',\n SMALL_SQUARE: 'small-square',\n SMALL_SQUARE_NO_PADDING: 'small-square-no-padding',\n MEDIUM: 'medium',\n MEDIUM_SQUARE: 'medium-square',\n LARGE: 'large',\n LARGE_SQUARE: 'large-square',\n XLARGE: 'xlarge',\n XLARGE_SQUARE: 'xlarge-square',\n} as const;\nexport type SqlButtonSize = (typeof SQL_BUTTON_SIZES)[keyof typeof SQL_BUTTON_SIZES];\n\n// type nativo del <button>\nexport const SQL_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const;\nexport type SqlButtonNativeType =\n (typeof SQL_BUTTON_NATIVE_TYPES)[keyof typeof SQL_BUTTON_NATIVE_TYPES];\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const;\nexport type ClickEventName = typeof CLICK;\n","<template>\n <button\n class=\"sql-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-pressed=\"selected !== null ? !!selected : undefined\"\n :class=\"[\n type ? `sql-button--${type}` : '',\n size ? `sql-button--${size}` : '',\n {\n 'is-disabled': disabled,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-plain': plain,\n 'is-round': round,\n 'selectable-button': selected !== null,\n 'is-selected': selected,\n },\n ]\"\n @click=\"handleClick\"\n >\n <!-- Siempre renderizamos el contenedor para que el spinner funcione con o sin texto -->\n <span class=\"slot-container\" :class=\"{ 'is-loading': loading }\">\n <!-- Spinner superpuesto cuando loading -->\n <SqlSpinner v-if=\"loading\" class=\"sql-spinner\" :type=\"spinnerType\" />\n\n <!-- Texto/slot (se oculta visualmente cuando loading) -->\n <div v-if=\"$slots.default\" class=\"slotted-content\">\n <slot />\n </div>\n </span>\n </button>\n</template>\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { SqlSpinner, SQL_SPINNER_THEME_MODES } from '@shared/ui/SqlSpinner';\nimport {\n SQL_BUTTON_NATIVE_TYPES,\n SQL_BUTTON_SIZES,\n SQL_BUTTON_TYPES,\n type SqlButtonNativeType,\n type SqlButtonSize,\n type SqlButtonType,\n} from './SqlButton.types';\nimport { CLICK } from '@shared/constants/events';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlButtonType>,\n default: SQL_BUTTON_TYPES.DEFAULT,\n },\n size: {\n type: String as PropType<SqlButtonSize>,\n default: SQL_BUTTON_SIZES.LARGE,\n },\n nativeType: {\n type: String as PropType<SqlButtonNativeType>,\n default: SQL_BUTTON_NATIVE_TYPES.BUTTON,\n },\n selected: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean,\n});\n\nconst emit = defineEmits<{\n (e: typeof CLICK, event: MouseEvent): void;\n}>();\n\nconst spinnerType = computed(() =>\n props.type === SQL_BUTTON_TYPES.PRIMARY || props.type === SQL_BUTTON_TYPES.DANGER\n ? SQL_SPINNER_THEME_MODES.LIGHT\n : SQL_SPINNER_THEME_MODES.DARK\n);\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return; // guard\n emit(CLICK, event);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n\n/* keyframes a nivel raíz */\n@keyframes rotating {\n 0% {\n transform: rotateZ(360deg);\n }\n 100% {\n transform: rotateZ(0deg);\n }\n}\n\n$default-background: colors.$white;\n\n.sql-button {\n padding: 0;\n\n color: colors.$primary-main;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n\n border-width: 0;\n border-radius: 4px;\n outline: none;\n\n cursor: pointer;\n transition:\n background 0.2s,\n color 0.2s,\n border-color 0.2s;\n\n &:active,\n &:hover {\n outline: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n }\n\n &.is-circle {\n padding: s.spacing(1);\n border-radius: 50%;\n }\n\n .slot-container {\n position: relative;\n\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .slotted-content {\n display: inline-flex;\n align-items: center;\n\n white-space: nowrap;\n }\n\n &.is-loading {\n .slotted-content {\n visibility: hidden;\n } /* el contenido sigue en el flujo para no cambiar ancho/alto */\n }\n\n .sql-spinner {\n position: absolute;\n inset: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 1em;\n height: 1em;\n margin: auto;\n\n pointer-events: none;\n }\n }\n\n /* Types */\n &.sql-button--default {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.sql-button--primary {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n\n &:hover {\n background-color: colors.$primary-accent-shadow;\n }\n &.is-disabled {\n background-color: colors.$primary-accent-mid;\n }\n }\n\n &.sql-button--secondary {\n color: colors.$primary-main;\n background-color: colors.$secondary-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &.is-disabled {\n color: colors.$primary-secondary-text;\n background-color: colors.$primary-tint;\n }\n }\n\n &.sql-button--tertiary {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &:active {\n color: $default-background;\n background-color: colors.$primary-secondary-text;\n }\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n &:active {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.selectable-button {\n &:active {\n color: colors.$primary-accent-main !important;\n background: colors.$primary-accent-background !important;\n }\n\n &.is-selected {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-main;\n background: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-mid;\n background-color: $default-background;\n\n &:hover {\n border: 1px solid colors.$primary-accent-main;\n }\n &:active {\n border: 1px solid colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n\n &:active {\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n }\n }\n }\n\n &.sql-button--special2 {\n color: colors.$primary-accent-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-accent-background;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special3 {\n color: colors.$primary-accent-main;\n font-weight: 400;\n\n background-color: colors.$primary-accent-tint;\n\n &:hover {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--dotted {\n color: colors.$primary-mid;\n font-weight: bold;\n\n border: 1px dashed colors.$primary-mid;\n border-radius: s.spacing(3);\n\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$primary-accent-main;\n border: 1px dashed colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n }\n\n &.sql-button--danger {\n color: colors.$tertiary-accent-main !important;\n\n background-color: colors.$tertiary-accent-tint;\n\n &:hover {\n background-color: colors.$tertiary-accent-mid;\n }\n &.is-disabled {\n color: colors.$tertiary-accent-mid;\n background-color: colors.$tertiary-accent-tint;\n }\n }\n\n &.sql-button--gradient {\n color: colors.$white !important;\n\n background: linear-gradient(\n 106.21deg,\n colors.$ai-gradient-1 22.52%,\n colors.$ai-gradient-2 100%\n );\n\n &:hover {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-hover 22.52%,\n colors.$ai-gradient-2 100%\n ) !important;\n }\n &.is-disabled {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-disabled 22.52%,\n colors.$ai-gradient-2 100%\n );\n }\n }\n\n /* Sizes */\n &.sql-button--small {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n\n .slot-container {\n padding: 0 s.spacing(1);\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n\n .sql-spinner .spinner {\n height: s.spacing(2);\n }\n }\n\n &.sql-button--small-square {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 4px;\n }\n }\n\n &.sql-button--small-square-no-padding {\n width: s.spacing(3);\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 0;\n }\n }\n\n &.sql-button--medium {\n height: s.spacing(4);\n\n .slot-container {\n padding: 0 12px;\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n }\n\n &.sql-button--medium-square {\n height: s.spacing(4);\n .slot-container {\n padding: 6px;\n }\n }\n\n &.sql-button--large {\n height: 36px;\n\n .slot-container {\n padding: 0 s.spacing(2);\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--large-square {\n height: 36px;\n .slot-container {\n padding: s.spacing(1);\n }\n }\n\n &.sql-button--xlarge {\n height: s.spacing(6);\n\n .slot-container {\n padding: 0 22px;\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--xlarge-square {\n height: s.spacing(6);\n .slot-container {\n padding: s.spacing(2);\n }\n }\n}\n</style>\n","// Alineación de una columna (clases: basic-table__th--<align> / __td--<align>)\nexport const BASIC_TABLE_ALIGN = {\n LEFT: 'left',\n CENTER: 'center',\n RIGHT: 'right',\n} as const;\nexport type BasicTableAlign = (typeof BASIC_TABLE_ALIGN)[keyof typeof BASIC_TABLE_ALIGN];\n\n// Definición de una columna. `key` mapea a la propiedad de la row para el\n// contenido por defecto y da nombre al slot scoped `cell-<key>`.\nexport interface BasicTableColumn {\n key: string;\n label: string;\n align?: BasicTableAlign;\n width?: string;\n}\n\n// Row genérica: sólo se exige un `id` estable para el :key; el resto de las\n// propiedades las consume cada columna vía su `key`.\nexport interface BasicTableRow {\n id: string | number;\n [key: string]: unknown;\n}\n","<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { BASIC_TABLE_ALIGN, type BasicTableColumn, type BasicTableRow } from './BasicTable.types';\n\ndefineProps({\n columns: {\n type: Array as PropType<BasicTableColumn[]>,\n required: true,\n },\n rows: {\n type: Array as PropType<BasicTableRow[]>,\n required: true,\n },\n emptyMessage: {\n type: String,\n default: '',\n },\n});\n</script>\n\n<template>\n <div class=\"basic-table\">\n <div class=\"basic-table__wrapper\">\n <table class=\"basic-table__table\">\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__th--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n :style=\"column.width ? { width: column.width } : undefined\"\n >\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"rows.length === 0\">\n <td\n class=\"basic-table__empty\"\n :colspan=\"columns.length\"\n data-testid=\"basic-table-empty\"\n >\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n <tr v-for=\"row in rows\" :key=\"row.id\" data-testid=\"basic-table-row\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__td--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n >\n <slot :name=\"`cell-${column.key}`\" :row=\"row\">{{ row[column.key] }}</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/font-size.scss' as f;\n\n.basic-table {\n &__wrapper {\n border: 1px solid colors.$primary-tint;\n border-radius: 8px;\n\n overflow-x: auto;\n }\n\n &__table {\n width: 100%;\n\n border-collapse: collapse;\n\n // Own every border/height explicitly so the table stays consistent even\n // when embedded in a host app whose global `table td/th` rules would\n // otherwise leak in. The scoped specificity (block + [data-v]) beats them.\n th {\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$primary-main;\n font-weight: 700;\n font-size: f.font-size('text');\n\n border: 0;\n border-bottom: 1px solid colors.$primary-tint;\n\n background-color: colors.$primary-background;\n }\n\n td {\n height: auto;\n padding: s.spacing(2);\n\n color: colors.$primary-main;\n font-size: f.font-size('text');\n\n border: 0;\n }\n\n tr {\n border: 0;\n }\n\n // Row separator only BETWEEN adjacent body rows: empty/single → none.\n tbody tr + tr {\n border-top: 1px solid colors.$primary-tint;\n }\n }\n\n // Alignment modifiers are always emitted, so each owns its text-align and\n // no base `th` text-align competes on specificity.\n &__th--left,\n &__td--left {\n text-align: left;\n }\n\n &__th--center,\n &__td--center {\n text-align: center;\n }\n\n &__th--right,\n &__td--right {\n text-align: right;\n }\n\n &__empty {\n padding: s.spacing(5) s.spacing(3);\n\n color: colors.$primary-secondary-text;\n text-align: center;\n }\n}\n</style>\n"],"names":["SQL_SPINNER_THEME_MODES","SQL_SPINNER_SIZES","props","__props","hasLabel","computed","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_toDisplayString","SQL_BUTTON_TYPES","SQL_BUTTON_SIZES","SQL_BUTTON_NATIVE_TYPES","CLICK","emit","__emit","spinnerType","handleClick","event","_createBlock","_unref","SqlSpinner","$slots","_openBlock","_renderSlot","_ctx","BASIC_TABLE_ALIGN","_hoisted_1","_hoisted_3","_Fragment","_renderList","column","_a","_normalizeStyle","_hoisted_4","row"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import './assets/css/base.scss';
2
+ export { SqlButton } from './ui/SqlButton';
3
+ export { SQL_BUTTON_TYPES, SQL_BUTTON_SIZES, SQL_BUTTON_NATIVE_TYPES } from './ui/SqlButton';
4
+ export type { SqlButtonType, SqlButtonSize, SqlButtonNativeType } from './ui/SqlButton';
5
+ export { SqlSpinner } from './ui/SqlSpinner';
6
+ export { SQL_SPINNER_THEME_MODES, SQL_SPINNER_SIZES } from './ui/SqlSpinner';
7
+ export type { SqlSpinnerThemeMode, SqlSpinnerSize } from './ui/SqlSpinner';
8
+ export { BasicTable, BASIC_TABLE_ALIGN } from './ui/BasicTable';
9
+ export type { BasicTableColumn, BasicTableRow, BasicTableAlign } from './ui/BasicTable';
package/dist/index.es.js CHANGED
@@ -1,31 +1,26 @@
1
- import { defineComponent as b, computed as y, createElementBlock as o, openBlock as n, normalizeClass as d, createElementVNode as S, createCommentVNode as c, toDisplayString as v, createBlock as T, renderSlot as m } from "vue";
2
- const r = {
3
- DEFAULT: "default",
4
- PRIMARY: "primary"
5
- }, B = {
6
- LARGE: "large"
7
- }, E = {
8
- BUTTON: "button"
9
- }, u = {
1
+ import { defineComponent as L, computed as h, openBlock as s, createElementBlock as n, normalizeClass as o, createElementVNode as d, toDisplayString as u, createCommentVNode as y, createBlock as I, unref as g, renderSlot as A, Fragment as b, renderList as S, normalizeStyle as v, createTextVNode as R } from "vue";
2
+ const T = {
10
3
  LIGHT: "light",
11
- // para botones oscuros: spinner claro
4
+ // para fondos oscuros: spinner claro
12
5
  DARK: "dark"
13
- // para botones claros: spinner oscuro
14
- }, I = {
15
- MEDIUM: "medium"
16
- }, L = ["aria-label", "aria-live", "aria-hidden"], q = {
6
+ // para fondos claros: spinner oscuro
7
+ }, B = {
8
+ SMALL: "small",
9
+ MEDIUM: "medium",
10
+ LARGE: "large"
11
+ }, N = ["aria-label", "aria-live", "aria-hidden"], k = {
17
12
  key: 0,
18
13
  class: "sr-only"
19
- }, N = /* @__PURE__ */ b({
14
+ }, D = /* @__PURE__ */ L({
20
15
  __name: "SqlSpinner",
21
16
  props: {
22
17
  type: {
23
18
  type: String,
24
- default: u.DARK
19
+ default: T.DARK
25
20
  },
26
21
  size: {
27
22
  type: String,
28
- default: I.MEDIUM
23
+ default: B.SMALL
29
24
  },
30
25
  // Opcional: texto accesible (si no hay, marcamos aria-hidden)
31
26
  label: {
@@ -34,40 +29,65 @@ const r = {
34
29
  }
35
30
  },
36
31
  setup(e) {
37
- const l = e, t = y(() => l.label && l.label.length > 0);
38
- return (i, a) => (n(), o("span", {
39
- class: d(["sql-spinner", [`theme-${e.type}`, `sql-spinner--${e.size}`]]),
32
+ const i = e, l = h(() => i.label && i.label.length > 0);
33
+ return (t, a) => (s(), n("span", {
34
+ class: o(["sql-spinner", [`theme-${e.type}`, `sql-spinner--${e.size}`]]),
40
35
  role: "status",
41
- "aria-label": t.value ? e.label : void 0,
42
- "aria-live": t.value ? "polite" : void 0,
43
- "aria-hidden": t.value ? void 0 : "true"
36
+ "aria-label": l.value ? e.label : void 0,
37
+ "aria-live": l.value ? "polite" : void 0,
38
+ "aria-hidden": l.value ? void 0 : "true"
44
39
  }, [
45
- a[0] || (a[0] = S("span", { class: "ring" }, null, -1)),
46
- t.value ? (n(), o("span", q, v(e.label), 1)) : c("", !0)
47
- ], 10, L));
40
+ a[0] || (a[0] = d("span", { class: "ring" }, null, -1)),
41
+ l.value ? (s(), n("span", k, u(e.label), 1)) : y("", !0)
42
+ ], 10, N));
48
43
  }
49
- }), f = (e, l) => {
50
- const t = e.__vccOpts || e;
51
- for (const [i, a] of l)
52
- t[i] = a;
53
- return t;
54
- }, h = /* @__PURE__ */ f(N, [["__scopeId", "data-v-bdd073d8"]]), k = "click", R = ["type", "disabled", "autofocus", "aria-busy", "aria-disabled", "aria-pressed"], A = {
44
+ }), m = (e, i) => {
45
+ const l = e.__vccOpts || e;
46
+ for (const [t, a] of i)
47
+ l[t] = a;
48
+ return l;
49
+ }, M = /* @__PURE__ */ m(D, [["__scopeId", "data-v-9694500e"]]), E = {
50
+ DEFAULT: "default",
51
+ PRIMARY: "primary",
52
+ SECONDARY: "secondary",
53
+ TERTIARY: "tertiary",
54
+ SPECIAL: "special",
55
+ SPECIAL2: "special2",
56
+ SPECIAL3: "special3",
57
+ DOTTED: "dotted",
58
+ DANGER: "danger",
59
+ GRADIENT: "gradient"
60
+ }, q = {
61
+ SMALL: "small",
62
+ SMALL_SQUARE: "small-square",
63
+ SMALL_SQUARE_NO_PADDING: "small-square-no-padding",
64
+ MEDIUM: "medium",
65
+ MEDIUM_SQUARE: "medium-square",
66
+ LARGE: "large",
67
+ LARGE_SQUARE: "large-square",
68
+ XLARGE: "xlarge",
69
+ XLARGE_SQUARE: "xlarge-square"
70
+ }, $ = {
71
+ BUTTON: "button",
72
+ SUBMIT: "submit",
73
+ RESET: "reset"
74
+ }, p = "click", U = ["type", "disabled", "autofocus", "aria-busy", "aria-disabled", "aria-pressed"], G = {
55
75
  key: 1,
56
76
  class: "slotted-content"
57
- }, D = /* @__PURE__ */ b({
77
+ }, C = /* @__PURE__ */ L({
58
78
  __name: "SqlButton",
59
79
  props: {
60
80
  type: {
61
81
  type: String,
62
- default: r.DEFAULT
82
+ default: E.DEFAULT
63
83
  },
64
84
  size: {
65
85
  type: String,
66
- default: B.LARGE
86
+ default: q.LARGE
67
87
  },
68
88
  nativeType: {
69
89
  type: String,
70
- default: E.BUTTON
90
+ default: $.BUTTON
71
91
  },
72
92
  selected: {
73
93
  type: Boolean,
@@ -80,15 +100,15 @@ const r = {
80
100
  round: Boolean,
81
101
  circle: Boolean
82
102
  },
83
- setup(e, { emit: l }) {
84
- const t = e, i = l, a = y(
85
- () => t.type === r.PRIMARY ? u.LIGHT : u.DARK
103
+ setup(e, { emit: i }) {
104
+ const l = e, t = i, a = h(
105
+ () => l.type === E.PRIMARY || l.type === E.DANGER ? T.LIGHT : T.DARK
86
106
  );
87
- function g(s) {
88
- t.disabled || t.loading || i(k, s);
107
+ function r(c) {
108
+ l.disabled || l.loading || t(p, c);
89
109
  }
90
- return (s, U) => (n(), o("button", {
91
- class: d(["sql-button", [
110
+ return (c, F) => (s(), n("button", {
111
+ class: o(["sql-button", [
92
112
  e.type ? `sql-button--${e.type}` : "",
93
113
  e.size ? `sql-button--${e.size}` : "",
94
114
  {
@@ -107,25 +127,101 @@ const r = {
107
127
  "aria-busy": e.loading || void 0,
108
128
  "aria-disabled": e.disabled || e.loading || void 0,
109
129
  "aria-pressed": e.selected !== null ? !!e.selected : void 0,
110
- onClick: g
130
+ onClick: r
111
131
  }, [
112
- S("span", {
113
- class: d(["slot-container", { "is-loading": e.loading }])
132
+ d("span", {
133
+ class: o(["slot-container", { "is-loading": e.loading }])
114
134
  }, [
115
- e.loading ? (n(), T(h, {
135
+ e.loading ? (s(), I(g(M), {
116
136
  key: 0,
117
137
  class: "sql-spinner",
118
138
  type: a.value
119
- }, null, 8, ["type"])) : c("", !0),
120
- s.$slots.default ? (n(), o("div", A, [
121
- m(s.$slots, "default", {}, void 0, !0)
122
- ])) : c("", !0)
139
+ }, null, 8, ["type"])) : y("", !0),
140
+ c.$slots.default ? (s(), n("div", G, [
141
+ A(c.$slots, "default", {}, void 0, !0)
142
+ ])) : y("", !0)
123
143
  ], 2)
124
- ], 10, R));
144
+ ], 10, U));
145
+ }
146
+ }), x = /* @__PURE__ */ m(C, [["__scopeId", "data-v-9eeb1a72"]]), f = {
147
+ LEFT: "left",
148
+ CENTER: "center",
149
+ RIGHT: "right"
150
+ }, O = { class: "basic-table" }, P = { class: "basic-table__wrapper" }, Q = { class: "basic-table__table" }, _ = { key: 0 }, z = ["colspan"], w = /* @__PURE__ */ L({
151
+ __name: "BasicTable",
152
+ props: {
153
+ columns: {
154
+ type: Array,
155
+ required: !0
156
+ },
157
+ rows: {
158
+ type: Array,
159
+ required: !0
160
+ },
161
+ emptyMessage: {
162
+ type: String,
163
+ default: ""
164
+ }
165
+ },
166
+ setup(e) {
167
+ return (i, l) => (s(), n("div", O, [
168
+ d("div", P, [
169
+ d("table", Q, [
170
+ d("thead", null, [
171
+ d("tr", null, [
172
+ (s(!0), n(b, null, S(e.columns, (t) => {
173
+ var a;
174
+ return s(), n("th", {
175
+ key: t.key,
176
+ class: o(`basic-table__th--${(a = t.align) != null ? a : g(f).LEFT}`),
177
+ style: v(t.width ? { width: t.width } : void 0)
178
+ }, u(t.label), 7);
179
+ }), 128))
180
+ ])
181
+ ]),
182
+ d("tbody", null, [
183
+ e.rows.length === 0 ? (s(), n("tr", _, [
184
+ d("td", {
185
+ class: "basic-table__empty",
186
+ colspan: e.columns.length,
187
+ "data-testid": "basic-table-empty"
188
+ }, [
189
+ A(i.$slots, "empty", {}, () => [
190
+ R(u(e.emptyMessage), 1)
191
+ ], !0)
192
+ ], 8, z)
193
+ ])) : y("", !0),
194
+ (s(!0), n(b, null, S(e.rows, (t) => (s(), n("tr", {
195
+ key: t.id,
196
+ "data-testid": "basic-table-row"
197
+ }, [
198
+ (s(!0), n(b, null, S(e.columns, (a) => {
199
+ var r;
200
+ return s(), n("td", {
201
+ key: a.key,
202
+ class: o(`basic-table__td--${(r = a.align) != null ? r : g(f).LEFT}`)
203
+ }, [
204
+ A(i.$slots, `cell-${a.key}`, { row: t }, () => [
205
+ R(u(t[a.key]), 1)
206
+ ], !0)
207
+ ], 2);
208
+ }), 128))
209
+ ]))), 128))
210
+ ])
211
+ ])
212
+ ])
213
+ ]));
125
214
  }
126
- }), M = /* @__PURE__ */ f(D, [["__scopeId", "data-v-bd5f8a62"]]);
215
+ }), H = /* @__PURE__ */ m(w, [["__scopeId", "data-v-8f713759"]]);
127
216
  export {
128
- M as sqlButton,
129
- h as sqlSpinner
217
+ f as BASIC_TABLE_ALIGN,
218
+ H as BasicTable,
219
+ $ as SQL_BUTTON_NATIVE_TYPES,
220
+ q as SQL_BUTTON_SIZES,
221
+ E as SQL_BUTTON_TYPES,
222
+ B as SQL_SPINNER_SIZES,
223
+ T as SQL_SPINNER_THEME_MODES,
224
+ x as SqlButton,
225
+ M as SqlSpinner
130
226
  };
131
227
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/constants/sql-components.ts","../src/components/SqlSpinner.vue","../src/constants/events.ts","../src/components/SqlButton.vue"],"sourcesContent":["// Tipos de botón (clases: sql-button--<type>)\nexport const SQL_BUTTON_TYPES = {\n DEFAULT: 'default',\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SPECIAL: 'special',\n SPECIAL2: 'special2',\n DOTTED: 'dotted',\n} as const\nexport type SqlButtonType = typeof SQL_BUTTON_TYPES[keyof typeof SQL_BUTTON_TYPES]\n\n// Tamaños de botón (clases: sql-button--<size>)\nexport const SQL_BUTTON_SIZES = {\n SMALL: 'small',\n SMALL_SQUARE: 'small-square',\n SMALL_SQUARE_NO_PADDING: 'small-square-no-padding',\n MEDIUM: 'medium',\n MEDIUM_SQUARE: 'medium-square',\n LARGE: 'large',\n LARGE_SQUARE: 'large-square',\n XLARGE: 'xlarge',\n XLARGE_SQUARE: 'xlarge-square',\n} as const\nexport type SqlButtonSize = typeof SQL_BUTTON_SIZES[keyof typeof SQL_BUTTON_SIZES]\n\n// type nativo del <button>\nexport const SQL_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const\nexport type SqlButtonNativeType = typeof SQL_BUTTON_NATIVE_TYPES[keyof typeof SQL_BUTTON_NATIVE_TYPES]\n\n// Tema del spinner (lo usas en el computed del botón)\nexport const SQL_SPINNER_THEME_MODES = {\n LIGHT: 'light', // para botones oscuros: spinner claro\n DARK: 'dark', // para botones claros: spinner oscuro\n} as const\nexport type SqlSpinnerThemeMode = typeof SQL_SPINNER_THEME_MODES[keyof typeof SQL_SPINNER_THEME_MODES]\n\nexport const SQL_SPINNER_SIZES = {\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n} as const;\n\nexport type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];\n","<script setup lang=\"ts\">\n import { type PropType, computed } from \"vue\";\n import {\n SQL_SPINNER_SIZES,\n SQL_SPINNER_THEME_MODES,\n type SqlSpinnerSize,\n type SqlSpinnerThemeMode,\n } from \"../constants/sql-components\";\n\n const props = defineProps({\n type: {\n type: String as PropType<SqlSpinnerThemeMode>,\n default: SQL_SPINNER_THEME_MODES.DARK,\n },\n size: {\n type: String as PropType<SqlSpinnerSize>,\n default: SQL_SPINNER_SIZES.MEDIUM,\n },\n // Opcional: texto accesible (si no hay, marcamos aria-hidden)\n label: {\n type: String,\n default: \"\",\n },\n });\n\n const hasLabel = computed(() => props.label && props.label.length > 0);\n</script>\n\n<template>\n <span\n class=\"sql-spinner\"\n :class=\"[`theme-${type}`, `sql-spinner--${size}`]\"\n role=\"status\"\n :aria-label=\"hasLabel ? label : undefined\"\n :aria-live=\"hasLabel ? 'polite' : undefined\"\n :aria-hidden=\"hasLabel ? undefined : 'true'\"\n >\n <span class=\"ring\" />\n <span v-if=\"hasLabel\" class=\"sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<style lang=\"scss\" scoped>\n @use \"../assets/css/colors.scss\" as colors;\n\n /* Accesibilidad (solo-lectura visual) */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n\n @keyframes sql-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .sql-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n /* Tamaños por clase */\n &.sql-spinner--small {\n width: 12px;\n height: 12px;\n }\n &.sql-spinner--medium {\n width: 16px;\n height: 16px;\n }\n &.sql-spinner--large {\n width: 24px;\n height: 24px;\n }\n\n .ring {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border-style: solid;\n border-width: 2px;\n animation: sql-spin 0.8s linear infinite;\n }\n\n /* Temas */\n &.theme-light .ring {\n /* 3 lados visibles, 1 transparente para efecto “spinner” */\n border-color: colors.$white colors.$white colors.$white transparent;\n }\n\n &.theme-dark .ring {\n border-color: colors.$primary-main colors.$primary-main\n colors.$primary-main transparent;\n }\n }\n</style>\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const\nexport type ClickEventName = typeof CLICK\n","<template>\n <button\n class=\"sql-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-pressed=\"selected !== null ? !!selected : undefined\"\n :class=\"[\n type ? `sql-button--${type}` : '',\n size ? `sql-button--${size}` : '',\n {\n 'is-disabled': disabled,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-plain': plain,\n 'is-round': round,\n 'selectable-button': selected !== null,\n 'is-selected': selected,\n },\n ]\"\n @click=\"handleClick\"\n >\n <!-- Siempre renderizamos el contenedor para que el spinner funcione con o sin texto -->\n <span class=\"slot-container\" :class=\"{ 'is-loading': loading }\">\n <!-- Spinner superpuesto cuando loading -->\n <SqlSpinner v-if=\"loading\" class=\"sql-spinner\" :type=\"spinnerType\" />\n\n <!-- Texto/slot (se oculta visualmente cuando loading) -->\n <div v-if=\"$slots.default\" class=\"slotted-content\">\n <slot />\n </div>\n </span>\n </button>\n</template>\n<script setup lang=\"ts\">\n import { computed, type PropType } from \"vue\";\n import SqlSpinner from \"@shared/components/SqlSpinner.vue\";\n import {\n SQL_BUTTON_NATIVE_TYPES,\n SQL_BUTTON_SIZES,\n SQL_BUTTON_TYPES,\n SQL_SPINNER_THEME_MODES,\n type SqlButtonNativeType,\n type SqlButtonSize,\n type SqlButtonType,\n } from \"@shared/constants/sql-components\";\n import { CLICK } from \"@shared/constants/events\";\n\n const props = defineProps({\n type: {\n type: String as PropType<SqlButtonType>,\n default: SQL_BUTTON_TYPES.DEFAULT,\n },\n size: {\n type: String as PropType<SqlButtonSize>,\n default: SQL_BUTTON_SIZES.LARGE,\n },\n nativeType: {\n type: String as PropType<SqlButtonNativeType>,\n default: SQL_BUTTON_NATIVE_TYPES.BUTTON,\n },\n selected: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean,\n });\n\n const emit = defineEmits<{\n (e: typeof CLICK, event: MouseEvent): void;\n }>();\n\n const spinnerType = computed(() =>\n props.type === SQL_BUTTON_TYPES.PRIMARY\n ? SQL_SPINNER_THEME_MODES.LIGHT\n : SQL_SPINNER_THEME_MODES.DARK\n );\n\n function handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return; // guard\n emit(CLICK, event);\n }\n</script>\n\n<style lang=\"scss\" scoped>\n @use \"../assets/css/colors.scss\" as colors;\n @use \"../assets/css/spacing.scss\" as s;\n\n /* keyframes a nivel raíz */\n @keyframes rotating {\n 0% {\n transform: rotateZ(360deg);\n }\n 100% {\n transform: rotateZ(0deg);\n }\n }\n\n $default-background: colors.$white;\n\n .sql-button {\n padding: 0;\n\n color: colors.$primary-main;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n\n border-width: 0;\n border-radius: 4px;\n outline: none;\n\n cursor: pointer;\n transition: background 0.2s, color 0.2s, border-color 0.2s;\n\n &:active,\n &:hover {\n outline: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n }\n\n &.is-circle {\n padding: s.spacing(1);\n border-radius: 50%;\n }\n\n .slot-container {\n position: relative;\n\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .slotted-content {\n display: inline-flex;\n align-items: center;\n }\n\n &.is-loading {\n .slotted-content {\n visibility: hidden;\n } /* el contenido sigue en el flujo para no cambiar ancho/alto */\n }\n\n .sql-spinner {\n position: absolute;\n inset: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 1em;\n height: 1em;\n margin: auto;\n\n pointer-events: none;\n }\n }\n\n /* Types */\n &.sql-button--default {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.sql-button--primary {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n\n &:hover {\n background-color: colors.$primary-accent-shadow;\n }\n &.is-disabled {\n background-color: colors.$primary-accent-mid;\n }\n }\n\n &.sql-button--secondary {\n color: colors.$primary-main;\n background-color: colors.$secondary-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &.is-disabled {\n color: colors.$primary-secondary-text;\n background-color: colors.$primary-tint;\n }\n }\n\n &.sql-button--tertiary {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &:active {\n color: $default-background;\n background-color: colors.$primary-secondary-text;\n }\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n &:active {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.selectable-button {\n &:active {\n color: colors.$primary-accent-main !important;\n background: colors.$primary-accent-background !important;\n }\n\n &.is-selected {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-main;\n background: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-mid;\n background-color: $default-background;\n\n &:hover {\n border: 1px solid colors.$primary-accent-main;\n }\n &:active {\n border: 1px solid colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n\n &:active {\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n }\n }\n }\n\n &.sql-button--special2 {\n color: colors.$primary-accent-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-accent-background;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--dotted {\n color: colors.$primary-mid;\n font-weight: bold;\n\n border: 1px dashed colors.$primary-mid;\n border-radius: s.spacing(3);\n\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$primary-accent-main;\n border: 1px dashed colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n }\n\n /* Sizes */\n &.sql-button--small {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n\n .slot-container {\n padding: 0 s.spacing(1);\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n\n .sql-spinner .spinner {\n height: s.spacing(2);\n }\n }\n\n &.sql-button--small-square {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 4px;\n }\n }\n\n &.sql-button--small-square-no-padding {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 0;\n }\n }\n\n &.sql-button--medium {\n height: s.spacing(4);\n\n .slot-container {\n padding: 0 12px;\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n }\n\n &.sql-button--medium-square {\n height: s.spacing(4);\n .slot-container {\n padding: 6px;\n }\n }\n\n &.sql-button--large {\n height: 36px;\n\n .slot-container {\n padding: 0 s.spacing(2);\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--large-square {\n height: 36px;\n .slot-container {\n padding: s.spacing(1);\n }\n }\n\n &.sql-button--xlarge {\n height: s.spacing(6);\n\n .slot-container {\n padding: 0 22px;\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--xlarge-square {\n height: s.spacing(6);\n .slot-container {\n padding: s.spacing(2);\n }\n }\n }\n</style>\n"],"names":["SQL_BUTTON_TYPES","SQL_BUTTON_SIZES","SQL_BUTTON_NATIVE_TYPES","SQL_SPINNER_THEME_MODES","SQL_SPINNER_SIZES","props","__props","hasLabel","computed","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_toDisplayString","CLICK","emit","__emit","spinnerType","handleClick","event","_createBlock","SqlSpinner","$slots","_openBlock","_renderSlot","_ctx"],"mappings":";AACO,MAAMA,IAAmB;AAAA,EAC9B,SAAS;AAAA,EACT,SAAS;AAMX,GAIaC,IAAmB;AAAA,EAM9B,OAAO;AAIT,GAIaC,IAA0B;AAAA,EACrC,QAAQ;AAGV,GAIaC,IAA0B;AAAA,EACrC,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AACR,GAGaC,IAAoB;AAAA,EAE/B,QAAQ;AAEV;;;;;;;;;;;;;;;;;;;;;ACpCE,UAAMC,IAAQC,GAgBRC,IAAWC,EAAS,MAAMH,EAAM,SAASA,EAAM,MAAM,SAAS,CAAC;2BAIrEI,EAUO,QAAA;AAAA,MATL,OAAKC,EAAA,CAAC,eAAa,CAAA,SACDJ,EAAA,IAAI,oBAAoBA,EAAA,IAAI,EAAA,CAAA,CAAA;AAAA,MAC9C,MAAK;AAAA,MACJ,cAAYC,EAAA,QAAWD,EAAA,QAAQ;AAAA,MAC/B,aAAWC,EAAA,QAAQ,WAAc;AAAA,MACjC,eAAaA,EAAA,QAAW,SAAS;AAAA,IAAA;sBAElCI,EAAqB,QAAA,EAAf,OAAM,OAAA,GAAM,MAAA,EAAA;AAAA,MACNJ,EAAA,cAAZE,EAAwD,QAAxDG,GAAwDC,EAAfP,EAAA,KAAK,GAAA,CAAA;;;;;;;;iECrCrCQ,IAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACiDnB,UAAMT,IAAQC,GAyBRS,IAAOC,GAIPC,IAAcT;AAAA,MAAS,MAC3BH,EAAM,SAASL,EAAiB,UAC5BG,EAAwB,QACxBA,EAAwB;AAAA,IAAA;AAG9B,aAASe,EAAYC,GAAmB;AACtC,MAAId,EAAM,YAAYA,EAAM,WAC5BU,EAAKD,GAAOK,CAAK;AAAA,IACnB;2BAvFAV,EAiCS,UAAA;AAAA,MAhCP,UAAM,cAAY;AAAA,QAOFH,EAAA,sBAAsBA,EAAA,IAAI,KAAA;AAAA,QAAeA,EAAA,sBAAsBA,EAAA,IAAI,KAAA;AAAA;yBAAwCA,EAAA;AAAA,wBAAgCA,EAAA;AAAA,uBAA8BA,EAAA;AAAA,sBAA4BA,EAAA;AAAA,sBAA2BA,EAAA;AAAA,+BAAoCA,EAAA,aAAQ;AAAA,yBAAkCA,EAAA;AAAA,QAAA;AAAA;MAN7T,MAAMA,EAAA;AAAA,MACN,UAAUA,EAAA,YAAYA,EAAA;AAAA,MACtB,WAAWA,EAAA;AAAA,MACX,aAAWA,EAAA,WAAW;AAAA,MACtB,iBAAeA,EAAA,YAAYA,EAAA,WAAW;AAAA,MACtC,gBAAcA,EAAA,aAAQ,OAAA,CAAA,CAAcA,EAAA,WAAW;AAAA,MAc/C,SAAOY;AAAA,IAAA;MAGRP,EAQO,QAAA;AAAA,QARD,OAAKD,EAAA,CAAC,kBAAgB,EAAA,cAAyBJ,EAAA,SAAO,CAAA;AAAA,MAAA;QAExCA,EAAA,gBAAlBc,EAAqEC,GAAA;AAAA;UAA1C,OAAM;AAAA,UAAe,MAAMJ,EAAA;AAAA,QAAA;QAG3CK,EAAAA,OAAO,WAAlBC,KAAAd,EAEM,OAFNG,GAEM;AAAA,UADJY,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,QAAA;;;;;"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/ui/SqlSpinner/SqlSpinner.types.ts","../src/ui/SqlSpinner/SqlSpinner.vue","../src/ui/SqlButton/SqlButton.types.ts","../src/constants/events.ts","../src/ui/SqlButton/SqlButton.vue","../src/ui/BasicTable/BasicTable.types.ts","../src/ui/BasicTable/BasicTable.vue"],"sourcesContent":["// Tema del spinner (clases: theme-<mode>)\nexport const SQL_SPINNER_THEME_MODES = {\n LIGHT: 'light', // para fondos oscuros: spinner claro\n DARK: 'dark', // para fondos claros: spinner oscuro\n} as const;\nexport type SqlSpinnerThemeMode =\n (typeof SQL_SPINNER_THEME_MODES)[keyof typeof SQL_SPINNER_THEME_MODES];\n\n// Tamaños (clases: sql-spinner--<size>)\nexport const SQL_SPINNER_SIZES = {\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n} as const;\nexport type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];\n","<script setup lang=\"ts\">\nimport { type PropType, computed } from 'vue';\nimport {\n SQL_SPINNER_SIZES,\n SQL_SPINNER_THEME_MODES,\n type SqlSpinnerSize,\n type SqlSpinnerThemeMode,\n} from './SqlSpinner.types';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlSpinnerThemeMode>,\n default: SQL_SPINNER_THEME_MODES.DARK,\n },\n size: {\n type: String as PropType<SqlSpinnerSize>,\n default: SQL_SPINNER_SIZES.SMALL,\n },\n // Opcional: texto accesible (si no hay, marcamos aria-hidden)\n label: {\n type: String,\n default: '',\n },\n});\n\nconst hasLabel = computed(() => props.label && props.label.length > 0);\n</script>\n\n<template>\n <span\n class=\"sql-spinner\"\n :class=\"[`theme-${type}`, `sql-spinner--${size}`]\"\n role=\"status\"\n :aria-label=\"hasLabel ? label : undefined\"\n :aria-live=\"hasLabel ? 'polite' : undefined\"\n :aria-hidden=\"hasLabel ? undefined : 'true'\"\n >\n <span class=\"ring\" />\n <span v-if=\"hasLabel\" class=\"sr-only\">{{ label }}</span>\n </span>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n\n/* Accesibilidad (solo-lectura visual) */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n@keyframes sql-spin {\n to {\n transform: rotate(1turn);\n }\n}\n\n.sql-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n /* color del anillo por tema (paridad con los PNG de frontend-app) */\n --sql-spinner-color: #{colors.$primary-accent-main};\n\n /* Tamaños (paridad con frontend-app: small=20, medium=36, large=64) */\n &.sql-spinner--small {\n width: 20px;\n height: 20px;\n }\n &.sql-spinner--medium {\n width: 36px;\n height: 36px;\n }\n &.sql-spinner--large {\n width: 64px;\n height: 64px;\n }\n\n .ring {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n\n /* Anillo con gradiente cónico transparente → color (arco que se desvanece) */\n background: conic-gradient(from 90deg, transparent 8%, var(--sql-spinner-color) 100%);\n\n /* Recorta el centro para dejar solo el anillo (grosor ~16% del radio ≈ 8% del diámetro,\n medido sobre los PNG de frontend-app) */\n mask: radial-gradient(farthest-side, transparent calc(100% - 16%), #000 calc(100% - 16%));\n /* stylelint-disable-next-line property-no-vendor-prefix */\n -webkit-mask: radial-gradient(\n farthest-side,\n transparent calc(100% - 16%),\n #000 calc(100% - 16%)\n );\n\n animation: sql-spin 1s linear infinite;\n }\n\n /* Temas */\n &.theme-dark {\n --sql-spinner-color: #{colors.$primary-accent-main};\n }\n &.theme-light {\n --sql-spinner-color: #{colors.$white};\n }\n}\n</style>\n","// Tipos de botón (clases: sql-button--<type>)\nexport const SQL_BUTTON_TYPES = {\n DEFAULT: 'default',\n PRIMARY: 'primary',\n SECONDARY: 'secondary',\n TERTIARY: 'tertiary',\n SPECIAL: 'special',\n SPECIAL2: 'special2',\n SPECIAL3: 'special3',\n DOTTED: 'dotted',\n DANGER: 'danger',\n GRADIENT: 'gradient',\n} as const;\nexport type SqlButtonType = (typeof SQL_BUTTON_TYPES)[keyof typeof SQL_BUTTON_TYPES];\n\n// Tamaños de botón (clases: sql-button--<size>)\nexport const SQL_BUTTON_SIZES = {\n SMALL: 'small',\n SMALL_SQUARE: 'small-square',\n SMALL_SQUARE_NO_PADDING: 'small-square-no-padding',\n MEDIUM: 'medium',\n MEDIUM_SQUARE: 'medium-square',\n LARGE: 'large',\n LARGE_SQUARE: 'large-square',\n XLARGE: 'xlarge',\n XLARGE_SQUARE: 'xlarge-square',\n} as const;\nexport type SqlButtonSize = (typeof SQL_BUTTON_SIZES)[keyof typeof SQL_BUTTON_SIZES];\n\n// type nativo del <button>\nexport const SQL_BUTTON_NATIVE_TYPES = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n RESET: 'reset',\n} as const;\nexport type SqlButtonNativeType =\n (typeof SQL_BUTTON_NATIVE_TYPES)[keyof typeof SQL_BUTTON_NATIVE_TYPES];\n","// Evento genérico de click para props/emit\nexport const CLICK = 'click' as const;\nexport type ClickEventName = typeof CLICK;\n","<template>\n <button\n class=\"sql-button\"\n :type=\"nativeType\"\n :disabled=\"disabled || loading\"\n :autofocus=\"autofocus\"\n :aria-busy=\"loading || undefined\"\n :aria-disabled=\"disabled || loading || undefined\"\n :aria-pressed=\"selected !== null ? !!selected : undefined\"\n :class=\"[\n type ? `sql-button--${type}` : '',\n size ? `sql-button--${size}` : '',\n {\n 'is-disabled': disabled,\n 'is-loading': loading,\n 'is-circle': circle,\n 'is-plain': plain,\n 'is-round': round,\n 'selectable-button': selected !== null,\n 'is-selected': selected,\n },\n ]\"\n @click=\"handleClick\"\n >\n <!-- Siempre renderizamos el contenedor para que el spinner funcione con o sin texto -->\n <span class=\"slot-container\" :class=\"{ 'is-loading': loading }\">\n <!-- Spinner superpuesto cuando loading -->\n <SqlSpinner v-if=\"loading\" class=\"sql-spinner\" :type=\"spinnerType\" />\n\n <!-- Texto/slot (se oculta visualmente cuando loading) -->\n <div v-if=\"$slots.default\" class=\"slotted-content\">\n <slot />\n </div>\n </span>\n </button>\n</template>\n<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue';\nimport { SqlSpinner, SQL_SPINNER_THEME_MODES } from '@shared/ui/SqlSpinner';\nimport {\n SQL_BUTTON_NATIVE_TYPES,\n SQL_BUTTON_SIZES,\n SQL_BUTTON_TYPES,\n type SqlButtonNativeType,\n type SqlButtonSize,\n type SqlButtonType,\n} from './SqlButton.types';\nimport { CLICK } from '@shared/constants/events';\n\nconst props = defineProps({\n type: {\n type: String as PropType<SqlButtonType>,\n default: SQL_BUTTON_TYPES.DEFAULT,\n },\n size: {\n type: String as PropType<SqlButtonSize>,\n default: SQL_BUTTON_SIZES.LARGE,\n },\n nativeType: {\n type: String as PropType<SqlButtonNativeType>,\n default: SQL_BUTTON_NATIVE_TYPES.BUTTON,\n },\n selected: {\n type: Boolean as PropType<boolean | null>,\n default: null,\n },\n loading: Boolean,\n disabled: Boolean,\n plain: Boolean,\n autofocus: Boolean,\n round: Boolean,\n circle: Boolean,\n});\n\nconst emit = defineEmits<{\n (e: typeof CLICK, event: MouseEvent): void;\n}>();\n\nconst spinnerType = computed(() =>\n props.type === SQL_BUTTON_TYPES.PRIMARY || props.type === SQL_BUTTON_TYPES.DANGER\n ? SQL_SPINNER_THEME_MODES.LIGHT\n : SQL_SPINNER_THEME_MODES.DARK\n);\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return; // guard\n emit(CLICK, event);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n\n/* keyframes a nivel raíz */\n@keyframes rotating {\n 0% {\n transform: rotateZ(360deg);\n }\n 100% {\n transform: rotateZ(0deg);\n }\n}\n\n$default-background: colors.$white;\n\n.sql-button {\n padding: 0;\n\n color: colors.$primary-main;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n\n border-width: 0;\n border-radius: 4px;\n outline: none;\n\n cursor: pointer;\n transition:\n background 0.2s,\n color 0.2s,\n border-color 0.2s;\n\n &:active,\n &:hover {\n outline: none;\n }\n\n &[disabled] {\n cursor: not-allowed;\n }\n\n &.is-circle {\n padding: s.spacing(1);\n border-radius: 50%;\n }\n\n .slot-container {\n position: relative;\n\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .slotted-content {\n display: inline-flex;\n align-items: center;\n\n white-space: nowrap;\n }\n\n &.is-loading {\n .slotted-content {\n visibility: hidden;\n } /* el contenido sigue en el flujo para no cambiar ancho/alto */\n }\n\n .sql-spinner {\n position: absolute;\n inset: 0;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n width: 1em;\n height: 1em;\n margin: auto;\n\n pointer-events: none;\n }\n }\n\n /* Types */\n &.sql-button--default {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.sql-button--primary {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n\n &:hover {\n background-color: colors.$primary-accent-shadow;\n }\n &.is-disabled {\n background-color: colors.$primary-accent-mid;\n }\n }\n\n &.sql-button--secondary {\n color: colors.$primary-main;\n background-color: colors.$secondary-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &.is-disabled {\n color: colors.$primary-secondary-text;\n background-color: colors.$primary-tint;\n }\n }\n\n &.sql-button--tertiary {\n color: colors.$primary-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-tint;\n }\n &:active {\n color: $default-background;\n background-color: colors.$primary-secondary-text;\n }\n &.is-disabled {\n color: colors.$primary-mid;\n background-color: $default-background;\n &:active {\n color: colors.$primary-mid;\n background-color: $default-background;\n }\n }\n\n &.selectable-button {\n &:active {\n color: colors.$primary-accent-main !important;\n background: colors.$primary-accent-background !important;\n }\n\n &.is-selected {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-main;\n background: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special {\n color: colors.$primary-accent-main;\n border: 1px solid colors.$primary-accent-mid;\n background-color: $default-background;\n\n &:hover {\n border: 1px solid colors.$primary-accent-main;\n }\n &:active {\n border: 1px solid colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n\n &:active {\n border: 1px solid colors.$primary-accent-tint;\n background-color: $default-background;\n }\n }\n }\n\n &.sql-button--special2 {\n color: colors.$primary-accent-main;\n background-color: $default-background;\n\n &:hover {\n background-color: colors.$primary-accent-background;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--special3 {\n color: colors.$primary-accent-main;\n font-weight: 400;\n\n background-color: colors.$primary-accent-tint;\n\n &:hover {\n color: colors.$white;\n background-color: colors.$primary-accent-main;\n }\n &:active {\n color: colors.$primary-accent-main;\n background-color: colors.$primary-accent-tint;\n }\n &.is-disabled {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n &:active {\n color: colors.$primary-accent-mid;\n background-color: colors.$primary-accent-background;\n }\n }\n }\n\n &.sql-button--dotted {\n color: colors.$primary-mid;\n font-weight: bold;\n\n border: 1px dashed colors.$primary-mid;\n border-radius: s.spacing(3);\n\n background-color: transparent;\n\n &:hover:not(.is-disabled) {\n color: colors.$primary-accent-main;\n border: 1px dashed colors.$primary-accent-main;\n background-color: colors.$primary-accent-background;\n }\n }\n\n &.sql-button--danger {\n color: colors.$tertiary-accent-main !important;\n\n background-color: colors.$tertiary-accent-tint;\n\n &:hover {\n background-color: colors.$tertiary-accent-mid;\n }\n &.is-disabled {\n color: colors.$tertiary-accent-mid;\n background-color: colors.$tertiary-accent-tint;\n }\n }\n\n &.sql-button--gradient {\n color: colors.$white !important;\n\n background: linear-gradient(\n 106.21deg,\n colors.$ai-gradient-1 22.52%,\n colors.$ai-gradient-2 100%\n );\n\n &:hover {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-hover 22.52%,\n colors.$ai-gradient-2 100%\n ) !important;\n }\n &.is-disabled {\n background: linear-gradient(\n 106deg,\n colors.$ai-gradient-disabled 22.52%,\n colors.$ai-gradient-2 100%\n );\n }\n }\n\n /* Sizes */\n &.sql-button--small {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 14px;\n\n .slot-container {\n padding: 0 s.spacing(1);\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n\n .sql-spinner .spinner {\n height: s.spacing(2);\n }\n }\n\n &.sql-button--small-square {\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 4px;\n }\n }\n\n &.sql-button--small-square-no-padding {\n width: s.spacing(3);\n height: s.spacing(3);\n font-weight: 400;\n font-size: 12px;\n line-height: 15px;\n\n .slot-container {\n padding: 0;\n }\n }\n\n &.sql-button--medium {\n height: s.spacing(4);\n\n .slot-container {\n padding: 0 12px;\n .icon-left {\n margin-right: 2px;\n }\n .icon-right {\n margin-left: 2px;\n }\n }\n }\n\n &.sql-button--medium-square {\n height: s.spacing(4);\n .slot-container {\n padding: 6px;\n }\n }\n\n &.sql-button--large {\n height: 36px;\n\n .slot-container {\n padding: 0 s.spacing(2);\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--large-square {\n height: 36px;\n .slot-container {\n padding: s.spacing(1);\n }\n }\n\n &.sql-button--xlarge {\n height: s.spacing(6);\n\n .slot-container {\n padding: 0 22px;\n .icon-left {\n margin-right: 4px;\n }\n .icon-right {\n margin-left: 4px;\n }\n }\n }\n\n &.sql-button--xlarge-square {\n height: s.spacing(6);\n .slot-container {\n padding: s.spacing(2);\n }\n }\n}\n</style>\n","// Alineación de una columna (clases: basic-table__th--<align> / __td--<align>)\nexport const BASIC_TABLE_ALIGN = {\n LEFT: 'left',\n CENTER: 'center',\n RIGHT: 'right',\n} as const;\nexport type BasicTableAlign = (typeof BASIC_TABLE_ALIGN)[keyof typeof BASIC_TABLE_ALIGN];\n\n// Definición de una columna. `key` mapea a la propiedad de la row para el\n// contenido por defecto y da nombre al slot scoped `cell-<key>`.\nexport interface BasicTableColumn {\n key: string;\n label: string;\n align?: BasicTableAlign;\n width?: string;\n}\n\n// Row genérica: sólo se exige un `id` estable para el :key; el resto de las\n// propiedades las consume cada columna vía su `key`.\nexport interface BasicTableRow {\n id: string | number;\n [key: string]: unknown;\n}\n","<script setup lang=\"ts\">\nimport { type PropType } from 'vue';\nimport { BASIC_TABLE_ALIGN, type BasicTableColumn, type BasicTableRow } from './BasicTable.types';\n\ndefineProps({\n columns: {\n type: Array as PropType<BasicTableColumn[]>,\n required: true,\n },\n rows: {\n type: Array as PropType<BasicTableRow[]>,\n required: true,\n },\n emptyMessage: {\n type: String,\n default: '',\n },\n});\n</script>\n\n<template>\n <div class=\"basic-table\">\n <div class=\"basic-table__wrapper\">\n <table class=\"basic-table__table\">\n <thead>\n <tr>\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__th--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n :style=\"column.width ? { width: column.width } : undefined\"\n >\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"rows.length === 0\">\n <td\n class=\"basic-table__empty\"\n :colspan=\"columns.length\"\n data-testid=\"basic-table-empty\"\n >\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n <tr v-for=\"row in rows\" :key=\"row.id\" data-testid=\"basic-table-row\">\n <td\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"`basic-table__td--${column.align ?? BASIC_TABLE_ALIGN.LEFT}`\"\n >\n <slot :name=\"`cell-${column.key}`\" :row=\"row\">{{ row[column.key] }}</slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n@use '../../assets/css/colors.scss' as colors;\n@use '../../assets/css/spacing.scss' as s;\n@use '../../assets/css/font-size.scss' as f;\n\n.basic-table {\n &__wrapper {\n border: 1px solid colors.$primary-tint;\n border-radius: 8px;\n\n overflow-x: auto;\n }\n\n &__table {\n width: 100%;\n\n border-collapse: collapse;\n\n // Own every border/height explicitly so the table stays consistent even\n // when embedded in a host app whose global `table td/th` rules would\n // otherwise leak in. The scoped specificity (block + [data-v]) beats them.\n th {\n padding: s.spacing(1) s.spacing(2);\n\n color: colors.$primary-main;\n font-weight: 700;\n font-size: f.font-size('text');\n\n border: 0;\n border-bottom: 1px solid colors.$primary-tint;\n\n background-color: colors.$primary-background;\n }\n\n td {\n height: auto;\n padding: s.spacing(2);\n\n color: colors.$primary-main;\n font-size: f.font-size('text');\n\n border: 0;\n }\n\n tr {\n border: 0;\n }\n\n // Row separator only BETWEEN adjacent body rows: empty/single → none.\n tbody tr + tr {\n border-top: 1px solid colors.$primary-tint;\n }\n }\n\n // Alignment modifiers are always emitted, so each owns its text-align and\n // no base `th` text-align competes on specificity.\n &__th--left,\n &__td--left {\n text-align: left;\n }\n\n &__th--center,\n &__td--center {\n text-align: center;\n }\n\n &__th--right,\n &__td--right {\n text-align: right;\n }\n\n &__empty {\n padding: s.spacing(5) s.spacing(3);\n\n color: colors.$primary-secondary-text;\n text-align: center;\n }\n}\n</style>\n"],"names":["SQL_SPINNER_THEME_MODES","SQL_SPINNER_SIZES","props","__props","hasLabel","computed","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_toDisplayString","SQL_BUTTON_TYPES","SQL_BUTTON_SIZES","SQL_BUTTON_NATIVE_TYPES","CLICK","emit","__emit","spinnerType","handleClick","event","_createBlock","_unref","SqlSpinner","$slots","_openBlock","_renderSlot","_ctx","BASIC_TABLE_ALIGN","_hoisted_1","_hoisted_3","_Fragment","_renderList","column","_a","_normalizeStyle","_hoisted_4","row"],"mappings":"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"}
@@ -1 +1 @@
1
- @charset "UTF-8";*,*:before,*:after{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body{height:100%}body{margin:0;color:#414c58;font-size:14px;font-family:Mulish,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:#fff}a{text-decoration:none;color:inherit}article,aside,blockquote,body,button,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,section,td,textarea,th,ul{margin:0;padding:0}button,input,select,textarea{font:inherit;line-height:inherit}img,svg{max-width:100%;height:auto;display:block}ul,ol{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th{text-align:left;font-weight:400;vertical-align:middle}q{quotes:none}q:before,q:after{content:"";content:none}input[type=search]{-webkit-appearance:textfield;outline-offset:-2px}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top;resize:vertical}[hidden]{display:none!important}.sr-only[data-v-bdd073d8]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes sql-spin-bdd073d8{to{transform:rotate(360deg)}}.sql-spinner[data-v-bdd073d8]{display:inline-flex;align-items:center;justify-content:center}.sql-spinner.sql-spinner--small[data-v-bdd073d8]{width:12px;height:12px}.sql-spinner.sql-spinner--medium[data-v-bdd073d8]{width:16px;height:16px}.sql-spinner.sql-spinner--large[data-v-bdd073d8]{width:24px;height:24px}.sql-spinner .ring[data-v-bdd073d8]{box-sizing:border-box;width:100%;height:100%;border-radius:50%;border-style:solid;border-width:2px;animation:sql-spin-bdd073d8 .8s linear infinite}.sql-spinner.theme-light .ring[data-v-bdd073d8]{border-color:#fff #fff #fff transparent}.sql-spinner.theme-dark .ring[data-v-bdd073d8]{border-color:#414c58 #414c58 #414c58 transparent}@keyframes rotating-bd5f8a62{0%{transform:rotate(360deg)}to{transform:rotate(0)}}.sql-button[data-v-bd5f8a62]{padding:0;color:#414c58;font-weight:500;font-size:14px;line-height:20px;border-width:0;border-radius:4px;outline:none;cursor:pointer;transition:background .2s,color .2s,border-color .2s}.sql-button[data-v-bd5f8a62]:active,.sql-button[data-v-bd5f8a62]:hover{outline:none}.sql-button[disabled][data-v-bd5f8a62]{cursor:not-allowed}.sql-button.is-circle[data-v-bd5f8a62]{padding:4px;border-radius:50%}.sql-button .slot-container[data-v-bd5f8a62]{position:relative;display:inline-flex;justify-content:center;align-items:center}.sql-button .slot-container .slotted-content[data-v-bd5f8a62]{display:inline-flex;align-items:center}.sql-button .slot-container.is-loading .slotted-content[data-v-bd5f8a62]{visibility:hidden}.sql-button .slot-container .sql-spinner[data-v-bd5f8a62]{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;width:1em;height:1em;margin:auto;pointer-events:none}.sql-button.sql-button--default[data-v-bd5f8a62]{color:#414c58;background-color:#fff}.sql-button.sql-button--default[data-v-bd5f8a62]:hover{background-color:#e7e9ea}.sql-button.sql-button--default.is-disabled[data-v-bd5f8a62]{color:#b8bcc0;background-color:#fff}.sql-button.sql-button--primary[data-v-bd5f8a62]{color:#fff;background-color:#6a69ff}.sql-button.sql-button--primary[data-v-bd5f8a62]:hover{background-color:#504fbf}.sql-button.sql-button--primary.is-disabled[data-v-bd5f8a62]{background-color:#c7c7ff}.sql-button.sql-button--secondary[data-v-bd5f8a62]{color:#414c58;background-color:#f6f6f6}.sql-button.sql-button--secondary[data-v-bd5f8a62]:hover{background-color:#e7e9ea}.sql-button.sql-button--secondary.is-disabled[data-v-bd5f8a62]{color:#888f97;background-color:#e7e9ea}.sql-button.sql-button--tertiary[data-v-bd5f8a62]{color:#414c58;background-color:#fff}.sql-button.sql-button--tertiary[data-v-bd5f8a62]:hover{background-color:#e7e9ea}.sql-button.sql-button--tertiary[data-v-bd5f8a62]:active{color:#fff;background-color:#888f97}.sql-button.sql-button--tertiary.is-disabled[data-v-bd5f8a62],.sql-button.sql-button--tertiary.is-disabled[data-v-bd5f8a62]:active{color:#b8bcc0;background-color:#fff}.sql-button.sql-button--tertiary.selectable-button[data-v-bd5f8a62]:active{color:#6a69ff!important;background:#f2f2ff!important}.sql-button.sql-button--tertiary.selectable-button.is-selected[data-v-bd5f8a62]{color:#6a69ff;border:1px solid #6a69ff;background:#f2f2ff}.sql-button.sql-button--special[data-v-bd5f8a62]{color:#6a69ff;border:1px solid #c7c7ff;background-color:#fff}.sql-button.sql-button--special[data-v-bd5f8a62]:hover{border:1px solid #6a69ff}.sql-button.sql-button--special[data-v-bd5f8a62]:active{border:1px solid #6a69ff;background-color:#f2f2ff}.sql-button.sql-button--special.is-disabled[data-v-bd5f8a62]{color:#c7c7ff;border:1px solid #ececff;background-color:#fff}.sql-button.sql-button--special.is-disabled[data-v-bd5f8a62]:active{border:1px solid #ececff;background-color:#fff}.sql-button.sql-button--special2[data-v-bd5f8a62]{color:#6a69ff;background-color:#fff}.sql-button.sql-button--special2[data-v-bd5f8a62]:hover{background-color:#f2f2ff}.sql-button.sql-button--special2[data-v-bd5f8a62]:active{color:#6a69ff;background-color:#ececff}.sql-button.sql-button--special2.is-disabled[data-v-bd5f8a62],.sql-button.sql-button--special2.is-disabled[data-v-bd5f8a62]:active{color:#c7c7ff;background-color:#f2f2ff}.sql-button.sql-button--dotted[data-v-bd5f8a62]{color:#b8bcc0;font-weight:700;border:1px dashed #b8bcc0;border-radius:12px;background-color:transparent}.sql-button.sql-button--dotted[data-v-bd5f8a62]:hover:not(.is-disabled){color:#6a69ff;border:1px dashed #6a69ff;background-color:#f2f2ff}.sql-button.sql-button--small[data-v-bd5f8a62]{height:12px;font-weight:400;font-size:12px;line-height:14px}.sql-button.sql-button--small .slot-container[data-v-bd5f8a62]{padding:0 4px}.sql-button.sql-button--small .slot-container .icon-left[data-v-bd5f8a62]{margin-right:2px}.sql-button.sql-button--small .slot-container .icon-right[data-v-bd5f8a62]{margin-left:2px}.sql-button.sql-button--small .sql-spinner .spinner[data-v-bd5f8a62]{height:8px}.sql-button.sql-button--small-square[data-v-bd5f8a62]{height:12px;font-weight:400;font-size:12px;line-height:15px}.sql-button.sql-button--small-square .slot-container[data-v-bd5f8a62]{padding:4px}.sql-button.sql-button--small-square-no-padding[data-v-bd5f8a62]{height:12px;font-weight:400;font-size:12px;line-height:15px}.sql-button.sql-button--small-square-no-padding .slot-container[data-v-bd5f8a62]{padding:0}.sql-button.sql-button--medium[data-v-bd5f8a62]{height:16px}.sql-button.sql-button--medium .slot-container[data-v-bd5f8a62]{padding:0 12px}.sql-button.sql-button--medium .slot-container .icon-left[data-v-bd5f8a62]{margin-right:2px}.sql-button.sql-button--medium .slot-container .icon-right[data-v-bd5f8a62]{margin-left:2px}.sql-button.sql-button--medium-square[data-v-bd5f8a62]{height:16px}.sql-button.sql-button--medium-square .slot-container[data-v-bd5f8a62]{padding:6px}.sql-button.sql-button--large[data-v-bd5f8a62]{height:36px}.sql-button.sql-button--large .slot-container[data-v-bd5f8a62]{padding:0 8px}.sql-button.sql-button--large .slot-container .icon-left[data-v-bd5f8a62]{margin-right:4px}.sql-button.sql-button--large .slot-container .icon-right[data-v-bd5f8a62]{margin-left:4px}.sql-button.sql-button--large-square[data-v-bd5f8a62]{height:36px}.sql-button.sql-button--large-square .slot-container[data-v-bd5f8a62]{padding:4px}.sql-button.sql-button--xlarge[data-v-bd5f8a62]{height:24px}.sql-button.sql-button--xlarge .slot-container[data-v-bd5f8a62]{padding:0 22px}.sql-button.sql-button--xlarge .slot-container .icon-left[data-v-bd5f8a62]{margin-right:4px}.sql-button.sql-button--xlarge .slot-container .icon-right[data-v-bd5f8a62]{margin-left:4px}.sql-button.sql-button--xlarge-square[data-v-bd5f8a62]{height:24px}.sql-button.sql-button--xlarge-square .slot-container[data-v-bd5f8a62]{padding:8px}
1
+ @charset "UTF-8";*,*:before,*:after{box-sizing:border-box;-webkit-tap-highlight-color:transparent}html,body{height:100%}body{margin:0;color:#414c58;font-size:14px;font-family:Mulish,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:#fff}a{text-decoration:none;color:inherit}article,aside,blockquote,body,button,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,section,td,textarea,th,ul{margin:0;padding:0}button,input,select,textarea{font:inherit;line-height:inherit}img,svg{max-width:100%;height:auto;display:block}ul,ol{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th{text-align:left;font-weight:400;vertical-align:middle}q{quotes:none}q:before,q:after{content:"";content:none}input[type=search]{-webkit-appearance:textfield;outline-offset:-2px}input[type=search]::-webkit-search-decoration{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top;resize:vertical}[hidden]{display:none!important}.sr-only[data-v-9694500e]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes sql-spin-9694500e{to{transform:rotate(1turn)}}.sql-spinner[data-v-9694500e]{display:inline-flex;align-items:center;justify-content:center;--sql-spinner-color: #6a69ff}.sql-spinner.sql-spinner--small[data-v-9694500e]{width:20px;height:20px}.sql-spinner.sql-spinner--medium[data-v-9694500e]{width:36px;height:36px}.sql-spinner.sql-spinner--large[data-v-9694500e]{width:64px;height:64px}.sql-spinner .ring[data-v-9694500e]{box-sizing:border-box;width:100%;height:100%;border-radius:50%;background:conic-gradient(from 90deg,transparent 8%,var(--sql-spinner-color) 100%);mask:radial-gradient(farthest-side,transparent 84%,#000 84%);-webkit-mask:radial-gradient(farthest-side,transparent 84%,#000 84%);animation:sql-spin-9694500e 1s linear infinite}.sql-spinner.theme-dark[data-v-9694500e]{--sql-spinner-color: #6a69ff}.sql-spinner.theme-light[data-v-9694500e]{--sql-spinner-color: #fff}@keyframes rotating-9eeb1a72{0%{transform:rotate(360deg)}to{transform:rotate(0)}}.sql-button[data-v-9eeb1a72]{padding:0;color:#414c58;font-weight:500;font-size:14px;line-height:20px;border-width:0;border-radius:4px;outline:none;cursor:pointer;transition:background .2s,color .2s,border-color .2s}.sql-button[data-v-9eeb1a72]:active,.sql-button[data-v-9eeb1a72]:hover{outline:none}.sql-button[disabled][data-v-9eeb1a72]{cursor:not-allowed}.sql-button.is-circle[data-v-9eeb1a72]{padding:4px;border-radius:50%}.sql-button .slot-container[data-v-9eeb1a72]{position:relative;display:inline-flex;justify-content:center;align-items:center}.sql-button .slot-container .slotted-content[data-v-9eeb1a72]{display:inline-flex;align-items:center;white-space:nowrap}.sql-button .slot-container.is-loading .slotted-content[data-v-9eeb1a72]{visibility:hidden}.sql-button .slot-container .sql-spinner[data-v-9eeb1a72]{position:absolute;inset:0;display:flex;justify-content:center;align-items:center;width:1em;height:1em;margin:auto;pointer-events:none}.sql-button.sql-button--default[data-v-9eeb1a72]{color:#414c58;background-color:#fff}.sql-button.sql-button--default[data-v-9eeb1a72]:hover{background-color:#e7e9ea}.sql-button.sql-button--default.is-disabled[data-v-9eeb1a72]{color:#b8bcc0;background-color:#fff}.sql-button.sql-button--primary[data-v-9eeb1a72]{color:#fff;background-color:#6a69ff}.sql-button.sql-button--primary[data-v-9eeb1a72]:hover{background-color:#504fbf}.sql-button.sql-button--primary.is-disabled[data-v-9eeb1a72]{background-color:#c7c7ff}.sql-button.sql-button--secondary[data-v-9eeb1a72]{color:#414c58;background-color:#f6f6f6}.sql-button.sql-button--secondary[data-v-9eeb1a72]:hover{background-color:#e7e9ea}.sql-button.sql-button--secondary.is-disabled[data-v-9eeb1a72]{color:#888f97;background-color:#e7e9ea}.sql-button.sql-button--tertiary[data-v-9eeb1a72]{color:#414c58;background-color:#fff}.sql-button.sql-button--tertiary[data-v-9eeb1a72]:hover{background-color:#e7e9ea}.sql-button.sql-button--tertiary[data-v-9eeb1a72]:active{color:#fff;background-color:#888f97}.sql-button.sql-button--tertiary.is-disabled[data-v-9eeb1a72],.sql-button.sql-button--tertiary.is-disabled[data-v-9eeb1a72]:active{color:#b8bcc0;background-color:#fff}.sql-button.sql-button--tertiary.selectable-button[data-v-9eeb1a72]:active{color:#6a69ff!important;background:#f2f2ff!important}.sql-button.sql-button--tertiary.selectable-button.is-selected[data-v-9eeb1a72]{color:#6a69ff;border:1px solid #6a69ff;background:#f2f2ff}.sql-button.sql-button--special[data-v-9eeb1a72]{color:#6a69ff;border:1px solid #c7c7ff;background-color:#fff}.sql-button.sql-button--special[data-v-9eeb1a72]:hover{border:1px solid #6a69ff}.sql-button.sql-button--special[data-v-9eeb1a72]:active{border:1px solid #6a69ff;background-color:#f2f2ff}.sql-button.sql-button--special.is-disabled[data-v-9eeb1a72]{color:#c7c7ff;border:1px solid #ececff;background-color:#fff}.sql-button.sql-button--special.is-disabled[data-v-9eeb1a72]:active{border:1px solid #ececff;background-color:#fff}.sql-button.sql-button--special2[data-v-9eeb1a72]{color:#6a69ff;background-color:#fff}.sql-button.sql-button--special2[data-v-9eeb1a72]:hover{background-color:#f2f2ff}.sql-button.sql-button--special2[data-v-9eeb1a72]:active{color:#6a69ff;background-color:#ececff}.sql-button.sql-button--special2.is-disabled[data-v-9eeb1a72],.sql-button.sql-button--special2.is-disabled[data-v-9eeb1a72]:active{color:#c7c7ff;background-color:#f2f2ff}.sql-button.sql-button--special3[data-v-9eeb1a72]{color:#6a69ff;font-weight:400;background-color:#ececff}.sql-button.sql-button--special3[data-v-9eeb1a72]:hover{color:#fff;background-color:#6a69ff}.sql-button.sql-button--special3[data-v-9eeb1a72]:active{color:#6a69ff;background-color:#ececff}.sql-button.sql-button--special3.is-disabled[data-v-9eeb1a72],.sql-button.sql-button--special3.is-disabled[data-v-9eeb1a72]:active{color:#c7c7ff;background-color:#f2f2ff}.sql-button.sql-button--dotted[data-v-9eeb1a72]{color:#b8bcc0;font-weight:700;border:1px dashed #b8bcc0;border-radius:12px;background-color:transparent}.sql-button.sql-button--dotted[data-v-9eeb1a72]:hover:not(.is-disabled){color:#6a69ff;border:1px dashed #6a69ff;background-color:#f2f2ff}.sql-button.sql-button--danger[data-v-9eeb1a72]{color:#ff6a69!important;background-color:#ffecec}.sql-button.sql-button--danger[data-v-9eeb1a72]:hover{background-color:#ffc7c7}.sql-button.sql-button--danger.is-disabled[data-v-9eeb1a72]{color:#ffc7c7;background-color:#ffecec}.sql-button.sql-button--gradient[data-v-9eeb1a72]{color:#fff!important;background:linear-gradient(106.21deg,#ff699f 22.52%,#ffba69)}.sql-button.sql-button--gradient[data-v-9eeb1a72]:hover{background:linear-gradient(106deg,#cc547f 22.52%,#ffba69)!important}.sql-button.sql-button--gradient.is-disabled[data-v-9eeb1a72]{background:linear-gradient(106deg,#ffa6c6 22.52%,#ffba69)}.sql-button.sql-button--small[data-v-9eeb1a72]{height:12px;font-weight:400;font-size:12px;line-height:14px}.sql-button.sql-button--small .slot-container[data-v-9eeb1a72]{padding:0 4px}.sql-button.sql-button--small .slot-container .icon-left[data-v-9eeb1a72]{margin-right:2px}.sql-button.sql-button--small .slot-container .icon-right[data-v-9eeb1a72]{margin-left:2px}.sql-button.sql-button--small .sql-spinner .spinner[data-v-9eeb1a72]{height:8px}.sql-button.sql-button--small-square[data-v-9eeb1a72]{height:12px;font-weight:400;font-size:12px;line-height:15px}.sql-button.sql-button--small-square .slot-container[data-v-9eeb1a72]{padding:4px}.sql-button.sql-button--small-square-no-padding[data-v-9eeb1a72]{width:12px;height:12px;font-weight:400;font-size:12px;line-height:15px}.sql-button.sql-button--small-square-no-padding .slot-container[data-v-9eeb1a72]{padding:0}.sql-button.sql-button--medium[data-v-9eeb1a72]{height:16px}.sql-button.sql-button--medium .slot-container[data-v-9eeb1a72]{padding:0 12px}.sql-button.sql-button--medium .slot-container .icon-left[data-v-9eeb1a72]{margin-right:2px}.sql-button.sql-button--medium .slot-container .icon-right[data-v-9eeb1a72]{margin-left:2px}.sql-button.sql-button--medium-square[data-v-9eeb1a72]{height:16px}.sql-button.sql-button--medium-square .slot-container[data-v-9eeb1a72]{padding:6px}.sql-button.sql-button--large[data-v-9eeb1a72]{height:36px}.sql-button.sql-button--large .slot-container[data-v-9eeb1a72]{padding:0 8px}.sql-button.sql-button--large .slot-container .icon-left[data-v-9eeb1a72]{margin-right:4px}.sql-button.sql-button--large .slot-container .icon-right[data-v-9eeb1a72]{margin-left:4px}.sql-button.sql-button--large-square[data-v-9eeb1a72]{height:36px}.sql-button.sql-button--large-square .slot-container[data-v-9eeb1a72]{padding:4px}.sql-button.sql-button--xlarge[data-v-9eeb1a72]{height:24px}.sql-button.sql-button--xlarge .slot-container[data-v-9eeb1a72]{padding:0 22px}.sql-button.sql-button--xlarge .slot-container .icon-left[data-v-9eeb1a72]{margin-right:4px}.sql-button.sql-button--xlarge .slot-container .icon-right[data-v-9eeb1a72]{margin-left:4px}.sql-button.sql-button--xlarge-square[data-v-9eeb1a72]{height:24px}.sql-button.sql-button--xlarge-square .slot-container[data-v-9eeb1a72]{padding:8px}.basic-table__wrapper[data-v-8f713759]{border:1px solid #e7e9ea;border-radius:8px;overflow-x:auto}.basic-table__table[data-v-8f713759]{width:100%;border-collapse:collapse}.basic-table__table th[data-v-8f713759]{padding:4px 8px;color:#414c58;font-weight:700;font-size:14px;border:0;border-bottom:1px solid #e7e9ea;background-color:#f6f6f6}.basic-table__table td[data-v-8f713759]{height:auto;padding:8px;color:#414c58;font-size:14px;border:0}.basic-table__table tr[data-v-8f713759]{border:0}.basic-table__table tbody tr+tr[data-v-8f713759]{border-top:1px solid #e7e9ea}.basic-table__th--left[data-v-8f713759],.basic-table__td--left[data-v-8f713759]{text-align:left}.basic-table__th--center[data-v-8f713759],.basic-table__td--center[data-v-8f713759]{text-align:center}.basic-table__th--right[data-v-8f713759],.basic-table__td--right[data-v-8f713759]{text-align:right}.basic-table__empty[data-v-8f713759]{padding:20px 12px;color:#888f97;text-align:center}
@@ -0,0 +1,16 @@
1
+ export declare const BASIC_TABLE_ALIGN: {
2
+ readonly LEFT: "left";
3
+ readonly CENTER: "center";
4
+ readonly RIGHT: "right";
5
+ };
6
+ export type BasicTableAlign = (typeof BASIC_TABLE_ALIGN)[keyof typeof BASIC_TABLE_ALIGN];
7
+ export interface BasicTableColumn {
8
+ key: string;
9
+ label: string;
10
+ align?: BasicTableAlign;
11
+ width?: string;
12
+ }
13
+ export interface BasicTableRow {
14
+ id: string | number;
15
+ [key: string]: unknown;
16
+ }
@@ -0,0 +1,46 @@
1
+ import { type PropType } from 'vue';
2
+ import { type BasicTableColumn, type BasicTableRow } from './BasicTable.types';
3
+ declare var __VLS_1: {}, __VLS_4: `cell-${string}`, __VLS_5: {
4
+ row: BasicTableRow;
5
+ };
6
+ type __VLS_Slots = {} & {
7
+ [K in NonNullable<typeof __VLS_4>]?: (props: typeof __VLS_5) => any;
8
+ } & {
9
+ empty?: (props: typeof __VLS_1) => any;
10
+ };
11
+ declare const __VLS_component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
12
+ columns: {
13
+ type: PropType<BasicTableColumn[]>;
14
+ required: true;
15
+ };
16
+ rows: {
17
+ type: PropType<BasicTableRow[]>;
18
+ required: true;
19
+ };
20
+ emptyMessage: {
21
+ type: StringConstructor;
22
+ default: string;
23
+ };
24
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
25
+ columns: {
26
+ type: PropType<BasicTableColumn[]>;
27
+ required: true;
28
+ };
29
+ rows: {
30
+ type: PropType<BasicTableRow[]>;
31
+ required: true;
32
+ };
33
+ emptyMessage: {
34
+ type: StringConstructor;
35
+ default: string;
36
+ };
37
+ }>> & Readonly<{}>, {
38
+ emptyMessage: string;
39
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
40
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
41
+ export default _default;
42
+ type __VLS_WithSlots<T, S> = T & {
43
+ new (): {
44
+ $slots: S;
45
+ };
46
+ };
@@ -0,0 +1,2 @@
1
+ export { default as BasicTable } from './BasicTable.vue';
2
+ export * from './BasicTable.types';
@@ -0,0 +1,31 @@
1
+ export declare const SQL_BUTTON_TYPES: {
2
+ readonly DEFAULT: "default";
3
+ readonly PRIMARY: "primary";
4
+ readonly SECONDARY: "secondary";
5
+ readonly TERTIARY: "tertiary";
6
+ readonly SPECIAL: "special";
7
+ readonly SPECIAL2: "special2";
8
+ readonly SPECIAL3: "special3";
9
+ readonly DOTTED: "dotted";
10
+ readonly DANGER: "danger";
11
+ readonly GRADIENT: "gradient";
12
+ };
13
+ export type SqlButtonType = (typeof SQL_BUTTON_TYPES)[keyof typeof SQL_BUTTON_TYPES];
14
+ export declare const SQL_BUTTON_SIZES: {
15
+ readonly SMALL: "small";
16
+ readonly SMALL_SQUARE: "small-square";
17
+ readonly SMALL_SQUARE_NO_PADDING: "small-square-no-padding";
18
+ readonly MEDIUM: "medium";
19
+ readonly MEDIUM_SQUARE: "medium-square";
20
+ readonly LARGE: "large";
21
+ readonly LARGE_SQUARE: "large-square";
22
+ readonly XLARGE: "xlarge";
23
+ readonly XLARGE_SQUARE: "xlarge-square";
24
+ };
25
+ export type SqlButtonSize = (typeof SQL_BUTTON_SIZES)[keyof typeof SQL_BUTTON_SIZES];
26
+ export declare const SQL_BUTTON_NATIVE_TYPES: {
27
+ readonly BUTTON: "button";
28
+ readonly SUBMIT: "submit";
29
+ readonly RESET: "reset";
30
+ };
31
+ export type SqlButtonNativeType = (typeof SQL_BUTTON_NATIVE_TYPES)[keyof typeof SQL_BUTTON_NATIVE_TYPES];
@@ -0,0 +1,75 @@
1
+ import { type PropType } from 'vue';
2
+ import { type SqlButtonNativeType, type SqlButtonSize, type SqlButtonType } from './SqlButton.types';
3
+ declare var __VLS_5: {};
4
+ type __VLS_Slots = {} & {
5
+ default?: (props: typeof __VLS_5) => any;
6
+ };
7
+ declare const __VLS_component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
+ type: {
9
+ type: PropType<SqlButtonType>;
10
+ default: "default";
11
+ };
12
+ size: {
13
+ type: PropType<SqlButtonSize>;
14
+ default: "large";
15
+ };
16
+ nativeType: {
17
+ type: PropType<SqlButtonNativeType>;
18
+ default: "button";
19
+ };
20
+ selected: {
21
+ type: PropType<boolean | null>;
22
+ default: null;
23
+ };
24
+ loading: BooleanConstructor;
25
+ disabled: BooleanConstructor;
26
+ plain: BooleanConstructor;
27
+ autofocus: BooleanConstructor;
28
+ round: BooleanConstructor;
29
+ circle: BooleanConstructor;
30
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
31
+ click: (event: MouseEvent) => any;
32
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
33
+ type: {
34
+ type: PropType<SqlButtonType>;
35
+ default: "default";
36
+ };
37
+ size: {
38
+ type: PropType<SqlButtonSize>;
39
+ default: "large";
40
+ };
41
+ nativeType: {
42
+ type: PropType<SqlButtonNativeType>;
43
+ default: "button";
44
+ };
45
+ selected: {
46
+ type: PropType<boolean | null>;
47
+ default: null;
48
+ };
49
+ loading: BooleanConstructor;
50
+ disabled: BooleanConstructor;
51
+ plain: BooleanConstructor;
52
+ autofocus: BooleanConstructor;
53
+ round: BooleanConstructor;
54
+ circle: BooleanConstructor;
55
+ }>> & Readonly<{
56
+ onClick?: ((event: MouseEvent) => any) | undefined;
57
+ }>, {
58
+ type: SqlButtonType;
59
+ size: SqlButtonSize;
60
+ circle: boolean;
61
+ nativeType: SqlButtonNativeType;
62
+ selected: boolean | null;
63
+ loading: boolean;
64
+ disabled: boolean;
65
+ plain: boolean;
66
+ autofocus: boolean;
67
+ round: boolean;
68
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
69
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
70
+ export default _default;
71
+ type __VLS_WithSlots<T, S> = T & {
72
+ new (): {
73
+ $slots: S;
74
+ };
75
+ };
@@ -0,0 +1,2 @@
1
+ export { default as SqlButton } from './SqlButton.vue';
2
+ export * from './SqlButton.types';
@@ -0,0 +1,11 @@
1
+ export declare const SQL_SPINNER_THEME_MODES: {
2
+ readonly LIGHT: "light";
3
+ readonly DARK: "dark";
4
+ };
5
+ export type SqlSpinnerThemeMode = (typeof SQL_SPINNER_THEME_MODES)[keyof typeof SQL_SPINNER_THEME_MODES];
6
+ export declare const SQL_SPINNER_SIZES: {
7
+ readonly SMALL: "small";
8
+ readonly MEDIUM: "medium";
9
+ readonly LARGE: "large";
10
+ };
11
+ export type SqlSpinnerSize = (typeof SQL_SPINNER_SIZES)[keyof typeof SQL_SPINNER_SIZES];
@@ -0,0 +1,34 @@
1
+ import { type PropType } from 'vue';
2
+ import { type SqlSpinnerSize, type SqlSpinnerThemeMode } from './SqlSpinner.types';
3
+ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
+ type: {
5
+ type: PropType<SqlSpinnerThemeMode>;
6
+ default: "dark";
7
+ };
8
+ size: {
9
+ type: PropType<SqlSpinnerSize>;
10
+ default: "small";
11
+ };
12
+ label: {
13
+ type: StringConstructor;
14
+ default: string;
15
+ };
16
+ }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
17
+ type: {
18
+ type: PropType<SqlSpinnerThemeMode>;
19
+ default: "dark";
20
+ };
21
+ size: {
22
+ type: PropType<SqlSpinnerSize>;
23
+ default: "small";
24
+ };
25
+ label: {
26
+ type: StringConstructor;
27
+ default: string;
28
+ };
29
+ }>> & Readonly<{}>, {
30
+ type: SqlSpinnerThemeMode;
31
+ size: SqlSpinnerSize;
32
+ label: string;
33
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
34
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export { default as SqlSpinner } from './SqlSpinner.vue';
2
+ export * from './SqlSpinner.types';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesql/sql_components_vue3",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Librería de componentes Vue 3 (SalesQL)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -28,21 +28,27 @@
28
28
  "devDependencies": {
29
29
  "@histoire/plugin-vue": "1.0.0-alpha.3",
30
30
  "@vitejs/plugin-vue": "^6.0.1",
31
+ "@vitest/coverage-v8": "^3.2.0",
32
+ "@vue/test-utils": "^2.4.6",
31
33
  "flexsearch": "^0.8.212",
32
34
  "histoire": "1.0.0-alpha.3",
35
+ "jsdom": "^26.1.0",
33
36
  "sass": "^1.93.2",
34
37
  "shiki": "^3.13.0",
35
38
  "vite": "^7.1.7",
39
+ "vitest": "^3.2.0",
36
40
  "vscode-oniguruma": "^2.0.1",
37
41
  "vscode-textmate": "^9.2.0",
38
42
  "vue": "^3.5.0",
39
43
  "vue-tsc": "^2.2.12"
40
44
  },
41
45
  "publishConfig": {
42
- "access": "public"
46
+ "access": "public",
47
+ "registry": "https://registry.npmjs.org",
48
+ "provenance": false
43
49
  },
44
50
  "engines": {
45
- "node": ">=20.19.0"
51
+ "node": "^24.0.0"
46
52
  },
47
53
  "repository": {
48
54
  "type": "git",
@@ -53,9 +59,13 @@
53
59
  },
54
60
  "homepage": "https://github.com/salesql/salesql-components-library-vue3#readme",
55
61
  "scripts": {
56
- "build": "vue-tsc -p tsconfig.build.json --emitDeclarationOnly && vite build",
62
+ "build": "vite build && vue-tsc -p tsconfig.build.json --emitDeclarationOnly",
57
63
  "stories": "histoire dev",
64
+ "build:stories": "histoire build",
58
65
  "typecheck": "vue-tsc --noEmit",
66
+ "test": "vitest run",
67
+ "test:watch": "vitest",
68
+ "test:coverage": "vitest run --coverage",
59
69
  "changeset:version": "changeset version",
60
70
  "changeset:publish": "changeset publish"
61
71
  }