@alkimi.org/ui-kit 0.1.25 → 0.1.27

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.
package/README.github.md CHANGED
@@ -65,20 +65,17 @@ Create your `globals.css`:
65
65
  /* Optional: Override library CSS variables */
66
66
  :root {
67
67
  /* Example: Custom primary color */
68
- --primary: 140 100% 97.1%;
69
- --primary-foreground: 240 6% 10%;
68
+ --primary: oklch(0.992 0.019 155.826);
69
+ --primary-foreground: oklch(0.205 0 0);
70
70
 
71
71
  /* You can override any of these variables:
72
72
  --secondary, --secondary-foreground
73
73
  --background, --foreground
74
- --muted, --muted-foreground, --bg-muted
74
+ --muted, --muted-foreground
75
75
  --accent, --accent-foreground
76
76
  --destructive, --destructive-foreground
77
77
  --border, --input, --ring
78
- --primary-accent
79
78
  --radius (border radius)
80
-
81
- Format: H S% L% (Hue Saturation% Lightness%)
82
79
  */
83
80
  }
84
81
  ```
@@ -146,28 +143,26 @@ Create your `globals.css`:
146
143
  @source "../node_modules/@alkimi.org/ui-kit/dist/**/*.{js,mjs}";
147
144
 
148
145
  /* REQUIRED: Define ALL CSS variables the library needs */
149
- /* Format: H S% L% (Hue Saturation% Lightness%) */
150
146
  :root {
151
- --background: 240 10% 4%;
152
- --foreground: 144 100% 97%;
153
- --card: 0 0% 3.5%;
154
- --card-foreground: 140 100% 97.1%;
155
- --popover: 0 0% 3.5%;
156
- --popover-foreground: 140 100% 97.1%;
157
- --primary: 140 100% 97.1%;
158
- --primary-foreground: 240 6% 10%;
159
- --primary-accent: 140 100% 97.1%;
160
- --secondary: 240 4.5% 15.88%;
161
- --secondary-foreground: 140 100% 97.1%;
162
- --muted: 240 10% 3.92%; /* #09090B */
163
- --muted-foreground: 144 4.3% 54.9%;
164
- --accent: 0 0% 15.3%;
165
- --accent-foreground: 140 100% 97.1%;
166
- --destructive: 0 62.8% 30.6%;
167
- --destructive-foreground: 140 100% 97.1%;
168
- --border: 240 3.7% 27.6%;
169
- --input: 240 3.7% 27.6%;
170
- --ring: 140 100% 97.1%;
147
+ --background: oklch(0.992 0.019 155.826);
148
+ --foreground: oklch(0.205 0 0);
149
+ --card: oklch(0.992 0.019 155.826);
150
+ --card-foreground: oklch(0.205 0 0);
151
+ --popover: oklch(0.992 0.019 155.826);
152
+ --popover-foreground: oklch(0.205 0 0);
153
+ --primary: oklch(0.992 0.019 155.826);
154
+ --primary-foreground: oklch(0.205 0 0);
155
+ --secondary: oklch(0.269 0 0);
156
+ --secondary-foreground: oklch(0.992 0.019 155.826);
157
+ --muted: oklch(0.269 0 0);
158
+ --muted-foreground: oklch(0.608 0 0);
159
+ --accent: oklch(0.269 0 0);
160
+ --accent-foreground: oklch(0.992 0.019 155.826);
161
+ --destructive: oklch(0.576 0.214 25.467);
162
+ --destructive-foreground: oklch(0.992 0.019 155.826);
163
+ --border: #3f3f46;
164
+ --input: #3f3f46;
165
+ --ring: oklch(0.992 0.019 155.826);
171
166
  --radius: 0.625rem;
172
167
  --font-family: "Helvetica Now Display", "Helvetica", sans-serif;
173
168
  }
@@ -400,7 +395,7 @@ Access sidebar state and controls from any component within `SidebarProvider`:
400
395
  import { useSidebar } from "@alkimi.org/ui-kit"
401
396
 
402
397
  function MyComponent() {
403
- const { state, open, toggleSidebar, isMobile } = useSidebar()
398
+ const { state, open, toggleSidebar } = useSidebar()
404
399
 
405
400
  return (
406
401
  <div>
@@ -412,12 +407,13 @@ function MyComponent() {
412
407
 
413
408
  **Returns:**
414
409
  - `state: "expanded" | "collapsed"` - Current sidebar state
415
- - `open: boolean` - Whether sidebar is open (desktop)
416
- - `setOpen: (open: boolean) => void` - Set sidebar state
417
- - `openMobile: boolean` - Whether sidebar is open (mobile)
410
+ - `isOpen: boolean` - Whether sidebar is fully open
411
+ - `setOpen: (open: boolean) => void` - Set desktop sidebar state
412
+ - `openMobile: boolean` - Whether mobile sidebar is open
418
413
  - `setOpenMobile: (open: boolean) => void` - Set mobile sidebar state
419
- - `isMobile: boolean` - Whether viewing on mobile
420
- - `toggleSidebar: () => void` - Toggle sidebar visibility
414
+ - `toggleSidebar: () => void` - Toggle desktop sidebar visibility
415
+ - `toggleMobileSidebar: () => void` - Toggle mobile sidebar visibility
416
+ - `setIsFullyOpen: (open: boolean) => void` - Set fully open state
421
417
 
422
418
  #### Keyboard Shortcuts
423
419
 
@@ -475,153 +471,113 @@ import {
475
471
  import { cn } from "@alkimi.org/ui-kit/utils"
476
472
  ```
477
473
 
478
- ## Adding More Components
479
-
480
- To add more shadcn/ui components to this library:
481
-
482
- 1. Use the shadcn CLI to add components:
483
-
484
- ```bash
485
- npx shadcn-ui@latest add [component-name]
486
- ```
487
-
488
- 2. Export the new component in [src/index.ts](src/index.ts):
489
-
490
- ```tsx
491
- export { ComponentName } from "./components/component-name"
492
- ```
474
+ **Note**: Both import methods require installing the full `@alkimi.org/ui-kit` package. The individual imports help optimize your production bundle size (only used components are included), but don't reduce installation size.
493
475
 
494
- 3. Create a story file in the `stories/` folder:
476
+ ## Migration Guide
495
477
 
496
- ```tsx
497
- // stories/ComponentName.stories.tsx
498
- import type { Meta, StoryObj } from "@storybook/react"
499
- import { ComponentName } from "../src/components/component-name"
478
+ ### Migrating from useScreenSize Hook
500
479
 
501
- const meta = {
502
- title: "Components/ComponentName",
503
- component: ComponentName,
504
- parameters: {
505
- layout: "centered",
506
- },
507
- tags: ["autodocs"],
508
- } satisfies Meta<typeof ComponentName>
480
+ **Breaking Change:** The `useScreenSize` hook has been removed in favor of pure CSS/Tailwind-based responsive design.
509
481
 
510
- export default meta
511
- type Story = StoryObj<typeof meta>
482
+ #### Before (Old API)
512
483
 
513
- export const Default: Story = {
514
- args: {
515
- // your component props
516
- },
517
- }
518
- ```
484
+ ```tsx
485
+ import { useScreenSize } from "@alkimi.org/ui-kit"
519
486
 
520
- 4. Test locally with Storybook:
487
+ function MyComponent() {
488
+ const { isMobile, isLg } = useScreenSize()
521
489
 
522
- ```bash
523
- npm run storybook
524
- ```
490
+ return (
491
+ <div>
492
+ {isMobile ? <MobileView /> : <DesktopView />}
493
+ </div>
494
+ )
495
+ }
496
+ ```
525
497
 
526
- 5. Commit and push to main:
498
+ #### After (Recommended - Use Tailwind Classes)
527
499
 
528
- ```bash
529
- git add .
530
- git commit -m "feat: add ComponentName"
531
- git push
532
- ```
500
+ ```tsx
501
+ function MyComponent() {
502
+ return (
503
+ <div>
504
+ <MobileView className="md:hidden" />
505
+ <DesktopView className="hidden md:block" />
506
+ </div>
507
+ )
508
+ }
509
+ ```
533
510
 
