@brycks/core-front 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/components/feedback/Alert/Alert.cjs +1 -1
  2. package/dist/components/feedback/Alert/Alert.cjs.map +1 -1
  3. package/dist/components/feedback/Alert/Alert.js +52 -177
  4. package/dist/components/feedback/Alert/Alert.js.map +1 -1
  5. package/dist/components/form/Checkbox/Checkbox.cjs +1 -1
  6. package/dist/components/form/Checkbox/Checkbox.js +12 -12
  7. package/dist/components/form/Input/Input.cjs +1 -1
  8. package/dist/components/form/Input/Input.js +13 -13
  9. package/dist/components/form/Slider/Slider.cjs +1 -1
  10. package/dist/components/form/Slider/Slider.js +1 -1
  11. package/dist/components/form/Switch/Switch.cjs +1 -1
  12. package/dist/components/form/Switch/Switch.cjs.map +1 -1
  13. package/dist/components/form/Switch/Switch.js +70 -105
  14. package/dist/components/form/Switch/Switch.js.map +1 -1
  15. package/dist/components/layout/Card/Card.cjs +1 -1
  16. package/dist/components/layout/Card/Card.cjs.map +1 -1
  17. package/dist/components/layout/Card/Card.js +59 -121
  18. package/dist/components/layout/Card/Card.js.map +1 -1
  19. package/dist/components/navigation/Dropdown/Dropdown.cjs +1 -6
  20. package/dist/components/navigation/Dropdown/Dropdown.cjs.map +1 -1
  21. package/dist/components/navigation/Dropdown/Dropdown.js +118 -183
  22. package/dist/components/navigation/Dropdown/Dropdown.js.map +1 -1
  23. package/dist/components/navigation/Menu/Menu.cjs +1 -1
  24. package/dist/components/navigation/Menu/Menu.js +5 -5
  25. package/dist/components/navigation/Tabs/Tabs.cjs +1 -6
  26. package/dist/components/navigation/Tabs/Tabs.cjs.map +1 -1
  27. package/dist/components/navigation/Tabs/Tabs.js +92 -162
  28. package/dist/components/navigation/Tabs/Tabs.js.map +1 -1
  29. package/dist/components/primitives/Button/Button.cjs +1 -1
  30. package/dist/components/primitives/Button/Button.cjs.map +1 -1
  31. package/dist/components/primitives/Button/Button.js +72 -96
  32. package/dist/components/primitives/Button/Button.js.map +1 -1
  33. package/dist/components/primitives/Button/Button.styles.cjs +1 -1
  34. package/dist/components/primitives/Button/Button.styles.cjs.map +1 -1
  35. package/dist/components/primitives/Button/Button.styles.js +8 -317
  36. package/dist/components/primitives/Button/Button.styles.js.map +1 -1
  37. package/dist/components/utility/Badge/Badge.cjs +1 -1
  38. package/dist/components/utility/Badge/Badge.cjs.map +1 -1
  39. package/dist/components/utility/Badge/Badge.js +23 -80
  40. package/dist/components/utility/Badge/Badge.js.map +1 -1
  41. package/dist/styles.css +1 -1
  42. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),r=require("react"),j=require("../../../utils/styles.cjs"),m=require("../../../design-system/tokens/spacing.cjs"),N=require("../../../design-system/tokens/motion.cjs"),i=require("../../../design-system/primitives/sizing.cjs"),C=require("../../../design-system/tokens/typography.cjs"),A=r.createContext(null);function G(){const f=r.useContext(A);if(!f)throw new Error("Menu components must be used within a Menu");return f}const H=r.forwardRef(function({activeItem:t,onChange:u,size:c="md",collapsed:s=!1,className:p,style:b,children:S,testId:g,...v},y){const[D,R]=r.useState(null),[x,o]=r.useState(-1),k=r.useRef([]),I=r.useRef(null),q=t!==void 0?t:D,l=e=>{t===void 0&&R(e),u?.(e)},d=r.useCallback(e=>{const n=k.current.indexOf(e);return n===-1?(k.current.push(e),k.current.length-1):n},[]),M=r.useCallback(e=>{const n=I.current?.querySelectorAll('[role="menuitem"]:not(:disabled)');if(!n?.length)return;const z=x>=0?x:0;switch(e.key){case"ArrowDown":e.preventDefault();const w=(z+1)%n.length;o(w),n[w]?.focus();break;case"ArrowUp":e.preventDefault();const h=(z-1+n.length)%n.length;o(h),n[h]?.focus();break;case"Home":e.preventDefault(),o(0),n[0]?.focus();break;case"End":e.preventDefault(),o(n.length-1),n[n.length-1]?.focus();break}},[x]),$={display:"flex",flexDirection:"column",gap:m.spacing[.5],padding:m.spacing[2],...b};return a.jsx(A.Provider,{value:{size:c,activeItem:q,setActiveItem:l,collapsed:s,focusedIndex:x,setFocusedIndex:o,registerItem:d},children:a.jsx("nav",{ref:e=>{I.current=e,typeof y=="function"?y(e):y&&(y.current=e)},role:"menu",className:j.cx("brycks-menu",`brycks-menu--${c}`,s&&"brycks-menu--collapsed",p),style:$,onKeyDown:M,"data-testid":g,...v,children:S})})});H.displayName="Menu";const E={sm:{height:i.componentHeights.sm,fontSize:C.fontSizes.base-1,iconSize:i.iconSizes.sm,padding:i.componentGap.lg},md:{height:i.componentHeights.md,fontSize:C.fontSizes.base,iconSize:i.iconSizes.md-2,padding:i.componentPaddingX.sm},lg:{height:i.componentHeights.lg,fontSize:C.fontSizes.md,iconSize:i.iconSizes.md,padding:m.spacing[3.5]}},F=r.forwardRef(function({value:t,icon:u,badge:c,disabled:s=!1,onClick:p,className:b,style:S,children:g,...v},y){const{size:D,activeItem:R,setActiveItem:x,collapsed:o,focusedIndex:k,setFocusedIndex:I,registerItem:q}=G(),l=R===t,d=E[D],M=q(t),$=()=>{s||(x(t),p?.(t))},e=()=>{I(M)},n={display:"flex",alignItems:"center",gap:i.componentGap.lg,width:"100%",minHeight:d.height,padding:o?d.padding:`0 ${d.padding}px`,fontSize:d.fontSize,fontWeight:l?600:500,color:s?"var(--brycks-foreground-disabled)":l?"var(--brycks-primary-default)":"var(--brycks-foreground-default)",backgroundColor:l?"var(--brycks-primary-50)":"transparent",border:"none",borderRadius:"var(--brycks-radius-md)",cursor:s?"not-allowed":"pointer",transition:`all ${N.durations.quick}ms ${N.easings.easeOut}`,textAlign:"left",outline:"none",justifyContent:o?"center":"flex-start",...S},z={width:d.iconSize,height:d.iconSize,flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center"},w={marginLeft:"auto"};return a.jsxs("button",{ref:y,type:"button",role:"menuitem",disabled:s,tabIndex:k===M?0:-1,className:j.cx("brycks-menu-item",l&&"brycks-menu-item--active",b),style:n,onClick:$,onFocus:e,onMouseEnter:h=>{!s&&!l&&(h.currentTarget.style.backgroundColor="var(--brycks-background-muted)")},onMouseLeave:h=>{l||(h.currentTarget.style.backgroundColor="transparent")},title:o?String(g):void 0,...v,children:[u&&a.jsx("span",{style:z,children:u}),!o&&a.jsx("span",{style:{flex:1},children:g}),!o&&c&&a.jsx("span",{style:w,children:c})]})});F.displayName="MenuItem";const P=r.forwardRef(function({label:t,className:u,style:c,children:s,...p},b){const{collapsed:S}=G(),g={display:"flex",flexDirection:"column",gap:m.spacing[.5],...c},v={padding:`${m.spacing[3]}px ${m.spacing[3]}px ${i.componentPaddingY.sm}px ${m.spacing[3]}px`,fontSize:C.fontSizes.xs,fontWeight:600,color:"var(--brycks-foreground-muted)",textTransform:"uppercase",letterSpacing:"0.05em"};return a.jsxs("div",{ref:b,className:j.cx("brycks-menu-group",u),style:g,...p,children:[t&&!S&&a.jsx("div",{style:v,children:t}),s]})});P.displayName="MenuGroup";const T=r.forwardRef(function({className:t,style:u,...c},s){const p={height:1,backgroundColor:"var(--brycks-border-muted)",margin:`${m.spacing[2]}px 0`,...u};return a.jsx("div",{ref:s,role:"separator",className:j.cx("brycks-menu-divider",t),style:p,...c})});T.displayName="MenuDivider";exports.Menu=H;exports.MenuDivider=T;exports.MenuGroup=P;exports.MenuItem=F;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),r=require("react"),j=require("../../../utils/styles.cjs"),i=require("../../../design-system/primitives/sizing.cjs"),m=require("../../../design-system/tokens/spacing.cjs"),N=require("../../../design-system/tokens/motion.cjs"),C=require("../../../design-system/tokens/typography.cjs"),A=r.createContext(null);function G(){const f=r.useContext(A);if(!f)throw new Error("Menu components must be used within a Menu");return f}const H=r.forwardRef(function({activeItem:t,onChange:u,size:c="md",collapsed:s=!1,className:p,style:b,children:S,testId:g,...v},y){const[D,R]=r.useState(null),[x,o]=r.useState(-1),k=r.useRef([]),I=r.useRef(null),q=t!==void 0?t:D,l=e=>{t===void 0&&R(e),u?.(e)},d=r.useCallback(e=>{const n=k.current.indexOf(e);return n===-1?(k.current.push(e),k.current.length-1):n},[]),M=r.useCallback(e=>{const n=I.current?.querySelectorAll('[role="menuitem"]:not(:disabled)');if(!n?.length)return;const z=x>=0?x:0;switch(e.key){case"ArrowDown":e.preventDefault();const w=(z+1)%n.length;o(w),n[w]?.focus();break;case"ArrowUp":e.preventDefault();const h=(z-1+n.length)%n.length;o(h),n[h]?.focus();break;case"Home":e.preventDefault(),o(0),n[0]?.focus();break;case"End":e.preventDefault(),o(n.length-1),n[n.length-1]?.focus();break}},[x]),$={display:"flex",flexDirection:"column",gap:m.spacing[.5],padding:m.spacing[2],...b};return a.jsx(A.Provider,{value:{size:c,activeItem:q,setActiveItem:l,collapsed:s,focusedIndex:x,setFocusedIndex:o,registerItem:d},children:a.jsx("nav",{ref:e=>{I.current=e,typeof y=="function"?y(e):y&&(y.current=e)},role:"menu",className:j.cx("brycks-menu",`brycks-menu--${c}`,s&&"brycks-menu--collapsed",p),style:$,onKeyDown:M,"data-testid":g,...v,children:S})})});H.displayName="Menu";const E={sm:{height:i.componentHeights.sm,fontSize:C.fontSizes.base-1,iconSize:i.iconSizes.sm,padding:i.componentGap.lg},md:{height:i.componentHeights.md,fontSize:C.fontSizes.base,iconSize:i.iconSizes.md-2,padding:i.componentPaddingX.sm},lg:{height:i.componentHeights.lg,fontSize:C.fontSizes.md,iconSize:i.iconSizes.md,padding:m.spacing[3.5]}},F=r.forwardRef(function({value:t,icon:u,badge:c,disabled:s=!1,onClick:p,className:b,style:S,children:g,...v},y){const{size:D,activeItem:R,setActiveItem:x,collapsed:o,focusedIndex:k,setFocusedIndex:I,registerItem:q}=G(),l=R===t,d=E[D],M=q(t),$=()=>{s||(x(t),p?.(t))},e=()=>{I(M)},n={display:"flex",alignItems:"center",gap:i.componentGap.lg,width:"100%",minHeight:d.height,padding:o?d.padding:`0 ${d.padding}px`,fontSize:d.fontSize,fontWeight:l?600:500,color:s?"var(--brycks-foreground-disabled)":l?"var(--brycks-primary-default)":"var(--brycks-foreground-default)",backgroundColor:l?"var(--brycks-primary-50)":"transparent",border:"none",borderRadius:"var(--brycks-radius-md)",cursor:s?"not-allowed":"pointer",transition:`all ${N.durations.quick}ms ${N.easings.easeOut}`,textAlign:"left",outline:"none",justifyContent:o?"center":"flex-start",...S},z={width:d.iconSize,height:d.iconSize,flexShrink:0,display:"flex",alignItems:"center",justifyContent:"center"},w={marginLeft:"auto"};return a.jsxs("button",{ref:y,type:"button",role:"menuitem",disabled:s,tabIndex:k===M?0:-1,className:j.cx("brycks-menu-item",l&&"brycks-menu-item--active",b),style:n,onClick:$,onFocus:e,onMouseEnter:h=>{!s&&!l&&(h.currentTarget.style.backgroundColor="var(--brycks-background-muted)")},onMouseLeave:h=>{l||(h.currentTarget.style.backgroundColor="transparent")},title:o?String(g):void 0,...v,children:[u&&a.jsx("span",{style:z,children:u}),!o&&a.jsx("span",{style:{flex:1},children:g}),!o&&c&&a.jsx("span",{style:w,children:c})]})});F.displayName="MenuItem";const P=r.forwardRef(function({label:t,className:u,style:c,children:s,...p},b){const{collapsed:S}=G(),g={display:"flex",flexDirection:"column",gap:m.spacing[.5],...c},v={padding:`${m.spacing[3]}px ${m.spacing[3]}px ${i.componentPaddingY.sm}px ${m.spacing[3]}px`,fontSize:C.fontSizes.xs,fontWeight:600,color:"var(--brycks-foreground-muted)",textTransform:"uppercase",letterSpacing:"0.05em"};return a.jsxs("div",{ref:b,className:j.cx("brycks-menu-group",u),style:g,...p,children:[t&&!S&&a.jsx("div",{style:v,children:t}),s]})});P.displayName="MenuGroup";const T=r.forwardRef(function({className:t,style:u,...c},s){const p={height:1,backgroundColor:"var(--brycks-border-muted)",margin:`${m.spacing[2]}px 0`,...u};return a.jsx("div",{ref:s,role:"separator",className:j.cx("brycks-menu-divider",t),style:p,...c})});T.displayName="MenuDivider";exports.Menu=H;exports.MenuDivider=T;exports.MenuGroup=P;exports.MenuItem=F;
2
2
  //# sourceMappingURL=Menu.cjs.map
@@ -1,9 +1,9 @@
1
1
  import { jsx as d, jsxs as H } from "react/jsx-runtime";
2
2
  import { forwardRef as C, useState as F, useRef as G, useCallback as E, createContext as K, useContext as L } from "react";
3
3
  import { cx as w } from "../../../utils/styles.js";
4
+ import { iconSizes as R, componentHeights as j, componentPaddingX as O, componentGap as P, componentPaddingY as W } from "../../../design-system/primitives/sizing.js";
4
5
  import { spacing as u } from "../../../design-system/tokens/spacing.js";
5
- import { durations as O, easings as W } from "../../../design-system/tokens/motion.js";
6
- import { iconSizes as R, componentHeights as j, componentPaddingX as U, componentGap as P, componentPaddingY as X } from "../../../design-system/primitives/sizing.js";
6
+ import { durations as U, easings as X } from "../../../design-system/tokens/motion.js";
7
7
  import { fontSizes as z } from "../../../design-system/tokens/typography.js";
8
8
  const T = K(null);
9
9
  function q() {
@@ -76,7 +76,7 @@ const Y = C(function({
76
76
  Y.displayName = "Menu";
77
77
  const B = {
78
78
  sm: { height: j.sm, fontSize: z.base - 1, iconSize: R.sm, padding: P.lg },
79
- md: { height: j.md, fontSize: z.base, iconSize: R.md - 2, padding: U.sm },
79
+ md: { height: j.md, fontSize: z.base, iconSize: R.md - 2, padding: O.sm },
80
80
  lg: { height: j.lg, fontSize: z.md, iconSize: R.md, padding: u[3.5] }
81
81
  }, J = C(function({ value: n, icon: i, badge: s, disabled: r = !1, onClick: l, className: x, style: h, children: f, ...b }, p) {
82
82
  const { size: D, activeItem: $, setActiveItem: g, collapsed: o, focusedIndex: k, setFocusedIndex: v, registerItem: N } = q(), c = $ === n, a = B[D], S = N(n), A = () => {
@@ -97,7 +97,7 @@ const B = {
97
97
  border: "none",
98
98
  borderRadius: "var(--brycks-radius-md)",
99
99
  cursor: r ? "not-allowed" : "pointer",
100
- transition: `all ${O.quick}ms ${W.easeOut}`,
100
+ transition: `all ${U.quick}ms ${X.easeOut}`,
101
101
  textAlign: "left",
102
102
  outline: "none",
103
103
  justifyContent: o ? "center" : "flex-start",
@@ -148,7 +148,7 @@ const Q = C(function({ label: n, className: i, style: s, children: r, ...l }, x)
148
148
  gap: u[0.5],
149
149
  ...s
150
150
  }, b = {
151
- padding: `${u[3]}px ${u[3]}px ${X.sm}px ${u[3]}px`,
151
+ padding: `${u[3]}px ${u[3]}px ${W.sm}px ${u[3]}px`,
152
152
  fontSize: z.xs,
153
153
  fontWeight: 600,
154
154
  color: "var(--brycks-foreground-muted)",
@@ -1,7 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),u=require("react"),m=require("../../../utils/styles.cjs"),j=u.createContext(null);function R(){const y=u.useContext(j);if(!y)throw new Error("Tabs components must be used within a Tabs");return y}const z=u.forwardRef(function({value:n,defaultValue:r="",onChange:s,size:d="md",variant:i="line",orientation:e="horizontal",className:o,style:p,children:g,testId:T,...w},k){const[f,t]=u.useState(r),v=n??f,S=u.useCallback(x=>{n===void 0&&t(x),s?.(x)},[n,s]),C={display:"flex",flexDirection:e==="vertical"?"row":"column",gap:e==="vertical"?24:0,...p};return c.jsx(j.Provider,{value:{value:v,onChange:S,size:d,variant:i,orientation:e},children:c.jsx("div",{ref:k,className:m.cx("brycks-tabs",`brycks-tabs--${i}`,`brycks-tabs--${e}`,o),style:C,"data-testid":T,...w,children:g})})});z.displayName="Tabs";const N=u.forwardRef(function({className:n,style:r,children:s,...d},i){const{orientation:e,variant:o}=R(),p={display:"flex",flexDirection:e==="vertical"?"column":"row",gap:o==="enclosed"||e==="vertical"?4:0,borderBottom:o==="line"&&e==="horizontal"?"1px solid var(--brycks-border-muted)":void 0,borderRight:o==="line"&&e==="vertical"?"1px solid var(--brycks-border-muted)":void 0,paddingRight:e==="vertical"?16:void 0,backgroundColor:o==="enclosed"?"var(--brycks-background-muted)":void 0,padding:o==="enclosed"?4:void 0,borderRadius:o==="enclosed"?"var(--brycks-radius-lg)":void 0,flexShrink:0,...r};return c.jsx("div",{ref:i,role:"tablist","aria-orientation":e,className:m.cx("brycks-tab-list",n),style:p,...d,children:s})});N.displayName="TabList";const I={sm:{fontSize:13,padding:"6px 12px",height:32},md:{fontSize:14,padding:"8px 16px",height:40},lg:{fontSize:16,padding:"10px 20px",height:48}},P=u.forwardRef(function({value:n,disabled:r=!1,icon:s,className:d,style:i,children:e,...o},p){const{value:g,onChange:T,size:w,variant:k,orientation:f}=R(),t=g===n,v=I[w],S=()=>{r||T(n)},C=a=>{if(r)return;const l=Array.from(a.currentTarget.parentElement?.querySelectorAll('[role="tab"]:not([disabled])')??[]),h=l.indexOf(a.currentTarget);let b=null;f==="horizontal"?(a.key==="ArrowRight"&&(b=(h+1)%l.length),a.key==="ArrowLeft"&&(b=(h-1+l.length)%l.length)):(a.key==="ArrowDown"&&(b=(h+1)%l.length),a.key==="ArrowUp"&&(b=(h-1+l.length)%l.length)),a.key==="Home"&&(b=0),a.key==="End"&&(b=l.length-1),b!==null&&(a.preventDefault(),l[b]?.focus(),l[b]?.click())},x=()=>{const a={display:"inline-flex",alignItems:"center",justifyContent:"center",gap:8,fontSize:v.fontSize,fontWeight:500,padding:v.padding,minHeight:v.height,cursor:r?"not-allowed":"pointer",opacity:r?.5:1,transition:"all 150ms ease-out",outline:"none",border:"none",backgroundColor:"transparent",whiteSpace:"nowrap"};return k==="line"?{...a,color:t?"var(--brycks-primary-default)":"var(--brycks-foreground-muted)",borderBottom:f==="horizontal"?`2px solid ${t?"var(--brycks-primary-default)":"transparent"}`:void 0,borderRight:f==="vertical"?`2px solid ${t?"var(--brycks-primary-default)":"transparent"}`:void 0,marginBottom:f==="horizontal"?-1:void 0,marginRight:f==="vertical"?-1:void 0}:k==="enclosed"?{...a,color:t?"var(--brycks-foreground-default)":"var(--brycks-foreground-muted)",backgroundColor:t?"var(--brycks-background-elevated)":"transparent",borderRadius:"var(--brycks-radius-md)",boxShadow:t?"var(--brycks-shadow-sm)":void 0}:{...a,color:t?"var(--brycks-primary-default)":"var(--brycks-foreground-muted)",backgroundColor:t?"var(--brycks-primary-50)":"transparent",borderRadius:"var(--brycks-radius-md)"}};return c.jsxs("button",{ref:p,role:"tab",type:"button","aria-selected":t,"aria-disabled":r,disabled:r,tabIndex:t?0:-1,className:m.cx("brycks-tab",t&&"brycks-tab--selected",d),style:{...x(),...i},onClick:S,onKeyDown:C,...o,children:[s&&c.jsx("span",{className:"brycks-tab-icon",children:s}),e]})});P.displayName="Tab";const A=u.forwardRef(function({className:n,style:r,children:s,...d},i){const e={flex:1,...r};return c.jsx("div",{ref:i,className:m.cx("brycks-tab-panels",n),style:e,...d,children:s})});A.displayName="TabPanels";const D=u.forwardRef(function({value:n,className:r,style:s,children:d,...i},e){const{value:o}=R();if(!(o===n))return null;const g={padding:"16px 0",animation:"brycks-tab-panel-in 200ms ease-out",...s};return c.jsxs(c.Fragment,{children:[c.jsx("style",{children:`
2
- @keyframes brycks-tab-panel-in {
3
- from { opacity: 0; }
4
- to { opacity: 1; }
5
- }
6
- `}),c.jsx("div",{ref:e,role:"tabpanel",tabIndex:0,className:m.cx("brycks-tab-panel",r),style:g,...i,children:d})]})});D.displayName="TabPanel";exports.Tab=P;exports.TabList=N;exports.TabPanel=D;exports.TabPanels=A;exports.Tabs=z;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react/jsx-runtime"),c=require("react"),T=require("../../../utils/styles.cjs"),v=c.createContext(null);function g(){const b=c.useContext(v);if(!b)throw new Error("Tabs components must be used within a Tabs");return b}const N=c.forwardRef(function({value:e,defaultValue:t="",onChange:n,size:r="md",variant:l="line",orientation:i="horizontal",className:d,style:x,children:h,testId:k,...m},y){const[p,w]=c.useState(t),s=e??p,a=c.useCallback(u=>{e===void 0&&w(u),n?.(u)},[e,n]);return f.jsx(v.Provider,{value:{value:s,onChange:a,size:r,variant:l,orientation:i},children:f.jsx("div",{ref:y,className:T.cx("brycks-tabs",`brycks-tabs--${l}`,`brycks-tabs--${i}`,`brycks-tabs--${r}`,d),style:x,"data-testid":k,...m,children:h})})});N.displayName="Tabs";const P=c.forwardRef(function({className:e,style:t,children:n,...r},l){const{orientation:i}=g();return f.jsx("div",{ref:l,role:"tablist","aria-orientation":i,className:T.cx("brycks-tab-list",e),style:t,...r,children:n})});P.displayName="TabList";const j=c.forwardRef(function({value:e,disabled:t=!1,icon:n,className:r,style:l,children:i,...d},x){const{value:h,onChange:k,orientation:m}=g(),y=h===e,p=()=>{t||k(e)},w=s=>{if(t)return;const a=Array.from(s.currentTarget.parentElement?.querySelectorAll('[role="tab"]:not([disabled])')??[]),u=a.indexOf(s.currentTarget);let o=null;m==="horizontal"?(s.key==="ArrowRight"&&(o=(u+1)%a.length),s.key==="ArrowLeft"&&(o=(u-1+a.length)%a.length)):(s.key==="ArrowDown"&&(o=(u+1)%a.length),s.key==="ArrowUp"&&(o=(u-1+a.length)%a.length)),s.key==="Home"&&(o=0),s.key==="End"&&(o=a.length-1),o!==null&&(s.preventDefault(),a[o]?.focus(),a[o]?.click())};return f.jsxs("button",{ref:x,role:"tab",type:"button","aria-selected":y,"aria-disabled":t,disabled:t,tabIndex:y?0:-1,className:T.cx("brycks-tab",y&&"brycks-tab--selected",r),style:l,onClick:p,onKeyDown:w,...d,children:[n&&f.jsx("span",{className:"brycks-tab__icon",children:n}),i]})});j.displayName="Tab";const C=c.forwardRef(function({className:e,style:t,children:n,...r},l){return f.jsx("div",{ref:l,className:T.cx("brycks-tab-panels",e),style:t,...r,children:n})});C.displayName="TabPanels";const R=c.forwardRef(function({value:e,className:t,style:n,children:r,...l},i){const{value:d}=g();return d===e?f.jsx("div",{ref:i,role:"tabpanel",tabIndex:0,className:T.cx("brycks-tab-panel",t),style:n,...l,children:r}):null});R.displayName="TabPanel";exports.Tab=j;exports.TabList=P;exports.TabPanel=R;exports.TabPanels=C;exports.Tabs=N;
7
2
  //# sourceMappingURL=Tabs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.cjs","sources":["../../../../src/components/navigation/Tabs/Tabs.tsx"],"sourcesContent":["/**\n * Tabs Component\n *\n * Accessible tab navigation with keyboard support.\n * Supports horizontal and vertical orientations.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n createContext,\n useContext,\n type CSSProperties,\n type ReactNode,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsVariant = 'line' | 'enclosed' | 'soft'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\ninterface TabsContextValue {\n value: string\n onChange: (value: string) => void\n size: TabsSize\n variant: TabsVariant\n orientation: TabsOrientation\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs')\n }\n return context\n}\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Currently selected tab value */\n value?: string\n /** Default value (uncontrolled) */\n defaultValue?: string\n /** Callback when tab changes */\n onChange?: (value: string) => void\n /** Tab size */\n size?: TabsSize\n /** Tab variant */\n variant?: TabsVariant\n /** Tab orientation */\n orientation?: TabsOrientation\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n value: controlledValue,\n defaultValue = '',\n onChange,\n size = 'md',\n variant = 'line',\n orientation = 'horizontal',\n className,\n style,\n children,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const value = controlledValue ?? internalValue\n\n const handleChange = useCallback(\n (newValue: string) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n },\n [controlledValue, onChange]\n )\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: orientation === 'vertical' ? 'row' : 'column',\n gap: orientation === 'vertical' ? 24 : 0,\n ...style,\n }\n\n return (\n <TabsContext.Provider value={{ value, onChange: handleChange, size, variant, orientation }}>\n <div\n ref={ref}\n className={cx('brycks-tabs', `brycks-tabs--${variant}`, `brycks-tabs--${orientation}`, className)}\n style={containerStyle}\n data-testid={testId}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n )\n})\n\nTabs.displayName = 'Tabs'\n\n// TabList\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(function TabList(\n { className, style, children, ...props },\n ref\n) {\n const { orientation, variant } = useTabsContext()\n\n const listStyle: CSSProperties = {\n display: 'flex',\n flexDirection: orientation === 'vertical' ? 'column' : 'row',\n gap: variant === 'enclosed' ? 4 : orientation === 'vertical' ? 4 : 0,\n borderBottom: variant === 'line' && orientation === 'horizontal' ? '1px solid var(--brycks-border-muted)' : undefined,\n borderRight: variant === 'line' && orientation === 'vertical' ? '1px solid var(--brycks-border-muted)' : undefined,\n paddingRight: orientation === 'vertical' ? 16 : undefined,\n backgroundColor: variant === 'enclosed' ? 'var(--brycks-background-muted)' : undefined,\n padding: variant === 'enclosed' ? 4 : undefined,\n borderRadius: variant === 'enclosed' ? 'var(--brycks-radius-lg)' : undefined,\n flexShrink: 0,\n ...style,\n }\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cx('brycks-tab-list', className)}\n style={listStyle}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nTabList.displayName = 'TabList'\n\n// Tab\nexport interface TabProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Tab value */\n value: string\n /** Whether the tab is disabled */\n disabled?: boolean\n /** Icon before the label */\n icon?: ReactNode\n /** Custom class name */\n className?: string\n}\n\nconst sizeConfig: Record<TabsSize, { fontSize: number; padding: string; height: number }> = {\n sm: { fontSize: 13, padding: '6px 12px', height: 32 },\n md: { fontSize: 14, padding: '8px 16px', height: 40 },\n lg: { fontSize: 16, padding: '10px 20px', height: 48 },\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value: tabValue, disabled = false, icon, className, style, children, ...props },\n ref\n) {\n const { value, onChange, size, variant, orientation } = useTabsContext()\n const isSelected = value === tabValue\n const config = sizeConfig[size]\n\n const handleClick = () => {\n if (!disabled) {\n onChange(tabValue)\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n\n const tabs = Array.from(\n e.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])') ?? []\n )\n const currentIndex = tabs.indexOf(e.currentTarget)\n\n let newIndex: number | null = null\n\n if (orientation === 'horizontal') {\n if (e.key === 'ArrowRight') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowLeft') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n } else {\n if (e.key === 'ArrowDown') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowUp') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n }\n\n if (e.key === 'Home') newIndex = 0\n if (e.key === 'End') newIndex = tabs.length - 1\n\n if (newIndex !== null) {\n e.preventDefault()\n tabs[newIndex]?.focus()\n tabs[newIndex]?.click()\n }\n }\n\n const getTabStyle = (): CSSProperties => {\n const base: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n fontSize: config.fontSize,\n fontWeight: 500,\n padding: config.padding,\n minHeight: config.height,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n transition: 'all 150ms ease-out',\n outline: 'none',\n border: 'none',\n backgroundColor: 'transparent',\n whiteSpace: 'nowrap',\n }\n\n if (variant === 'line') {\n return {\n ...base,\n color: isSelected ? 'var(--brycks-primary-default)' : 'var(--brycks-foreground-muted)',\n borderBottom: orientation === 'horizontal' ? `2px solid ${isSelected ? 'var(--brycks-primary-default)' : 'transparent'}` : undefined,\n borderRight: orientation === 'vertical' ? `2px solid ${isSelected ? 'var(--brycks-primary-default)' : 'transparent'}` : undefined,\n marginBottom: orientation === 'horizontal' ? -1 : undefined,\n marginRight: orientation === 'vertical' ? -1 : undefined,\n }\n }\n\n if (variant === 'enclosed') {\n return {\n ...base,\n color: isSelected ? 'var(--brycks-foreground-default)' : 'var(--brycks-foreground-muted)',\n backgroundColor: isSelected ? 'var(--brycks-background-elevated)' : 'transparent',\n borderRadius: 'var(--brycks-radius-md)',\n boxShadow: isSelected ? 'var(--brycks-shadow-sm)' : undefined,\n }\n }\n\n // soft variant\n return {\n ...base,\n color: isSelected ? 'var(--brycks-primary-default)' : 'var(--brycks-foreground-muted)',\n backgroundColor: isSelected ? 'var(--brycks-primary-50)' : 'transparent',\n borderRadius: 'var(--brycks-radius-md)',\n }\n }\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n type=\"button\"\n aria-selected={isSelected}\n aria-disabled={disabled}\n disabled={disabled}\n tabIndex={isSelected ? 0 : -1}\n className={cx('brycks-tab', isSelected && 'brycks-tab--selected', className)}\n style={{ ...getTabStyle(), ...style }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className=\"brycks-tab-icon\">{icon}</span>}\n {children}\n </button>\n )\n})\n\nTab.displayName = 'Tab'\n\n// TabPanels\nexport interface TabPanelsProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanels = forwardRef<HTMLDivElement, TabPanelsProps>(function TabPanels(\n { className, style, children, ...props },\n ref\n) {\n const panelsStyle: CSSProperties = {\n flex: 1,\n ...style,\n }\n\n return (\n <div ref={ref} className={cx('brycks-tab-panels', className)} style={panelsStyle} {...props}>\n {children}\n </div>\n )\n})\n\nTabPanels.displayName = 'TabPanels'\n\n// TabPanel\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Panel value (must match a Tab value) */\n value: string\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(function TabPanel(\n { value: panelValue, className, style, children, ...props },\n ref\n) {\n const { value } = useTabsContext()\n const isSelected = value === panelValue\n\n if (!isSelected) return null\n\n const panelStyle: CSSProperties = {\n padding: '16px 0',\n animation: 'brycks-tab-panel-in 200ms ease-out',\n ...style,\n }\n\n return (\n <>\n <style>\n {`\n @keyframes brycks-tab-panel-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}\n </style>\n <div\n ref={ref}\n role=\"tabpanel\"\n tabIndex={0}\n className={cx('brycks-tab-panel', className)}\n style={panelStyle}\n {...props}\n >\n {children}\n </div>\n </>\n )\n})\n\nTabPanel.displayName = 'TabPanel'\n"],"names":["TabsContext","createContext","useTabsContext","context","useContext","Tabs","forwardRef","controlledValue","defaultValue","onChange","size","variant","orientation","className","style","children","testId","props","ref","internalValue","setInternalValue","useState","value","handleChange","useCallback","newValue","containerStyle","jsx","cx","TabList","listStyle","sizeConfig","Tab","tabValue","disabled","icon","isSelected","config","handleClick","handleKeyDown","e","tabs","currentIndex","newIndex","getTabStyle","base","jsxs","TabPanels","panelsStyle","TabPanel","panelValue","panelStyle","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Tabs.cjs","sources":["../../../../src/components/navigation/Tabs/Tabs.tsx"],"sourcesContent":["/**\n * Tabs Component\n *\n * Accessible tab navigation with keyboard support.\n * Supports horizontal and vertical orientations.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n createContext,\n useContext,\n type ReactNode,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsVariant = 'line' | 'enclosed' | 'soft'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\ninterface TabsContextValue {\n value: string\n onChange: (value: string) => void\n size: TabsSize\n variant: TabsVariant\n orientation: TabsOrientation\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs')\n }\n return context\n}\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Currently selected tab value */\n value?: string\n /** Default value (uncontrolled) */\n defaultValue?: string\n /** Callback when tab changes */\n onChange?: (value: string) => void\n /** Tab size */\n size?: TabsSize\n /** Tab variant */\n variant?: TabsVariant\n /** Tab orientation */\n orientation?: TabsOrientation\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n value: controlledValue,\n defaultValue = '',\n onChange,\n size = 'md',\n variant = 'line',\n orientation = 'horizontal',\n className,\n style,\n children,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const value = controlledValue ?? internalValue\n\n const handleChange = useCallback(\n (newValue: string) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n },\n [controlledValue, onChange]\n )\n\n return (\n <TabsContext.Provider value={{ value, onChange: handleChange, size, variant, orientation }}>\n <div\n ref={ref}\n className={cx(\n 'brycks-tabs',\n `brycks-tabs--${variant}`,\n `brycks-tabs--${orientation}`,\n `brycks-tabs--${size}`,\n className\n )}\n style={style}\n data-testid={testId}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n )\n})\n\nTabs.displayName = 'Tabs'\n\n// TabList\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(function TabList(\n { className, style, children, ...props },\n ref\n) {\n const { orientation } = useTabsContext()\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cx('brycks-tab-list', className)}\n style={style}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nTabList.displayName = 'TabList'\n\n// Tab\nexport interface TabProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Tab value */\n value: string\n /** Whether the tab is disabled */\n disabled?: boolean\n /** Icon before the label */\n icon?: ReactNode\n /** Custom class name */\n className?: string\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value: tabValue, disabled = false, icon, className, style, children, ...props },\n ref\n) {\n const { value, onChange, orientation } = useTabsContext()\n const isSelected = value === tabValue\n\n const handleClick = () => {\n if (!disabled) {\n onChange(tabValue)\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n\n const tabs = Array.from(\n e.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])') ?? []\n )\n const currentIndex = tabs.indexOf(e.currentTarget)\n\n let newIndex: number | null = null\n\n if (orientation === 'horizontal') {\n if (e.key === 'ArrowRight') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowLeft') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n } else {\n if (e.key === 'ArrowDown') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowUp') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n }\n\n if (e.key === 'Home') newIndex = 0\n if (e.key === 'End') newIndex = tabs.length - 1\n\n if (newIndex !== null) {\n e.preventDefault()\n tabs[newIndex]?.focus()\n tabs[newIndex]?.click()\n }\n }\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n type=\"button\"\n aria-selected={isSelected}\n aria-disabled={disabled}\n disabled={disabled}\n tabIndex={isSelected ? 0 : -1}\n className={cx('brycks-tab', isSelected && 'brycks-tab--selected', className)}\n style={style}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className=\"brycks-tab__icon\">{icon}</span>}\n {children}\n </button>\n )\n})\n\nTab.displayName = 'Tab'\n\n// TabPanels\nexport interface TabPanelsProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanels = forwardRef<HTMLDivElement, TabPanelsProps>(function TabPanels(\n { className, style, children, ...props },\n ref\n) {\n return (\n <div ref={ref} className={cx('brycks-tab-panels', className)} style={style} {...props}>\n {children}\n </div>\n )\n})\n\nTabPanels.displayName = 'TabPanels'\n\n// TabPanel\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Panel value (must match a Tab value) */\n value: string\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(function TabPanel(\n { value: panelValue, className, style, children, ...props },\n ref\n) {\n const { value } = useTabsContext()\n const isSelected = value === panelValue\n\n if (!isSelected) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n tabIndex={0}\n className={cx('brycks-tab-panel', className)}\n style={style}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nTabPanel.displayName = 'TabPanel'\n"],"names":["TabsContext","createContext","useTabsContext","context","useContext","Tabs","forwardRef","controlledValue","defaultValue","onChange","size","variant","orientation","className","style","children","testId","props","ref","internalValue","setInternalValue","useState","value","handleChange","useCallback","newValue","jsx","cx","TabList","Tab","tabValue","disabled","icon","isSelected","handleClick","handleKeyDown","e","tabs","currentIndex","newIndex","jsxs","TabPanels","TabPanel","panelValue"],"mappings":"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"}
@@ -1,196 +1,126 @@
1
- import { jsx as y, jsxs as N, Fragment as P } from "react/jsx-runtime";
2
- import { forwardRef as g, useState as A, useCallback as D, createContext as I, useContext as L } from "react";
3
- import { cx as v } from "../../../utils/styles.js";
4
- const R = I(null);
5
- function z() {
6
- const b = L(R);
7
- if (!b)
1
+ import { jsx as u, jsxs as N } from "react/jsx-runtime";
2
+ import { forwardRef as y, useState as C, useCallback as P, createContext as A, useContext as I } from "react";
3
+ import { cx as m } from "../../../utils/styles.js";
4
+ const w = A(null);
5
+ function g() {
6
+ const i = I(w);
7
+ if (!i)
8
8
  throw new Error("Tabs components must be used within a Tabs");
9
- return b;
9
+ return i;
10
10
  }
11
- const $ = g(function({
12
- value: n,
11
+ const S = y(function({
12
+ value: e,
13
13
  defaultValue: t = "",
14
- onChange: i,
15
- size: c = "md",
16
- variant: s = "line",
17
- orientation: e = "horizontal",
18
- className: o,
19
- style: p,
20
- children: f,
21
- testId: T,
22
- ...w
23
- }, k) {
24
- const [u, r] = A(t), m = n ?? u, S = D(
25
- (h) => {
26
- n === void 0 && r(h), i?.(h);
14
+ onChange: a,
15
+ size: r = "md",
16
+ variant: l = "line",
17
+ orientation: c = "horizontal",
18
+ className: f,
19
+ style: T,
20
+ children: h,
21
+ testId: k,
22
+ ...p
23
+ }, d) {
24
+ const [x, v] = C(t), s = e ?? x, n = P(
25
+ (b) => {
26
+ e === void 0 && v(b), a?.(b);
27
27
  },
28
- [n, i]
29
- ), C = {
30
- display: "flex",
31
- flexDirection: e === "vertical" ? "row" : "column",
32
- gap: e === "vertical" ? 24 : 0,
33
- ...p
34
- };
35
- return /* @__PURE__ */ y(R.Provider, { value: { value: m, onChange: S, size: c, variant: s, orientation: e }, children: /* @__PURE__ */ y(
28
+ [e, a]
29
+ );
30
+ return /* @__PURE__ */ u(w.Provider, { value: { value: s, onChange: n, size: r, variant: l, orientation: c }, children: /* @__PURE__ */ u(
36
31
  "div",
37
32
  {
38
- ref: k,
39
- className: v("brycks-tabs", `brycks-tabs--${s}`, `brycks-tabs--${e}`, o),
40
- style: C,
41
- "data-testid": T,
42
- ...w,
43
- children: f
33
+ ref: d,
34
+ className: m(
35
+ "brycks-tabs",
36
+ `brycks-tabs--${l}`,
37
+ `brycks-tabs--${c}`,
38
+ `brycks-tabs--${r}`,
39
+ f
40
+ ),
41
+ style: T,
42
+ "data-testid": k,
43
+ ...p,
44
+ children: h
44
45
  }
45
46
  ) });
46
47
  });
47
- $.displayName = "Tabs";
48
- const j = g(function({ className: n, style: t, children: i, ...c }, s) {
49
- const { orientation: e, variant: o } = z(), p = {
50
- display: "flex",
51
- flexDirection: e === "vertical" ? "column" : "row",
52
- gap: o === "enclosed" || e === "vertical" ? 4 : 0,
53
- borderBottom: o === "line" && e === "horizontal" ? "1px solid var(--brycks-border-muted)" : void 0,
54
- borderRight: o === "line" && e === "vertical" ? "1px solid var(--brycks-border-muted)" : void 0,
55
- paddingRight: e === "vertical" ? 16 : void 0,
56
- backgroundColor: o === "enclosed" ? "var(--brycks-background-muted)" : void 0,
57
- padding: o === "enclosed" ? 4 : void 0,
58
- borderRadius: o === "enclosed" ? "var(--brycks-radius-lg)" : void 0,
59
- flexShrink: 0,
60
- ...t
61
- };
62
- return /* @__PURE__ */ y(
48
+ S.displayName = "Tabs";
49
+ const D = y(function({ className: e, style: t, children: a, ...r }, l) {
50
+ const { orientation: c } = g();
51
+ return /* @__PURE__ */ u(
63
52
  "div",
64
53
  {
65
- ref: s,
54
+ ref: l,
66
55
  role: "tablist",
67
- "aria-orientation": e,
68
- className: v("brycks-tab-list", n),
69
- style: p,
70
- ...c,
71
- children: i
56
+ "aria-orientation": c,
57
+ className: m("brycks-tab-list", e),
58
+ style: t,
59
+ ...r,
60
+ children: a
72
61
  }
73
62
  );
74
63
  });
75
- j.displayName = "TabList";
76
- const B = {
77
- sm: { fontSize: 13, padding: "6px 12px", height: 32 },
78
- md: { fontSize: 14, padding: "8px 16px", height: 40 },
79
- lg: { fontSize: 16, padding: "10px 20px", height: 48 }
80
- }, E = g(function({ value: n, disabled: t = !1, icon: i, className: c, style: s, children: e, ...o }, p) {
81
- const { value: f, onChange: T, size: w, variant: k, orientation: u } = z(), r = f === n, m = B[w], S = () => {
82
- t || T(n);
83
- }, C = (a) => {
64
+ D.displayName = "TabList";
65
+ const L = y(function({ value: e, disabled: t = !1, icon: a, className: r, style: l, children: c, ...f }, T) {
66
+ const { value: h, onChange: k, orientation: p } = g(), d = h === e, x = () => {
67
+ t || k(e);
68
+ }, v = (s) => {
84
69
  if (t) return;
85
- const l = Array.from(
86
- a.currentTarget.parentElement?.querySelectorAll('[role="tab"]:not([disabled])') ?? []
87
- ), x = l.indexOf(a.currentTarget);
88
- let d = null;
89
- u === "horizontal" ? (a.key === "ArrowRight" && (d = (x + 1) % l.length), a.key === "ArrowLeft" && (d = (x - 1 + l.length) % l.length)) : (a.key === "ArrowDown" && (d = (x + 1) % l.length), a.key === "ArrowUp" && (d = (x - 1 + l.length) % l.length)), a.key === "Home" && (d = 0), a.key === "End" && (d = l.length - 1), d !== null && (a.preventDefault(), l[d]?.focus(), l[d]?.click());
90
- }, h = () => {
91
- const a = {
92
- display: "inline-flex",
93
- alignItems: "center",
94
- justifyContent: "center",
95
- gap: 8,
96
- fontSize: m.fontSize,
97
- fontWeight: 500,
98
- padding: m.padding,
99
- minHeight: m.height,
100
- cursor: t ? "not-allowed" : "pointer",
101
- opacity: t ? 0.5 : 1,
102
- transition: "all 150ms ease-out",
103
- outline: "none",
104
- border: "none",
105
- backgroundColor: "transparent",
106
- whiteSpace: "nowrap"
107
- };
108
- return k === "line" ? {
109
- ...a,
110
- color: r ? "var(--brycks-primary-default)" : "var(--brycks-foreground-muted)",
111
- borderBottom: u === "horizontal" ? `2px solid ${r ? "var(--brycks-primary-default)" : "transparent"}` : void 0,
112
- borderRight: u === "vertical" ? `2px solid ${r ? "var(--brycks-primary-default)" : "transparent"}` : void 0,
113
- marginBottom: u === "horizontal" ? -1 : void 0,
114
- marginRight: u === "vertical" ? -1 : void 0
115
- } : k === "enclosed" ? {
116
- ...a,
117
- color: r ? "var(--brycks-foreground-default)" : "var(--brycks-foreground-muted)",
118
- backgroundColor: r ? "var(--brycks-background-elevated)" : "transparent",
119
- borderRadius: "var(--brycks-radius-md)",
120
- boxShadow: r ? "var(--brycks-shadow-sm)" : void 0
121
- } : {
122
- ...a,
123
- color: r ? "var(--brycks-primary-default)" : "var(--brycks-foreground-muted)",
124
- backgroundColor: r ? "var(--brycks-primary-50)" : "transparent",
125
- borderRadius: "var(--brycks-radius-md)"
126
- };
70
+ const n = Array.from(
71
+ s.currentTarget.parentElement?.querySelectorAll('[role="tab"]:not([disabled])') ?? []
72
+ ), b = n.indexOf(s.currentTarget);
73
+ let o = null;
74
+ p === "horizontal" ? (s.key === "ArrowRight" && (o = (b + 1) % n.length), s.key === "ArrowLeft" && (o = (b - 1 + n.length) % n.length)) : (s.key === "ArrowDown" && (o = (b + 1) % n.length), s.key === "ArrowUp" && (o = (b - 1 + n.length) % n.length)), s.key === "Home" && (o = 0), s.key === "End" && (o = n.length - 1), o !== null && (s.preventDefault(), n[o]?.focus(), n[o]?.click());
127
75
  };
128
76
  return /* @__PURE__ */ N(
129
77
  "button",
130
78
  {
131
- ref: p,
79
+ ref: T,
132
80
  role: "tab",
133
81
  type: "button",
134
- "aria-selected": r,
82
+ "aria-selected": d,
135
83
  "aria-disabled": t,
136
84
  disabled: t,
137
- tabIndex: r ? 0 : -1,
138
- className: v("brycks-tab", r && "brycks-tab--selected", c),
139
- style: { ...h(), ...s },
140
- onClick: S,
141
- onKeyDown: C,
142
- ...o,
85
+ tabIndex: d ? 0 : -1,
86
+ className: m("brycks-tab", d && "brycks-tab--selected", r),
87
+ style: l,
88
+ onClick: x,
89
+ onKeyDown: v,
90
+ ...f,
143
91
  children: [
144
- i && /* @__PURE__ */ y("span", { className: "brycks-tab-icon", children: i }),
145
- e
92
+ a && /* @__PURE__ */ u("span", { className: "brycks-tab__icon", children: a }),
93
+ c
146
94
  ]
147
95
  }
148
96
  );
149
97
  });
150
- E.displayName = "Tab";
151
- const H = g(function({ className: n, style: t, children: i, ...c }, s) {
152
- const e = {
153
- flex: 1,
154
- ...t
155
- };
156
- return /* @__PURE__ */ y("div", { ref: s, className: v("brycks-tab-panels", n), style: e, ...c, children: i });
98
+ L.displayName = "Tab";
99
+ const E = y(function({ className: e, style: t, children: a, ...r }, l) {
100
+ return /* @__PURE__ */ u("div", { ref: l, className: m("brycks-tab-panels", e), style: t, ...r, children: a });
157
101
  });
158
- H.displayName = "TabPanels";
159
- const K = g(function({ value: n, className: t, style: i, children: c, ...s }, e) {
160
- const { value: o } = z();
161
- if (!(o === n)) return null;
162
- const f = {
163
- padding: "16px 0",
164
- animation: "brycks-tab-panel-in 200ms ease-out",
165
- ...i
166
- };
167
- return /* @__PURE__ */ N(P, { children: [
168
- /* @__PURE__ */ y("style", { children: `
169
- @keyframes brycks-tab-panel-in {
170
- from { opacity: 0; }
171
- to { opacity: 1; }
172
- }
173
- ` }),
174
- /* @__PURE__ */ y(
175
- "div",
176
- {
177
- ref: e,
178
- role: "tabpanel",
179
- tabIndex: 0,
180
- className: v("brycks-tab-panel", t),
181
- style: f,
182
- ...s,
183
- children: c
184
- }
185
- )
186
- ] });
102
+ E.displayName = "TabPanels";
103
+ const $ = y(function({ value: e, className: t, style: a, children: r, ...l }, c) {
104
+ const { value: f } = g();
105
+ return f === e ? /* @__PURE__ */ u(
106
+ "div",
107
+ {
108
+ ref: c,
109
+ role: "tabpanel",
110
+ tabIndex: 0,
111
+ className: m("brycks-tab-panel", t),
112
+ style: a,
113
+ ...l,
114
+ children: r
115
+ }
116
+ ) : null;
187
117
  });
188
- K.displayName = "TabPanel";
118
+ $.displayName = "TabPanel";
189
119
  export {
190
- E as Tab,
191
- j as TabList,
192
- K as TabPanel,
193
- H as TabPanels,
194
- $ as Tabs
120
+ L as Tab,
121
+ D as TabList,
122
+ $ as TabPanel,
123
+ E as TabPanels,
124
+ S as Tabs
195
125
  };
196
126
  //# sourceMappingURL=Tabs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sources":["../../../../src/components/navigation/Tabs/Tabs.tsx"],"sourcesContent":["/**\n * Tabs Component\n *\n * Accessible tab navigation with keyboard support.\n * Supports horizontal and vertical orientations.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n createContext,\n useContext,\n type CSSProperties,\n type ReactNode,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsVariant = 'line' | 'enclosed' | 'soft'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\ninterface TabsContextValue {\n value: string\n onChange: (value: string) => void\n size: TabsSize\n variant: TabsVariant\n orientation: TabsOrientation\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs')\n }\n return context\n}\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Currently selected tab value */\n value?: string\n /** Default value (uncontrolled) */\n defaultValue?: string\n /** Callback when tab changes */\n onChange?: (value: string) => void\n /** Tab size */\n size?: TabsSize\n /** Tab variant */\n variant?: TabsVariant\n /** Tab orientation */\n orientation?: TabsOrientation\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n value: controlledValue,\n defaultValue = '',\n onChange,\n size = 'md',\n variant = 'line',\n orientation = 'horizontal',\n className,\n style,\n children,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const value = controlledValue ?? internalValue\n\n const handleChange = useCallback(\n (newValue: string) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n },\n [controlledValue, onChange]\n )\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: orientation === 'vertical' ? 'row' : 'column',\n gap: orientation === 'vertical' ? 24 : 0,\n ...style,\n }\n\n return (\n <TabsContext.Provider value={{ value, onChange: handleChange, size, variant, orientation }}>\n <div\n ref={ref}\n className={cx('brycks-tabs', `brycks-tabs--${variant}`, `brycks-tabs--${orientation}`, className)}\n style={containerStyle}\n data-testid={testId}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n )\n})\n\nTabs.displayName = 'Tabs'\n\n// TabList\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(function TabList(\n { className, style, children, ...props },\n ref\n) {\n const { orientation, variant } = useTabsContext()\n\n const listStyle: CSSProperties = {\n display: 'flex',\n flexDirection: orientation === 'vertical' ? 'column' : 'row',\n gap: variant === 'enclosed' ? 4 : orientation === 'vertical' ? 4 : 0,\n borderBottom: variant === 'line' && orientation === 'horizontal' ? '1px solid var(--brycks-border-muted)' : undefined,\n borderRight: variant === 'line' && orientation === 'vertical' ? '1px solid var(--brycks-border-muted)' : undefined,\n paddingRight: orientation === 'vertical' ? 16 : undefined,\n backgroundColor: variant === 'enclosed' ? 'var(--brycks-background-muted)' : undefined,\n padding: variant === 'enclosed' ? 4 : undefined,\n borderRadius: variant === 'enclosed' ? 'var(--brycks-radius-lg)' : undefined,\n flexShrink: 0,\n ...style,\n }\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cx('brycks-tab-list', className)}\n style={listStyle}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nTabList.displayName = 'TabList'\n\n// Tab\nexport interface TabProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Tab value */\n value: string\n /** Whether the tab is disabled */\n disabled?: boolean\n /** Icon before the label */\n icon?: ReactNode\n /** Custom class name */\n className?: string\n}\n\nconst sizeConfig: Record<TabsSize, { fontSize: number; padding: string; height: number }> = {\n sm: { fontSize: 13, padding: '6px 12px', height: 32 },\n md: { fontSize: 14, padding: '8px 16px', height: 40 },\n lg: { fontSize: 16, padding: '10px 20px', height: 48 },\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value: tabValue, disabled = false, icon, className, style, children, ...props },\n ref\n) {\n const { value, onChange, size, variant, orientation } = useTabsContext()\n const isSelected = value === tabValue\n const config = sizeConfig[size]\n\n const handleClick = () => {\n if (!disabled) {\n onChange(tabValue)\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n\n const tabs = Array.from(\n e.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])') ?? []\n )\n const currentIndex = tabs.indexOf(e.currentTarget)\n\n let newIndex: number | null = null\n\n if (orientation === 'horizontal') {\n if (e.key === 'ArrowRight') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowLeft') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n } else {\n if (e.key === 'ArrowDown') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowUp') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n }\n\n if (e.key === 'Home') newIndex = 0\n if (e.key === 'End') newIndex = tabs.length - 1\n\n if (newIndex !== null) {\n e.preventDefault()\n tabs[newIndex]?.focus()\n tabs[newIndex]?.click()\n }\n }\n\n const getTabStyle = (): CSSProperties => {\n const base: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n fontSize: config.fontSize,\n fontWeight: 500,\n padding: config.padding,\n minHeight: config.height,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n transition: 'all 150ms ease-out',\n outline: 'none',\n border: 'none',\n backgroundColor: 'transparent',\n whiteSpace: 'nowrap',\n }\n\n if (variant === 'line') {\n return {\n ...base,\n color: isSelected ? 'var(--brycks-primary-default)' : 'var(--brycks-foreground-muted)',\n borderBottom: orientation === 'horizontal' ? `2px solid ${isSelected ? 'var(--brycks-primary-default)' : 'transparent'}` : undefined,\n borderRight: orientation === 'vertical' ? `2px solid ${isSelected ? 'var(--brycks-primary-default)' : 'transparent'}` : undefined,\n marginBottom: orientation === 'horizontal' ? -1 : undefined,\n marginRight: orientation === 'vertical' ? -1 : undefined,\n }\n }\n\n if (variant === 'enclosed') {\n return {\n ...base,\n color: isSelected ? 'var(--brycks-foreground-default)' : 'var(--brycks-foreground-muted)',\n backgroundColor: isSelected ? 'var(--brycks-background-elevated)' : 'transparent',\n borderRadius: 'var(--brycks-radius-md)',\n boxShadow: isSelected ? 'var(--brycks-shadow-sm)' : undefined,\n }\n }\n\n // soft variant\n return {\n ...base,\n color: isSelected ? 'var(--brycks-primary-default)' : 'var(--brycks-foreground-muted)',\n backgroundColor: isSelected ? 'var(--brycks-primary-50)' : 'transparent',\n borderRadius: 'var(--brycks-radius-md)',\n }\n }\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n type=\"button\"\n aria-selected={isSelected}\n aria-disabled={disabled}\n disabled={disabled}\n tabIndex={isSelected ? 0 : -1}\n className={cx('brycks-tab', isSelected && 'brycks-tab--selected', className)}\n style={{ ...getTabStyle(), ...style }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className=\"brycks-tab-icon\">{icon}</span>}\n {children}\n </button>\n )\n})\n\nTab.displayName = 'Tab'\n\n// TabPanels\nexport interface TabPanelsProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanels = forwardRef<HTMLDivElement, TabPanelsProps>(function TabPanels(\n { className, style, children, ...props },\n ref\n) {\n const panelsStyle: CSSProperties = {\n flex: 1,\n ...style,\n }\n\n return (\n <div ref={ref} className={cx('brycks-tab-panels', className)} style={panelsStyle} {...props}>\n {children}\n </div>\n )\n})\n\nTabPanels.displayName = 'TabPanels'\n\n// TabPanel\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Panel value (must match a Tab value) */\n value: string\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(function TabPanel(\n { value: panelValue, className, style, children, ...props },\n ref\n) {\n const { value } = useTabsContext()\n const isSelected = value === panelValue\n\n if (!isSelected) return null\n\n const panelStyle: CSSProperties = {\n padding: '16px 0',\n animation: 'brycks-tab-panel-in 200ms ease-out',\n ...style,\n }\n\n return (\n <>\n <style>\n {`\n @keyframes brycks-tab-panel-in {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}\n </style>\n <div\n ref={ref}\n role=\"tabpanel\"\n tabIndex={0}\n className={cx('brycks-tab-panel', className)}\n style={panelStyle}\n {...props}\n >\n {children}\n </div>\n </>\n )\n})\n\nTabPanel.displayName = 'TabPanel'\n"],"names":["TabsContext","createContext","useTabsContext","context","useContext","Tabs","forwardRef","controlledValue","defaultValue","onChange","size","variant","orientation","className","style","children","testId","props","ref","internalValue","setInternalValue","useState","value","handleChange","useCallback","newValue","containerStyle","jsx","cx","TabList","listStyle","sizeConfig","Tab","tabValue","disabled","icon","isSelected","config","handleClick","handleKeyDown","e","tabs","currentIndex","newIndex","getTabStyle","base","jsxs","TabPanels","panelsStyle","TabPanel","panelValue","panelStyle","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Tabs.js","sources":["../../../../src/components/navigation/Tabs/Tabs.tsx"],"sourcesContent":["/**\n * Tabs Component\n *\n * Accessible tab navigation with keyboard support.\n * Supports horizontal and vertical orientations.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n createContext,\n useContext,\n type ReactNode,\n type HTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type TabsSize = 'sm' | 'md' | 'lg'\nexport type TabsVariant = 'line' | 'enclosed' | 'soft'\nexport type TabsOrientation = 'horizontal' | 'vertical'\n\ninterface TabsContextValue {\n value: string\n onChange: (value: string) => void\n size: TabsSize\n variant: TabsVariant\n orientation: TabsOrientation\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs')\n }\n return context\n}\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Currently selected tab value */\n value?: string\n /** Default value (uncontrolled) */\n defaultValue?: string\n /** Callback when tab changes */\n onChange?: (value: string) => void\n /** Tab size */\n size?: TabsSize\n /** Tab variant */\n variant?: TabsVariant\n /** Tab orientation */\n orientation?: TabsOrientation\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n value: controlledValue,\n defaultValue = '',\n onChange,\n size = 'md',\n variant = 'line',\n orientation = 'horizontal',\n className,\n style,\n children,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const value = controlledValue ?? internalValue\n\n const handleChange = useCallback(\n (newValue: string) => {\n if (controlledValue === undefined) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n },\n [controlledValue, onChange]\n )\n\n return (\n <TabsContext.Provider value={{ value, onChange: handleChange, size, variant, orientation }}>\n <div\n ref={ref}\n className={cx(\n 'brycks-tabs',\n `brycks-tabs--${variant}`,\n `brycks-tabs--${orientation}`,\n `brycks-tabs--${size}`,\n className\n )}\n style={style}\n data-testid={testId}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n )\n})\n\nTabs.displayName = 'Tabs'\n\n// TabList\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(function TabList(\n { className, style, children, ...props },\n ref\n) {\n const { orientation } = useTabsContext()\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cx('brycks-tab-list', className)}\n style={style}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nTabList.displayName = 'TabList'\n\n// Tab\nexport interface TabProps extends Omit<HTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Tab value */\n value: string\n /** Whether the tab is disabled */\n disabled?: boolean\n /** Icon before the label */\n icon?: ReactNode\n /** Custom class name */\n className?: string\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value: tabValue, disabled = false, icon, className, style, children, ...props },\n ref\n) {\n const { value, onChange, orientation } = useTabsContext()\n const isSelected = value === tabValue\n\n const handleClick = () => {\n if (!disabled) {\n onChange(tabValue)\n }\n }\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled) return\n\n const tabs = Array.from(\n e.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])') ?? []\n )\n const currentIndex = tabs.indexOf(e.currentTarget)\n\n let newIndex: number | null = null\n\n if (orientation === 'horizontal') {\n if (e.key === 'ArrowRight') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowLeft') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n } else {\n if (e.key === 'ArrowDown') newIndex = (currentIndex + 1) % tabs.length\n if (e.key === 'ArrowUp') newIndex = (currentIndex - 1 + tabs.length) % tabs.length\n }\n\n if (e.key === 'Home') newIndex = 0\n if (e.key === 'End') newIndex = tabs.length - 1\n\n if (newIndex !== null) {\n e.preventDefault()\n tabs[newIndex]?.focus()\n tabs[newIndex]?.click()\n }\n }\n\n return (\n <button\n ref={ref}\n role=\"tab\"\n type=\"button\"\n aria-selected={isSelected}\n aria-disabled={disabled}\n disabled={disabled}\n tabIndex={isSelected ? 0 : -1}\n className={cx('brycks-tab', isSelected && 'brycks-tab--selected', className)}\n style={style}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className=\"brycks-tab__icon\">{icon}</span>}\n {children}\n </button>\n )\n})\n\nTab.displayName = 'Tab'\n\n// TabPanels\nexport interface TabPanelsProps extends HTMLAttributes<HTMLDivElement> {\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanels = forwardRef<HTMLDivElement, TabPanelsProps>(function TabPanels(\n { className, style, children, ...props },\n ref\n) {\n return (\n <div ref={ref} className={cx('brycks-tab-panels', className)} style={style} {...props}>\n {children}\n </div>\n )\n})\n\nTabPanels.displayName = 'TabPanels'\n\n// TabPanel\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n /** Panel value (must match a Tab value) */\n value: string\n /** Custom class name */\n className?: string\n}\n\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(function TabPanel(\n { value: panelValue, className, style, children, ...props },\n ref\n) {\n const { value } = useTabsContext()\n const isSelected = value === panelValue\n\n if (!isSelected) return null\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n tabIndex={0}\n className={cx('brycks-tab-panel', className)}\n style={style}\n {...props}\n >\n {children}\n </div>\n )\n})\n\nTabPanel.displayName = 'TabPanel'\n"],"names":["TabsContext","createContext","useTabsContext","context","useContext","Tabs","forwardRef","controlledValue","defaultValue","onChange","size","variant","orientation","className","style","children","testId","props","ref","internalValue","setInternalValue","useState","value","handleChange","useCallback","newValue","jsx","cx","TabList","Tab","tabValue","disabled","icon","isSelected","handleClick","handleKeyDown","e","tabs","currentIndex","newIndex","jsxs","TabPanels","TabPanel","panelValue"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),u=require("react"),S=require("./Button.styles.cjs"),W=require("../../../utils/styles.cjs"),_=u.memo(function({size:s}){return t.jsxs("svg",{width:s,height:s,viewBox:"0 0 24 24",fill:"none",className:"brycks-animate-spin","aria-hidden":"true",children:[t.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeDasharray:"31.4 31.4",opacity:"0.25"}),t.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeDasharray:"31.4 31.4",strokeDashoffset:"62.8",style:{transform:"rotate(-90deg)",transformOrigin:"center"}})]})}),A=({as:c,variant:s="solid",intent:b="primary",size:l="md",fullWidth:p,isLoading:e,isDisabled:v,leftIcon:h,rightIcon:f,isIconOnly:r,className:w,style:M,children:x,testId:g,onMouseEnter:z,onMouseLeave:C,onMouseDown:D,onMouseUp:N,...k},q)=>{const m=c||"button",[P,B]=u.useState(!1),[R,d]=u.useState(!1),o=v||e,a=S.getButtonStyles({variant:s,intent:b,size:l,fullWidth:p,isIconOnly:r}),$={...a.base,...P&&!o?a.hover:{},...R&&!o?a.active:{},...o?a.disabled:{},...e?a.loading:{},...M},i=S.sizeConfig[l],I=n=>{B(!0),z?.(n)},E=n=>{B(!1),d(!1),C?.(n)},H=n=>{d(!0),D?.(n)},U=n=>{d(!1),N?.(n)},T=W.cx("brycks-button",`brycks-button--${s}`,`brycks-button--${b}`,`brycks-button--${l}`,p&&"brycks-button--full-width",r&&"brycks-button--icon-only",e&&"brycks-button--loading",o&&"brycks-button--disabled",w),V=m==="button"||c===void 0?{type:k.type??"button",disabled:o}:{"aria-disabled":o||void 0,role:"button",tabIndex:o?-1:0};return t.jsxs(m,{ref:q,className:T,style:$,"data-testid":g,onMouseEnter:I,onMouseLeave:E,onMouseDown:H,onMouseUp:U,...V,...k,children:[e&&t.jsx("span",{style:{display:"inline-flex",position:r?"absolute":"relative"},children:t.jsx(_,{size:i.iconSize})}),!e&&h&&t.jsx("span",{style:{display:"inline-flex",width:i.iconSize,height:i.iconSize},children:h}),!r&&t.jsx("span",{style:{opacity:e&&!r?.5:1},children:x}),!e&&f&&t.jsx("span",{style:{display:"inline-flex",width:i.iconSize,height:i.iconSize},children:f}),r&&!e&&x]})},y=u.forwardRef(A);y.displayName="Button";const F=(c,s)=>t.jsx(y,{ref:s,isIconOnly:!0,...c}),j=u.forwardRef(F);j.displayName="IconButton";exports.Button=y;exports.IconButton=j;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),c=require("react"),z=require("./Button.styles.cjs"),C=require("../../../utils/styles.cjs"),N=c.memo(function({size:n}){return t.jsxs("svg",{width:n,height:n,viewBox:"0 0 24 24",fill:"none",className:"brycks-animate-spin","aria-hidden":"true",children:[t.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeDasharray:"31.4 31.4",opacity:"0.25"}),t.jsx("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeDasharray:"31.4 31.4",strokeDashoffset:"62.8",style:{transform:"rotate(-90deg)",transformOrigin:"center"}})]})}),q=({as:o,variant:n="solid",intent:h="primary",size:l="md",fullWidth:k,isLoading:e,isDisabled:f,leftIcon:u,rightIcon:d,isIconOnly:s,className:m,style:j,children:y,testId:B,...b},S)=>{const p=o||"button",i=f||e,r=z.sizeConfig[l],w={display:"inline-flex",alignItems:"center",justifyContent:"center",...j},g=C.cx("brycks-button",`brycks-button--${n}`,`brycks-button--${h}`,`brycks-button--${l}`,k&&"brycks-button--full-width",s&&"brycks-button--icon-only",e&&"brycks-button--loading",i&&"brycks-button--disabled",m),v=p==="button"||o===void 0?{type:b.type??"button",disabled:i}:{"aria-disabled":i||void 0,role:"button",tabIndex:i?-1:0};return t.jsxs(p,{ref:S,className:g,style:w,"data-testid":B,...v,...b,children:[e&&t.jsx("span",{style:{display:"inline-flex",position:s?"absolute":"relative"},children:t.jsx(N,{size:r.iconSize})}),!e&&u&&t.jsx("span",{style:{display:"inline-flex",width:r.iconSize,height:r.iconSize},children:u}),!s&&t.jsx("span",{style:{opacity:e&&!s?.5:1},children:y}),!e&&d&&t.jsx("span",{style:{display:"inline-flex",width:r.iconSize,height:r.iconSize},children:d}),s&&!e&&y]})},a=c.forwardRef(q);a.displayName="Button";const R=(o,n)=>t.jsx(a,{ref:n,isIconOnly:!0,...o}),x=c.forwardRef(R);x.displayName="IconButton";exports.Button=a;exports.IconButton=x;
2
2
  //# sourceMappingURL=Button.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.cjs","sources":["../../../../src/components/primitives/Button/Button.tsx"],"sourcesContent":["/**\r\n * Button Component\r\n *\r\n * A versatile, polymorphic button component with multiple variants,\r\n * sizes, and states. Designed with Apple-inspired aesthetics -\r\n * smooth transitions, tactile feedback, and refined visual details.\r\n */\r\n\r\nimport React, {\r\n forwardRef,\r\n useState,\r\n type ElementType,\r\n type ComponentPropsWithRef,\r\n type CSSProperties,\r\n} from 'react'\r\nimport type { ButtonProps } from './Button.types'\r\nimport { getButtonStyles, sizeConfig } from './Button.styles'\r\nimport { cx } from '../../../utils/styles'\r\n\r\ninterface ButtonComponent {\r\n <E extends ElementType = 'button'>(\r\n props: ButtonProps<E> & { ref?: ComponentPropsWithRef<E>['ref'] }\r\n ): React.JSX.Element | null\r\n displayName?: string\r\n}\r\n\r\n/** Loading spinner component - uses global CSS keyframes */\r\nconst LoadingSpinner = React.memo(function LoadingSpinner({ size }: { size: number }) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n className=\"brycks-animate-spin\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray=\"31.4 31.4\"\r\n opacity=\"0.25\"\r\n />\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray=\"31.4 31.4\"\r\n strokeDashoffset=\"62.8\"\r\n style={{ transform: 'rotate(-90deg)', transformOrigin: 'center' }}\r\n />\r\n </svg>\r\n )\r\n})\r\n\r\nconst ButtonInner = <E extends ElementType = 'button'>(\r\n {\r\n as,\r\n variant = 'solid',\r\n intent = 'primary',\r\n size = 'md',\r\n fullWidth,\r\n isLoading,\r\n isDisabled,\r\n leftIcon,\r\n rightIcon,\r\n isIconOnly,\r\n className,\r\n style,\r\n children,\r\n testId,\r\n onMouseEnter,\r\n onMouseLeave,\r\n onMouseDown,\r\n onMouseUp,\r\n ...props\r\n }: ButtonProps<E>,\r\n ref: React.ForwardedRef<Element>\r\n) => {\r\n const Component = (as || 'button') as ElementType\r\n const [isHovered, setIsHovered] = useState(false)\r\n const [isPressed, setIsPressed] = useState(false)\r\n\r\n const disabled = isDisabled || isLoading\r\n\r\n const styles = getButtonStyles({\r\n variant,\r\n intent,\r\n size,\r\n fullWidth,\r\n isIconOnly,\r\n isDisabled: disabled,\r\n isLoading,\r\n })\r\n\r\n // Build final style object\r\n const computedStyle: CSSProperties = {\r\n ...styles.base,\r\n ...(isHovered && !disabled ? styles.hover : {}),\r\n ...(isPressed && !disabled ? styles.active : {}),\r\n ...(disabled ? styles.disabled : {}),\r\n ...(isLoading ? styles.loading : {}),\r\n ...style,\r\n }\r\n\r\n const sizeValues = sizeConfig[size]\r\n\r\n const handleMouseEnter = (e: React.MouseEvent) => {\r\n setIsHovered(true)\r\n onMouseEnter?.(e as never)\r\n }\r\n\r\n const handleMouseLeave = (e: React.MouseEvent) => {\r\n setIsHovered(false)\r\n setIsPressed(false)\r\n onMouseLeave?.(e as never)\r\n }\r\n\r\n const handleMouseDown = (e: React.MouseEvent) => {\r\n setIsPressed(true)\r\n onMouseDown?.(e as never)\r\n }\r\n\r\n const handleMouseUp = (e: React.MouseEvent) => {\r\n setIsPressed(false)\r\n onMouseUp?.(e as never)\r\n }\r\n\r\n // Build class name\r\n const buttonClassName = cx(\r\n 'brycks-button',\r\n `brycks-button--${variant}`,\r\n `brycks-button--${intent}`,\r\n `brycks-button--${size}`,\r\n fullWidth && 'brycks-button--full-width',\r\n isIconOnly && 'brycks-button--icon-only',\r\n isLoading && 'brycks-button--loading',\r\n disabled && 'brycks-button--disabled',\r\n className\r\n )\r\n\r\n const isButton = Component === 'button' || as === undefined\r\n const buttonProps = isButton\r\n ? {\r\n type: (props as { type?: string }).type ?? 'button',\r\n disabled,\r\n }\r\n : {\r\n 'aria-disabled': disabled || undefined,\r\n role: 'button',\r\n tabIndex: disabled ? -1 : 0,\r\n }\r\n\r\n return (\r\n <Component\r\n ref={ref}\r\n className={buttonClassName}\r\n style={computedStyle}\r\n data-testid={testId}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseLeave={handleMouseLeave}\r\n onMouseDown={handleMouseDown}\r\n onMouseUp={handleMouseUp}\r\n {...buttonProps}\r\n {...props}\r\n >\r\n {isLoading && (\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n position: isIconOnly ? 'absolute' : 'relative',\r\n }}\r\n >\r\n <LoadingSpinner size={sizeValues.iconSize} />\r\n </span>\r\n )}\r\n\r\n {!isLoading && leftIcon && (\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n width: sizeValues.iconSize,\r\n height: sizeValues.iconSize,\r\n }}\r\n >\r\n {leftIcon}\r\n </span>\r\n )}\r\n\r\n {!isIconOnly && (\r\n <span\r\n style={{\r\n opacity: isLoading && !isIconOnly ? 0.5 : 1,\r\n }}\r\n >\r\n {children}\r\n </span>\r\n )}\r\n\r\n {!isLoading && rightIcon && (\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n width: sizeValues.iconSize,\r\n height: sizeValues.iconSize,\r\n }}\r\n >\r\n {rightIcon}\r\n </span>\r\n )}\r\n\r\n {isIconOnly && !isLoading && children}\r\n </Component>\r\n )\r\n}\r\n\r\nexport const Button = forwardRef(ButtonInner) as ButtonComponent\r\n\r\nButton.displayName = 'Button'\r\n\r\n/** Icon button shorthand */\r\nconst IconButtonInner = <E extends ElementType = 'button'>(\r\n props: Omit<ButtonProps<E>, 'isIconOnly'>,\r\n ref: React.ForwardedRef<Element>\r\n) => {\r\n return <Button ref={ref as React.ForwardedRef<HTMLButtonElement>} isIconOnly {...(props as ButtonProps<'button'>)} />\r\n}\r\n\r\nexport const IconButton = forwardRef(IconButtonInner) as ButtonComponent\r\n\r\nIconButton.displayName = 'IconButton'\r\n"],"names":["LoadingSpinner","React","size","jsxs","jsx","ButtonInner","as","variant","intent","fullWidth","isLoading","isDisabled","leftIcon","rightIcon","isIconOnly","className","style","children","testId","onMouseEnter","onMouseLeave","onMouseDown","onMouseUp","props","ref","Component","isHovered","setIsHovered","useState","isPressed","setIsPressed","disabled","styles","getButtonStyles","computedStyle","sizeValues","sizeConfig","handleMouseEnter","e","handleMouseLeave","handleMouseDown","handleMouseUp","buttonClassName","cx","buttonProps","Button","forwardRef","IconButtonInner","IconButton"],"mappings":"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"}
1
+ {"version":3,"file":"Button.cjs","sources":["../../../../src/components/primitives/Button/Button.tsx"],"sourcesContent":["/**\r\n * Button Component\r\n *\r\n * A versatile, polymorphic button component with multiple variants,\r\n * sizes, and states. Designed with Apple-inspired aesthetics -\r\n * smooth transitions, tactile feedback, and refined visual details.\r\n *\r\n * All color styles are handled via CSS classes for easy customization.\r\n * Layout styles (display, alignment) use inline styles for flexibility.\r\n */\r\n\r\nimport React, {\r\n forwardRef,\r\n type ElementType,\r\n type ComponentPropsWithRef,\r\n type CSSProperties,\r\n} from 'react'\r\nimport type { ButtonProps } from './Button.types'\r\nimport { sizeConfig } from './Button.styles'\r\nimport { cx } from '../../../utils/styles'\r\n\r\ninterface ButtonComponent {\r\n <E extends ElementType = 'button'>(\r\n props: ButtonProps<E> & { ref?: ComponentPropsWithRef<E>['ref'] }\r\n ): React.JSX.Element | null\r\n displayName?: string\r\n}\r\n\r\n/** Loading spinner component - uses global CSS keyframes */\r\nconst LoadingSpinner = React.memo(function LoadingSpinner({ size }: { size: number }) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n className=\"brycks-animate-spin\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray=\"31.4 31.4\"\r\n opacity=\"0.25\"\r\n />\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeDasharray=\"31.4 31.4\"\r\n strokeDashoffset=\"62.8\"\r\n style={{ transform: 'rotate(-90deg)', transformOrigin: 'center' }}\r\n />\r\n </svg>\r\n )\r\n})\r\n\r\nconst ButtonInner = <E extends ElementType = 'button'>(\r\n {\r\n as,\r\n variant = 'solid',\r\n intent = 'primary',\r\n size = 'md',\r\n fullWidth,\r\n isLoading,\r\n isDisabled,\r\n leftIcon,\r\n rightIcon,\r\n isIconOnly,\r\n className,\r\n style,\r\n children,\r\n testId,\r\n ...props\r\n }: ButtonProps<E>,\r\n ref: React.ForwardedRef<Element>\r\n) => {\r\n const Component = (as || 'button') as ElementType\r\n\r\n const disabled = isDisabled || isLoading\r\n\r\n const sizeValues = sizeConfig[size]\r\n\r\n // Layout-only inline styles (colors handled by CSS classes)\r\n const layoutStyle: CSSProperties = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n ...style,\r\n }\r\n\r\n // Build class name - CSS handles all colors and states\r\n const buttonClassName = cx(\r\n 'brycks-button',\r\n `brycks-button--${variant}`,\r\n `brycks-button--${intent}`,\r\n `brycks-button--${size}`,\r\n fullWidth && 'brycks-button--full-width',\r\n isIconOnly && 'brycks-button--icon-only',\r\n isLoading && 'brycks-button--loading',\r\n disabled && 'brycks-button--disabled',\r\n className\r\n )\r\n\r\n const isButton = Component === 'button' || as === undefined\r\n const buttonProps = isButton\r\n ? {\r\n type: (props as { type?: string }).type ?? 'button',\r\n disabled,\r\n }\r\n : {\r\n 'aria-disabled': disabled || undefined,\r\n role: 'button',\r\n tabIndex: disabled ? -1 : 0,\r\n }\r\n\r\n return (\r\n <Component\r\n ref={ref}\r\n className={buttonClassName}\r\n style={layoutStyle}\r\n data-testid={testId}\r\n {...buttonProps}\r\n {...props}\r\n >\r\n {isLoading && (\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n position: isIconOnly ? 'absolute' : 'relative',\r\n }}\r\n >\r\n <LoadingSpinner size={sizeValues.iconSize} />\r\n </span>\r\n )}\r\n\r\n {!isLoading && leftIcon && (\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n width: sizeValues.iconSize,\r\n height: sizeValues.iconSize,\r\n }}\r\n >\r\n {leftIcon}\r\n </span>\r\n )}\r\n\r\n {!isIconOnly && (\r\n <span\r\n style={{\r\n opacity: isLoading && !isIconOnly ? 0.5 : 1,\r\n }}\r\n >\r\n {children}\r\n </span>\r\n )}\r\n\r\n {!isLoading && rightIcon && (\r\n <span\r\n style={{\r\n display: 'inline-flex',\r\n width: sizeValues.iconSize,\r\n height: sizeValues.iconSize,\r\n }}\r\n >\r\n {rightIcon}\r\n </span>\r\n )}\r\n\r\n {isIconOnly && !isLoading && children}\r\n </Component>\r\n )\r\n}\r\n\r\nexport const Button = forwardRef(ButtonInner) as ButtonComponent\r\n\r\nButton.displayName = 'Button'\r\n\r\n/** Icon button shorthand */\r\nconst IconButtonInner = <E extends ElementType = 'button'>(\r\n props: Omit<ButtonProps<E>, 'isIconOnly'>,\r\n ref: React.ForwardedRef<Element>\r\n) => {\r\n return <Button ref={ref as React.ForwardedRef<HTMLButtonElement>} isIconOnly {...(props as ButtonProps<'button'>)} />\r\n}\r\n\r\nexport const IconButton = forwardRef(IconButtonInner) as ButtonComponent\r\n\r\nIconButton.displayName = 'IconButton'\r\n"],"names":["LoadingSpinner","React","size","jsxs","jsx","ButtonInner","as","variant","intent","fullWidth","isLoading","isDisabled","leftIcon","rightIcon","isIconOnly","className","style","children","testId","props","ref","Component","disabled","sizeValues","sizeConfig","layoutStyle","buttonClassName","cx","buttonProps","Button","forwardRef","IconButtonInner","IconButton"],"mappings":"gNA6BMA,EAAiBC,EAAM,KAAK,SAAwB,CAAE,KAAAC,GAA0B,CACpF,OACEC,EAAAA,KAAC,MAAA,CACC,MAAOD,EACP,OAAQA,EACR,QAAQ,YACR,KAAK,OACL,UAAU,sBACV,cAAY,OAEZ,SAAA,CAAAE,EAAAA,IAAC,SAAA,CACC,GAAG,KACH,GAAG,KACH,EAAE,KACF,OAAO,eACP,YAAY,IACZ,cAAc,QACd,gBAAgB,YAChB,QAAQ,MAAA,CAAA,EAEVA,EAAAA,IAAC,SAAA,CACC,GAAG,KACH,GAAG,KACH,EAAE,KACF,OAAO,eACP,YAAY,IACZ,cAAc,QACd,gBAAgB,YAChB,iBAAiB,OACjB,MAAO,CAAE,UAAW,iBAAkB,gBAAiB,QAAA,CAAS,CAAA,CAClE,CAAA,CAAA,CAGN,CAAC,EAEKC,EAAc,CAClB,CACE,GAAAC,EACA,QAAAC,EAAU,QACV,OAAAC,EAAS,UACT,KAAAN,EAAO,KACP,UAAAO,EACA,UAAAC,EACA,WAAAC,EACA,SAAAC,EACA,UAAAC,EACA,WAAAC,EACA,UAAAC,EACA,MAAAC,EACA,SAAAC,EACA,OAAAC,EACA,GAAGC,CACL,EACAC,IACG,CACH,MAAMC,EAAaf,GAAM,SAEnBgB,EAAWX,GAAcD,EAEzBa,EAAaC,EAAAA,WAAWtB,CAAI,EAG5BuB,EAA6B,CACjC,QAAS,cACT,WAAY,SACZ,eAAgB,SAChB,GAAGT,CAAA,EAICU,EAAkBC,EAAAA,GACtB,gBACA,kBAAkBpB,CAAO,GACzB,kBAAkBC,CAAM,GACxB,kBAAkBN,CAAI,GACtBO,GAAa,4BACbK,GAAc,2BACdJ,GAAa,yBACbY,GAAY,0BACZP,CAAA,EAIIa,EADWP,IAAc,UAAYf,IAAO,OAE9C,CACE,KAAOa,EAA4B,MAAQ,SAC3C,SAAAG,CAAA,EAEF,CACE,gBAAiBA,GAAY,OAC7B,KAAM,SACN,SAAUA,EAAW,GAAK,CAAA,EAGhC,OACEnB,EAAAA,KAACkB,EAAA,CACC,IAAAD,EACA,UAAWM,EACX,MAAOD,EACP,cAAaP,EACZ,GAAGU,EACH,GAAGT,EAEH,SAAA,CAAAT,GACCN,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,QAAS,cACT,SAAUU,EAAa,WAAa,UAAA,EAGtC,SAAAV,EAAAA,IAACJ,EAAA,CAAe,KAAMuB,EAAW,QAAA,CAAU,CAAA,CAAA,EAI9C,CAACb,GAAaE,GACbR,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,QAAS,cACT,MAAOmB,EAAW,SAClB,OAAQA,EAAW,QAAA,EAGpB,SAAAX,CAAA,CAAA,EAIJ,CAACE,GACAV,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,QAASM,GAAa,CAACI,EAAa,GAAM,CAAA,EAG3C,SAAAG,CAAA,CAAA,EAIJ,CAACP,GAAaG,GACbT,EAAAA,IAAC,OAAA,CACC,MAAO,CACL,QAAS,cACT,MAAOmB,EAAW,SAClB,OAAQA,EAAW,QAAA,EAGpB,SAAAV,CAAA,CAAA,EAIJC,GAAc,CAACJ,GAAaO,CAAA,CAAA,CAAA,CAGnC,EAEaY,EAASC,EAAAA,WAAWzB,CAAW,EAE5CwB,EAAO,YAAc,SAGrB,MAAME,EAAkB,CACtBZ,EACAC,UAEQS,EAAA,CAAO,IAAAT,EAAmD,WAAU,GAAE,GAAID,EAAiC,EAGxGa,EAAaF,EAAAA,WAAWC,CAAe,EAEpDC,EAAW,YAAc"}