@topjoao/top-design-system 0.1.0-beta.2 → 0.1.0-beta.3
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 +246 -135
- package/dist/TopSelect-B30Dk8R7.cjs +2 -0
- package/dist/TopSelect-B30Dk8R7.cjs.map +1 -0
- package/dist/TopSelect-BtRWj2sh.js +364 -0
- package/dist/TopSelect-BtRWj2sh.js.map +1 -0
- package/dist/components/TopSelect.vue.d.ts +100 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/nuxt.cjs +1 -1
- package/dist/nuxt.cjs.map +1 -1
- package/dist/nuxt.js +4 -0
- package/dist/nuxt.js.map +1 -1
- package/dist/plugin.cjs +1 -1
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.ts +2 -0
- package/dist/plugin.js +4 -4
- package/dist/plugin.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/topSolutions.d.ts +7 -0
- package/package.json +89 -84
- package/dist/TopButton-9IIdtUbJ.js +0 -81
- package/dist/TopButton-9IIdtUbJ.js.map +0 -1
- package/dist/TopButton-CDKgguLF.cjs +0 -2
- package/dist/TopButton-CDKgguLF.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,135 +1,246 @@
|
|
|
1
|
-
# TopSolutions Design System
|
|
2
|
-
|
|
3
|
-
Biblioteca de componentes Vue 3, estilos e tokens visuais compartilhados pela
|
|
4
|
-
TopSolutions.
|
|
5
|
-
|
|
6
|
-
## Instalação
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
npm install @topjoao/top-design-system@beta
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
A aplicação consumidora deve possuir Vue 3, PrimeVue, PrimeIcons e
|
|
13
|
-
`@primeuix/themes` em versões compatíveis com as `peerDependencies` do pacote.
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
<template>
|
|
81
|
-
<TopButton label="Salvar" icon="pi pi-save"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
1
|
+
# TopSolutions Design System
|
|
2
|
+
|
|
3
|
+
Biblioteca de componentes Vue 3, estilos e tokens visuais compartilhados pela
|
|
4
|
+
TopSolutions.
|
|
5
|
+
|
|
6
|
+
## Instalação
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install @topjoao/top-design-system@beta
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
A aplicação consumidora deve possuir Vue 3, PrimeVue, PrimeIcons e
|
|
13
|
+
`@primeuix/themes` em versões compatíveis com as `peerDependencies` do pacote.
|
|
14
|
+
|
|
15
|
+
## Tema TopSolutions
|
|
16
|
+
|
|
17
|
+
A biblioteca exporta `TopSolutionsPreset`, o preset PrimeVue baseado na paleta
|
|
18
|
+
oficial da TopSolutions. Configure-o uma vez na aplicação consumidora:
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import PrimeVue from 'primevue/config'
|
|
22
|
+
import { TopSolutionsPreset } from '@topjoao/top-design-system'
|
|
23
|
+
|
|
24
|
+
app.use(PrimeVue, {
|
|
25
|
+
theme: {
|
|
26
|
+
preset: TopSolutionsPreset,
|
|
27
|
+
options: { darkModeSelector: '.dark' },
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
O preset é independente dos ajustes de layout próprios do TopLicita; ele
|
|
33
|
+
contém apenas tokens semânticos compartilháveis, como cores primárias, neutras,
|
|
34
|
+
sucesso, alerta e erro.
|
|
35
|
+
|
|
36
|
+
`style.css` contém somente os estilos de `TopButton` e `TopSelect`. Regras que
|
|
37
|
+
alcançam o PrimeVue são encapsuladas pelas classes-raiz desses componentes;
|
|
38
|
+
componentes PrimeVue usados diretamente pela aplicação consumidora não são
|
|
39
|
+
sobrescritos pela biblioteca.
|
|
40
|
+
|
|
41
|
+
## Uso com Nuxt
|
|
42
|
+
|
|
43
|
+
Adicione o módulo uma única vez ao `nuxt.config.ts`:
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
export default defineNuxtConfig({
|
|
47
|
+
modules: [
|
|
48
|
+
// outros módulos...
|
|
49
|
+
'@topjoao/top-design-system/nuxt',
|
|
50
|
+
],
|
|
51
|
+
})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Depois de alterar a configuração, reinicie o servidor de desenvolvimento ou
|
|
55
|
+
regenere os arquivos do Nuxt:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm run postinstall
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
O módulo registra os componentes, gera suas tipagens e inclui o CSS da
|
|
62
|
+
biblioteca. Não é necessário importar o componente manualmente:
|
|
63
|
+
|
|
64
|
+
```vue
|
|
65
|
+
<template>
|
|
66
|
+
<TopButton label="Salvar" icon="pi pi-save" />
|
|
67
|
+
</template>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Uso com Vue 3
|
|
71
|
+
|
|
72
|
+
### Importação por componente
|
|
73
|
+
|
|
74
|
+
```vue
|
|
75
|
+
<script setup lang="ts">
|
|
76
|
+
import { TopButton } from '@topjoao/top-design-system'
|
|
77
|
+
import '@topjoao/top-design-system/style.css'
|
|
78
|
+
</script>
|
|
79
|
+
|
|
80
|
+
<template>
|
|
81
|
+
<TopButton label="Salvar" icon="pi pi-save" />
|
|
82
|
+
</template>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Registro global
|
|
86
|
+
|
|
87
|
+
Na inicialização da aplicação:
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import { createApp } from 'vue'
|
|
91
|
+
import { TopSolutionsDesignSystem } from '@topjoao/top-design-system/plugin'
|
|
92
|
+
import '@topjoao/top-design-system/style.css'
|
|
93
|
+
import App from './App.vue'
|
|
94
|
+
|
|
95
|
+
createApp(App).use(TopSolutionsDesignSystem).mount('#app')
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Após o registro, os componentes podem ser utilizados sem importação manual. A
|
|
99
|
+
entrada `/plugin` também fornece as declarações globais usadas pela IDE.
|
|
100
|
+
|
|
101
|
+
## TopButton
|
|
102
|
+
|
|
103
|
+
Exemplo
|
|
104
|
+
|
|
105
|
+
```vue
|
|
106
|
+
<template>
|
|
107
|
+
<TopButton label="Salvar" icon="pi pi-save" @click="salvar" />
|
|
108
|
+
<TopButton label="Cancelar" secondary />
|
|
109
|
+
|
|
110
|
+
<TopButton label="Consultar" outlined>
|
|
111
|
+
<template #icon>
|
|
112
|
+
<i class="pi pi-search" />
|
|
113
|
+
</template>
|
|
114
|
+
</TopButton>
|
|
115
|
+
</template>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
| Prop | Tipo | Padrão |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| `tooltip` | `string` | `''` |
|
|
121
|
+
| `tooltipClass` | `string` | `'text-xs'` |
|
|
122
|
+
| `label` | `string` | `''` |
|
|
123
|
+
| `icon` | `string` | `''` |
|
|
124
|
+
| `loading` | `boolean` | `false` |
|
|
125
|
+
| `class` | `string` | `''` |
|
|
126
|
+
| `outlined` | `boolean` | `false` |
|
|
127
|
+
| `secondary` | `boolean` | `false` |
|
|
128
|
+
| `disabled` | `boolean` | `false` |
|
|
129
|
+
| `unstyled` | `boolean` | `false` |
|
|
130
|
+
| `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
|
|
131
|
+
|
|
132
|
+
O componente emite `click` sem payload e oferece o slot nomeado `icon`.
|
|
133
|
+
|
|
134
|
+
## TopSelect
|
|
135
|
+
|
|
136
|
+
Seletor pesquisável baseado no `AutoComplete` do PrimeVue. Ele é genérico: a
|
|
137
|
+
aplicação fornece os itens, executa a busca e decide qualquer apresentação de
|
|
138
|
+
domínio por slots.
|
|
139
|
+
|
|
140
|
+
```vue
|
|
141
|
+
<script setup lang="ts">
|
|
142
|
+
import { ref } from 'vue'
|
|
143
|
+
import { TopSelect } from '@topjoao/top-design-system'
|
|
144
|
+
|
|
145
|
+
const selectedCustomer = ref(null)
|
|
146
|
+
const customers = ref([])
|
|
147
|
+
|
|
148
|
+
function searchCustomers({ query }: { query: string }) {
|
|
149
|
+
// Atualize customers com o resultado da sua fonte de dados.
|
|
150
|
+
}
|
|
151
|
+
</script>
|
|
152
|
+
|
|
153
|
+
<template>
|
|
154
|
+
<TopSelect
|
|
155
|
+
v-model="selectedCustomer"
|
|
156
|
+
:options="customers"
|
|
157
|
+
option-label="name"
|
|
158
|
+
option-key="id"
|
|
159
|
+
option-prefix="code"
|
|
160
|
+
show-option-prefix
|
|
161
|
+
:loading="false"
|
|
162
|
+
@search="searchCustomers"
|
|
163
|
+
>
|
|
164
|
+
<template #icon="{ loading }">
|
|
165
|
+
<i :class="loading ? 'pi pi-spin pi-spinner' : 'pi pi-users'" />
|
|
166
|
+
</template>
|
|
167
|
+
<template #footer>
|
|
168
|
+
<button type="button">Criar cliente</button>
|
|
169
|
+
</template>
|
|
170
|
+
</TopSelect>
|
|
171
|
+
</template>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
| Prop | Tipo | Padrão |
|
|
175
|
+
|---|---|---|
|
|
176
|
+
| `options` | `array` | `[]` |
|
|
177
|
+
| `optionLabel` | `string \| function` | `'label'` |
|
|
178
|
+
| `optionKey` | `string` | `'id'` |
|
|
179
|
+
| `optionPrefix` | `string` | `''` |
|
|
180
|
+
| `showOptionPrefix` | `boolean` | `false` |
|
|
181
|
+
| `showSelectedPrefix` | `boolean` | `false` |
|
|
182
|
+
| `loading` / `disabled` / `invalid` | `boolean` | `false` |
|
|
183
|
+
| `placeholder` | `string` | `'Search...'` |
|
|
184
|
+
| `minQueryLength` | `number` | `1` |
|
|
185
|
+
| `multiple` / `forceSelection` | `boolean` | `false` / `true` |
|
|
186
|
+
| `panelWidth` / `scrollHeight` | `string` | `null` / `'250px'` |
|
|
187
|
+
| `emptyMessage` / `loadingMessage` | `string` | mensagens padrão em inglês |
|
|
188
|
+
| `closeOnSelect` | `boolean` | `false` |
|
|
189
|
+
|
|
190
|
+
Eventos: `update:modelValue`, `search`, `loadMore`, `clear`, `select` e
|
|
191
|
+
`change`.
|
|
192
|
+
|
|
193
|
+
Slots: `icon`, `option`, `selected-item`, `chip`, `empty`, `option-group` e
|
|
194
|
+
`footer`. O slot `icon` recebe `loading`; sem ele, o componente mostra uma lupa
|
|
195
|
+
ou um indicador de carregamento. Quando um slot não é informado, o componente usa sua apresentação padrão.
|
|
196
|
+
O texto das opções é limitado visualmente pela largura disponível do painel,
|
|
197
|
+
sem corte por quantidade fixa de caracteres; o tooltip padrão exibe o valor
|
|
198
|
+
completo quando `showTooltip` está ativo.
|
|
199
|
+
|
|
200
|
+
## Desenvolvimento da biblioteca
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
npm install
|
|
204
|
+
npm run check
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
O comando `check` executa verificação de tipos, testes e build.
|
|
208
|
+
|
|
209
|
+
Para inspecionar o conteúdo que seria publicado:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
npm pack --dry-run
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Playground visual
|
|
216
|
+
|
|
217
|
+
O Storybook permite testar os componentes isoladamente e consultar seus
|
|
218
|
+
exemplos. Ele é uma dependência de desenvolvimento e não é incluído no pacote
|
|
219
|
+
publicado.
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
npm run storybook
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Abra `http://localhost:6006` para acessar as histórias de `TopButton` e
|
|
226
|
+
`TopSelect`. Use o botão de contraste na barra superior para alternar o preview
|
|
227
|
+
entre tema claro e escuro. Para gerar a versão estática da documentação,
|
|
228
|
+
execute:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
npm run build-storybook
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Para gerar um pacote local instalável:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
npm pack
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Para publicar uma nova versão beta, primeiro altere a versão; versões já
|
|
241
|
+
publicadas no npm não podem ser sobrescritas.
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
npm version prerelease --preid=beta --no-git-tag-version
|
|
245
|
+
npm publish --access public --tag beta
|
|
246
|
+
```
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("vue"),l=require("primevue/button");l=s(l,1);let u=require("primevue/tooltip");u=s(u,1);let d=require("tailwind-merge"),f=require("primevue/autocomplete");f=s(f,1);var p={class:`top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent`},m=(0,c.defineComponent)({__name:`TopButton`,props:{tooltip:{default:``},tooltipClass:{default:`text-xs`},label:{default:``},icon:{default:``},loading:{type:Boolean,default:!1},class:{default:``},outlined:{type:Boolean,default:!1},secondary:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},unstyled:{type:Boolean,default:!1},type:{default:`button`}},emits:[`click`],setup(e,{emit:t}){let n=(0,c.useSlots)(),r=(0,c.computed)(()=>!!n.icon),i=e,a=t,o=(0,c.computed)(()=>{let e=i.unstyled?``:i.secondary?`rounded-[10px] border px-2 py-2 font-bold`:i.outlined?`shrink-0 rounded-[10px] border-primary-800 px-4 py-2 text-primary-800 hover:bg-primary-50`:`rounded-[10px] !border-primary-900 bg-primary-900 px-3 py-2 font-bold text-white hover:!border-primary-800 hover:bg-primary-800 `;return(0,d.twMerge)(e,i.class)});return(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`span`,p,[(0,c.withDirectives)(((0,c.openBlock)(),(0,c.createBlock)((0,c.unref)(l.default),{type:e.type,label:e.label,disabled:e.disabled||e.loading,icon:r.value?void 0:e.icon||void 0,loading:e.loading,outlined:e.outlined||e.secondary,severity:e.secondary?`secondary`:void 0,class:(0,c.normalizeClass)(o.value),pt:{root:{class:o.value}},onClick:n[0]||=e=>a(`click`)},(0,c.createSlots)({_:2},[r.value?{name:`icon`,fn:(0,c.withCtx)(()=>[(0,c.renderSlot)(t.$slots,`icon`)]),key:`0`}:void 0]),1032,[`type`,`label`,`disabled`,`icon`,`loading`,`outlined`,`severity`,`class`,`pt`])),[[(0,c.unref)(u.default),{value:e.tooltip,class:e.tooltipClass},void 0,{top:!0}]])]))}}),h={class:`pointer-events-none absolute left-3 top-3 iconetop z-10 text-primary-800 dark:text-primary-500`},g={key:0,class:`pi pi-spin pi-spinner`},_={key:1,class:`pi pi-search`},v={key:1,class:`flex items-center gap-1 !text-sm`},y={class:`flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white`},b=[`onClick`],x={class:`line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis`},S={key:1,class:`flex min-h-[100px] flex-col items-center justify-center gap-2 py-2`},C={key:0,class:`text-xs font-medium text-primary-600`},w={key:2,class:`text-xs text-secondary-500`},T={key:1},E={key:1,class:`flex items-center gap-2 font-semibold`},D={key:1,class:`flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm`,style:{"white-space":`normal`}},O=[`title`],k={key:0,class:`top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100`},A={key:0,class:`rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white`},j={key:0,class:`rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white`},M=(0,c.defineComponent)({__name:`TopSelect`,props:{modelValue:{default:null},options:{default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},placeholder:{default:`Search...`},optionLabel:{type:[String,Function],default:`label`},optionKey:{default:`id`},optionPrefix:{default:``},showOptionPrefix:{type:Boolean,default:!1},showSelectedPrefix:{type:Boolean,default:!1},panelWidth:{default:null},scrollHeight:{default:`250px`},invalid:{type:Boolean,default:!1},showTooltip:{type:Boolean,default:!0},optionGroupLabel:{default:null},optionGroupChildren:{default:null},minQueryLength:{default:1},emptyMessage:{default:`No results found.`},loadingMessage:{default:`Loading...`},showLoadingMessage:{type:Boolean,default:!0},multiple:{type:Boolean,default:!1},forceSelection:{type:Boolean,default:!0},closeOnSelect:{type:Boolean,default:!1}},emits:[`update:modelValue`,`search`,`loadMore`,`clear`,`select`,`change`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=(0,c.useSlots)(),o=f.default,s=(0,c.ref)(``),l=(0,c.ref)(!1),d=(0,c.ref)(null),p=`top-select-${Math.random().toString(36).slice(2)}`,m=null,M=(0,c.computed)({get:()=>r.modelValue,set:e=>i(`update:modelValue`,e)});function N(e,t){return e==null?``:String(typeof e==`object`?e[t]??``:e)}function P(e){return e==null?``:typeof r.optionLabel==`function`?r.optionLabel(e):N(e,r.optionLabel)}function F(e){return r.optionPrefix?N(e,r.optionPrefix):``}function I(e,t=r.showSelectedPrefix){let n=P(e),i=F(e);return t&&i?`${i} - ${n}`:n}function L(e){let t=s.value;if(!t)return[{text:e,highlighted:!1}];let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),r=RegExp(`(${n})`,`gi`);return e.split(r).filter(Boolean).map(e=>({text:e,highlighted:e.toLowerCase()===t.toLowerCase()}))}function R(){d.value?.hide?.()}function z(){typeof window>`u`||window.dispatchEvent(new CustomEvent(`top-select:close-others`,{detail:{instanceId:p}}))}function B(e){e.detail?.instanceId!==p&&R()}function V(){if(r.disabled||m){R();return}l.value=!0,z()}function H(){r.closeOnSelect&&(l.value=!1,R(),(0,c.nextTick)(R),m&&clearTimeout(m),m=setTimeout(()=>{R(),m=null},200))}return t({hideDropdown:R}),(0,c.onMounted)(()=>window.addEventListener(`top-select:close-others`,B)),(0,c.onBeforeUnmount)(()=>{window.removeEventListener(`top-select:close-others`,B),m&&clearTimeout(m)}),(0,c.watch)(()=>r.disabled,e=>{e&&(l.value=!1,R())}),(0,c.watch)(()=>r.options,()=>{l.value||R()}),(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,{class:(0,c.normalizeClass)([`top-select top-solutions-component relative w-full`,{"pointer-events-none":e.disabled}]),onFocusin:V},[(0,c.createElementVNode)(`span`,h,[(0,c.renderSlot)(t.$slots,`icon`,{loading:e.loading},()=>[e.loading?((0,c.openBlock)(),(0,c.createElementBlock)(`i`,g)):((0,c.openBlock)(),(0,c.createElementBlock)(`i`,_))])]),(0,c.createVNode)((0,c.unref)(o),{ref_key:`autocompleteRef`,ref:d,modelValue:M.value,"onUpdate:modelValue":n[0]||=e=>M.value=e,"option-group-label":e.optionGroupLabel??void 0,"option-group-children":e.optionGroupChildren??void 0,suggestions:e.options,"data-key":e.optionKey,"option-label":e=>I(e),placeholder:e.placeholder,multiple:e.multiple,"min-length":e.minQueryLength,disabled:e.disabled,delay:500,"show-clear":!e.multiple&&!e.disabled,dropdown:``,"dropdown-mode":`current`,"complete-on-focus":!1,invalid:e.invalid,fluid:``,"force-selection":e.forceSelection,"input-class":`text-xs`,"virtual-scroller-options":{lazy:!0,onLazyLoad:e=>i(`loadMore`,e),itemSize:84,showLoader:!0,scrollHeight:e.scrollHeight},pt:{root:{class:[`w-full text-xs`,e.multiple?`h-auto`:`h-[40px]`].join(` `)},input:{class:[`w-full h-auto text-xs dark:text-zinc-100`,e.multiple?`border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent`:`border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:bg-zinc-800`].join(` `)},inputMultiple:{class:[`pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100`,e.disabled?`dark:!bg-zinc-700 dark:!text-zinc-400`:`dark:bg-zinc-800`].join(` `)},inputChip:{class:`py-0`},token:{class:`bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100`},removeTokenIcon:{class:`text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100`},panel:{class:`top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl`},listContainer:{class:`max-w-full overflow-x-hidden`,style:{overflowX:`hidden`,maxWidth:e.panelWidth??`85vw`,...e.panelWidth?{width:e.panelWidth}:{}}},list:{class:`max-w-full overflow-x-hidden`},option:{class:`max-w-full overflow-hidden min-h-[84px]`},placeholder:{class:`!text-xs`}},"search-message":` `,onClear:n[1]||=e=>{s.value=``,i(`clear`)},onItemSelect:n[2]||=e=>{s.value=``,i(`select`,e),H()},onComplete:n[3]||=t=>{if(e.disabled){R();return}s.value=t.query??``,z(),i(`search`,{...t,query:s.value})},onChange:n[4]||=e=>i(`change`,e)},(0,c.createSlots)({chip:(0,c.withCtx)(e=>[(0,c.unref)(a).chip?(0,c.renderSlot)(t.$slots,`chip`,(0,c.normalizeProps)((0,c.guardReactiveProps)(e)),void 0,void 0,0):((0,c.openBlock)(),(0,c.createElementBlock)(`div`,v,[(0,c.createElementVNode)(`div`,y,[(0,c.createElementVNode)(`i`,{class:`pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800`,onClick:t=>e.removeCallback(t)},null,8,b),(0,c.withDirectives)(((0,c.openBlock)(),(0,c.createElementBlock)(`span`,x,[(0,c.createTextVNode)((0,c.toDisplayString)(I(e.value)),1)])),[[(0,c.unref)(u.default),I(e.value),void 0,{top:!0}]])])]))]),empty:(0,c.withCtx)(()=>[(0,c.unref)(a).empty?(0,c.renderSlot)(t.$slots,`empty`,{},void 0,void 0,0):e.loading?((0,c.openBlock)(),(0,c.createElementBlock)(`div`,S,[n[5]||=(0,c.createElementVNode)(`span`,{class:`pi pi-spin pi-spinner text-2xl text-primary-600`},null,-1),e.showLoadingMessage?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,C,(0,c.toDisplayString)(e.loadingMessage),1)):(0,c.createCommentVNode)(``,!0)])):((0,c.openBlock)(),(0,c.createElementBlock)(`span`,w,(0,c.toDisplayString)(e.emptyMessage),1))]),"selected-item":(0,c.withCtx)(e=>[(0,c.unref)(a)[`selected-item`]?(0,c.renderSlot)(t.$slots,`selected-item`,(0,c.normalizeProps)((0,c.guardReactiveProps)(e)),void 0,void 0,0):e.item?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,T,(0,c.toDisplayString)(I(e.item)),1)):(0,c.createCommentVNode)(``,!0)]),optiongroup:(0,c.withCtx)(n=>[(0,c.unref)(a)[`option-group`]?(0,c.renderSlot)(t.$slots,`option-group`,(0,c.normalizeProps)((0,c.guardReactiveProps)(n)),void 0,void 0,0):((0,c.openBlock)(),(0,c.createElementBlock)(`div`,E,[n.option.icon?((0,c.openBlock)(),(0,c.createElementBlock)(`i`,{key:0,class:(0,c.normalizeClass)(n.option.icon)},null,2)):(0,c.createCommentVNode)(``,!0),(0,c.createElementVNode)(`span`,null,(0,c.toDisplayString)(n.option[e.optionGroupLabel??`label`]),1)]))]),option:(0,c.withCtx)(r=>[(0,c.unref)(a).option?(0,c.renderSlot)(t.$slots,`option`,(0,c.mergeProps)(r,{label:P(r.option),prefix:F(r.option),query:s.value}),void 0,void 0,0):(0,c.withDirectives)(((0,c.openBlock)(),(0,c.createElementBlock)(`div`,D,[(0,c.createElementVNode)(`span`,{class:`top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200`,title:P(r.option)},[e.showOptionPrefix&&F(r.option)?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,k,[((0,c.openBlock)(!0),(0,c.createElementBlock)(c.Fragment,null,(0,c.renderList)(L(F(r.option)),(e,t)=>((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:t},[e.highlighted?((0,c.openBlock)(),(0,c.createElementBlock)(`mark`,A,(0,c.toDisplayString)(e.text),1)):((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:1},[(0,c.createTextVNode)((0,c.toDisplayString)(e.text),1)],64))],64))),128)),n[6]||=(0,c.createElementVNode)(`span`,{class:`font-bold text-secondary-500 dark:text-zinc-400`},`\xA0-\xA0`,-1)])):(0,c.createCommentVNode)(``,!0),((0,c.openBlock)(!0),(0,c.createElementBlock)(c.Fragment,null,(0,c.renderList)(L(P(r.option)),(e,t)=>((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:t},[e.highlighted?((0,c.openBlock)(),(0,c.createElementBlock)(`mark`,j,(0,c.toDisplayString)(e.text),1)):((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:1},[(0,c.createTextVNode)((0,c.toDisplayString)(e.text),1)],64))],64))),128))],8,O)])),[[(0,c.unref)(u.default),e.showTooltip?P(r.option):null,void 0,{top:!0}]])]),_:2},[(0,c.unref)(a).footer?{name:`footer`,fn:(0,c.withCtx)(e=>[(0,c.renderSlot)(t.$slots,`footer`,(0,c.normalizeProps)((0,c.guardReactiveProps)(e)))]),key:`0`}:void 0]),1032,[`modelValue`,`option-group-label`,`option-group-children`,`suggestions`,`data-key`,`option-label`,`placeholder`,`multiple`,`min-length`,`disabled`,`show-clear`,`invalid`,`force-selection`,`virtual-scroller-options`,`pt`])],34))}});Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return M}});
|
|
2
|
+
//# sourceMappingURL=TopSelect-B30Dk8R7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopSelect-B30Dk8R7.cjs","names":[],"sources":["../src/components/TopButton.vue","../src/components/TopButton.vue","../src/components/TopSelect.vue","../src/components/TopSelect.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, useSlots } from 'vue'\r\nimport Button from 'primevue/button'\r\nimport vTooltip from 'primevue/tooltip'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tooltip?: string\r\n tooltipClass?: string\r\n label?: string\r\n icon?: string\r\n loading?: boolean\r\n class?: string\r\n outlined?: boolean\r\n secondary?: boolean\r\n disabled?: boolean\r\n unstyled?: boolean\r\n type?: 'button' | 'submit' | 'reset'\r\n }>(),\r\n {\r\n tooltip: '',\r\n tooltipClass: 'text-xs',\r\n label: '',\r\n icon: '',\r\n loading: false,\r\n class: '',\r\n outlined: false,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\n ? 'rounded-[10px] border px-2 py-2 font-bold'\r\n : props.outlined\r\n ? 'shrink-0 rounded-[10px] border-primary-800 px-4 py-2 text-primary-800 hover:bg-primary-50'\r\n : 'rounded-[10px] !border-primary-900 bg-primary-900 px-3 py-2 font-bold text-white hover:!border-primary-800 hover:bg-primary-800 '\r\n : ''\r\n\r\n return twMerge(baseClasses, props.class)\r\n})\r\n</script>\r\n\r\n<template>\r\n <span class=\"top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent\">\r\n <Button\r\n v-tooltip.top=\"{\r\n value: tooltip,\r\n class: tooltipClass,\r\n }\"\r\n :type=\"type\"\r\n :label=\"label\"\r\n :disabled=\"disabled || loading\"\r\n :icon=\"outrosIcones ? undefined : icon || undefined\"\r\n :loading=\"loading\"\r\n :outlined=\"outlined || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\n :class=\"buttonClasses\"\r\n :pt=\"{\r\n root: { class: buttonClasses },\r\n }\"\r\n @click=\"emit('click')\"\r\n >\r\n <template v-if=\"outrosIcones\" #icon>\r\n <slot name=\"icon\" />\r\n </template>\r\n </Button>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.top-button {\r\n width: fit-content;\r\n height: fit-content;\r\n border-radius: 12px;\r\n background-color: transparent;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useSlots } from 'vue'\r\nimport Button from 'primevue/button'\r\nimport vTooltip from 'primevue/tooltip'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tooltip?: string\r\n tooltipClass?: string\r\n label?: string\r\n icon?: string\r\n loading?: boolean\r\n class?: string\r\n outlined?: boolean\r\n secondary?: boolean\r\n disabled?: boolean\r\n unstyled?: boolean\r\n type?: 'button' | 'submit' | 'reset'\r\n }>(),\r\n {\r\n tooltip: '',\r\n tooltipClass: 'text-xs',\r\n label: '',\r\n icon: '',\r\n loading: false,\r\n class: '',\r\n outlined: false,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\n ? 'rounded-[10px] border px-2 py-2 font-bold'\r\n : props.outlined\r\n ? 'shrink-0 rounded-[10px] border-primary-800 px-4 py-2 text-primary-800 hover:bg-primary-50'\r\n : 'rounded-[10px] !border-primary-900 bg-primary-900 px-3 py-2 font-bold text-white hover:!border-primary-800 hover:bg-primary-800 '\r\n : ''\r\n\r\n return twMerge(baseClasses, props.class)\r\n})\r\n</script>\r\n\r\n<template>\r\n <span class=\"top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent\">\r\n <Button\r\n v-tooltip.top=\"{\r\n value: tooltip,\r\n class: tooltipClass,\r\n }\"\r\n :type=\"type\"\r\n :label=\"label\"\r\n :disabled=\"disabled || loading\"\r\n :icon=\"outrosIcones ? undefined : icon || undefined\"\r\n :loading=\"loading\"\r\n :outlined=\"outlined || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\n :class=\"buttonClasses\"\r\n :pt=\"{\r\n root: { class: buttonClasses },\r\n }\"\r\n @click=\"emit('click')\"\r\n >\r\n <template v-if=\"outrosIcones\" #icon>\r\n <slot name=\"icon\" />\r\n </template>\r\n </Button>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.top-button {\r\n width: fit-content;\r\n height: fit-content;\r\n border-radius: 12px;\r\n background-color: transparent;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport AutoComplete from 'primevue/autocomplete'\r\nimport vTooltip from 'primevue/tooltip'\r\n\r\ntype SelectOption = Record<string, unknown> | string | number\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: SelectOption | SelectOption[] | null\r\n options?: SelectOption[]\r\n loading?: boolean\r\n disabled?: boolean\r\n placeholder?: string\r\n optionLabel?: string | ((option: SelectOption) => string)\r\n optionKey?: string\r\n optionPrefix?: string\r\n showOptionPrefix?: boolean\r\n showSelectedPrefix?: boolean\r\n panelWidth?: string | null\r\n scrollHeight?: string\r\n invalid?: boolean\r\n showTooltip?: boolean\r\n optionGroupLabel?: string | null\r\n optionGroupChildren?: string | null\r\n minQueryLength?: number\r\n emptyMessage?: string\r\n loadingMessage?: string\r\n showLoadingMessage?: boolean\r\n multiple?: boolean\r\n forceSelection?: boolean\r\n closeOnSelect?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n loading: false,\r\n disabled: false,\r\n placeholder: 'Search...',\r\n optionLabel: 'label',\r\n optionKey: 'id',\r\n optionPrefix: '',\r\n showOptionPrefix: false,\r\n showSelectedPrefix: false,\r\n panelWidth: null,\r\n scrollHeight: '250px',\r\n invalid: false,\r\n showTooltip: true,\r\n optionGroupLabel: null,\r\n optionGroupChildren: null,\r\n minQueryLength: 1,\r\n emptyMessage: 'No results found.',\r\n loadingMessage: 'Loading...',\r\n showLoadingMessage: true,\r\n multiple: false,\r\n forceSelection: true,\r\n closeOnSelect: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: SelectOption | SelectOption[] | null]\r\n search: [event: { originalEvent: Event; query: string }]\r\n loadMore: [event: unknown]\r\n clear: []\r\n select: [event: unknown]\r\n change: [event: unknown]\r\n}>()\r\n\r\nconst slots = useSlots()\r\n// PrimeVue's slot types omit selected-item even though the runtime component supports it.\r\nconst TopAutoComplete = AutoComplete as any\r\nconst query = ref('')\r\nconst focused = ref(false)\r\nconst autocompleteRef = ref<{ hide?: () => void } | null>(null)\r\nconst instanceId = `top-select-${Math.random().toString(36).slice(2)}`\r\nlet closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\nconst valueProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value) => emit('update:modelValue', value),\r\n})\r\n\r\nfunction readOptionValue(option: SelectOption | null | undefined, key: string) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof option !== 'object') return String(option)\r\n return String(option[key] ?? '')\r\n}\r\n\r\nfunction getOptionLabel(option: SelectOption | null | undefined) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof props.optionLabel === 'function') return props.optionLabel(option)\r\n return readOptionValue(option, props.optionLabel)\r\n}\r\n\r\nfunction getOptionPrefix(option: SelectOption | null | undefined) {\r\n return props.optionPrefix ? readOptionValue(option, props.optionPrefix) : ''\r\n}\r\n\r\nfunction formatOptionLabel(option: SelectOption | null | undefined, includePrefix = props.showSelectedPrefix) {\r\n const label = getOptionLabel(option)\r\n const prefix = getOptionPrefix(option)\r\n return includePrefix && prefix ? `${prefix} - ${label}` : label\r\n}\r\n\r\nfunction getHighlightedParts(value: string) {\r\n const searchTerm = query.value\r\n if (!searchTerm) return [{ text: value, highlighted: false }]\r\n\r\n const escapedQuery = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n const regex = new RegExp(`(${escapedQuery})`, 'gi')\r\n return value.split(regex).filter(Boolean).map((part) => ({\r\n text: part,\r\n highlighted: part.toLowerCase() === searchTerm.toLowerCase(),\r\n }))\r\n}\r\n\r\nfunction hideDropdown() {\r\n autocompleteRef.value?.hide?.()\r\n}\r\n\r\nfunction closeOtherDropdowns() {\r\n if (typeof window === 'undefined') return\r\n window.dispatchEvent(new CustomEvent('top-select:close-others', { detail: { instanceId } }))\r\n}\r\n\r\nfunction handleOtherDropdownClosing(event: Event) {\r\n const customEvent = event as CustomEvent<{ instanceId?: string }>\r\n if (customEvent.detail?.instanceId !== instanceId) hideDropdown()\r\n}\r\n\r\nfunction handleFocusIn() {\r\n if (props.disabled || closeTimer) {\r\n hideDropdown()\r\n return\r\n }\r\n focused.value = true\r\n closeOtherDropdowns()\r\n}\r\n\r\nfunction closeAfterSelection() {\r\n if (!props.closeOnSelect) return\r\n focused.value = false\r\n hideDropdown()\r\n nextTick(hideDropdown)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n closeTimer = setTimeout(() => {\r\n hideDropdown()\r\n closeTimer = null\r\n }, 200)\r\n}\r\n\r\ndefineExpose({ hideDropdown })\r\n\r\nonMounted(() => window.addEventListener('top-select:close-others', handleOtherDropdownClosing))\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('top-select:close-others', handleOtherDropdownClosing)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n})\r\n\r\nwatch(() => props.disabled, (disabled) => {\r\n if (disabled) {\r\n focused.value = false\r\n hideDropdown()\r\n }\r\n})\r\n\r\nwatch(() => props.options, () => {\r\n if (!focused.value) hideDropdown()\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-select top-solutions-component relative w-full\" :class=\"{ 'pointer-events-none': disabled }\" @focusin=\"handleFocusIn\">\r\n <span class=\"pointer-events-none absolute left-3 top-3 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\n <slot name=\"icon\" :loading=\"loading\">\r\n <i v-if=\"loading\" class=\"pi pi-spin pi-spinner\" />\r\n <i v-else class=\"pi pi-search\" />\r\n </slot>\r\n </span>\r\n\r\n <TopAutoComplete\r\n ref=\"autocompleteRef\"\r\n v-model=\"valueProxy\"\r\n :option-group-label=\"optionGroupLabel ?? undefined\"\r\n :option-group-children=\"optionGroupChildren ?? undefined\"\r\n :suggestions=\"options\"\r\n :data-key=\"optionKey\"\r\n :option-label=\"(option: SelectOption) => formatOptionLabel(option)\"\r\n :placeholder=\"placeholder\"\r\n :multiple=\"multiple\"\r\n :min-length=\"minQueryLength\"\r\n :disabled=\"disabled\"\r\n :delay=\"500\"\r\n :show-clear=\"!multiple && !disabled\"\r\n dropdown\r\n dropdown-mode=\"current\"\r\n :complete-on-focus=\"false\"\r\n :invalid=\"invalid\"\r\n fluid\r\n :force-selection=\"forceSelection\"\r\n input-class=\"text-xs\"\r\n :virtual-scroller-options=\"{\r\n lazy: true,\r\n onLazyLoad: (event: unknown) => emit('loadMore', event),\r\n itemSize: 84,\r\n showLoader: true,\r\n scrollHeight,\r\n }\"\r\n :pt=\"{\r\n root: { class: ['w-full text-xs', multiple ? 'h-auto' : 'h-[40px]'].join(' ') },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:bg-zinc-800'].join(' ') },\r\n inputMultiple: { class: ['pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:bg-zinc-800'].join(' ') },\r\n inputChip: { class: 'py-0' },\r\n token: { class: 'bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100' },\r\n removeTokenIcon: { class: 'text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100' },\r\n panel: { class: 'top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl' },\r\n listContainer: { class: 'max-w-full overflow-x-hidden', style: { overflowX: 'hidden', maxWidth: panelWidth ?? '85vw', ...(panelWidth ? { width: panelWidth } : {}) } },\r\n list: { class: 'max-w-full overflow-x-hidden' }, option: { class: 'max-w-full overflow-hidden min-h-[84px]' }, placeholder: { class: '!text-xs' },\r\n }\"\r\n search-message=\" \"\r\n @clear=\"query = ''; emit('clear')\"\r\n @item-select=\"(event: unknown) => { query = ''; emit('select', event); closeAfterSelection() }\"\r\n @complete=\"(event: { originalEvent: Event; query?: string }) => { if (disabled) { hideDropdown(); return }; query = event.query ?? ''; closeOtherDropdowns(); emit('search', { ...event, query: query }) }\"\r\n @change=\"(event: unknown) => emit('change', event)\"\r\n >\r\n <template #chip=\"slotProps\">\r\n <slot v-if=\"slots.chip\" name=\"chip\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-1 !text-sm\">\r\n <div class=\"flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white\">\r\n <i class=\"pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800\" @click=\"slotProps.removeCallback($event)\" />\r\n <span v-tooltip.top=\"formatOptionLabel(slotProps.value)\" class=\"line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis\">{{ formatOptionLabel(slotProps.value) }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <template #empty>\r\n <slot v-if=\"slots.empty\" name=\"empty\" />\r\n <div v-else-if=\"loading\" class=\"flex min-h-[100px] flex-col items-center justify-center gap-2 py-2\">\r\n <span class=\"pi pi-spin pi-spinner text-2xl text-primary-600\" />\r\n <span v-if=\"showLoadingMessage\" class=\"text-xs font-medium text-primary-600\">{{ loadingMessage }}</span>\r\n </div>\r\n <span v-else class=\"text-xs text-secondary-500\">{{ emptyMessage }}</span>\r\n </template>\r\n\r\n <template #selected-item=\"slotProps\">\r\n <slot v-if=\"slots['selected-item']\" name=\"selected-item\" v-bind=\"slotProps\" />\r\n <span v-else-if=\"slotProps.item\">{{ formatOptionLabel(slotProps.item) }}</span>\r\n </template>\r\n\r\n <template #optiongroup=\"slotProps\">\r\n <slot v-if=\"slots['option-group']\" name=\"option-group\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-2 font-semibold\">\r\n <i v-if=\"slotProps.option.icon\" :class=\"slotProps.option.icon\" />\r\n <span>{{ slotProps.option[optionGroupLabel ?? 'label'] }}</span>\r\n </div>\r\n </template>\r\n\r\n <template #option=\"slotProps\">\r\n <slot v-if=\"slots.option\" name=\"option\" v-bind=\"slotProps\" :label=\"getOptionLabel(slotProps.option)\" :prefix=\"getOptionPrefix(slotProps.option)\" :query=\"query\" />\r\n <div v-else v-tooltip.top=\"showTooltip ? getOptionLabel(slotProps.option) : null\" class=\"flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm\" style=\"white-space: normal\">\r\n <span class=\"top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200\" :title=\"getOptionLabel(slotProps.option)\">\r\n <span v-if=\"showOptionPrefix && getOptionPrefix(slotProps.option)\" class=\"top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100\">\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionPrefix(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template><span class=\"font-bold text-secondary-500 dark:text-zinc-400\"> - </span>\r\n </span>\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionLabel(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template>\r\n </span>\r\n </div>\r\n </template>\r\n\r\n <template v-if=\"slots.footer\" #footer=\"slotProps\"><slot name=\"footer\" v-bind=\"slotProps\" /></template>\r\n </TopAutoComplete>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-select {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input {\r\n padding-left: 35px !important;\r\n border-radius: 10px 0 0 10px !important;\r\n}\r\n\r\n.top-select .p-autocomplete-dropdown {\r\n border-radius: 0 10px 10px 0 !important;\r\n}\r\n\r\n.top-select-option-prefix {\r\n color: var(--top-primary-800) !important;\r\n}\r\n\r\n.dark .top-select-option-prefix {\r\n color: var(--top-primary-100) !important;\r\n}\r\n\r\n.top-select-option-label {\r\n min-width: 0;\r\n flex: 1;\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n -webkit-line-clamp: 2;\r\n line-clamp: 2;\r\n overflow: hidden;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.top-select-panel,\r\n.top-select-panel .p-virtualscroller,\r\n.top-select-panel .p-autocomplete-list-container,\r\n.top-select-panel .p-autocomplete-list { overflow-x: hidden !important; }\r\n.top-select-panel .p-autocomplete-option { max-width: 100%; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport AutoComplete from 'primevue/autocomplete'\r\nimport vTooltip from 'primevue/tooltip'\r\n\r\ntype SelectOption = Record<string, unknown> | string | number\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: SelectOption | SelectOption[] | null\r\n options?: SelectOption[]\r\n loading?: boolean\r\n disabled?: boolean\r\n placeholder?: string\r\n optionLabel?: string | ((option: SelectOption) => string)\r\n optionKey?: string\r\n optionPrefix?: string\r\n showOptionPrefix?: boolean\r\n showSelectedPrefix?: boolean\r\n panelWidth?: string | null\r\n scrollHeight?: string\r\n invalid?: boolean\r\n showTooltip?: boolean\r\n optionGroupLabel?: string | null\r\n optionGroupChildren?: string | null\r\n minQueryLength?: number\r\n emptyMessage?: string\r\n loadingMessage?: string\r\n showLoadingMessage?: boolean\r\n multiple?: boolean\r\n forceSelection?: boolean\r\n closeOnSelect?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n loading: false,\r\n disabled: false,\r\n placeholder: 'Search...',\r\n optionLabel: 'label',\r\n optionKey: 'id',\r\n optionPrefix: '',\r\n showOptionPrefix: false,\r\n showSelectedPrefix: false,\r\n panelWidth: null,\r\n scrollHeight: '250px',\r\n invalid: false,\r\n showTooltip: true,\r\n optionGroupLabel: null,\r\n optionGroupChildren: null,\r\n minQueryLength: 1,\r\n emptyMessage: 'No results found.',\r\n loadingMessage: 'Loading...',\r\n showLoadingMessage: true,\r\n multiple: false,\r\n forceSelection: true,\r\n closeOnSelect: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: SelectOption | SelectOption[] | null]\r\n search: [event: { originalEvent: Event; query: string }]\r\n loadMore: [event: unknown]\r\n clear: []\r\n select: [event: unknown]\r\n change: [event: unknown]\r\n}>()\r\n\r\nconst slots = useSlots()\r\n// PrimeVue's slot types omit selected-item even though the runtime component supports it.\r\nconst TopAutoComplete = AutoComplete as any\r\nconst query = ref('')\r\nconst focused = ref(false)\r\nconst autocompleteRef = ref<{ hide?: () => void } | null>(null)\r\nconst instanceId = `top-select-${Math.random().toString(36).slice(2)}`\r\nlet closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\nconst valueProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value) => emit('update:modelValue', value),\r\n})\r\n\r\nfunction readOptionValue(option: SelectOption | null | undefined, key: string) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof option !== 'object') return String(option)\r\n return String(option[key] ?? '')\r\n}\r\n\r\nfunction getOptionLabel(option: SelectOption | null | undefined) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof props.optionLabel === 'function') return props.optionLabel(option)\r\n return readOptionValue(option, props.optionLabel)\r\n}\r\n\r\nfunction getOptionPrefix(option: SelectOption | null | undefined) {\r\n return props.optionPrefix ? readOptionValue(option, props.optionPrefix) : ''\r\n}\r\n\r\nfunction formatOptionLabel(option: SelectOption | null | undefined, includePrefix = props.showSelectedPrefix) {\r\n const label = getOptionLabel(option)\r\n const prefix = getOptionPrefix(option)\r\n return includePrefix && prefix ? `${prefix} - ${label}` : label\r\n}\r\n\r\nfunction getHighlightedParts(value: string) {\r\n const searchTerm = query.value\r\n if (!searchTerm) return [{ text: value, highlighted: false }]\r\n\r\n const escapedQuery = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n const regex = new RegExp(`(${escapedQuery})`, 'gi')\r\n return value.split(regex).filter(Boolean).map((part) => ({\r\n text: part,\r\n highlighted: part.toLowerCase() === searchTerm.toLowerCase(),\r\n }))\r\n}\r\n\r\nfunction hideDropdown() {\r\n autocompleteRef.value?.hide?.()\r\n}\r\n\r\nfunction closeOtherDropdowns() {\r\n if (typeof window === 'undefined') return\r\n window.dispatchEvent(new CustomEvent('top-select:close-others', { detail: { instanceId } }))\r\n}\r\n\r\nfunction handleOtherDropdownClosing(event: Event) {\r\n const customEvent = event as CustomEvent<{ instanceId?: string }>\r\n if (customEvent.detail?.instanceId !== instanceId) hideDropdown()\r\n}\r\n\r\nfunction handleFocusIn() {\r\n if (props.disabled || closeTimer) {\r\n hideDropdown()\r\n return\r\n }\r\n focused.value = true\r\n closeOtherDropdowns()\r\n}\r\n\r\nfunction closeAfterSelection() {\r\n if (!props.closeOnSelect) return\r\n focused.value = false\r\n hideDropdown()\r\n nextTick(hideDropdown)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n closeTimer = setTimeout(() => {\r\n hideDropdown()\r\n closeTimer = null\r\n }, 200)\r\n}\r\n\r\ndefineExpose({ hideDropdown })\r\n\r\nonMounted(() => window.addEventListener('top-select:close-others', handleOtherDropdownClosing))\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('top-select:close-others', handleOtherDropdownClosing)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n})\r\n\r\nwatch(() => props.disabled, (disabled) => {\r\n if (disabled) {\r\n focused.value = false\r\n hideDropdown()\r\n }\r\n})\r\n\r\nwatch(() => props.options, () => {\r\n if (!focused.value) hideDropdown()\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-select top-solutions-component relative w-full\" :class=\"{ 'pointer-events-none': disabled }\" @focusin=\"handleFocusIn\">\r\n <span class=\"pointer-events-none absolute left-3 top-3 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\n <slot name=\"icon\" :loading=\"loading\">\r\n <i v-if=\"loading\" class=\"pi pi-spin pi-spinner\" />\r\n <i v-else class=\"pi pi-search\" />\r\n </slot>\r\n </span>\r\n\r\n <TopAutoComplete\r\n ref=\"autocompleteRef\"\r\n v-model=\"valueProxy\"\r\n :option-group-label=\"optionGroupLabel ?? undefined\"\r\n :option-group-children=\"optionGroupChildren ?? undefined\"\r\n :suggestions=\"options\"\r\n :data-key=\"optionKey\"\r\n :option-label=\"(option: SelectOption) => formatOptionLabel(option)\"\r\n :placeholder=\"placeholder\"\r\n :multiple=\"multiple\"\r\n :min-length=\"minQueryLength\"\r\n :disabled=\"disabled\"\r\n :delay=\"500\"\r\n :show-clear=\"!multiple && !disabled\"\r\n dropdown\r\n dropdown-mode=\"current\"\r\n :complete-on-focus=\"false\"\r\n :invalid=\"invalid\"\r\n fluid\r\n :force-selection=\"forceSelection\"\r\n input-class=\"text-xs\"\r\n :virtual-scroller-options=\"{\r\n lazy: true,\r\n onLazyLoad: (event: unknown) => emit('loadMore', event),\r\n itemSize: 84,\r\n showLoader: true,\r\n scrollHeight,\r\n }\"\r\n :pt=\"{\r\n root: { class: ['w-full text-xs', multiple ? 'h-auto' : 'h-[40px]'].join(' ') },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:bg-zinc-800'].join(' ') },\r\n inputMultiple: { class: ['pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:bg-zinc-800'].join(' ') },\r\n inputChip: { class: 'py-0' },\r\n token: { class: 'bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100' },\r\n removeTokenIcon: { class: 'text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100' },\r\n panel: { class: 'top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl' },\r\n listContainer: { class: 'max-w-full overflow-x-hidden', style: { overflowX: 'hidden', maxWidth: panelWidth ?? '85vw', ...(panelWidth ? { width: panelWidth } : {}) } },\r\n list: { class: 'max-w-full overflow-x-hidden' }, option: { class: 'max-w-full overflow-hidden min-h-[84px]' }, placeholder: { class: '!text-xs' },\r\n }\"\r\n search-message=\" \"\r\n @clear=\"query = ''; emit('clear')\"\r\n @item-select=\"(event: unknown) => { query = ''; emit('select', event); closeAfterSelection() }\"\r\n @complete=\"(event: { originalEvent: Event; query?: string }) => { if (disabled) { hideDropdown(); return }; query = event.query ?? ''; closeOtherDropdowns(); emit('search', { ...event, query: query }) }\"\r\n @change=\"(event: unknown) => emit('change', event)\"\r\n >\r\n <template #chip=\"slotProps\">\r\n <slot v-if=\"slots.chip\" name=\"chip\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-1 !text-sm\">\r\n <div class=\"flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white\">\r\n <i class=\"pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800\" @click=\"slotProps.removeCallback($event)\" />\r\n <span v-tooltip.top=\"formatOptionLabel(slotProps.value)\" class=\"line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis\">{{ formatOptionLabel(slotProps.value) }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <template #empty>\r\n <slot v-if=\"slots.empty\" name=\"empty\" />\r\n <div v-else-if=\"loading\" class=\"flex min-h-[100px] flex-col items-center justify-center gap-2 py-2\">\r\n <span class=\"pi pi-spin pi-spinner text-2xl text-primary-600\" />\r\n <span v-if=\"showLoadingMessage\" class=\"text-xs font-medium text-primary-600\">{{ loadingMessage }}</span>\r\n </div>\r\n <span v-else class=\"text-xs text-secondary-500\">{{ emptyMessage }}</span>\r\n </template>\r\n\r\n <template #selected-item=\"slotProps\">\r\n <slot v-if=\"slots['selected-item']\" name=\"selected-item\" v-bind=\"slotProps\" />\r\n <span v-else-if=\"slotProps.item\">{{ formatOptionLabel(slotProps.item) }}</span>\r\n </template>\r\n\r\n <template #optiongroup=\"slotProps\">\r\n <slot v-if=\"slots['option-group']\" name=\"option-group\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-2 font-semibold\">\r\n <i v-if=\"slotProps.option.icon\" :class=\"slotProps.option.icon\" />\r\n <span>{{ slotProps.option[optionGroupLabel ?? 'label'] }}</span>\r\n </div>\r\n </template>\r\n\r\n <template #option=\"slotProps\">\r\n <slot v-if=\"slots.option\" name=\"option\" v-bind=\"slotProps\" :label=\"getOptionLabel(slotProps.option)\" :prefix=\"getOptionPrefix(slotProps.option)\" :query=\"query\" />\r\n <div v-else v-tooltip.top=\"showTooltip ? getOptionLabel(slotProps.option) : null\" class=\"flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm\" style=\"white-space: normal\">\r\n <span class=\"top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200\" :title=\"getOptionLabel(slotProps.option)\">\r\n <span v-if=\"showOptionPrefix && getOptionPrefix(slotProps.option)\" class=\"top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100\">\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionPrefix(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template><span class=\"font-bold text-secondary-500 dark:text-zinc-400\"> - </span>\r\n </span>\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionLabel(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template>\r\n </span>\r\n </div>\r\n </template>\r\n\r\n <template v-if=\"slots.footer\" #footer=\"slotProps\"><slot name=\"footer\" v-bind=\"slotProps\" /></template>\r\n </TopAutoComplete>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-select {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input {\r\n padding-left: 35px !important;\r\n border-radius: 10px 0 0 10px !important;\r\n}\r\n\r\n.top-select .p-autocomplete-dropdown {\r\n border-radius: 0 10px 10px 0 !important;\r\n}\r\n\r\n.top-select-option-prefix {\r\n color: var(--top-primary-800) !important;\r\n}\r\n\r\n.dark .top-select-option-prefix {\r\n color: var(--top-primary-100) !important;\r\n}\r\n\r\n.top-select-option-label {\r\n min-width: 0;\r\n flex: 1;\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n -webkit-line-clamp: 2;\r\n line-clamp: 2;\r\n overflow: hidden;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.top-select-panel,\r\n.top-select-panel .p-virtualscroller,\r\n.top-select-panel .p-autocomplete-list-container,\r\n.top-select-panel .p-autocomplete-list { overflow-x: hidden !important; }\r\n.top-select-panel .p-autocomplete-option { max-width: 100%; }\r\n</style>\r\n"],"mappings":"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"}
|