Autocomplete works with array and objects
All checks were successful
Deploy Docs to Synology / deploy (push) Successful in 4s
All checks were successful
Deploy Docs to Synology / deploy (push) Successful in 4s
This commit is contained in:
@@ -36,9 +36,9 @@ Unlike heavy frameworks, SigPro UI focuses on a **"Zero-Build"** philosophy, all
|
|||||||
### ESM / Bundler
|
### ESM / Bundler
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install sigpro sigpro-ui
|
npm install sigpro-ui
|
||||||
# or
|
# or
|
||||||
bun add sigpro sigpro-ui
|
bun add sigpro-ui
|
||||||
```
|
```
|
||||||
|
|
||||||
### CDN (Browser - All-in-One)
|
### CDN (Browser - All-in-One)
|
||||||
@@ -57,8 +57,7 @@ bun add sigpro sigpro-ui
|
|||||||
### ESM / Modular (Tree Shaking)
|
### ESM / Modular (Tree Shaking)
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
import { $, mount, watch, h } from "sigpro";
|
import { $, mount, watch, h, Button, Modal, Input, Alert } from "sigpro-ui";
|
||||||
import { Button, Modal, Input, Alert } from "sigpro-ui";
|
|
||||||
import "sigpro-ui/css";
|
import "sigpro-ui/css";
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
|
|||||||
6
dist/sigpro-ui.css
vendored
6
dist/sigpro-ui.css
vendored
@@ -3408,6 +3408,9 @@
|
|||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.mb-2 {
|
||||||
|
margin-bottom: calc(var(--spacing) * 2);
|
||||||
|
}
|
||||||
.mb-4 {
|
.mb-4 {
|
||||||
margin-bottom: calc(var(--spacing) * 4);
|
margin-bottom: calc(var(--spacing) * 4);
|
||||||
}
|
}
|
||||||
@@ -4495,6 +4498,9 @@
|
|||||||
.gap-8 {
|
.gap-8 {
|
||||||
gap: calc(var(--spacing) * 8);
|
gap: calc(var(--spacing) * 8);
|
||||||
}
|
}
|
||||||
|
.gap-10 {
|
||||||
|
gap: calc(var(--spacing) * 10);
|
||||||
|
}
|
||||||
.space-y-1 {
|
.space-y-1 {
|
||||||
:where(& > :not(:last-child)) {
|
:where(& > :not(:last-child)) {
|
||||||
--tw-space-y-reverse: 0;
|
--tw-space-y-reverse: 0;
|
||||||
|
|||||||
8
dist/sigpro-ui.esm.js
vendored
8
dist/sigpro-ui.esm.js
vendored
@@ -637,7 +637,11 @@ if (typeof window !== "undefined") {
|
|||||||
var val = (val2) => typeof val2 === "function" ? val2() : val2;
|
var val = (val2) => typeof val2 === "function" ? val2() : val2;
|
||||||
var getBy = (item, field = "label") => item && typeof item === "object" ? item[field] : item;
|
var getBy = (item, field = "label") => item && typeof item === "object" ? item[field] : item;
|
||||||
var cls = (...classes) => classes.filter(Boolean).join(" ").trim();
|
var cls = (...classes) => classes.filter(Boolean).join(" ").trim();
|
||||||
var filterBy = (items, query, field = "label", q = String(query).toLowerCase()) => !query ? val(items) : val(items).filter((item) => String(item && typeof item === "object" ? item[field] : item).toLowerCase().includes(q));
|
var filterBy = (items, query, field = "label") => {
|
||||||
|
const q = String(val(query) || "").toLowerCase();
|
||||||
|
const list = (val(items) || []).map((i) => typeof i === "object" ? i : { label: i, value: i });
|
||||||
|
return !q ? list : list.filter((item) => String(item[field] || "").toLowerCase().includes(q));
|
||||||
|
};
|
||||||
var rand = (r) => `${r}-${Math.random().toString(36).slice(2, 9)}`;
|
var rand = (r) => `${r}-${Math.random().toString(36).slice(2, 9)}`;
|
||||||
var hide = () => document.activeElement?.blur();
|
var hide = () => document.activeElement?.blur();
|
||||||
var lang = {
|
var lang = {
|
||||||
@@ -694,7 +698,7 @@ var Autocomplete = ({ items, value, onselect, placeholder = "...", ...props }) =
|
|||||||
onmousedown: (e) => e.preventDefault(),
|
onmousedown: (e) => e.preventDefault(),
|
||||||
onclick: () => pick(item)
|
onclick: () => pick(item)
|
||||||
}, getBy(item))
|
}, getBy(item))
|
||||||
]), (item) => getBy(item)),
|
]), "value"),
|
||||||
() => filtered().length === 0 ? h("li", { class: "p-4 opacity-50 text-center" }, "Sin resultados") : null
|
() => filtered().length === 0 ? h("li", { class: "p-4 opacity-50 text-center" }, "Sin resultados") : null
|
||||||
]))
|
]))
|
||||||
]);
|
]);
|
||||||
|
|||||||
4
dist/sigpro-ui.esm.min.js
vendored
4
dist/sigpro-ui.esm.min.js
vendored
File diff suppressed because one or more lines are too long
8
dist/sigpro-ui.js
vendored
8
dist/sigpro-ui.js
vendored
@@ -667,7 +667,11 @@
|
|||||||
var val = (val2) => typeof val2 === "function" ? val2() : val2;
|
var val = (val2) => typeof val2 === "function" ? val2() : val2;
|
||||||
var getBy = (item, field = "label") => item && typeof item === "object" ? item[field] : item;
|
var getBy = (item, field = "label") => item && typeof item === "object" ? item[field] : item;
|
||||||
var cls = (...classes) => classes.filter(Boolean).join(" ").trim();
|
var cls = (...classes) => classes.filter(Boolean).join(" ").trim();
|
||||||
var filterBy = (items, query, field = "label", q = String(query).toLowerCase()) => !query ? val(items) : val(items).filter((item) => String(item && typeof item === "object" ? item[field] : item).toLowerCase().includes(q));
|
var filterBy = (items, query, field = "label") => {
|
||||||
|
const q = String(val(query) || "").toLowerCase();
|
||||||
|
const list = (val(items) || []).map((i) => typeof i === "object" ? i : { label: i, value: i });
|
||||||
|
return !q ? list : list.filter((item) => String(item[field] || "").toLowerCase().includes(q));
|
||||||
|
};
|
||||||
var rand = (r) => `${r}-${Math.random().toString(36).slice(2, 9)}`;
|
var rand = (r) => `${r}-${Math.random().toString(36).slice(2, 9)}`;
|
||||||
var hide = () => document.activeElement?.blur();
|
var hide = () => document.activeElement?.blur();
|
||||||
var lang = {
|
var lang = {
|
||||||
@@ -724,7 +728,7 @@
|
|||||||
onmousedown: (e) => e.preventDefault(),
|
onmousedown: (e) => e.preventDefault(),
|
||||||
onclick: () => pick(item)
|
onclick: () => pick(item)
|
||||||
}, getBy(item))
|
}, getBy(item))
|
||||||
]), (item) => getBy(item)),
|
]), "value"),
|
||||||
() => filtered().length === 0 ? h("li", { class: "p-4 opacity-50 text-center" }, "Sin resultados") : null
|
() => filtered().length === 0 ? h("li", { class: "p-4 opacity-50 text-center" }, "Sin resultados") : null
|
||||||
]))
|
]))
|
||||||
]);
|
]);
|
||||||
|
|||||||
2
dist/sigpro-ui.min.css
vendored
2
dist/sigpro-ui.min.css
vendored
File diff suppressed because one or more lines are too long
4
dist/sigpro-ui.min.js
vendored
4
dist/sigpro-ui.min.js
vendored
File diff suppressed because one or more lines are too long
49
docs/demo.md
49
docs/demo.md
@@ -59,26 +59,45 @@ mount(
|
|||||||
<div id="demo-autocomplete"></div>
|
<div id="demo-autocomplete"></div>
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const selected = $("");
|
const selectedFruit = $("");
|
||||||
const items = [
|
const fruitItems = [
|
||||||
"Apple",
|
{ label: "Apple", value: "apple" },
|
||||||
"Banana",
|
{ label: "Banana", value: "banana" },
|
||||||
"Orange",
|
{ label: "Orange", value: "orange" },
|
||||||
"Mango",
|
{ label: "Mango", value: "mango" },
|
||||||
"Carrot",
|
{ label: "Carrot", value: "carrot" },
|
||||||
"Broccoli",
|
{ label: "Broccoli", value: "broccoli" },
|
||||||
"Spinach",
|
{ label: "Spinach", value: "spinach" },
|
||||||
"Potato",
|
{ label: "Potato", value: "potato" },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const selectedColor = $("");
|
||||||
|
const colorItems = ["Red", "Blue", "Green", "Yellow", "Black", "White", "Purple", "Cyan"];
|
||||||
|
|
||||||
mount(
|
mount(
|
||||||
|
h('div', { class: 'p-8 flex flex-col gap-10' }, [
|
||||||
|
h('div', {}, [
|
||||||
|
h('h3', { class: 'font-bold mb-2' }, 'Objetos:'),
|
||||||
Autocomplete({
|
Autocomplete({
|
||||||
items,
|
items: fruitItems,
|
||||||
value: selected,
|
value: selectedFruit,
|
||||||
placeholder: "Search fruit or vegetable…",
|
placeholder: "Search fruit...",
|
||||||
onselect: (val) => console.log("Selected:", val),
|
onselect: (v) => console.log("Obj:", v)
|
||||||
}),
|
}),
|
||||||
"#demo-autocomplete",
|
h('span', { class: 'text-xs' }, () => `Signal: ${selectedFruit()}`)
|
||||||
|
]),
|
||||||
|
h('div', {}, [
|
||||||
|
h('h3', { class: 'font-bold mb-2' }, 'Array Plano:'),
|
||||||
|
Autocomplete({
|
||||||
|
items: colorItems,
|
||||||
|
value: selectedColor,
|
||||||
|
placeholder: "Search color...",
|
||||||
|
onselect: (v) => console.log("Str:", v)
|
||||||
|
}),
|
||||||
|
h('span', { class: 'text-xs' }, () => `Signal: ${selectedColor()}`)
|
||||||
|
])
|
||||||
|
]),
|
||||||
|
"#demo-autocomplete"
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ bun add sigpro-ui
|
|||||||
### ESM / Module usage
|
### ESM / Module usage
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
import { Input, Button, Alert } from "sigpro-ui";
|
import { $, Input, Button, Alert } from "sigpro-ui";
|
||||||
import "sigpro-ui/css";
|
import "sigpro-ui/css";
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
|
|||||||
2
docs/sigpro-ui.min.css
vendored
2
docs/sigpro-ui.min.css
vendored
File diff suppressed because one or more lines are too long
4
docs/sigpro-ui.min.js
vendored
4
docs/sigpro-ui.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "sigpro-ui",
|
"name": "sigpro-ui",
|
||||||
"version": "1.2.8",
|
"version": "1.2.9",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"author": {
|
"author": {
|
||||||
@@ -43,11 +43,10 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://sigpro.natxocc.com/ui/#/",
|
"homepage": "https://sigpro.natxocc.com/ui/#/",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"del": "bun pm cache rm && rm -f bun.lockb $$ rm -f bun.lock",
|
"del": "bun pm cache rm && rm -f bun.lockb && rm -f bun.lock",
|
||||||
"clean": "rm -rf ./dist ./css/*.css ./docs/*.js ./docs/*.css",
|
"clean": "rm -rf ./dist ./css/*.css ./docs/*.js ./docs/*.css",
|
||||||
"build:css": "tailwindcss -i ./sigpro-ui.css -o ./dist/sigpro-ui.css --content './src/**/*.js' && du -h ./dist/sigpro-ui.css",
|
"build:css": "tailwindcss -i ./sigpro-ui.css -o ./dist/sigpro-ui.css --content './src/**/*.js' && du -h ./dist/sigpro-ui.css",
|
||||||
"build:cssmin": "tailwindcss -i ./sigpro-ui.css -o ./dist/sigpro-ui.min.css --content './src/**/*.js' --minify && du -h ./dist/sigpro-ui.css",
|
"build:cssmin": "tailwindcss -i ./sigpro-ui.css -o ./dist/sigpro-ui.min.css --content './src/**/*.js' --minify && du -h ./dist/sigpro-ui.css",
|
||||||
"build:js": "bun run build:js:iife && bun run build:js:esm",
|
|
||||||
"build:js:iife": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.js --format=iife --global-name=SigProUI",
|
"build:js:iife": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.js --format=iife --global-name=SigProUI",
|
||||||
"build:js:iife:min": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.min.js --format=iife --global-name=SigProUI --minify",
|
"build:js:iife:min": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.min.js --format=iife --global-name=SigProUI --minify",
|
||||||
"build:js:esm": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.esm.js --format=esm",
|
"build:js:esm": "bun build ./index.js --bundle --outfile=./dist/sigpro-ui.esm.js --format=esm",
|
||||||
|
|||||||
@@ -11,7 +11,11 @@ export { $, $$, watch, batch, h, Fragment, mount, when, each, router, onUnmount,
|
|||||||
const val = val => typeof val === "function" ? val() : val;
|
const val = val => typeof val === "function" ? val() : val;
|
||||||
const getBy = (item, field = 'label') => (item && typeof item === 'object') ? item[field] : item;
|
const getBy = (item, field = 'label') => (item && typeof item === 'object') ? item[field] : item;
|
||||||
const cls = (...classes) => classes.filter(Boolean).join(' ').trim();
|
const cls = (...classes) => classes.filter(Boolean).join(' ').trim();
|
||||||
const filterBy = (items, query, field = 'label', q = String(query).toLowerCase()) => !query ? val(items) : val(items).filter(item => String(item && typeof item === 'object' ? item[field] : item).toLowerCase().includes(q));
|
const filterBy = (items, query, field = 'label') => {
|
||||||
|
const q = String(val(query) || '').toLowerCase();
|
||||||
|
const list = (val(items) || []).map(i => typeof i === 'object' ? i : { label: i, value: i });
|
||||||
|
return !q ? list : list.filter(item => String(item[field] || '').toLowerCase().includes(q));
|
||||||
|
};
|
||||||
const rand = (r) => `${r}-${Math.random().toString(36).slice(2, 9)}`
|
const rand = (r) => `${r}-${Math.random().toString(36).slice(2, 9)}`
|
||||||
export const hide = () => document.activeElement?.blur()
|
export const hide = () => document.activeElement?.blur()
|
||||||
|
|
||||||
@@ -78,7 +82,7 @@ export const Autocomplete = ({ items, value, onselect, placeholder = '...', ...p
|
|||||||
onclick: () => pick(item)
|
onclick: () => pick(item)
|
||||||
}, getBy(item))
|
}, getBy(item))
|
||||||
]),
|
]),
|
||||||
(item) => getBy(item)
|
'value'
|
||||||
),
|
),
|
||||||
() => filtered().length === 0
|
() => filtered().length === 0
|
||||||
? h('li', { class: 'p-4 opacity-50 text-center' }, 'Sin resultados')
|
? h('li', { class: 'p-4 opacity-50 text-center' }, 'Sin resultados')
|
||||||
|
|||||||
Reference in New Issue
Block a user