Filter kinds
Each kind is one facets: entry, {property, as: <kind>, …options}, and every kind edits the same Bases filters tree, so a pick shows in every view and what the rail cannot draw stays as a custom clause. An unknown kind draws as values with a warning. Options common to all: label, info (the ⓘ), diagram, collapsed. The snippets below are cut from this case's views.base. Sites accessed 2026-10-26.
values copies Algolia refinementList
checkboxes with counts, "Show N more", a find box over a long list; counts are disjunctive. Options: label, limit, sort (count | alpha | value), searchable, exclude. Try it: ?brand=Steadywin,CubeMars
facets:
- { property: brand, as: values, exclude: true, label: Brand, searchable: true }
values + exclude copies Kibana's filter pills, Exclude results
a ⊘ beside each value writes {not: [p == v]}; the value is struck through. Options: exclude: true. Try it: ?brand!=KST,Feetech
facets:
- { property: brand, as: values, exclude: true, label: Brand, searchable: true }
select copies Algolia menu / menuSelect
one value or Any, as radio buttons or (dropdown: true) a select. Options: any, dropdown, limit, sort. Try it: ?in_stock=no
facets:
- { property: in_stock, as: select, label: Stock }
toggle copies Algolia toggleRefinement
a switch for one value ("In stock only", "Has CAD"); Algolia's on is value: here. Options: value (default true), text. Try it: ?in_stock=yes
facets:
- { property: in_stock, as: toggle, value: "yes", text: In stock only }
has copies Tableau quick filters' Special (null / non-null)
has a value, for one property or a group, matching all of or any of. Options: properties, match (all | any). Try it: ?hasany=photo,price
facets:
- { property: photo, as: has, properties: [photo, torque_density, price], label: Has data, match: all }
range copies Algolia rangeInput; Zillow's min / max dropdowns (choices:)
min and max boxes (dates on a date property), or dropdown pairs of round numbers. Options: unit, choices, diagram. Try it: ?price=100..500
facets:
- { property: price, as: range, choices: [25, 50, 100, 250, 500, 1000, 2500], label: Price (min / max) }
slider copies Algolia rangeSlider; WAI-ARIA multi-thumb slider
two thumbs on one rail; arrows and Page Up / Down move a thumb, release applies. Options: log, unit. Try it: ?mass=..1800
facets:
- { property: mass, as: slider, log: true, label: Mass }
slider-histogram copies Airbnb's price filter
the distribution above the slider; bars outside the range dim; a bar's count on hover. Options: log, bins, unit. Try it: ?peak_torque=10..
facets:
- { property: peak_torque, as: slider-histogram, log: true, label: Peak torque }
buckets copies Algolia numericMenu; Amazon's price bands
preset ranges as chips, p >= a and p < b; edges given or nice ones from the data. Options: buckets ([edges] or [{label, min, max}]), log, unit. Try it: ?price=50..<100
facets:
- { property: price, as: buckets, buckets: [50, 100, 250, 500], unit: USD, label: Price }
rating copies Algolia ratingMenu (Amazon's "& Up")
★★★☆☆ & up, top level first, each with its count. Options: max, min, style. Try it: ?level=2..
facets:
- { property: level, as: rating, max: 5, label: robotparts level }
min-level copies Algolia ratingMenu, drawn as steps
"Level ≥ N" for robotparts' levels. Options: max, min. Try it: ?level=4..
facets:
- { property: level, as: min-level, max: 5, label: Level }
date copies Tableau relative date filters
from / until boxes, "Last 7 days" presets and "Older than" for staleness (stored as ISO dates). Options: presets, older. Try it: ?listed=..<2026-10-12
facets:
- { property: listed, as: date, presets: [7d, 30d, year], older: [14d, 90d], label: First listed }
chips copies Linear's label filter
pressable chips for a list property's tags, any of them. Options: limit, sort. Try it: ?buses=can,ethercat
facets:
- { property: buses, as: chips, label: Bus }
swatch copies Shopify filter presentation SWATCH / IMAGE
a logo or colour per value with its count; a monogram where there is none. Options: images, image, colors, columns. Try it: ?brand=Steadywin
facets:
- property: brand
as: swatch
label: Brand (logos)
limit: 12
images:
Steadywin: logos/steadywin.webp
Damiao: logos/damiao.webp
JMC: logos/jmc.webp
gallery copies McMaster-Carr's "Drive Style" tiles
picture tiles in N columns, multi-select; a .svg line drawing takes the text colour. Options: images, image, columns. Try it: ?form=hobby servo
facets:
- property: form
as: gallery
label: Form
columns: 2
info: "How the actuator is built: a hobby servo's case and horn, an integrated joint with its driver inside, a frameless direct-drive ring, a motor with a separate gearbox, or a motor inside a wheel."
images:
hobby servo: icons/form-hobby_servo.svg
integrated actuator: icons/form-integrated_actuator.svg
direct drive: icons/form-direct_drive.svg
bare gearmotor: icons/form-bare_gearmotor.svg
wheel hub: icons/form-wheel_hub.svg
picture-list copies McMaster-Carr's "Threading" list
a small drawing beside each value. Options: images, image. Try it: ?drivetrain=direct_drive
facets:
- property: drivetrain
as: picture-list
label: Drivetrain
images:
geared: icons/drivetrain-geared.svg
direct_drive: icons/drivetrain-direct_drive.svg
motor: icons/drivetrain-motor.svg
grid copies McMaster-Carr's "Thread Pitch" grid
compact values in columns, no checkboxes, click to pick. Options: columns, sort, limit, searchable. Try it: ?gear_ratio=9,10
facets:
- { property: gear_ratio, as: grid, columns: 3, sort: value, limit: 15, label: Gear ratio, info: "Output turns per motor turn; 1 is direct drive." }
diagram (any kind) copies McMaster-Carr's dimension drawings ("Head Diameter")
a drawing at the top of a facet showing which dimension it filters. Options: diagram. Try it: ?od=50..100
facets:
- { property: od, as: range, diagram: diagrams/od.svg, label: Outer diameter, info: "Across the actuator's face, housing to housing; not the output flange." }
listbox copies Digi-Key's parametric columns
a native multi-select list: click, Ctrl-click, Shift-range; a stack of them is Digi-Key's grid. Options: size, sort, searchable. Try it: ?voltage=24,48
facets:
- { property: voltage, as: listbox, sort: value, label: Voltage }
tree copies Algolia hierarchicalMenu
form › brand: a level opens under its pick; deeper counts apply the levels above. Options: levels, limit, sort. Try it: ?form=hobby servo&brand=Feetech
facets:
- { property: form, as: tree, levels: [form, brand], label: Form › brand }
search copies Algolia searchBox; Tableau's wildcard match
a text box over chosen properties: contains, or starts with. Options: properties, match (contains | startsWith), placeholder. Try it: ?model~=gim
facets:
- { property: model, as: search, properties: [model, name], label: Search, placeholder: "Model or name, e.g. AK80" }
popular copies Booking.com's "Popular filters"
named shortcuts, each one filter expression, with what it would leave. Options: options ([expr] or [{label, filter}]). Try it: ?price=..<100
facets:
- property: price
as: popular
label: Popular filters
options:
- { label: In stock, filter: 'in_stock == "yes"' }
- { label: CAN bus, filter: 'buses.contains("can")' }
- { label: Under $100, filter: 'price < 100' }
- { label: Has a photo, filter: '!photo.isEmpty()' }
current copies Algolia currentRefinements + clearRefinements
every pick as a removable chip, "+N custom", Clear all. Options: label. Try it: ?brand=Steadywin&buses=can
facets:
- { as: current, label: Current filters }
Also looked at
| Obsidian Bases filters | the stored model: and / or / not over expressions; the rail edits its facet-shaped part (the Obsidian recipe) |
| Notion filters | simple filters promote to an advanced group; data-ui's Filter menu is that builder |
| Datasette facets | the readable URL: col=value per pick |
| Shopify storefront filtering | comma lists OR within a filter, filters AND together; .gte / .lte bounds (data-ui writes a..b) |
| Algolia routing URLs | state -> route -> URL, flat keys rather than nested brackets |
| WAI-ARIA listbox | the listbox's keyboard: the native select multiple already does it |
| Octopart parametric search | a numeric parameter opens a range slider; the URL is hand-editable (secondary source) |
| Kayak time-of-day sliders | not built: no time-of-day column in the data; slider covers it when one exists |
| PCPartPicker | not reached (403); its sliders and "show all" lists are covered by slider and values |
| Zillow / Redfin | not reached (403); their min / max dropdown pairs are range with choices:, from memory |