@turtleclub/ui 0.7.0-beta.32 → 0.7.0-beta.33

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.
@@ -6,12 +6,14 @@ type SidebarItemBase = {
6
6
  type SidebarLink = SidebarItemBase & {
7
7
  url: string;
8
8
  isActive: boolean;
9
+ isEnabled?: boolean;
9
10
  children?: never;
10
11
  };
11
12
  type SidebarGroupBase = SidebarItemBase & {
12
13
  children: SidebarItem[];
13
14
  url?: never;
14
15
  isActive?: never;
16
+ isEnabled?: boolean;
15
17
  };
16
18
  export type SidebarItem = SidebarLink | SidebarGroupBase;
17
19
  export declare function TurtleSidebarLayout({ children, sidebarSlot, sidebarFooter, topSlot, items, linkComponent, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-layout.d.ts","sourceRoot":"","sources":["../../../../src/components/features/sidebar-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAyB1B,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,CAAC;AAGF,KAAK,WAAW,GAAG,eAAe,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC;AAGF,KAAK,gBAAgB,GAAG,eAAe,GAAG;IACxC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAEzD,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,WAAW,EACX,aAAa,EACb,OAAO,EACP,KAAK,EACL,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC;CACpB,2CAYA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,aAAa,EACb,aAAa,EAAE,IAAU,GAC1B,EAAE;IACD,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,aAAa,EAAE,GAAG,CAAC;CACpB,2CA6EA;AAED,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAuBA"}
1
+ {"version":3,"file":"sidebar-layout.d.ts","sourceRoot":"","sources":["../../../../src/components/features/sidebar-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA0B1B,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ,CAAC;AAGF,KAAK,WAAW,GAAG,eAAe,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,CAAC;AAGF,KAAK,gBAAgB,GAAG,eAAe,GAAG;IACxC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAIzD,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,WAAW,EACX,aAAa,EACb,OAAO,EACP,KAAK,EACL,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC;CACpB,2CAYA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,aAAa,EACb,aAAa,EAAE,IAAU,GAC1B,EAAE;IACD,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAChC,aAAa,EAAE,GAAG,CAAC;CACpB,2CA8JA;AAED,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAuBA"}
@@ -44,7 +44,7 @@ declare function ChartTooltipContent<TValue extends ValueType = ValueType, TName
44
44
  nameKey?: string;
45
45
  labelKey?: string;
46
46
  } & React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
47
- declare const ChartLegend: typeof RechartsPrimitive.Legend;
47
+ declare const ChartLegend: React.MemoExoticComponent<(outsideProps: RechartsPrimitive.LegendProps) => React.ReactPortal | null>;
48
48
  declare function ChartLegendContent({ className, hideIcon, payload, verticalAlign, nameKey, }: React.ComponentProps<"div"> & {
49
49
  payload?: ReadonlyArray<Payload<ValueType, NameType>>;
50
50
  verticalAlign?: "top" | "bottom";
@@ -1 +1 @@
1
- {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/chart.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/chart.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turtleclub/ui",
3
- "version": "0.7.0-beta.32",
3
+ "version": "0.7.0-beta.33",
4
4
  "description": "shadcn/ui and custom Turtle UI components library",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -84,5 +84,5 @@
84
84
  "vite": "^7.1.6",
85
85
  "vite-plugin-dts": "^4.5.4"
86
86
  },
87
- "gitHead": "1227922c80cfc941b1e4e22b7c251c38f413ddae"
87
+ "gitHead": "f660fb0960abd423a39ebfac3f4ce21d880ff171"
88
88
  }
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { ChevronRight } from "lucide-react";
2
+ import { ChevronRight, Lock } from "lucide-react";
3
3
  import {
4
4
  Sidebar,
5
5
  SidebarProvider,
@@ -22,6 +22,7 @@ import {
22
22
  } from "../ui";
23
23
  import { cn } from "@/lib/utils";
24
24
  import { DotIcon, TurtleIcon } from "../icons";
25
+ import { TurtleTooltip } from "./turtle-tooltip";
25
26
 
26
27
  type SidebarItemBase = {
27
28
  title: string;
@@ -32,6 +33,7 @@ type SidebarItemBase = {
32
33
  type SidebarLink = SidebarItemBase & {
33
34
  url: string;
34
35
  isActive: boolean;
36
+ isEnabled?: boolean;
35
37
  children?: never;
36
38
  };
37
39
 
@@ -40,10 +42,13 @@ type SidebarGroupBase = SidebarItemBase & {
40
42
  children: SidebarItem[];
41
43
  url?: never;
42
44
  isActive?: never;
45
+ isEnabled?: boolean;
43
46
  };
44
47
 
45
48
  export type SidebarItem = SidebarLink | SidebarGroupBase;
46
49
 
50
+ const LOCKED_TOOLTIP_CONTENT = "Contact the Turtle team to unlock.";
51
+
47
52
  export function TurtleSidebarLayout({
48
53
  children,
49
54
  sidebarSlot,
@@ -101,52 +106,133 @@ export function TurtleSidebar({
101
106
  <SidebarMenu>
102
107
  {items.map((item) => {
103
108
  if (item?.children?.length) {
109
+ const isEnabled = item.isEnabled !== false;
110
+
104
111
  return (
105
- <Collapsible className="group/collapsible">
112
+ <Collapsible
113
+ key={item.title}
114
+ className="group/collapsible"
115
+ open={isEnabled ? undefined : false}
116
+ >
106
117
  <SidebarMenuItem>
107
- <CollapsibleTrigger asChild>
108
- <SidebarMenuButton>
109
- {item.icon && <item.icon />}
110
- <span className="grow">{item.title}</span>
111
- <ChevronRight className="transition-all group-data-[state=open]/collapsible:rotate-90" />
112
- </SidebarMenuButton>
113
- </CollapsibleTrigger>
114
- <CollapsibleContent>
115
- <SidebarMenuSub>
116
- {item.children.map((child) => (
117
- <SidebarMenuSubItem key={child.title}>
118
- <SidebarMenuSubButton
119
- asChild
120
- isActive={child.isActive}
118
+ {isEnabled ? (
119
+ <CollapsibleTrigger asChild>
120
+ <SidebarMenuButton>
121
+ {item.icon && <item.icon />}
122
+ <span className="grow">{item.title}</span>
123
+ <ChevronRight className="transition-all group-data-[state=open]/collapsible:rotate-90" />
124
+ </SidebarMenuButton>
125
+ </CollapsibleTrigger>
126
+ ) : (
127
+ <TurtleTooltip
128
+ asChild
129
+ className="w-full"
130
+ content={LOCKED_TOOLTIP_CONTENT}
131
+ trigger={
132
+ <div className="w-full">
133
+ <SidebarMenuButton
134
+ disabled
135
+ className="opacity-70"
121
136
  >
122
- <Comp href={child.url}>
123
- {child.icon && <child.icon />}
124
- <span className="grow">{child.title}</span>
125
-
126
- <div className="relative size-[18px] shrink-0 group-data-[active=false]/menu-sub-button:hidden">
127
- <DotIcon className="text-primary absolute top-[-15px] left-[-15px] size-12" />
128
- </div>
129
- </Comp>
130
- </SidebarMenuSubButton>
131
- </SidebarMenuSubItem>
132
- ))}
133
- </SidebarMenuSub>
134
- </CollapsibleContent>
137
+ {item.icon && <item.icon />}
138
+ <span className="grow">{item.title}</span>
139
+ <Lock className="text-muted-foreground size-4 shrink-0" />
140
+ </SidebarMenuButton>
141
+ </div>
142
+ }
143
+ />
144
+ )}
145
+
146
+ {isEnabled && (
147
+ <CollapsibleContent>
148
+ <SidebarMenuSub>
149
+ {item.children.map((child) => {
150
+ const isChildEnabled =
151
+ child.isEnabled !== false;
152
+
153
+ return (
154
+ <SidebarMenuSubItem key={child.title}>
155
+ {isChildEnabled ? (
156
+ <SidebarMenuSubButton
157
+ asChild
158
+ isActive={child.isActive}
159
+ >
160
+ <Comp href={child.url}>
161
+ {child.icon && <child.icon />}
162
+ <span className="grow">
163
+ {child.title}
164
+ </span>
165
+
166
+ <div className="relative size-[18px] shrink-0 group-data-[active=false]/menu-sub-button:hidden">
167
+ <DotIcon className="text-primary absolute top-[-15px] left-[-15px] size-12" />
168
+ </div>
169
+ </Comp>
170
+ </SidebarMenuSubButton>
171
+ ) : (
172
+ <TurtleTooltip
173
+ asChild
174
+ className="w-full"
175
+ content={LOCKED_TOOLTIP_CONTENT}
176
+ trigger={
177
+ <div className="w-full">
178
+ <SidebarMenuSubButton
179
+ className="opacity-70"
180
+ aria-disabled="true"
181
+ >
182
+ {child.icon && <child.icon />}
183
+ <span className="grow">
184
+ {child.title}
185
+ </span>
186
+ <Lock className="text-muted-foreground size-4 shrink-0" />
187
+ </SidebarMenuSubButton>
188
+ </div>
189
+ }
190
+ />
191
+ )}
192
+ </SidebarMenuSubItem>
193
+ );
194
+ })}
195
+ </SidebarMenuSub>
196
+ </CollapsibleContent>
197
+ )}
135
198
  </SidebarMenuItem>
136
199
  </Collapsible>
137
200
  );
138
201
  }
202
+
203
+ const isEnabled = item.isEnabled !== false;
204
+
139
205
  return (
140
206
  <SidebarMenuItem key={item.title}>
141
- <SidebarMenuButton asChild isActive={item.isActive}>
142
- <Comp href={item.url}>
143
- {item.icon && <item.icon />}
144
- <span className="grow">{item.title}</span>
145
- <div className="relative size-[18px] shrink-0 group-data-[active=false]/menu-button:hidden">
146
- <DotIcon className="text-primary absolute top-[-15px] left-[-15px] size-12" />
147
- </div>
148
- </Comp>
149
- </SidebarMenuButton>
207
+ {isEnabled ? (
208
+ <SidebarMenuButton asChild isActive={item.isActive}>
209
+ <Comp href={item.url}>
210
+ {item.icon && <item.icon />}
211
+ <span className="grow">{item.title}</span>
212
+ <div className="relative size-[18px] shrink-0 group-data-[active=false]/menu-button:hidden">
213
+ <DotIcon className="text-primary absolute top-[-15px] left-[-15px] size-12" />
214
+ </div>
215
+ </Comp>
216
+ </SidebarMenuButton>
217
+ ) : (
218
+ <TurtleTooltip
219
+ asChild
220
+ className="w-full"
221
+ content={LOCKED_TOOLTIP_CONTENT}
222
+ trigger={
223
+ <div className="w-full">
224
+ <SidebarMenuButton
225
+ aria-disabled="true"
226
+ className="opacity-70"
227
+ >
228
+ {item.icon && <item.icon />}
229
+ <span className="grow">{item.title}</span>
230
+ <Lock className="text-muted-foreground size-4 shrink-0" />
231
+ </SidebarMenuButton>
232
+ </div>
233
+ }
234
+ />
235
+ )}
150
236
  </SidebarMenuItem>
151
237
  );
152
238
  })}