/** * @license * Copyright 2023 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import '@material/web/icon/icon.js'; import '@material/web/iconbutton/icon-button.js'; import '@material/web/tabs/primary-tab.js'; import '@material/web/tabs/secondary-tab.js'; import '@material/web/tabs/tabs.js'; import {MaterialStoryInit} from './material-collection.js'; import {MdTabs} from '@material/web/tabs/tabs.js'; import {styles as typescaleStyles} from '@material/web/typography/md-typescale-styles.js'; import {css, html, nothing} from 'lit'; import {ref} from 'lit/directives/ref.js'; /** Knob types for Tabs stories. */ export interface StoryKnobs { activeTabIndex: number; autoActivate: boolean; inlineIcon: boolean; content: string; } const styles = [ typescaleStyles, css` [role='tabpanel']:not(.subtabs) { padding: 16px; } md-tabs { --inline-size: 50vw; min-inline-size: var(--inline-size); } md-tabs.scrolling { inline-size: var(--inline-size); } .controls { height: 48px; } `, ]; const primary: MaterialStoryInit = { name: 'Primary Tabs', styles, render(knobs) { const tabContent = getTabContentGenerator(knobs); const inlineIcon = knobs.inlineIcon; return html` ${tabContent('piano', 'Keyboard')} ${tabContent('tune', 'Guitar')} ${tabContent('graphic_eq', 'Drums')} ${tabContent('speaker', 'Bass')} ${tabContent('nightlife', 'Saxophone')}
Keyboard
`; }, }; const secondary: MaterialStoryInit = { name: 'Secondary Tabs', styles, render(knobs) { const tabContent = getTabContentGenerator(knobs); return html` ${tabContent('flight', 'Travel')} ${tabContent('hotel', 'Hotel')} ${tabContent('hiking', 'Activities')} ${tabContent('restaurant', 'Food')}
Travel
`; }, }; const scrolling: MaterialStoryInit = { name: 'Scrolling Tabs', styles, render(knobs) { const tabContent = getTabContentGenerator(knobs); const inlineIcon = knobs.inlineIcon; return html` ${new Array(10).fill(html` ${tabContent('piano', 'Keyboard')} ${tabContent('tune', 'Guitar')} ${tabContent('graphic_eq', 'Drums')} ${tabContent('speaker', 'Bass')} ${tabContent('nightlife', 'Saxophone')} `)} `; }, }; const custom: MaterialStoryInit = { name: 'Custom Tabs', styles: [ ...styles, css` .custom { /* colors */ --md-sys-color-primary: var(--md-sys-color-tertiary); /* text */ --md-primary-tab-label-text-font: cursive, system-ui; --md-primary-tab-label-text-size: 0.8em; /* indicator */ --md-primary-tab-active-indicator-height: 8px; --md-primary-tab-active-indicator-shape: 9999px 0; } .custom::part(divider) { --md-divider-color: var(--md-sys-color-tertiary); --md-divider-thickness: 4px; } `, ], render(knobs) { const tabContent = getTabContentGenerator(knobs); return html` ${tabContent('flight', 'Travel')} ${tabContent('hotel', 'Hotel')} ${tabContent('hiking', 'Activities')} ${tabContent('restaurant', 'Food')}
Travel
`; }, }; const primaryAndSecondary: MaterialStoryInit = { name: 'Primary and Secondary Tabs', styles, render(knobs) { const tabContent = getTabContentGenerator(knobs); const inlineIcon = knobs.inlineIcon; return html` ${tabContent('videocam', 'Movies')} ${tabContent('photo', 'Photos')} ${tabContent('audiotrack', 'Music')}
Star Wars Avengers Jaws Frozen
Star Wars
`; }, }; const dynamic: MaterialStoryInit = { name: 'Dynamic Tabs', styles, render(knobs) { const inlineIcon = knobs.inlineIcon; function getTabs(event: Event) { return ( (event.target! as Element).getRootNode() as ShadowRoot ).querySelector('md-tabs')!; } function addTab(event: Event) { const tabs = getTabs(event); const count = tabs.childElementCount; const tab = document.createElement('md-primary-tab'); tab.textContent = `Tab ${count + 1}`; tabs.append(tab); } function removeTab(event: Event) { const tabs = getTabs(event); tabs.tabs[tabs.tabs.length - 1]?.remove(); } function moveTabTowardsEnd(event: Event) { const tabs = getTabs(event); if (!tabs.activeTab) { return; } const next = tabs.activeTab.nextElementSibling; if (next) { next.after(tabs.activeTab); } } function moveTabTowardsStart(event: Event) { const tabs = getTabs(event); if (!tabs.activeTab) { return; } const previous = tabs.activeTab.previousElementSibling; if (previous) { previous.before(tabs.activeTab); } } return html`
add remove chevron_left chevron_right
Tab 1 Tab 2 Tab 3 `; }, }; function getTabContentGenerator(knobs: StoryKnobs) { const contentKnob = knobs.content; const useIcon = contentKnob !== 'label'; const useLabel = contentKnob !== 'icon'; return (icon: string, label: string) => { const iconTemplate = html`${icon}`; return html` ${useIcon ? iconTemplate : nothing} ${useLabel ? html`${label}` : nothing} `; }; } function setupTabPanels() { return ref((instance) => { if (!instance) { return; } const tabs = instance as MdTabs; let currentPanel: HTMLElement | null = null; tabs.addEventListener('change', () => { if (currentPanel) { currentPanel.hidden = true; } const panelId = tabs.activeTab?.getAttribute('aria-controls'); const root = tabs.getRootNode() as Document | ShadowRoot; currentPanel = root.querySelector(`#${panelId}`); if (currentPanel) { currentPanel.hidden = false; } }); }); } /** Tabs stories. */ export const stories = [ primary, secondary, scrolling, custom, primaryAndSecondary, dynamic, ];