smoo v0.0.17
Hold your horses!
<script>
import { Fence, Search } from 'smoo';
let users = [
{ id: 1, name: 'Juanito Hace', value: 'j@do.e' },
{ id: 2, name: 'Carlangas Marca', value: 'cmrx@so.co' },
];
let members = [];
let visible = false;
function open() {
visible = true;
}
function close() {
visible = false;
}
</script>
<Fence modal bind:visible on:cancel={close}>
<h1>It works.</h1>
<Search multiple data={users} bind:value={members} />
<pre>Got: {JSON.stringify(members)}</pre>
</Fence>
<button on:click={open}>Open modal</button>How it works?
smoo lets you place any kind of markup or components inside a <div role="dialog">...</div>,
it also brings to you many other useful components, you'll see below.
Components
We have a Fence component, i.e. a thing you need to guard your cows...
<Fence {id} {class} {loading} {modal} {visible} {autofocus} on:submit on:cancel />
This is a <form /> wrapper that handle various effects:
- Allows you to subscribe to any connection status and block its content while loading...
- All focusable inputs found during
onMount(...)will be traped an cycled back and forth - When rendered as a modal-overlay, it can be canceled with the ESC key or clicking outside
- It can setup
autofocuson the first input-element found inside the inner<form />wrapper (js only)
Before submitting HTML5 validation will run, if it's valid a
submitevent will be triggered. Thecancelevent is fired when you click outside the modal, or press the ESC key to close the modal.
Available props:
{id}— Usedidfor the inner<form />element{class}— Usedclassfor the inner<form />element{loading}— Its presence will protect the UI withpointer-events:none{modal}— Its presence will render the inner<form />in a modal-overlay{noform}— It disables the<form />render, use themainslot instead{visible}— Its value is used to toggle the render of the entire custom-element{autofocus}— Its presence enablesfocus()on the first input-element found
Available slots:
before— Renders before the<form />tagafter— Renders after the<form />tag
Add the
nofocusordata-nofocusattribute to any element to skip autofocus on it (useful for close-icons, etc.).
<Search {id} {pk} {keys} {data} {value} {class} {label} {disabled} {multiple} {autoclose} {placeholder} on:change />
This is an <input type="search" /> wrapper that handle various effects:
- It is fully accessible through the keyboard, e.g.
- you can press ESC to clear search
- on items, press ESC to focus back to the input
- It allows you to customize the data-source used and the render options
- The search input fires their
input,focusandblurevents, while the dropdown firesopenandcloseevents.
It uses checkboxes or radios to enable selection through the keyboard, once values are choosen a
changeevent is fired with the current selection. You can use CSS to hide those inputs and render the items by using:focusand:checkedselectors.
Available props:
{id}— Usedidfor the inner<input />element{pk}— Property to identify each item fromdatalist, default isid{keys}— Properties to filter-out when searching for values, default are['name', 'value']{data}— Used data-source to retrieve items when searching, it must be anArray{value}— This is anArrayof selected ids from the data-source, can be bound{class}— Usedclassfor the inner<input />element{label}— Property used to print a human-readable value from each rendered item{nofilter}— its presence will disable the filtering over the passed data-source{disabled}— It just disables the<input />field, while disabled options are hidden{multiple}— Enable multiple selection of values (checkboxvsradio), disabled by default{autoclose}— Close the dropdown on click-selection, it should not work withmultipleoptions, disabled by default{fallback}— This message is shown when no results are found while searching{placeholder}— Customplaceholderfor the<input />field
Available slots:
before— Renders before the<input />tagafter— Renders before the<input />tagitem— Renders each value, uselet:itemto access its propsempty— Renders when no values where found in the data-source
If you like, place an icon like
<svg slot="before">...</svg>and it will be positioned inside the<input />on its left. Later you can use CSS to customize this through the[role=search]selector.