534
- 6. Update the Storybook deployment:
511
+ #### Alternative (If JavaScript Detection Required)
535
512
 
536
- ```bash
537
- git checkout storybook
538
- git merge main
539
- git push
540
- ```
513
+ If you need JavaScript-based screen detection for your use case, implement your own hook using native `matchMedia`:
541
514
 
542
- Vercel will automatically rebuild and deploy the updated Storybook.
515
+ ```tsx
516
+ import { useEffect, useState } from "react"
543
517
 
544
- 7. (Optional) Publish to npm:
545
- ```bash
546
- git checkout main
547
- # Update version in package.json
548
- npm run build
549
- npm publish
550
- ```
518
+ function useMediaQuery(query: string) {
519
+ const [matches, setMatches] = useState(false)
551
520
 
552
- ## Development
521
+ useEffect(() => {
522
+ const media = window.matchMedia(query)
523
+ setMatches(media.matches)
553
524
 
554
- ### Running the Demo
525
+ const listener = () => setMatches(media.matches)
526
+ media.addEventListener("change", listener)
527
+ return () => media.removeEventListener("change", listener)
528
+ }, [query])
555
529
 
556
- To see the components in action, run the demo application:
530
+ return matches
531
+ }
557
532
 
558
- ```bash
559
- cd demo
560
- pnpm install
561
- pnpm run dev
533
+ function MyComponent() {
534
+ const isMobile = useMediaQuery("(max-width: 575px)")
535
+ // Use as needed
536
+ }
562
537
  ```
563
538
 
564
- Then open [http://localhost:3000](http://localhost:3000) in your browser.
565
-
566
- The demo showcases all available components with interactive examples, including:
539
+ #### Custom Breakpoints
567
540
 
568
- - All button variants and sizes
569
- - Card layouts and compositions
570
- - Dark mode toggle
571
- - Interactive component states
541
+ The library uses these Tailwind breakpoints:
572
542
 
573
- ### Build
543
+ - `sm: 448px`
544
+ - `md: 576px`
545
+ - `lg: 986px`
546
+ - `xl: 1280px`
547
+ - `2xl: 1400px`
574
548
 
575
- Build the library for production:
549
+ Use Tailwind's responsive prefixes in your components:
576
550
 
577
- ```bash
578
- npm run build
551
+ ```tsx
552
+ <div className="text-sm md:text-base lg:text-lg">
553
+ Responsive text size
554
+ </div>
579
555
  ```
580
556
 
581
- ### Watch Mode
582
-
583
- Build the library in watch mode during development:
584
-
585
- ```bash
586
- npm run dev
587
- ```
557
+ ### Migrating useSidebar Hook
588
558
 
589
- ### Type Check
559
+ **Breaking Change:** The `useSidebar()` hook no longer returns `isMobile`.
590
560
 
591
- Run TypeScript type checking:
561
+ #### Before
592
562
 
593
- ```bash
594
- npm run type-check
595
- ```
596
-
597
- ### Storybook
598
-
599
- View and develop components in isolation using Storybook:
600
-
601
- ```bash
602
- npm run storybook
563
+ ```tsx
564
+ const { isMobile, toggleSidebar } = useSidebar()
603
565
  ```
604
566
 
605
- This will start Storybook on [http://localhost:6006](http://localhost:6006).
567
+ #### After
606
568
 
607
- #### Building Storybook for Deployment
569
+ ```tsx
570
+ // For desktop sidebar toggle
571
+ const { toggleSidebar } = useSidebar()
608
572
 
609
- To build a static version of Storybook for deployment:
573
+ // For mobile sidebar toggle
574
+ const { toggleMobileSidebar } = useSidebar()
610
575
 
611
- ```bash
612
- npm run build-storybook
576
+ // The library handles mobile/desktop rendering with CSS
577
+ // No need to check isMobile in most cases
613
578
  ```
614
579
 
615
- This will generate a static site in the `storybook-static` directory that you can deploy to any static hosting service.
616
-
617
- ## Publishing to npm
618
-
619
- 1. Update the version number in [package.json](package.json) (e.g., from `0.1.3` to `0.1.4`)
620
- 2. Build the library: `npm run build`
621
- 3. Login to npm (if not already logged in): `npm login`
622
- 4. Publish: `npm publish`
623
-
624
- **Note:** Make sure to bump the version in [package.json](package.json) before publishing any changes to avoid conflicts with existing versions on npm.
580
+ The sidebar component now automatically renders both mobile and desktop variants using CSS to control visibility, so you typically don't need to check for mobile state in your code.
625
581
 
626
582
  ## License
