Skip to main content

Combobox

Struct Combobox 

Source
pub struct Combobox<S> { /* private fields */ }
Expand description

A combobox on a page whose signals are S: a text field with a list of options that the text filters.

Declare one as a const naming its text field and its list, since the runtime finds both by name. It follows the WAI-ARIA combobox pattern with list autocomplete. The text field has role="combobox", aria-expanded, aria-controls, and aria-activedescendant, and focus stays in it while the up and down arrows move through the options shown, through El::active_descendant. Typing opens the list and shows the options that contain the text, ignoring case, the down arrow opens it, Enter chooses the option the arrows reached, and Escape closes the list or, when it is closed, clears the text. Choosing an option puts its label in the text field and closes the list, and so does leaving the field, unless the pointer is on the list.

Escape is taken by the combobox while focus is in its text field, so a dialog around it closes on Escape only from elsewhere. The visitor can also leave text that matches no option, which the page checks where it needs one of the options. The text field and the list carry node refs with their names, so two comboboxes with one name on a page make Page::render panic.

use hypersig::Signals;
use hypersig_ui::{Combobox, ComboboxState};
use serde::{Deserialize, Serialize};

#[derive(Signals, Serialize, Deserialize)]
struct Form {
    country: ComboboxState,
}

const COUNTRY: Combobox<Form> = Combobox::new("country", "country-options");

let field = COUNTRY.render("Country", Form::country(), ["France", "Japan", "Kenya"]);
let html = field.render();
assert!(html.contains(r#"role="combobox""#));
assert!(html.contains(r#"aria-controls="country-options""#));

Implementations§

Source§

impl<S> Combobox<S>

Source

pub const fn new(field: &'static str, list: &'static str) -> Self

A combobox whose text field has the id field and whose list has the id list.

§Panics

Panics if either name is empty or holds a character other than an ASCII letter, digit, -, or _, or if the two are equal. In a const, that is a compile error.

Source

pub fn render<L: Into<String>>( self, label_text: impl Into<String>, state: Sig<S, ComboboxState>, options: impl IntoIterator<Item = L>, ) -> El<S>

The label, the text field, and the list of options, in a <div>, keeping their state in state.

Trait Implementations§

Source§

impl<S> Clone for Combobox<S>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<S> Copy for Combobox<S>

Source§

impl<S> Debug for Combobox<S>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<S> Freeze for Combobox<S>

§

impl<S> RefUnwindSafe for Combobox<S>

§

impl<S> Send for Combobox<S>

§

impl<S> Sync for Combobox<S>

§

impl<S> Unpin for Combobox<S>

§

impl<S> UnsafeUnpin for Combobox<S>

§

impl<S> UnwindSafe for Combobox<S>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.