Tabs
shadcn-lit-registry/tabsFreeComponent
A set of layered sections of content—known as tab panels—that are displayed one at a time. Built with Lit and styled using Tailwind CSS. Features keyboard navigation and accessible ARIA attributes.
Install it
npx shadcn@latest add https://lit-registry.lloydrichards.dev/r/tabs.jsonSource
1import { html, LitElement, nothing, type PropertyValues } from "lit";2import {3 customElement,4 property,5 queryAssignedElements,6} from "lit/decorators.js";7import { TW } from "@/registry/lib/tailwindMixin";8import { cn } from "@/registry/lib/utils";910export interface TabsChangeEvent extends CustomEvent {11 detail: { value: string };12}1314export interface TabsProperties {15 value?: string;16 defaultValue?: string;17}1819@customElement("ui-tabs")20export class Tabs extends TW(LitElement) implements TabsProperties {21 @property({ type: String }) value = "";22 @property({ type: String, attribute: "default-value" }) defaultValue = "";2324 override connectedCallback() {25 super.connectedCallback();26 this.setAttribute("data-orientation", "horizontal");2728 if (!this.value && this.defaultValue) {29 this.value = this.defaultValue;30 }3132 this.addEventListener("tabs-trigger-click", this.handleTriggerClick);33 }3435 override disconnectedCallback() {36 super.disconnectedCallback();37 this.removeEventListener("tabs-trigger-click", this.handleTriggerClick);38 }3940 private handleTriggerClick = (e: CustomEvent) => {41 const newValue = e.detail.value;42 if (newValue !== this.value) {43 this.value = newValue;44 this.dispatchEvent(45 new CustomEvent("change", {46 detail: { value: newValue },47 bubbles: true,48 composed: true,49 }),50 );51 }52 };5354 override updated(changedProperties: PropertyValues) {55 super.updated(changedProperties);5657 if (changedProperties.has("value")) {58 this.updateTriggers();59 this.updateContents();60 }61 }6263 private updateTriggers() {64 const triggers = Array.from(65 this.querySelectorAll("ui-tabs-trigger"),66 ) as TabsTrigger[];67 triggers.forEach((trigger) => {68 trigger.selected = trigger.value === this.value;69 });70 }7172 private updateContents() {73 const contents = Array.from(74 this.querySelectorAll("ui-tabs-content"),75 ) as TabsContent[];76 contents.forEach((content) => {77 content.active = content.value === this.value;78 });79 }8081 override render() {82 return html`<slot></slot>`;83 }84}8586@customElement("ui-tabs-list")87export class TabsList extends TW(LitElement) {88 @queryAssignedElements({ selector: "ui-tabs-trigger" })89 private triggers!: Array<TabsTrigger>;9091 override connectedCallback() {92 super.connectedCallback();93 this.setAttribute("role", "tablist");94// … truncated
Files it writes
More from shadcn-lit-registry
All 26 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | shadcn-lit-registry | Components | Free | 1 dep · 2 files | |
| Avataravatar | shadcn-lit-registry | Components | Free | no deps · 2 files | |
| Badgebadge | shadcn-lit-registry | Components | Free | no deps · 2 files | |
| Buttonbutton | shadcn-lit-registry | Components | Free | 1 dep · 2 files | |
| Cardcard | shadcn-lit-registry | Components | Free | no deps · 2 files | |
| Checkboxcheckbox | shadcn-lit-registry | Components | Free | 1 dep · 2 files | |
| Collapsiblecollapsible | shadcn-lit-registry | Components | Free | 1 dep · 2 files | |
| Commandcommand | shadcn-lit-registry | Components | Free | 1 dep · 2 files |
