UNPKG

@wener/console

Version:
579 lines (578 loc) 22.8 kB
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." } } } };