@wener/console
Version:
Base console UI toolkit
579 lines (578 loc) • 22.8 kB
JavaScript
function _array_like_to_array(arr, len) {
if (len == null || len > arr.length)
len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++)
arr2[i] = arr[i];
return arr2;
}
function _array_with_holes(arr) {
if (Array.isArray(arr))
return arr;
}
function _iterable_to_array_limit(arr, i) {
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
if (_i == null)
return;
var _arr = [];
var _n = true;
var _d = false;
var _s, _e;
try {
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i)
break;
}
}
catch (err) {
_d = true;
_e = err;
}
finally {
try {
if (!_n && _i["return"] != null)
_i["return"]();
}
finally {
if (_d)
throw _e;
}
}
return _arr;
}
function _non_iterable_rest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _sliced_to_array(arr, i) {
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
}
function _unsupported_iterable_to_array(o, minLen) {
if (!o)
return;
if (typeof o === "string")
return _array_like_to_array(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor)
n = o.constructor.name;
if (n === "Map" || n === "Set")
return Array.from(n);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
return _array_like_to_array(o, minLen);
}
import { useState } from "react";
import { PiChartLineLight, PiGearLight, PiUserLight } from "react-icons/pi";
import { Tabs } from "./Tabs.js";
var meta = {
title: "Components/Tabs",
component: Tabs.Composite,
tags: [
"autodocs"
],
parameters: {
layout: "centered"
}
};
export default meta;
export var Basic = {
args: {
tabs: [
{
label: "Overview",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Overview content")
},
{
label: "Details",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Details content")
},
{
label: "Settings",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Settings content")
}
]
}
};
export var WithIcons = {
args: {
tabs: [
{
label: "User",
icon: /*#__PURE__*/ React.createElement(PiUserLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "space-y-2 p-4"
}, /*#__PURE__*/ React.createElement("h3", {
className: "font-semibold"
}, "User Information"), /*#__PURE__*/ React.createElement("p", null, "Name: John Doe"), /*#__PURE__*/ React.createElement("p", null, "Email: john@example.com"))
},
{
label: "Analytics",
icon: /*#__PURE__*/ React.createElement(PiChartLineLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "space-y-2 p-4"
}, /*#__PURE__*/ React.createElement("h3", {
className: "font-semibold"
}, "Analytics Data"), /*#__PURE__*/ React.createElement("p", null, "Views: 1,234"), /*#__PURE__*/ React.createElement("p", null, "Clicks: 567"))
},
{
label: "Settings",
icon: /*#__PURE__*/ React.createElement(PiGearLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "space-y-2 p-4"
}, /*#__PURE__*/ React.createElement("h3", {
className: "font-semibold"
}, "Settings Panel"), /*#__PURE__*/ React.createElement("label", {
className: "flex items-center gap-2"
}, /*#__PURE__*/ React.createElement("input", {
type: "checkbox",
className: "checkbox checkbox-sm"
}), /*#__PURE__*/ React.createElement("span", null, "Enable notifications")))
}
]
}
};
export var Controlled = {
render: function () {
var _useState = _sliced_to_array(useState("1"), 2), activeTab = _useState[0], setActiveTab = _useState[1];
return /*#__PURE__*/ React.createElement("div", {
className: "space-y-4"
}, /*#__PURE__*/ React.createElement("div", {
className: "flex items-center gap-2"
}, /*#__PURE__*/ React.createElement("span", {
className: "text-sm"
}, "Active tab:"), /*#__PURE__*/ React.createElement("code", {
className: "bg-base-200 rounded px-2 py-1"
}, activeTab)), /*#__PURE__*/ React.createElement(Tabs.Composite, {
activeTab: activeTab,
onTabChange: setActiveTab,
tabs: [
{
key: "1",
label: "Tab 1",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Content 1")
},
{
key: "2",
label: "Tab 2",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Content 2")
},
{
key: "3",
label: "Tab 3",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Content 3")
}
]
}));
}
};
export var Variants = {
render: function () {
return /*#__PURE__*/ React.createElement("div", {
className: "w-[600px] space-y-8"
}, /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("h3", {
className: "mb-2 text-sm font-semibold"
}, "Lifted (default)"), /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "lift",
tabs: [
{
label: "Tab 1",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Lifted content")
},
{
label: "Tab 2",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Content 2")
},
{
label: "Tab 3",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Content 3")
}
]
})), /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("h3", {
className: "mb-2 text-sm font-semibold"
}, "Bordered"), /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "border",
tabs: [
{
label: "Tab 1",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Bordered content")
},
{
label: "Tab 2",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Content 2")
},
{
label: "Tab 3",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Content 3")
}
]
})), /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("h3", {
className: "mb-2 text-sm font-semibold"
}, "Boxed"), /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "box",
tabs: [
{
label: "Tab 1",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Boxed content")
},
{
label: "Tab 2",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Content 2")
},
{
label: "Tab 3",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Content 3")
}
]
})));
}
};
export var WithDisabled = {
args: {
tabs: [
{
label: "Active Tab",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "This tab is active")
},
{
label: "Disabled Tab",
disabled: true,
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "This content is not accessible")
},
{
label: "Another Tab",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Another active tab")
}
]
}
};
export var InSummaryPanel = {
render: function () {
return /*#__PURE__*/ React.createElement("div", {
className: "flex h-96 w-80 flex-col rounded border"
}, /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 flex items-center gap-2 border-b p-2"
}, /*#__PURE__*/ React.createElement("h3", {
className: "flex-1 font-semibold"
}, "Order Details"), /*#__PURE__*/ React.createElement("button", {
className: "btn btn-circle btn-ghost btn-xs"
}, "\u00D7")), /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 flex items-center gap-2 border-b p-2"
}, /*#__PURE__*/ React.createElement("span", {
className: "badge badge-success"
}, "\u5DF2\u652F\u4ED8"), /*#__PURE__*/ React.createElement("span", {
className: "badge badge-info"
}, "\u5DF2\u53D1\u8D27")), /*#__PURE__*/ React.createElement(Tabs.Composite, {
tabs: [
{
label: "Info",
icon: /*#__PURE__*/ React.createElement(PiUserLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "space-y-2 p-2"
}, /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("label", {
className: "text-base-content/60 text-xs"
}, "Order ID"), /*#__PURE__*/ React.createElement("p", {
className: "font-mono"
}, "#12345")), /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("label", {
className: "text-base-content/60 text-xs"
}, "Customer"), /*#__PURE__*/ React.createElement("p", null, "John Doe")), /*#__PURE__*/ React.createElement("div", null, /*#__PURE__*/ React.createElement("label", {
className: "text-base-content/60 text-xs"
}, "Amount"), /*#__PURE__*/ React.createElement("p", {
className: "font-semibold"
}, "\u00A51,234.56")))
},
{
label: "Items",
content: /*#__PURE__*/ React.createElement("div", {
className: "space-y-2 p-2"
}, /*#__PURE__*/ React.createElement("div", {
className: "border-b pb-2"
}, /*#__PURE__*/ React.createElement("p", {
className: "font-semibold"
}, "Product A"), /*#__PURE__*/ React.createElement("p", {
className: "text-base-content/60 text-sm"
}, "Qty: 2 \u00D7 \u00A5500.00")), /*#__PURE__*/ React.createElement("div", {
className: "border-b pb-2"
}, /*#__PURE__*/ React.createElement("p", {
className: "font-semibold"
}, "Product B"), /*#__PURE__*/ React.createElement("p", {
className: "text-base-content/60 text-sm"
}, "Qty: 1 \u00D7 \u00A5234.56")))
}
]
}));
}
};
export var AutoKeys = {
render: function () {
var _useState = _sliced_to_array(useState("0"), 2), activeTab = _useState[0], setActiveTab = _useState[1];
return /*#__PURE__*/ React.createElement("div", {
className: "space-y-4"
}, /*#__PURE__*/ React.createElement("div", {
className: "flex items-center gap-2"
}, /*#__PURE__*/ React.createElement("span", {
className: "text-sm"
}, "Active tab (auto key):"), /*#__PURE__*/ React.createElement("code", {
className: "bg-base-200 rounded px-2 py-1"
}, activeTab)), /*#__PURE__*/ React.createElement(Tabs.Composite, {
activeTab: activeTab,
onTabChange: setActiveTab,
tabs: [
{
label: "First (key: 0)",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Auto key = 0")
},
{
label: "Second (key: 1)",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Auto key = 1")
},
{
label: "Third (key: 2)",
content: /*#__PURE__*/ React.createElement("div", {
className: "p-4"
}, "Auto key = 2")
}
]
}));
}
};
export var WithTitle = {
render: function () {
return /*#__PURE__*/ React.createElement("div", {
className: "w-[600px]"
}, /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "lift",
title: "My Dashboard",
tabs: [
{
label: "Overview",
icon: /*#__PURE__*/ React.createElement(PiUserLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Overview content with title")
},
{
label: "Analytics",
icon: /*#__PURE__*/ React.createElement(PiChartLineLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Analytics data")
},
{
label: "Settings",
icon: /*#__PURE__*/ React.createElement(PiGearLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Settings panel")
}
]
}));
}
};
export var WithAction = {
render: function () {
return /*#__PURE__*/ React.createElement("div", {
className: "w-[600px]"
}, /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "lift",
title: "Orders",
action: /*#__PURE__*/ React.createElement("button", {
className: "btn btn-primary btn-sm"
}, "+ New Order"),
tabs: [
{
label: "All",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "All orders")
},
{
label: "Pending",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Pending orders")
},
{
label: "Completed",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Completed orders")
}
]
}));
}
};
export var TitleAndAction = {
render: function () {
return /*#__PURE__*/ React.createElement("div", {
className: "w-[600px]"
}, /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "lift",
title: "Projects",
action: /*#__PURE__*/ React.createElement("div", {
className: "flex gap-2"
}, /*#__PURE__*/ React.createElement("button", {
className: "btn btn-ghost btn-sm"
}, "Export"), /*#__PURE__*/ React.createElement("button", {
className: "btn btn-primary btn-sm"
}, "+ Create")),
tabs: [
{
label: "Active",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Active projects")
},
{
label: "Archived",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Archived projects")
}
]
}));
}
};
export var LiftedWithWrap = {
render: function () {
return /*#__PURE__*/ React.createElement("div", {
className: "w-[500px]"
}, /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "lift",
title: "Dashboard",
action: /*#__PURE__*/ React.createElement("div", {
className: "flex gap-2"
}, /*#__PURE__*/ React.createElement("button", {
className: "btn btn-ghost btn-sm"
}, "Refresh")),
tabs: [
{
label: "Overview",
icon: /*#__PURE__*/ React.createElement(PiUserLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 h-48 p-4"
}, "Overview with many tabs to demonstrate wrapping behavior")
},
{
label: "Analytics",
icon: /*#__PURE__*/ React.createElement(PiChartLineLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 h-48 p-4"
}, "Analytics content")
},
{
label: "Settings",
icon: /*#__PURE__*/ React.createElement(PiGearLight, null),
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 h-48 p-4"
}, "Settings content")
},
{
label: "Reports",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 h-48 p-4"
}, "Reports content")
},
{
label: "Users",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 h-48 p-4"
}, "Users content")
},
{
label: "Permissions",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 h-48 p-4"
}, "Permissions content")
}
]
}));
},
parameters: {
docs: {
description: {
story: "Demonstrates how tabs wrap gracefully when there are many tabs. The title stays in place and does not shift when tabs wrap to a new line."
}
}
}
};
export var LiftedNoTitle = {
render: function () {
return /*#__PURE__*/ React.createElement("div", {
className: "w-[600px]"
}, /*#__PURE__*/ React.createElement(Tabs.Composite, {
variant: "lift",
action: /*#__PURE__*/ React.createElement("div", {
className: "flex gap-2"
}, /*#__PURE__*/ React.createElement("button", {
className: "btn btn-ghost btn-sm"
}, "Filter"), /*#__PURE__*/ React.createElement("button", {
className: "btn btn-primary btn-sm"
}, "+ Add")),
tabs: [
{
label: "All Items",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "All items view")
},
{
label: "Favorites",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Favorites view")
},
{
label: "Recent",
content: /*#__PURE__*/ React.createElement("div", {
className: "bg-base-100 p-4"
}, "Recent items")
}
]
}));
},
parameters: {
docs: {
description: {
story: "Lifted variant without title, showing the 4px spacer for a smoother visual appearance."
}
}
}
};