Buckets:
| // @ts-nocheck | |
| import { createSignal } from "solid-js" | |
| import { Field as FieldV2 } from "./field-v2" | |
| import { SelectV2 } from "./select-v2" | |
| const fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"] | |
| type Region = "North" | "South" | "East" | "West" | |
| const cities: { city: string; region: Region }[] = [ | |
| { city: "Boston", region: "North" }, | |
| { city: "Miami", region: "South" }, | |
| { city: "Atlanta", region: "South" }, | |
| { city: "Seattle", region: "West" }, | |
| { city: "Denver", region: "West" }, | |
| ] | |
| const docs = `### Overview | |
| Single-select built on Kobalte with a **TextInput v2** trigger surface and **Menu v2** list styling. | |
| ### API | |
| - \`placeholder\`: Shown in the trigger when nothing is selected (same idea as text inputs). | |
| - \`options\`, \`current\`, \`onSelect\`: controlled selection (\`current\` is the selected option object). | |
| - \`value\` / \`label\`: accessors when options are not plain strings. | |
| - \`groupBy\`: groups options; section headers use menu group label styling. | |
| - \`appearance\`: \`base\` (28px), \`large\` (32px), or \`inline\` (compact settings-row trigger). | |
| - \`placement\`, \`gutter\`, \`sameWidth\`, \`flip\`, \`slide\`, \`fitViewport\`: forwarded to Kobalte popper (defaults match legacy \`Select\`: gutter 4, flip/slide on; inline uses \`bottom-end\` and \`sameWidth: false\`). | |
| - \`invalid\`, \`disabled\`, \`numeric\`: match text input conventions. | |
| ` | |
| export default { | |
| title: "UI V2/Select", | |
| id: "components-select-v2", | |
| component: SelectV2, | |
| tags: ["autodocs"], | |
| parameters: { | |
| frameHeight: "420px", | |
| frameBackground: "#fff", | |
| docs: { | |
| description: { | |
| component: docs, | |
| }, | |
| }, | |
| }, | |
| args: { | |
| placeholder: "Pick a fruit", | |
| invalid: false, | |
| disabled: false, | |
| appearance: "base", | |
| }, | |
| argTypes: { | |
| placeholder: { | |
| control: "text", | |
| }, | |
| invalid: { | |
| control: "boolean", | |
| }, | |
| disabled: { | |
| control: "boolean", | |
| }, | |
| appearance: { | |
| control: "select", | |
| options: ["base", "large", "inline"], | |
| }, | |
| }, | |
| } | |
| export const Playground = { | |
| render: (args) => { | |
| const [current, setCurrent] = createSignal(undefined) | |
| return ( | |
| <SelectV2 | |
| placeholder={args.placeholder} | |
| invalid={args.invalid} | |
| disabled={args.disabled} | |
| appearance={args.appearance} | |
| options={fruits} | |
| current={current()} | |
| onSelect={(v) => setCurrent(v === null ? undefined : v)} | |
| /> | |
| ) | |
| }, | |
| } | |
| export const Large = { | |
| render: (args) => { | |
| const [current, setCurrent] = createSignal(undefined) | |
| return ( | |
| <SelectV2 | |
| placeholder={args.placeholder} | |
| invalid={args.invalid} | |
| disabled={args.disabled} | |
| appearance="large" | |
| options={fruits} | |
| current={current()} | |
| onSelect={(v) => setCurrent(v === null ? undefined : v)} | |
| /> | |
| ) | |
| }, | |
| } | |
| export const Grouped = { | |
| render: (args) => { | |
| const [current, setCurrent] = createSignal(undefined) | |
| return ( | |
| <SelectV2<(typeof cities)[0]> | |
| placeholder={args.placeholder} | |
| invalid={args.invalid} | |
| disabled={args.disabled} | |
| appearance={args.appearance} | |
| options={cities} | |
| current={current()} | |
| onSelect={(v) => setCurrent(v === null ? undefined : v)} | |
| value={(x) => x.city} | |
| label={(x) => x.city} | |
| groupBy={(x) => x.region} | |
| /> | |
| ) | |
| }, | |
| } | |
| export const Invalid = { | |
| render: (args) => { | |
| const [current, setCurrent] = createSignal(undefined) | |
| return ( | |
| <SelectV2 | |
| placeholder={args.placeholder} | |
| invalid | |
| disabled={args.disabled} | |
| appearance={args.appearance} | |
| options={fruits} | |
| current={current()} | |
| onSelect={(v) => setCurrent(v === null ? undefined : v)} | |
| /> | |
| ) | |
| }, | |
| } | |
| export const Disabled = { | |
| render: (args) => ( | |
| <SelectV2 | |
| placeholder={args.placeholder} | |
| invalid={args.invalid} | |
| disabled | |
| appearance={args.appearance} | |
| options={fruits} | |
| current="Cherry" | |
| onSelect={() => {}} | |
| /> | |
| ), | |
| } | |
| export const Field = { | |
| parameters: { frameHeight: "500px" }, | |
| render: (args) => { | |
| const [current, setCurrent] = createSignal(undefined) | |
| return ( | |
| <div style={{ width: "280px" }}> | |
| <FieldV2> | |
| <FieldV2.Label tooltip="Choose one of the available options.">Fruit</FieldV2.Label> | |
| <FieldV2.Prefix>Optional helper</FieldV2.Prefix> | |
| <SelectV2 | |
| placeholder={args.placeholder} | |
| invalid={args.invalid} | |
| disabled={args.disabled} | |
| appearance={args.appearance} | |
| options={fruits} | |
| current={current()} | |
| onSelect={(v) => setCurrent(v === null ? undefined : v)} | |
| /> | |
| <FieldV2.Suffix>After selection</FieldV2.Suffix> | |
| </FieldV2> | |
| </div> | |
| ) | |
| }, | |
| } | |
Xet Storage Details
- Size:
- 4.84 kB
- Xet hash:
- 22a55f5d2e76ffc35f475688c15c9e97b78291cdaa67df16fa6b9f07b2c04710
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.