627
583
 
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
+ var _chunkQZ2ZUF7Qjs = require('./chunk-QZ2ZUF7Q.js');var _chunk7SOZ6MOVjs = require('./chunk-7SOZ6MOV.js');var _chunkNKYU43T6js = require('./chunk-NKYU43T6.js');var _chunk5L5DM2X5js = require('./chunk-5L5DM2X5.js');var _chunkC5AZO7RUjs = require('./chunk-C5AZO7RU.js');var _chunkOH7VGIZDjs = require('./chunk-OH7VGIZD.js');var _chunkFUYXCJOQjs = require('./chunk-FUYXCJOQ.js');var _react = require('react'); var o = _interopRequireWildcard(_react);var _reactslot = require('@radix-ui/react-slot');var _classvarianceauthority = require('class-variance-authority');var _lucidereact = require('lucide-react');var _jsxruntime = require('react/jsx-runtime');var Y="sidebar_state",J=3600*24*7,Q="16rem",F="23rem",Z="4.625rem",ee="b",K=o.createContext(null);function w(){let e=o.useContext(K);if(!e)throw new Error("useSidebar must be used within a SidebarProvider.");return e}var ae=o.forwardRef(({defaultOpen:e=!0,open:a,onOpenChange:t,className:i,style:s,children:d,...b},l)=>{let[v,m]=o.useState(!1),[u,R]=o.useState(e),[y,h]=o.useState(e),x=_nullishCoalesce(a, () => (y)),f=o.useCallback(c=>{let g=typeof c=="function"?c(x):c;t?t(g):h(g),document.cookie=`${Y}=${g}; path=/; max-age=${J}`},[t,x]),C=o.useCallback(()=>{f(c=>!c)},[f]),E=o.useCallback(()=>{m(c=>!c)},[m]);o.useEffect(()=>{let c=g=>{g.key===ee&&(g.metaKey||g.ctrlKey)&&(g.preventDefault(),C())};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[C]);let P=x?"expanded":"collapsed",W=o.useMemo(()=>({state:P,isOpen:u,setOpen:f,openMobile:v,setOpenMobile:m,toggleSidebar:C,toggleMobileSidebar:E,setIsFullyOpen:R}),[P,u,f,v,m,C,E,R]);return _jsxruntime.jsx.call(void 0, K.Provider,{value:W,children:_jsxruntime.jsx.call(void 0, _chunkC5AZO7RUjs.a,{delayDuration:0,children:_jsxruntime.jsx.call(void 0, "div",{style:{"--sidebar-width":Q,"--sidebar-width-icon":Z,...s},className:_chunkFUYXCJOQjs.a.call(void 0, "group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar",i),ref:l,...b,children:d})})})});ae.displayName="SidebarProvider";var te=o.forwardRef(({side:e="left",variant:a="sidebar",collapsible:t="offcanvas",className:i,children:s,...d},b)=>{let{state:l,openMobile:v,setOpenMobile:m,setIsFullyOpen:u}=w(),R=o.useRef(null),y=o.useRef(!0);return o.useEffect(()=>{let h=R.current;if(!h)return;if(y.current){y.current=!1,u(l==="expanded");return}let x=f=>{f.target===h&&(f.propertyName==="left"||f.propertyName==="right"||f.propertyName==="width")&&u(l==="expanded")};return h.addEventListener("transitionend",x),()=>h.removeEventListener("transitionend",x)},[l,u]),t==="none"?_jsxruntime.jsx.call(void 0, "aside",{className:_chunkFUYXCJOQjs.a.call(void 0, "flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground",i),ref:b,...d,children:s}):_jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, _chunkNKYU43T6js.a,{open:v,onOpenChange:m,children:_jsxruntime.jsxs.call(void 0, _chunkNKYU43T6js.f,{"data-sidebar":"sidebar","data-mobile":"true",className:"md:hidden bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",style:{width:F,maxWidth:F},side:e,children:[_jsxruntime.jsxs.call(void 0, _chunkNKYU43T6js.g,{className:"sr-only",children:[_jsxruntime.jsx.call(void 0, _chunkNKYU43T6js.i,{children:"Sidebar"}),_jsxruntime.jsx.call(void 0, _chunkNKYU43T6js.j,{children:"Displays the mobile sidebar."})]}),_jsxruntime.jsx.call(void 0, "div",{className:"flex h-full w-full flex-col",children:s})]})}),_jsxruntime.jsxs.call(void 0, "aside",{ref:b,className:"group peer hidden text-sidebar-foreground md:block","data-state":l,"data-collapsible":l==="collapsed"?t:"","data-variant":a,"data-side":e,children:[_jsxruntime.jsx.call(void 0, "div",{className:_chunkFUYXCJOQjs.a.call(void 0, "relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear","group-data-[collapsible=offcanvas]:w-0","group-data-[side=right]:rotate-180",a==="floating"||a==="inset"?"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon)")}),_jsxruntime.jsx.call(void 0, "div",{ref:R,className:_chunkFUYXCJOQjs.a.call(void 0, "fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",e==="left"?"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]":"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",a==="floating"||a==="inset"?"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon)",i),...d,children:_jsxruntime.jsx.call(void 0, "div",{"data-sidebar":"sidebar",className:"flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow",children:_jsxruntime.jsx.call(void 0, "div",{className:"m-2.5 rounded-2xl border bg-sidebar border-border h-full",children:s})})})]})]})});te.displayName="Sidebar";var V=o.forwardRef(({className:e,onClick:a,...t},i)=>{let{toggleSidebar:s,toggleMobileSidebar:d,openMobile:b}=w();return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsxs.call(void 0, _chunkOH7VGIZDjs.b,{ref:i,"data-sidebar":"trigger",variant:"ghost",size:"icon",className:_chunkFUYXCJOQjs.a.call(void 0, "md:hidden bg-transparent hover:bg-transparent",e),onClick:l=>{_optionalChain([a, 'optionalCall', _2 => _2(l)]),d()},...t,children:[b?_jsxruntime.jsx.call(void 0, "span",{className:_chunkFUYXCJOQjs.a.call(void 0, _chunkOH7VGIZDjs.a.call(void 0, {variant:"secondary",size:"icon"})),children:_jsxruntime.jsx.call(void 0, _lucidereact.X,{size:16})}):_jsxruntime.jsx.call(void 0, "span",{className:_chunkFUYXCJOQjs.a.call(void 0, _chunkOH7VGIZDjs.a.call(void 0, {variant:"outline",size:"icon"})),children:_jsxruntime.jsx.call(void 0, _lucidereact.Menu,{size:16})}),_jsxruntime.jsx.call(void 0, "span",{className:"sr-only",children:"Toggle Sidebar"})]}),_jsxruntime.jsxs.call(void 0, _chunkOH7VGIZDjs.b,{ref:i,"data-sidebar":"trigger",variant:"ghost",size:"icon",className:_chunkFUYXCJOQjs.a.call(void 0, "hidden md:flex h-7 w-7 bg-transparent hover:bg-transparent",e),onClick:l=>{_optionalChain([a, 'optionalCall', _3 => _3(l)]),s()},...t,children:[_jsxruntime.jsx.call(void 0, "span",{className:"rounded-full hover:bg-secondary p-2",children:_jsxruntime.jsx.call(void 0, _lucidereact.PanelLeft,{size:16})}),_jsxruntime.jsx.call(void 0, "span",{className:"sr-only",children:"Toggle Sidebar"})]})]})});V.displayName="SidebarTrigger";var re=o.forwardRef(({className:e,...a},t)=>{let{toggleSidebar:i}=w();return _jsxruntime.jsx.call(void 0, "button",{ref:t,"data-sidebar":"rail","aria-label":"Toggle Sidebar",tabIndex:-1,onClick:i,title:"Toggle Sidebar",className:_chunkFUYXCJOQjs.a.call(void 0, "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex","in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize","[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize","group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar","[[data-side=left][data-collapsible=offcanvas]_&]:-right-2","[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",e),...a})});re.displayName="SidebarRail";var oe=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "main",{ref:t,className:_chunkFUYXCJOQjs.a.call(void 0, "relative flex w-full flex-1 flex-col","md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",e),...a}));oe.displayName="SidebarInset";var ne=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, _chunkQZ2ZUF7Qjs.a,{ref:t,"data-sidebar":"input",className:_chunkFUYXCJOQjs.a.call(void 0, "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",e),...a}));ne.displayName="SidebarInput";var ie=o.forwardRef(({className:e,showTrigger:a=!1,children:t,...i},s)=>{let{state:d}=w();return _jsxruntime.jsxs.call(void 0, "div",{ref:s,"data-sidebar":"header",className:_chunkFUYXCJOQjs.a.call(void 0, "flex w-full gap-2 p-2",d==="collapsed"?"justify-center items-center":"justify-between items-start",e),...i,children:[d!=="collapsed"&&_jsxruntime.jsx.call(void 0, "div",{className:"transition-all duration-200 w-full overflow-hidden",children:_jsxruntime.jsx.call(void 0, "div",{className:"whitespace-nowrap",children:t})}),a&&_jsxruntime.jsx.call(void 0, V,{})]})});ie.displayName="SidebarHeader";var se=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "div",{ref:t,"data-sidebar":"footer",className:_chunkFUYXCJOQjs.a.call(void 0, "flex flex-col gap-2 p-2",e),...a}));se.displayName="SidebarFooter";var de=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, _chunk7SOZ6MOVjs.a,{ref:t,"data-sidebar":"separator",className:_chunkFUYXCJOQjs.a.call(void 0, "mx-2 w-auto bg-sidebar-border",e),...a}));de.displayName="SidebarSeparator";var le=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "div",{ref:t,"data-sidebar":"content",className:_chunkFUYXCJOQjs.a.call(void 0, "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden","p-2 group-data-[collapsible=icon]:px-0",e),...a}));le.displayName="SidebarContent";var ce=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "div",{ref:t,"data-sidebar":"group",className:_chunkFUYXCJOQjs.a.call(void 0, "relative flex w-full min-w-0 flex-col","group-data-[collapsible=icon]:p-0",e),...a}));ce.displayName="SidebarGroup";var pe=o.forwardRef(({className:e,asChild:a=!1,...t},i)=>_jsxruntime.jsx.call(void 0, a?_reactslot.Slot:"div",{ref:i,"data-sidebar":"group-label",className:_chunkFUYXCJOQjs.a.call(void 0, "flex h-8 shrink-0 items-center rounded-md text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0","group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",e),...t}));pe.displayName="SidebarGroupLabel";var be=o.forwardRef(({className:e,asChild:a=!1,...t},i)=>_jsxruntime.jsx.call(void 0, a?_reactslot.Slot:"button",{ref:i,"data-sidebar":"group-action",className:_chunkFUYXCJOQjs.a.call(void 0, "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0","after:absolute after:-inset-2 after:md:hidden","group-data-[collapsible=icon]:hidden",e),...t}));be.displayName="SidebarGroupAction";var ue=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "div",{ref:t,"data-sidebar":"group-content",className:_chunkFUYXCJOQjs.a.call(void 0, "w-full text-sm",e),...a}));ue.displayName="SidebarGroupContent";var fe=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "ul",{ref:t,"data-sidebar":"menu",className:_chunkFUYXCJOQjs.a.call(void 0, "flex w-full min-w-0 flex-col gap-1",e),...a}));fe.displayName="SidebarMenu";var me=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "li",{ref:t,"data-sidebar":"menu-item",className:_chunkFUYXCJOQjs.a.call(void 0, "group/menu-item relative",e),...a}));me.displayName="SidebarMenuItem";var ge=_classvarianceauthority.cva.call(void 0, "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",{variants:{variant:{default:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",outline:"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"},size:{default:"h-8 text-sm",sm:"h-7 text-xs",lg:"h-12 text-sm group-data-[collapsible=icon]:!p-0"}},defaultVariants:{variant:"default",size:"default"}}),ve= exports.r =o.forwardRef(({asChild:e=!1,isActive:a=!1,variant:t="default",size:i="default",tooltip:s,className:d,...b},l)=>{let v=e?_reactslot.Slot:"button",{state:m}=w(),u=_jsxruntime.jsx.call(void 0, v,{ref:l,"data-sidebar":"menu-button","data-size":i,"data-active":a,className:_chunkFUYXCJOQjs.a.call(void 0, ge({variant:t,size:i}),d),...b});return s?(typeof s=="string"&&(s={children:s}),_jsxruntime.jsxs.call(void 0, _chunkC5AZO7RUjs.b,{children:[_jsxruntime.jsx.call(void 0, _chunkC5AZO7RUjs.c,{asChild:!0,children:u}),_jsxruntime.jsx.call(void 0, _chunkC5AZO7RUjs.d,{side:"right",align:"center",hidden:m!=="collapsed",...s})]})):u});ve.displayName="SidebarMenuButton";var he=o.forwardRef(({className:e,asChild:a=!1,showOnHover:t=!1,...i},s)=>_jsxruntime.jsx.call(void 0, a?_reactslot.Slot:"button",{ref:s,"data-sidebar":"menu-action",className:_chunkFUYXCJOQjs.a.call(void 0, "absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0","after:absolute after:-inset-2 after:md:hidden","peer-data-[size=sm]/menu-button:top-1","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","group-data-[collapsible=icon]:hidden",t&&"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",e),...i}));he.displayName="SidebarMenuAction";var xe=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "div",{ref:t,"data-sidebar":"menu-badge",className:_chunkFUYXCJOQjs.a.call(void 0, "pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground","peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground","peer-data-[size=sm]/menu-button:top-1","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","group-data-[collapsible=icon]:hidden",e),...a}));xe.displayName="SidebarMenuBadge";var Re=o.forwardRef(({className:e,showIcon:a=!1,...t},i)=>{let s=o.useMemo(()=>`${Math.floor(Math.random()*40)+50}%`,[]);return _jsxruntime.jsxs.call(void 0, "div",{ref:i,"data-sidebar":"menu-skeleton",className:_chunkFUYXCJOQjs.a.call(void 0, "flex h-8 items-center gap-2 rounded-md px-2",e),...t,children:[a&&_jsxruntime.jsx.call(void 0, _chunk5L5DM2X5js.a,{className:"size-4 rounded-md","data-sidebar":"menu-skeleton-icon"}),_jsxruntime.jsx.call(void 0, _chunk5L5DM2X5js.a,{className:"h-4 max-w-[--skeleton-width] flex-1","data-sidebar":"menu-skeleton-text",style:{"--skeleton-width":s}})]})});Re.displayName="SidebarMenuSkeleton";var Se=o.forwardRef(({className:e,...a},t)=>_jsxruntime.jsx.call(void 0, "ul",{ref:t,"data-sidebar":"menu-sub",className:_chunkFUYXCJOQjs.a.call(void 0, "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5","group-data-[collapsible=icon]:hidden",e),...a}));Se.displayName="SidebarMenuSub";var we=o.forwardRef(({...e},a)=>_jsxruntime.jsx.call(void 0, "li",{ref:a,...e}));we.displayName="SidebarMenuSubItem";var ye=o.forwardRef(({asChild:e=!1,size:a="md",isActive:t,className:i,...s},d)=>_jsxruntime.jsx.call(void 0, e?_reactslot.Slot:"a",{ref:d,"data-sidebar":"menu-sub-button","data-size":a,"data-active":t,className:_chunkFUYXCJOQjs.a.call(void 0, "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground","data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",a==="sm"&&"text-xs",a==="md"&&"text-sm","group-data-[collapsible=icon]:hidden",i),...s}));ye.displayName="SidebarMenuSubButton";exports.a = w; exports.b = ae; exports.c = te; exports.d = V; exports.e = re; exports.f = oe; exports.g = ne; exports.h = ie; exports.i = se; exports.j = de; exports.k = le; exports.l = ce; exports.m = pe; exports.n = be; exports.o = ue; exports.p = fe; exports.q = me; exports.r = ve; exports.s = he; exports.t = xe; exports.u = Re; exports.v = Se; exports.w = we; exports.x = ye;
3
+ //# sourceMappingURL=chunk-32CR5EJY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-32CR5EJY.js","../src/components/sidebar.tsx"],"names":["SIDEBAR_COOKIE_NAME","SIDEBAR_COOKIE_MAX_AGE","SIDEBAR_WIDTH","SIDEBAR_WIDTH_MOBILE","SIDEBAR_WIDTH_ICON","SIDEBAR_KEYBOARD_SHORTCUT","SidebarContext","useSidebar","context","SidebarProvider","defaultOpen","openProp","setOpenProp","className","style","children","props","ref","openMobile","setOpenMobile","isFullyOpen","setIsFullyOpen","_open","_setOpen","open","setOpen","value","openState"],"mappings":"AAAA,+8BAAY;AACZ,sDAAuC,sDAAwC,sDAAoE,sDAAwC,sDAA6D,sDAA+C,sDAAwC,uECCxT,iDACF,kEACkB,2CACJ,+CA4IzB,IAvHJA,CAAAA,CAAsB,eAAA,CACtBC,CAAAA,CAAyB,IAAA,CAAU,EAAA,CAAK,CAAA,CACxCC,CAAAA,CAAgB,OAAA,CAChBC,CAAAA,CAAuB,OAAA,CACvBC,CAAAA,CAAqB,UAAA,CACrBC,EAAAA,CAA4B,GAAA,CAa5BC,CAAAA,CAAuB,CAAA,CAAA,aAAA,CAA0C,IAAI,CAAA,CAE3E,SAASC,CAAAA,CAAAA,CAAa,CACpB,IAAMC,CAAAA,CAAgB,CAAA,CAAA,UAAA,CAAWF,CAAc,CAAA,CAC/C,EAAA,CAAI,CAACE,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,mDAAmD,CAAA,CAGrE,OAAOA,CACT,CAEA,IAAMC,EAAAA,CAAwB,CAAA,CAAA,UAAA,CAQ5B,CACE,CACE,WAAA,CAAAC,CAAAA,CAAc,CAAA,CAAA,CACd,IAAA,CAAMC,CAAAA,CACN,YAAA,CAAcC,CAAAA,CACd,SAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,QAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,CACAC,CAAAA,CAAAA,EACG,CACH,GAAM,CAACC,CAAAA,CAAYC,CAAa,CAAA,CAAU,CAAA,CAAA,QAAA,CAAS,CAAA,CAAK,CAAA,CAClD,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAU,CAAA,CAAA,QAAA,CAASX,CAAW,CAAA,CAE1D,CAACY,CAAAA,CAAOC,CAAQ,CAAA,CAAU,CAAA,CAAA,QAAA,CAASb,CAAW,CAAA,CAC9Cc,CAAAA,kBAAOb,CAAAA,SAAYW,GAAAA,CACnBG,CAAAA,CAAgB,CAAA,CAAA,WAAA,CACnBC,CAAAA,EAAmD,CAClD,IAAMC,CAAAA,CAAY,OAAOD,CAAAA,EAAU,UAAA,CAAaA,CAAAA,CAAMF,CAAI,CAAA,CAAIE,CAAAA,CAC1Dd,CAAAA,CACFA,CAAAA,CAAYe,CAAS,CAAA,CAErBJ,CAAAA,CAASI,CAAS,CAAA,CAGpB,QAAA,CAAS,MAAA,CAAS,CAAA,EAAA","file":"/Users/admin/Desktop/PROJECTS/alkimi-ui-kit/dist/chunk-32CR5EJY.js","sourcesContent":[null,"\"use client\"\n\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { PanelLeft, X, Menu } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button, buttonVariants } from \"@/components/button\"\nimport { Input } from \"@/components/input\"\nimport { Separator } from \"@/components/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/components/sheet\"\nimport { Skeleton } from \"@/components/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"23rem\"\nconst SIDEBAR_WIDTH_ICON = \"4.625rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n isOpen: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n toggleSidebar: () => void\n toggleMobileSidebar: () => void\n setIsFullyOpen: (open: boolean) => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nconst SidebarProvider = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n }\n>(\n (\n {\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n },\n ref\n ) => {\n const [openMobile, setOpenMobile] = React.useState(false)\n const [isFullyOpen, setIsFullyOpen] = React.useState(defaultOpen)\n\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n const toggleSidebar = React.useCallback(() => {\n setOpen((open) => !open)\n }, [setOpen])\n\n const toggleMobileSidebar = React.useCallback(() => {\n setOpenMobile((open) => !open)\n }, [setOpenMobile])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n isOpen: isFullyOpen,\n setOpen,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n toggleMobileSidebar,\n setIsFullyOpen,\n }),\n [\n state,\n isFullyOpen,\n setOpen,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n toggleMobileSidebar,\n setIsFullyOpen,\n ]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n }\n)\nSidebarProvider.displayName = \"SidebarProvider\"\n\nconst Sidebar = React.forwardRef<\n HTMLElement,\n React.ComponentProps<\"aside\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n }\n>(\n (\n {\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n },\n ref\n ) => {\n const { state, openMobile, setOpenMobile, setIsFullyOpen } = useSidebar()\n const sidebarRef = React.useRef<HTMLDivElement>(null)\n const isFirstRenderRef = React.useRef(true)\n\n // Track when the sidebar animation completes\n React.useEffect(() => {\n const sidebar = sidebarRef.current\n if (!sidebar) return\n\n // On first render, set isFullyOpen immediately without waiting for animation\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false\n setIsFullyOpen(state === \"expanded\")\n return\n }\n\n const handleTransitionEnd = (event: TransitionEvent) => {\n // Only respond to transitions on the sidebar itself, not children\n if (event.target !== sidebar) return\n\n // Check if we're transitioning width, left, or right properties\n if (\n event.propertyName === \"left\" ||\n event.propertyName === \"right\" ||\n event.propertyName === \"width\"\n ) {\n setIsFullyOpen(state === \"expanded\")\n }\n }\n\n sidebar.addEventListener(\"transitionend\", handleTransitionEnd)\n return () =>\n sidebar.removeEventListener(\"transitionend\", handleTransitionEnd)\n }, [state, setIsFullyOpen])\n\n if (collapsible === \"none\") {\n return (\n <aside\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </aside>\n )\n }\n\n return (\n <>\n {/* Mobile Sheet - visible only on mobile (< md) */}\n <Sheet open={openMobile} onOpenChange={setOpenMobile}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"md:hidden bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n width: SIDEBAR_WIDTH_MOBILE,\n maxWidth: SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n\n {/* Desktop Sidebar - visible only on desktop (md+) */}\n <aside\n ref={ref}\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n >\n <div\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n ref={sidebarRef}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n className=\"flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\n >\n <div className=\"m-2.5 rounded-2xl border bg-sidebar border-border h-full\">\n {children}\n </div>\n </div>\n </div>\n </aside>\n </>\n )\n }\n)\nSidebar.displayName = \"Sidebar\"\n\nconst SidebarTrigger = React.forwardRef<\n React.ElementRef<typeof Button>,\n React.ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n const { toggleSidebar, toggleMobileSidebar, openMobile } = useSidebar()\n\n return (\n <>\n {/* Mobile trigger - visible only on mobile (< md) */}\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n \"md:hidden bg-transparent hover:bg-transparent\",\n className\n )}\n onClick={(event) => {\n onClick?.(event)\n toggleMobileSidebar()\n }}\n {...props}\n >\n {openMobile ? (\n <span\n className={cn(\n buttonVariants({ variant: \"secondary\", size: \"icon\" })\n )}\n >\n <X size={16} />\n </span>\n ) : (\n <span\n className={cn(buttonVariants({ variant: \"outline\", size: \"icon\" }))}\n >\n <Menu size={16} />\n </span>\n )}\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n\n {/* Desktop trigger - visible only on desktop (md+) */}\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n \"hidden md:flex h-7 w-7 bg-transparent hover:bg-transparent\",\n className\n )}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <span className=\"rounded-full hover:bg-secondary p-2\">\n <PanelLeft size={16} />\n </span>\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n </>\n )\n})\nSidebarTrigger.displayName = \"SidebarTrigger\"\n\nconst SidebarRail = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\">\n>(({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarRail.displayName = \"SidebarRail\"\n\nconst SidebarInset = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"main\">\n>(({ className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n className={cn(\n \"relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarInset.displayName = \"SidebarInset\"\n\nconst SidebarInput = React.forwardRef<\n React.ElementRef<typeof Input>,\n React.ComponentProps<typeof Input>\n>(({ className, ...props }, ref) => {\n return (\n <Input\n ref={ref}\n data-sidebar=\"input\"\n className={cn(\n \"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarInput.displayName = \"SidebarInput\"\n\nconst SidebarHeader = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n showTrigger?: boolean\n }\n>(({ className, showTrigger = false, children, ...props }, ref) => {\n const { state } = useSidebar()\n\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn(\n \"flex w-full gap-2 p-2\",\n state === \"collapsed\"\n ? \"justify-center items-center\"\n : \"justify-between items-start\",\n className\n )}\n {...props}\n >\n {state !== \"collapsed\" && (\n <div className=\"transition-all duration-200 w-full overflow-hidden\">\n <div className=\"whitespace-nowrap\">{children}</div>\n </div>\n )}\n\n {showTrigger && <SidebarTrigger />}\n </div>\n )\n})\nSidebarHeader.displayName = \"SidebarHeader\"\n\nconst SidebarFooter = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n})\nSidebarFooter.displayName = \"SidebarFooter\"\n\nconst SidebarSeparator = React.forwardRef<\n React.ElementRef<typeof Separator>,\n React.ComponentProps<typeof Separator>\n>(({ className, ...props }, ref) => {\n return (\n <Separator\n ref={ref}\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n})\nSidebarSeparator.displayName = \"SidebarSeparator\"\n\nconst SidebarContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n \"p-2 group-data-[collapsible=icon]:px-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarContent.displayName = \"SidebarContent\"\n\nconst SidebarGroup = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn(\n \"relative flex w-full min-w-0 flex-col\",\n \"group-data-[collapsible=icon]:p-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarGroup.displayName = \"SidebarGroup\"\n\nconst SidebarGroupLabel = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\"\n\nconst SidebarGroupAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarGroupAction.displayName = \"SidebarGroupAction\"\n\nconst SidebarGroupContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n))\nSidebarGroupContent.displayName = \"SidebarGroupContent\"\n\nconst SidebarMenu = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n))\nSidebarMenu.displayName = \"SidebarMenu\"\n\nconst SidebarMenuItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n))\nSidebarMenuItem.displayName = \"SidebarMenuItem\"\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:!p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst SidebarMenuButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n (\n {\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n const { state } = useSidebar()\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\"}\n {...tooltip}\n />\n </Tooltip>\n )\n }\n)\nSidebarMenuButton.displayName = \"SidebarMenuButton\"\n\nconst SidebarMenuAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarMenuAction.displayName = \"SidebarMenuAction\"\n\nconst SidebarMenuBadge = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n))\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\"\n\nconst SidebarMenuSkeleton = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-[--skeleton-width] flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n})\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\"\n\nconst SidebarMenuSub = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n))\nSidebarMenuSub.displayName = \"SidebarMenuSub\"\n\nconst SidebarMenuSubItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\"\n\nconst SidebarMenuSubButton = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n }\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\"\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n"]}
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import{a as L}from"./chunk-6BEVEBGO.mjs";import{a as I}from"./chunk-YBV4CPVD.mjs";import{a as H,f as z,g as D,i as _,j as k}from"./chunk-73BUNE7H.mjs";import{a as T}from"./chunk-CNRZOMR4.mjs";import{a as B,b as O,c as A,d as G}from"./chunk-PY6WBMT2.mjs";import{a as N,b as M}from"./chunk-S3TZPGTZ.mjs";import{a as n}from"./chunk-S5TKCF6T.mjs";import*as o from"react";import{Slot as S}from"@radix-ui/react-slot";import{cva as $}from"class-variance-authority";import{PanelLeft as U,X as q,Menu as X}from"lucide-react";import{Fragment as j,jsx as r,jsxs as p}from"react/jsx-runtime";var Y="sidebar_state",J=3600*24*7,Q="16rem",F="23rem",Z="4.625rem",ee="b",K=o.createContext(null);function w(){let e=o.useContext(K);if(!e)throw new Error("useSidebar must be used within a SidebarProvider.");return e}var ae=o.forwardRef(({defaultOpen:e=!0,open:a,onOpenChange:t,className:i,style:s,children:d,...b},l)=>{let[v,m]=o.useState(!1),[u,R]=o.useState(e),[y,h]=o.useState(e),x=a??y,f=o.useCallback(c=>{let g=typeof c=="function"?c(x):c;t?t(g):h(g),document.cookie=`${Y}=${g}; path=/; max-age=${J}`},[t,x]),C=o.useCallback(()=>{f(c=>!c)},[f]),E=o.useCallback(()=>{m(c=>!c)},[m]);o.useEffect(()=>{let c=g=>{g.key===ee&&(g.metaKey||g.ctrlKey)&&(g.preventDefault(),C())};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[C]);let P=x?"expanded":"collapsed",W=o.useMemo(()=>({state:P,isOpen:u,setOpen:f,openMobile:v,setOpenMobile:m,toggleSidebar:C,toggleMobileSidebar:E,setIsFullyOpen:R}),[P,u,f,v,m,C,E,R]);return r(K.Provider,{value:W,children:r(B,{delayDuration:0,children:r("div",{style:{"--sidebar-width":Q,"--sidebar-width-icon":Z,...s},className:n("group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar",i),ref:l,...b,children:d})})})});ae.displayName="SidebarProvider";var te=o.forwardRef(({side:e="left",variant:a="sidebar",collapsible:t="offcanvas",className:i,children:s,...d},b)=>{let{state:l,openMobile:v,setOpenMobile:m,setIsFullyOpen:u}=w(),R=o.useRef(null),y=o.useRef(!0);return o.useEffect(()=>{let h=R.current;if(!h)return;if(y.current){y.current=!1,u(l==="expanded");return}let x=f=>{f.target===h&&(f.propertyName==="left"||f.propertyName==="right"||f.propertyName==="width")&&u(l==="expanded")};return h.addEventListener("transitionend",x),()=>h.removeEventListener("transitionend",x)},[l,u]),t==="none"?r("aside",{className:n("flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground",i),ref:b,...d,children:s}):p(j,{children:[r(H,{open:v,onOpenChange:m,children:p(z,{"data-sidebar":"sidebar","data-mobile":"true",className:"md:hidden bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden",style:{width:F,maxWidth:F},side:e,children:[p(D,{className:"sr-only",children:[r(_,{children:"Sidebar"}),r(k,{children:"Displays the mobile sidebar."})]}),r("div",{className:"flex h-full w-full flex-col",children:s})]})}),p("aside",{ref:b,className:"group peer hidden text-sidebar-foreground md:block","data-state":l,"data-collapsible":l==="collapsed"?t:"","data-variant":a,"data-side":e,children:[r("div",{className:n("relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear","group-data-[collapsible=offcanvas]:w-0","group-data-[side=right]:rotate-180",a==="floating"||a==="inset"?"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon)")}),r("div",{ref:R,className:n("fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex",e==="left"?"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]":"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",a==="floating"||a==="inset"?"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]":"group-data-[collapsible=icon]:w-(--sidebar-width-icon)",i),...d,children:r("div",{"data-sidebar":"sidebar",className:"flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow",children:r("div",{className:"m-2.5 rounded-2xl border bg-sidebar border-border h-full",children:s})})})]})]})});te.displayName="Sidebar";var V=o.forwardRef(({className:e,onClick:a,...t},i)=>{let{toggleSidebar:s,toggleMobileSidebar:d,openMobile:b}=w();return p(j,{children:[p(M,{ref:i,"data-sidebar":"trigger",variant:"ghost",size:"icon",className:n("md:hidden bg-transparent hover:bg-transparent",e),onClick:l=>{a?.(l),d()},...t,children:[b?r("span",{className:n(N({variant:"secondary",size:"icon"})),children:r(q,{size:16})}):r("span",{className:n(N({variant:"outline",size:"icon"})),children:r(X,{size:16})}),r("span",{className:"sr-only",children:"Toggle Sidebar"})]}),p(M,{ref:i,"data-sidebar":"trigger",variant:"ghost",size:"icon",className:n("hidden md:flex h-7 w-7 bg-transparent hover:bg-transparent",e),onClick:l=>{a?.(l),s()},...t,children:[r("span",{className:"rounded-full hover:bg-secondary p-2",children:r(U,{size:16})}),r("span",{className:"sr-only",children:"Toggle Sidebar"})]})]})});V.displayName="SidebarTrigger";var re=o.forwardRef(({className:e,...a},t)=>{let{toggleSidebar:i}=w();return r("button",{ref:t,"data-sidebar":"rail","aria-label":"Toggle Sidebar",tabIndex:-1,onClick:i,title:"Toggle Sidebar",className:n("absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex","in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize","[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize","group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar","[[data-side=left][data-collapsible=offcanvas]_&]:-right-2","[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",e),...a})});re.displayName="SidebarRail";var oe=o.forwardRef(({className:e,...a},t)=>r("main",{ref:t,className:n("relative flex w-full flex-1 flex-col","md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",e),...a}));oe.displayName="SidebarInset";var ne=o.forwardRef(({className:e,...a},t)=>r(L,{ref:t,"data-sidebar":"input",className:n("h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",e),...a}));ne.displayName="SidebarInput";var ie=o.forwardRef(({className:e,showTrigger:a=!1,children:t,...i},s)=>{let{state:d}=w();return p("div",{ref:s,"data-sidebar":"header",className:n("flex w-full gap-2 p-2",d==="collapsed"?"justify-center items-center":"justify-between items-start",e),...i,children:[d!=="collapsed"&&r("div",{className:"transition-all duration-200 w-full overflow-hidden",children:r("div",{className:"whitespace-nowrap",children:t})}),a&&r(V,{})]})});ie.displayName="SidebarHeader";var se=o.forwardRef(({className:e,...a},t)=>r("div",{ref:t,"data-sidebar":"footer",className:n("flex flex-col gap-2 p-2",e),...a}));se.displayName="SidebarFooter";var de=o.forwardRef(({className:e,...a},t)=>r(I,{ref:t,"data-sidebar":"separator",className:n("mx-2 w-auto bg-sidebar-border",e),...a}));de.displayName="SidebarSeparator";var le=o.forwardRef(({className:e,...a},t)=>r("div",{ref:t,"data-sidebar":"content",className:n("flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden","p-2 group-data-[collapsible=icon]:px-0",e),...a}));le.displayName="SidebarContent";var ce=o.forwardRef(({className:e,...a},t)=>r("div",{ref:t,"data-sidebar":"group",className:n("relative flex w-full min-w-0 flex-col","group-data-[collapsible=icon]:p-0",e),...a}));ce.displayName="SidebarGroup";var pe=o.forwardRef(({className:e,asChild:a=!1,...t},i)=>r(a?S:"div",{ref:i,"data-sidebar":"group-label",className:n("flex h-8 shrink-0 items-center rounded-md text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0","group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",e),...t}));pe.displayName="SidebarGroupLabel";var be=o.forwardRef(({className:e,asChild:a=!1,...t},i)=>r(a?S:"button",{ref:i,"data-sidebar":"group-action",className:n("absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0","after:absolute after:-inset-2 after:md:hidden","group-data-[collapsible=icon]:hidden",e),...t}));be.displayName="SidebarGroupAction";var ue=o.forwardRef(({className:e,...a},t)=>r("div",{ref:t,"data-sidebar":"group-content",className:n("w-full text-sm",e),...a}));ue.displayName="SidebarGroupContent";var fe=o.forwardRef(({className:e,...a},t)=>r("ul",{ref:t,"data-sidebar":"menu",className:n("flex w-full min-w-0 flex-col gap-1",e),...a}));fe.displayName="SidebarMenu";var me=o.forwardRef(({className:e,...a},t)=>r("li",{ref:t,"data-sidebar":"menu-item",className:n("group/menu-item relative",e),...a}));me.displayName="SidebarMenuItem";var ge=$("peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",{variants:{variant:{default:"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",outline:"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]"},size:{default:"h-8 text-sm",sm:"h-7 text-xs",lg:"h-12 text-sm group-data-[collapsible=icon]:!p-0"}},defaultVariants:{variant:"default",size:"default"}}),ve=o.forwardRef(({asChild:e=!1,isActive:a=!1,variant:t="default",size:i="default",tooltip:s,className:d,...b},l)=>{let v=e?S:"button",{state:m}=w(),u=r(v,{ref:l,"data-sidebar":"menu-button","data-size":i,"data-active":a,className:n(ge({variant:t,size:i}),d),...b});return s?(typeof s=="string"&&(s={children:s}),p(O,{children:[r(A,{asChild:!0,children:u}),r(G,{side:"right",align:"center",hidden:m!=="collapsed",...s})]})):u});ve.displayName="SidebarMenuButton";var he=o.forwardRef(({className:e,asChild:a=!1,showOnHover:t=!1,...i},s)=>r(a?S:"button",{ref:s,"data-sidebar":"menu-action",className:n("absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0","after:absolute after:-inset-2 after:md:hidden","peer-data-[size=sm]/menu-button:top-1","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","group-data-[collapsible=icon]:hidden",t&&"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",e),...i}));he.displayName="SidebarMenuAction";var xe=o.forwardRef(({className:e,...a},t)=>r("div",{ref:t,"data-sidebar":"menu-badge",className:n("pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground","peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground","peer-data-[size=sm]/menu-button:top-1","peer-data-[size=default]/menu-button:top-1.5","peer-data-[size=lg]/menu-button:top-2.5","group-data-[collapsible=icon]:hidden",e),...a}));xe.displayName="SidebarMenuBadge";var Re=o.forwardRef(({className:e,showIcon:a=!1,...t},i)=>{let s=o.useMemo(()=>`${Math.floor(Math.random()*40)+50}%`,[]);return p("div",{ref:i,"data-sidebar":"menu-skeleton",className:n("flex h-8 items-center gap-2 rounded-md px-2",e),...t,children:[a&&r(T,{className:"size-4 rounded-md","data-sidebar":"menu-skeleton-icon"}),r(T,{className:"h-4 max-w-[--skeleton-width] flex-1","data-sidebar":"menu-skeleton-text",style:{"--skeleton-width":s}})]})});Re.displayName="SidebarMenuSkeleton";var Se=o.forwardRef(({className:e,...a},t)=>r("ul",{ref:t,"data-sidebar":"menu-sub",className:n("mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5","group-data-[collapsible=icon]:hidden",e),...a}));Se.displayName="SidebarMenuSub";var we=o.forwardRef(({...e},a)=>r("li",{ref:a,...e}));we.displayName="SidebarMenuSubItem";var ye=o.forwardRef(({asChild:e=!1,size:a="md",isActive:t,className:i,...s},d)=>r(e?S:"a",{ref:d,"data-sidebar":"menu-sub-button","data-size":a,"data-active":t,className:n("flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground","data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",a==="sm"&&"text-xs",a==="md"&&"text-sm","group-data-[collapsible=icon]:hidden",i),...s}));ye.displayName="SidebarMenuSubButton";export{w as a,ae as b,te as c,V as d,re as e,oe as f,ne as g,ie as h,se as i,de as j,le as k,ce as l,pe as m,be as n,ue as o,fe as p,me as q,ve as r,he as s,xe as t,Re as u,Se as v,we as w,ye as x};
3
+ //# sourceMappingURL=chunk-FZAEAODR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/sidebar.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { PanelLeft, X, Menu } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button, buttonVariants } from \"@/components/button\"\nimport { Input } from \"@/components/input\"\nimport { Separator } from \"@/components/separator\"\nimport {\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from \"@/components/sheet\"\nimport { Skeleton } from \"@/components/skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"23rem\"\nconst SIDEBAR_WIDTH_ICON = \"4.625rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n isOpen: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n toggleSidebar: () => void\n toggleMobileSidebar: () => void\n setIsFullyOpen: (open: boolean) => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nconst SidebarProvider = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n }\n>(\n (\n {\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n },\n ref\n ) => {\n const [openMobile, setOpenMobile] = React.useState(false)\n const [isFullyOpen, setIsFullyOpen] = React.useState(defaultOpen)\n\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n },\n [setOpenProp, open]\n )\n\n const toggleSidebar = React.useCallback(() => {\n setOpen((open) => !open)\n }, [setOpen])\n\n const toggleMobileSidebar = React.useCallback(() => {\n setOpenMobile((open) => !open)\n }, [setOpenMobile])\n\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar])\n\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n isOpen: isFullyOpen,\n setOpen,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n toggleMobileSidebar,\n setIsFullyOpen,\n }),\n [\n state,\n isFullyOpen,\n setOpen,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n toggleMobileSidebar,\n setIsFullyOpen,\n ]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n }\n)\nSidebarProvider.displayName = \"SidebarProvider\"\n\nconst Sidebar = React.forwardRef<\n HTMLElement,\n React.ComponentProps<\"aside\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n }\n>(\n (\n {\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n },\n ref\n ) => {\n const { state, openMobile, setOpenMobile, setIsFullyOpen } = useSidebar()\n const sidebarRef = React.useRef<HTMLDivElement>(null)\n const isFirstRenderRef = React.useRef(true)\n\n // Track when the sidebar animation completes\n React.useEffect(() => {\n const sidebar = sidebarRef.current\n if (!sidebar) return\n\n // On first render, set isFullyOpen immediately without waiting for animation\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false\n setIsFullyOpen(state === \"expanded\")\n return\n }\n\n const handleTransitionEnd = (event: TransitionEvent) => {\n // Only respond to transitions on the sidebar itself, not children\n if (event.target !== sidebar) return\n\n // Check if we're transitioning width, left, or right properties\n if (\n event.propertyName === \"left\" ||\n event.propertyName === \"right\" ||\n event.propertyName === \"width\"\n ) {\n setIsFullyOpen(state === \"expanded\")\n }\n }\n\n sidebar.addEventListener(\"transitionend\", handleTransitionEnd)\n return () =>\n sidebar.removeEventListener(\"transitionend\", handleTransitionEnd)\n }, [state, setIsFullyOpen])\n\n if (collapsible === \"none\") {\n return (\n <aside\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n ref={ref}\n {...props}\n >\n {children}\n </aside>\n )\n }\n\n return (\n <>\n {/* Mobile Sheet - visible only on mobile (< md) */}\n <Sheet open={openMobile} onOpenChange={setOpenMobile}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"md:hidden bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n width: SIDEBAR_WIDTH_MOBILE,\n maxWidth: SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n\n {/* Desktop Sidebar - visible only on desktop (md+) */}\n <aside\n ref={ref}\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n >\n <div\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\"\n )}\n />\n <div\n ref={sidebarRef}\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n className=\"flex h-full w-full flex-col group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\n >\n <div className=\"m-2.5 rounded-2xl border bg-sidebar border-border h-full\">\n {children}\n </div>\n </div>\n </div>\n </aside>\n </>\n )\n }\n)\nSidebar.displayName = \"Sidebar\"\n\nconst SidebarTrigger = React.forwardRef<\n React.ElementRef<typeof Button>,\n React.ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n const { toggleSidebar, toggleMobileSidebar, openMobile } = useSidebar()\n\n return (\n <>\n {/* Mobile trigger - visible only on mobile (< md) */}\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n \"md:hidden bg-transparent hover:bg-transparent\",\n className\n )}\n onClick={(event) => {\n onClick?.(event)\n toggleMobileSidebar()\n }}\n {...props}\n >\n {openMobile ? (\n <span\n className={cn(\n buttonVariants({ variant: \"secondary\", size: \"icon\" })\n )}\n >\n <X size={16} />\n </span>\n ) : (\n <span\n className={cn(buttonVariants({ variant: \"outline\", size: \"icon\" }))}\n >\n <Menu size={16} />\n </span>\n )}\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n\n {/* Desktop trigger - visible only on desktop (md+) */}\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n \"hidden md:flex h-7 w-7 bg-transparent hover:bg-transparent\",\n className\n )}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <span className=\"rounded-full hover:bg-secondary p-2\">\n <PanelLeft size={16} />\n </span>\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n </>\n )\n})\nSidebarTrigger.displayName = \"SidebarTrigger\"\n\nconst SidebarRail = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\">\n>(({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarRail.displayName = \"SidebarRail\"\n\nconst SidebarInset = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"main\">\n>(({ className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n className={cn(\n \"relative flex w-full flex-1 flex-col\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarInset.displayName = \"SidebarInset\"\n\nconst SidebarInput = React.forwardRef<\n React.ElementRef<typeof Input>,\n React.ComponentProps<typeof Input>\n>(({ className, ...props }, ref) => {\n return (\n <Input\n ref={ref}\n data-sidebar=\"input\"\n className={cn(\n \"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarInput.displayName = \"SidebarInput\"\n\nconst SidebarHeader = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n showTrigger?: boolean\n }\n>(({ className, showTrigger = false, children, ...props }, ref) => {\n const { state } = useSidebar()\n\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn(\n \"flex w-full gap-2 p-2\",\n state === \"collapsed\"\n ? \"justify-center items-center\"\n : \"justify-between items-start\",\n className\n )}\n {...props}\n >\n {state !== \"collapsed\" && (\n <div className=\"transition-all duration-200 w-full overflow-hidden\">\n <div className=\"whitespace-nowrap\">{children}</div>\n </div>\n )}\n\n {showTrigger && <SidebarTrigger />}\n </div>\n )\n})\nSidebarHeader.displayName = \"SidebarHeader\"\n\nconst SidebarFooter = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n})\nSidebarFooter.displayName = \"SidebarFooter\"\n\nconst SidebarSeparator = React.forwardRef<\n React.ElementRef<typeof Separator>,\n React.ComponentProps<typeof Separator>\n>(({ className, ...props }, ref) => {\n return (\n <Separator\n ref={ref}\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n})\nSidebarSeparator.displayName = \"SidebarSeparator\"\n\nconst SidebarContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n \"p-2 group-data-[collapsible=icon]:px-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarContent.displayName = \"SidebarContent\"\n\nconst SidebarGroup = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn(\n \"relative flex w-full min-w-0 flex-col\",\n \"group-data-[collapsible=icon]:p-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarGroup.displayName = \"SidebarGroup\"\n\nconst SidebarGroupLabel = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\"\n\nconst SidebarGroupAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarGroupAction.displayName = \"SidebarGroupAction\"\n\nconst SidebarGroupContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n))\nSidebarGroupContent.displayName = \"SidebarGroupContent\"\n\nconst SidebarMenu = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n))\nSidebarMenu.displayName = \"SidebarMenu\"\n\nconst SidebarMenuItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative\", className)}\n {...props}\n />\n))\nSidebarMenuItem.displayName = \"SidebarMenuItem\"\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:!p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst SidebarMenuButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n (\n {\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n },\n ref\n ) => {\n const Comp = asChild ? Slot : \"button\"\n const { state } = useSidebar()\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\"}\n {...tooltip}\n />\n </Tooltip>\n )\n }\n)\nSidebarMenuButton.displayName = \"SidebarMenuButton\"\n\nconst SidebarMenuAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0\",\n \"after:absolute after:-inset-2 after:md:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarMenuAction.displayName = \"SidebarMenuAction\"\n\nconst SidebarMenuBadge = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n))\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\"\n\nconst SidebarMenuSkeleton = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-[--skeleton-width] flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n})\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\"\n\nconst SidebarMenuSub = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n))\nSidebarMenuSub.displayName = \"SidebarMenuSub\"\n\nconst SidebarMenuSubItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\"\n\nconst SidebarMenuSubButton = React.forwardRef<\n HTMLAnchorElement,\n React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n }\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\"\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n})\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\"\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n"],"mappings":"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","names":["React","Slot","cva","PanelLeft","X","Menu","Fragment","jsx","jsxs","SIDEBAR_COOKIE_NAME","SIDEBAR_COOKIE_MAX_AGE","SIDEBAR_WIDTH","SIDEBAR_WIDTH_MOBILE","SIDEBAR_WIDTH_ICON","SIDEBAR_KEYBOARD_SHORTCUT","SidebarContext","useSidebar","context","SidebarProvider","defaultOpen","openProp","setOpenProp","className","style","children","props","ref","openMobile","setOpenMobile","isFullyOpen","setIsFullyOpen","_open","_setOpen","open","setOpen","value","openState","toggleSidebar","toggleMobileSidebar","handleKeyDown","event","state","contextValue","TooltipProvider","cn","Sidebar","side","variant","collapsible","sidebarRef","isFirstRenderRef","sidebar","handleTransitionEnd","Sheet","SheetContent","SheetHeader","SheetTitle","SheetDescription","SidebarTrigger","onClick","Button","buttonVariants","X","Menu","PanelLeft","SidebarRail","SidebarInset","SidebarInput","Input","SidebarHeader","showTrigger","SidebarFooter","SidebarSeparator","Separator","SidebarContent","SidebarGroup","SidebarGroupLabel","asChild","Slot","SidebarGroupAction","SidebarGroupContent","SidebarMenu","SidebarMenuItem","sidebarMenuButtonVariants","cva","SidebarMenuButton","isActive","size","tooltip","Comp","button","Tooltip","TooltipTrigger","TooltipContent","SidebarMenuAction","showOnHover","SidebarMenuBadge","SidebarMenuSkeleton","showIcon","width","Skeleton","SidebarMenuSub","SidebarMenuSubItem","SidebarMenuSubButton"]}
@@ -1,3 +1,3 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }"use client";
2
2
  var _chunkFUYXCJOQjs = require('./chunk-FUYXCJOQ.js');var _react = require('react'); var a = _interopRequireWildcard(_react);var _reactslot = require('@radix-ui/react-slot');var _classvarianceauthority = require('class-variance-authority');var _jsxruntime = require('react/jsx-runtime');var p=_classvarianceauthority.cva.call(void 0, "inline-flex items-center cursor-pointer justify-center whitespace-nowrap rounded-3xl font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground hover:bg-destructive/90",outline:"border border-input bg-background hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-primary-accent hover:bg-muted",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 text-sm",sm:"h-8 text-xs px-3 py-2",lg:"h-10 px-8 py-2 text-sm",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),m= exports.b =a.forwardRef(({className:i,variant:s,size:d,asChild:c=!1,loading:e=!1,icon:r,...t},u)=>_jsxruntime.jsxs.call(void 0, c?_reactslot.Slot:"button",{className:_chunkFUYXCJOQjs.a.call(void 0, p({variant:s,size:d,className:i})),ref:u,disabled:e||t.disabled,...t,children:[e&&_jsxruntime.jsx.call(void 0, "div",{className:"mr-2 h-4 w-4 animate-spin rounded-full border border-primary-foreground border-t-transparent"}),!e&&r&&_jsxruntime.jsx.call(void 0, "span",{className:"mr-2",children:r}),t.children]}));m.displayName="Button";exports.a = p; exports.b = m;
3
- //# sourceMappingURL=chunk-54IB54OZ.js.map
3
+ //# sourceMappingURL=chunk-OH7VGIZD.js.map