@tangle-network/sandbox-ui 0.23.0 → 0.23.2

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.
@@ -17,7 +17,7 @@ import {
17
17
  DropdownMenuSeparator,
18
18
  DropdownMenuTrigger
19
19
  } from "@tangle-network/ui/primitives";
20
- import { Skeleton } from "@tangle-network/ui/primitives";
20
+ import { Skeleton, useTheme } from "@tangle-network/ui/primitives";
21
21
 
22
22
  // src/dashboard/sidebar-context.tsx
23
23
  import * as React from "react";
@@ -142,6 +142,41 @@ function LogOutIcon({ className }) {
142
142
  /* @__PURE__ */ jsx2("line", { x1: "21", x2: "9", y1: "12", y2: "12" })
143
143
  ] });
144
144
  }
145
+ function SunIcon({ className }) {
146
+ return /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
147
+ /* @__PURE__ */ jsx2("title", { children: "Light mode icon" }),
148
+ /* @__PURE__ */ jsx2("circle", { cx: "12", cy: "12", r: "4" }),
149
+ /* @__PURE__ */ jsx2("path", { d: "M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41" })
150
+ ] });
151
+ }
152
+ function MoonIcon({ className }) {
153
+ return /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
154
+ /* @__PURE__ */ jsx2("title", { children: "Dark mode icon" }),
155
+ /* @__PURE__ */ jsx2("path", { d: "M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z" })
156
+ ] });
157
+ }
158
+ function RailThemeToggle({ className }) {
159
+ const { theme, setTheme } = useTheme();
160
+ const [mounted, setMounted] = React2.useState(false);
161
+ React2.useEffect(() => setMounted(true), []);
162
+ const isDark = mounted && (theme === "dark" || theme === "system" && typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches);
163
+ return /* @__PURE__ */ jsx2(
164
+ "button",
165
+ {
166
+ type: "button",
167
+ onClick: () => setTheme(isDark ? "light" : "dark"),
168
+ "aria-label": "Toggle theme",
169
+ title: isDark ? "Switch to light mode" : "Switch to dark mode",
170
+ className: cn(
171
+ "flex h-9 w-9 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors",
172
+ "hover:bg-[var(--accent-surface-soft)] hover:text-[var(--accent-text)]",
173
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary",
174
+ className
175
+ ),
176
+ children: isDark ? /* @__PURE__ */ jsx2(SunIcon, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx2(MoonIcon, { className: "h-4 w-4" })
177
+ }
178
+ );
179
+ }
145
180
  function Sidebar({ children, className, style }) {
146
181
  const { panelOpen, hidden, hasPanels, railWidth } = useSidebar();
147
182
  return /* @__PURE__ */ jsx2(
@@ -174,20 +209,20 @@ function SidebarRail({ children, className, wide = false }) {
174
209
  );
175
210
  }
176
211
  function SidebarRailHeader({ children, className }) {
177
- return /* @__PURE__ */ jsx2("div", { className: cn("flex h-14 items-center justify-center border-b border-border", className), children });
212
+ return /* @__PURE__ */ jsx2("div", { className: cn("flex h-14 shrink-0 items-center justify-center border-b border-border", className), children });
178
213
  }
179
214
  function SidebarRailNav({ children, className }) {
180
- return /* @__PURE__ */ jsx2("nav", { className: cn("flex flex-col items-center gap-1 py-3 flex-1", className), children });
215
+ return /* @__PURE__ */ jsx2("nav", { className: cn("flex flex-col items-center gap-1 py-3 flex-1 min-h-0 overflow-y-auto", className), children });
181
216
  }
182
217
  function SidebarRailFooter({ children, className }) {
183
- return /* @__PURE__ */ jsx2("div", { className: cn("flex flex-col items-center gap-1 pb-3", className), children });
218
+ return /* @__PURE__ */ jsx2("div", { className: cn("flex flex-col items-center gap-1 pb-3 shrink-0", className), children });
184
219
  }
185
220
  function RailSeparator({ className }) {
186
221
  return /* @__PURE__ */ jsx2("div", { className: cn("my-2 h-px w-10 bg-[var(--md3-outline-variant)]", className) });
187
222
  }
188
223
  function RailButton({ icon: Icon, label, isActive, badge, onClick, className, showLabel, asChild, children }) {
189
224
  const classes = cn(
190
- "group relative flex items-center justify-center rounded-xl transition-all duration-200",
225
+ "group relative flex shrink-0 items-center justify-center rounded-xl transition-all duration-200",
191
226
  showLabel ? "w-full justify-start px-3 h-11 gap-3" : "w-11 h-11 justify-center",
192
227
  "hover:bg-[var(--accent-surface-soft)] hover:text-[var(--accent-text)]",
193
228
  "active:scale-95",
@@ -289,13 +324,7 @@ function ProfileAvatar({
289
324
  user?.avatarUrl && /* @__PURE__ */ jsx2(AvatarImage, { src: user.avatarUrl, alt: "" }),
290
325
  /* @__PURE__ */ jsx2(AvatarFallback, { className: "text-[10px] bg-violet-500/20 text-violet-300", children: getInitials(user?.name, user?.email) })
291
326
  ] }),
292
- showDetails && /* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: isLoading ? /* @__PURE__ */ jsxs(Fragment, { children: [
293
- /* @__PURE__ */ jsx2(Skeleton, { className: "mb-1 h-3.5 w-20" }),
294
- /* @__PURE__ */ jsx2(Skeleton, { className: "h-3 w-28" })
295
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
296
- /* @__PURE__ */ jsx2("p", { className: "truncate text-sm font-medium text-foreground", children: user?.name ?? user?.email ?? "Not signed in" }),
297
- user?.email && user?.name && /* @__PURE__ */ jsx2("p", { className: "truncate text-xs text-muted-foreground", children: user.email })
298
- ] }) })
327
+ showDetails && /* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: isLoading ? /* @__PURE__ */ jsx2(Skeleton, { className: "h-3.5 w-24" }) : /* @__PURE__ */ jsx2("p", { className: "truncate text-sm font-medium text-foreground", children: user?.name ?? user?.email ?? "Not signed in" }) })
299
328
  ]
300
329
  }
301
330
  ) }),
@@ -1562,6 +1591,7 @@ function SidebarLayoutInner({
1562
1591
  onSettingsClick,
1563
1592
  settingsHref,
1564
1593
  profileMenuItems,
1594
+ showThemeToggle = false,
1565
1595
  railFooter,
1566
1596
  LinkComponent,
1567
1597
  hideBelow,
@@ -1603,19 +1633,29 @@ function SidebarLayoutInner({
1603
1633
  ) }),
1604
1634
  (railFooter !== void 0 || hasProfile) && /* @__PURE__ */ jsxs13(SidebarRailFooter, { className: cn("border-t border-border pt-2", railLabels && "items-stretch px-2"), children: [
1605
1635
  railFooter,
1606
- hasProfile && /* @__PURE__ */ jsx14(
1607
- ProfileAvatar,
1608
- {
1609
- user: user ?? void 0,
1610
- isLoading,
1611
- onLogout,
1612
- onSettingsClick,
1613
- settingsHref,
1614
- showDetails: railLabels,
1615
- LinkComponent: Link,
1616
- children: profileMenuItems
1617
- }
1618
- )
1636
+ hasProfile && (() => {
1637
+ const profile = /* @__PURE__ */ jsx14(
1638
+ ProfileAvatar,
1639
+ {
1640
+ user: user ?? void 0,
1641
+ isLoading,
1642
+ onLogout,
1643
+ onSettingsClick,
1644
+ settingsHref,
1645
+ showDetails: railLabels,
1646
+ LinkComponent: Link,
1647
+ children: profileMenuItems
1648
+ }
1649
+ );
1650
+ if (!showThemeToggle) return profile;
1651
+ return railLabels ? /* @__PURE__ */ jsxs13("div", { className: "flex w-full items-center gap-1", children: [
1652
+ /* @__PURE__ */ jsx14("div", { className: "min-w-0 flex-1", children: profile }),
1653
+ /* @__PURE__ */ jsx14(RailThemeToggle, {})
1654
+ ] }) : /* @__PURE__ */ jsxs13("div", { className: "flex flex-col items-center gap-1", children: [
1655
+ /* @__PURE__ */ jsx14(RailThemeToggle, {}),
1656
+ profile
1657
+ ] });
1658
+ })()
1619
1659
  ] })
1620
1660
  ] }),
1621
1661
  panel != null && /* @__PURE__ */ jsx14(SidebarPanel, { children: panel })
@@ -2177,14 +2217,14 @@ function VariantList({
2177
2217
 
2178
2218
  // src/dashboard/system-logs.tsx
2179
2219
  import { Terminal as Terminal3 } from "lucide-react";
2180
- import { useEffect as useEffect2, useRef as useRef2, useState as useState4 } from "react";
2220
+ import { useEffect as useEffect3, useRef as useRef2, useState as useState5 } from "react";
2181
2221
  import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
2182
2222
  function SystemLogsViewer({ apiUrl, token, className }) {
2183
- const [logs, setLogs] = useState4([]);
2184
- const [error, setError] = useState4(null);
2185
- const [isFollowing, setIsFollowing] = useState4(true);
2223
+ const [logs, setLogs] = useState5([]);
2224
+ const [error, setError] = useState5(null);
2225
+ const [isFollowing, setIsFollowing] = useState5(true);
2186
2226
  const scrollRef = useRef2(null);
2187
- useEffect2(() => {
2227
+ useEffect3(() => {
2188
2228
  let timeoutId;
2189
2229
  let backoff = 2e3;
2190
2230
  const controller = new AbortController();
@@ -2220,7 +2260,7 @@ function SystemLogsViewer({ apiUrl, token, className }) {
2220
2260
  clearTimeout(timeoutId);
2221
2261
  };
2222
2262
  }, [apiUrl, token]);
2223
- useEffect2(() => {
2263
+ useEffect3(() => {
2224
2264
  if (isFollowing && scrollRef.current) {
2225
2265
  scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
2226
2266
  }
@@ -535,6 +535,8 @@ interface SidebarLayoutProps {
535
535
  settingsHref?: string;
536
536
  /** Extra items rendered before settings/logout in the profile menu. */
537
537
  profileMenuItems?: React.ReactNode;
538
+ /** Render a light/dark theme switch in the profile menu (uses the shared `useTheme`). */
539
+ showThemeToggle?: boolean;
538
540
  /** Extra content in the rail footer, above the profile avatar. */
539
541
  railFooter?: React.ReactNode;
540
542
  LinkComponent?: React.ComponentType<any>;
package/dist/dashboard.js CHANGED
@@ -47,7 +47,7 @@ import {
47
47
  canAdminSandbox,
48
48
  parseInsufficientBalance,
49
49
  useSidebar
50
- } from "./chunk-CB3KBKYN.js";
50
+ } from "./chunk-MBYBQWRN.js";
51
51
  import {
52
52
  BillingDashboard,
53
53
  InfoPanel,
package/dist/globals.css CHANGED
@@ -365,6 +365,9 @@
365
365
  .bottom-0 {
366
366
  bottom: calc(var(--spacing) * 0);
367
367
  }
368
+ .bottom-2 {
369
+ bottom: calc(var(--spacing) * 2);
370
+ }
368
371
  .bottom-4 {
369
372
  bottom: calc(var(--spacing) * 4);
370
373
  }
@@ -380,12 +383,18 @@
380
383
  .left-0\.5 {
381
384
  left: calc(var(--spacing) * 0.5);
382
385
  }
386
+ .left-1 {
387
+ left: calc(var(--spacing) * 1);
388
+ }
383
389
  .left-1\/2 {
384
390
  left: calc(1 / 2 * 100%);
385
391
  }
386
392
  .left-2 {
387
393
  left: calc(var(--spacing) * 2);
388
394
  }
395
+ .left-2\.5 {
396
+ left: calc(var(--spacing) * 2.5);
397
+ }
389
398
  .left-3 {
390
399
  left: calc(var(--spacing) * 3);
391
400
  }
@@ -602,6 +611,9 @@
602
611
  .table {
603
612
  display: table;
604
613
  }
614
+ .aspect-\[9\/16\] {
615
+ aspect-ratio: 9/16;
616
+ }
605
617
  .aspect-square {
606
618
  aspect-ratio: 1 / 1;
607
619
  }
@@ -723,6 +735,9 @@
723
735
  .h-screen {
724
736
  height: 100vh;
725
737
  }
738
+ .max-h-40 {
739
+ max-height: calc(var(--spacing) * 40);
740
+ }
726
741
  .max-h-48 {
727
742
  max-height: calc(var(--spacing) * 48);
728
743
  }
@@ -777,6 +792,9 @@
777
792
  .min-h-\[44px\] {
778
793
  min-height: 44px;
779
794
  }
795
+ .min-h-\[60px\] {
796
+ min-height: 60px;
797
+ }
780
798
  .min-h-\[72px\] {
781
799
  min-height: 72px;
782
800
  }
@@ -792,6 +810,9 @@
792
810
  .min-h-\[200px\] {
793
811
  min-height: 200px;
794
812
  }
813
+ .min-h-\[300px\] {
814
+ min-height: 300px;
815
+ }
795
816
  .min-h-full {
796
817
  min-height: 100%;
797
818
  }
@@ -1065,6 +1086,9 @@
1065
1086
  .min-w-4 {
1066
1087
  min-width: calc(var(--spacing) * 4);
1067
1088
  }
1089
+ .min-w-40 {
1090
+ min-width: calc(var(--spacing) * 40);
1091
+ }
1068
1092
  .min-w-\[8rem\] {
1069
1093
  min-width: 8rem;
1070
1094
  }
@@ -1614,6 +1638,10 @@
1614
1638
  border-left-style: var(--tw-border-style);
1615
1639
  border-left-width: 1px;
1616
1640
  }
1641
+ .border-l-2 {
1642
+ border-left-style: var(--tw-border-style);
1643
+ border-left-width: 2px;
1644
+ }
1617
1645
  .border-dashed {
1618
1646
  --tw-border-style: dashed;
1619
1647
  border-style: dashed;
@@ -1931,6 +1959,9 @@
1931
1959
  background-color: color-mix(in oklab, var(--color-amber-500) 10%, transparent);
1932
1960
  }
1933
1961
  }
1962
+ .bg-black {
1963
+ background-color: var(--color-black);
1964
+ }
1934
1965
  .bg-black\/40 {
1935
1966
  background-color: color-mix(in srgb, #000 40%, transparent);
1936
1967
  @supports (color: color-mix(in lab, red, red)) {
@@ -2039,6 +2070,12 @@
2039
2070
  background-color: color-mix(in oklab, var(--color-white) 10%, transparent);
2040
2071
  }
2041
2072
  }
2073
+ .bg-white\/40 {
2074
+ background-color: color-mix(in srgb, #fff 40%, transparent);
2075
+ @supports (color: color-mix(in lab, red, red)) {
2076
+ background-color: color-mix(in oklab, var(--color-white) 40%, transparent);
2077
+ }
2078
+ }
2042
2079
  .bg-yellow-500 {
2043
2080
  background-color: var(--color-yellow-500);
2044
2081
  }
@@ -2078,6 +2115,9 @@
2078
2115
  .object-contain {
2079
2116
  object-fit: contain;
2080
2117
  }
2118
+ .object-cover {
2119
+ object-fit: cover;
2120
+ }
2081
2121
  .p-0 {
2082
2122
  padding: calc(var(--spacing) * 0);
2083
2123
  }
@@ -2270,6 +2310,9 @@
2270
2310
  .pt-16 {
2271
2311
  padding-top: calc(var(--spacing) * 16);
2272
2312
  }
2313
+ .pr-1 {
2314
+ padding-right: calc(var(--spacing) * 1);
2315
+ }
2273
2316
  .pr-2 {
2274
2317
  padding-right: calc(var(--spacing) * 2);
2275
2318
  }
@@ -2309,6 +2352,9 @@
2309
2352
  .pl-2 {
2310
2353
  padding-left: calc(var(--spacing) * 2);
2311
2354
  }
2355
+ .pl-3 {
2356
+ padding-left: calc(var(--spacing) * 3);
2357
+ }
2312
2358
  .pl-4 {
2313
2359
  padding-left: calc(var(--spacing) * 4);
2314
2360
  }
@@ -2678,6 +2724,9 @@
2678
2724
  .text-blue-400 {
2679
2725
  color: var(--color-blue-400);
2680
2726
  }
2727
+ .text-blue-500 {
2728
+ color: var(--color-blue-500);
2729
+ }
2681
2730
  .text-emerald-400 {
2682
2731
  color: var(--color-emerald-400);
2683
2732
  }
@@ -2735,6 +2784,9 @@
2735
2784
  .italic {
2736
2785
  font-style: italic;
2737
2786
  }
2787
+ .not-italic {
2788
+ font-style: normal;
2789
+ }
2738
2790
  .tabular-nums {
2739
2791
  --tw-numeric-spacing: tabular-nums;
2740
2792
  font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
@@ -2758,6 +2810,9 @@
2758
2810
  .opacity-30 {
2759
2811
  opacity: 30%;
2760
2812
  }
2813
+ .opacity-40 {
2814
+ opacity: 40%;
2815
+ }
2761
2816
  .opacity-50 {
2762
2817
  opacity: 50%;
2763
2818
  }
@@ -3204,6 +3259,16 @@
3204
3259
  }
3205
3260
  }
3206
3261
  }
3262
+ .hover\:bg-black\/60 {
3263
+ &:hover {
3264
+ @media (hover: hover) {
3265
+ background-color: color-mix(in srgb, #000 60%, transparent);
3266
+ @supports (color: color-mix(in lab, red, red)) {
3267
+ background-color: color-mix(in oklab, var(--color-black) 60%, transparent);
3268
+ }
3269
+ }
3270
+ }
3271
+ }
3207
3272
  .hover\:bg-blue-600\/30 {
3208
3273
  &:hover {
3209
3274
  @media (hover: hover) {
@@ -3224,6 +3289,16 @@
3224
3289
  }
3225
3290
  }
3226
3291
  }
3292
+ .hover\:bg-green-600\/5 {
3293
+ &:hover {
3294
+ @media (hover: hover) {
3295
+ background-color: color-mix(in srgb, oklch(62.7% 0.194 149.214) 5%, transparent);
3296
+ @supports (color: color-mix(in lab, red, red)) {
3297
+ background-color: color-mix(in oklab, var(--color-green-600) 5%, transparent);
3298
+ }
3299
+ }
3300
+ }
3301
+ }
3227
3302
  .hover\:bg-green-600\/30 {
3228
3303
  &:hover {
3229
3304
  @media (hover: hover) {
@@ -3282,6 +3357,13 @@
3282
3357
  }
3283
3358
  }
3284
3359
  }
3360
+ .hover\:text-green-600 {
3361
+ &:hover {
3362
+ @media (hover: hover) {
3363
+ color: var(--color-green-600);
3364
+ }
3365
+ }
3366
+ }
3285
3367
  .hover\:underline {
3286
3368
  &:hover {
3287
3369
  @media (hover: hover) {
@@ -3607,6 +3689,11 @@
3607
3689
  grid-template-columns: repeat(2, minmax(0, 1fr));
3608
3690
  }
3609
3691
  }
3692
+ .sm\:grid-cols-3 {
3693
+ @media (width >= 40rem) {
3694
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3695
+ }
3696
+ }
3610
3697
  .sm\:grid-cols-4 {
3611
3698
  @media (width >= 40rem) {
3612
3699
  grid-template-columns: repeat(4, minmax(0, 1fr));
@@ -3793,6 +3880,11 @@
3793
3880
  grid-template-columns: repeat(4, minmax(0, 1fr));
3794
3881
  }
3795
3882
  }
3883
+ .xl\:grid-cols-5 {
3884
+ @media (width >= 80rem) {
3885
+ grid-template-columns: repeat(5, minmax(0, 1fr));
3886
+ }
3887
+ }
3796
3888
  .dark\:text-neutral-500 {
3797
3889
  @media (prefers-color-scheme: dark) {
3798
3890
  color: var(--color-neutral-500);
package/dist/index.js CHANGED
@@ -189,7 +189,7 @@ import {
189
189
  canAdminSandbox,
190
190
  parseInsufficientBalance,
191
191
  useSidebar
192
- } from "./chunk-CB3KBKYN.js";
192
+ } from "./chunk-MBYBQWRN.js";
193
193
  import {
194
194
  BillingDashboard,
195
195
  InfoPanel,
package/dist/styles.css CHANGED
@@ -365,6 +365,9 @@
365
365
  .bottom-0 {
366
366
  bottom: calc(var(--spacing) * 0);
367
367
  }
368
+ .bottom-2 {
369
+ bottom: calc(var(--spacing) * 2);
370
+ }
368
371
  .bottom-4 {
369
372
  bottom: calc(var(--spacing) * 4);
370
373
  }
@@ -380,12 +383,18 @@
380
383
  .left-0\.5 {
381
384
  left: calc(var(--spacing) * 0.5);
382
385
  }
386
+ .left-1 {
387
+ left: calc(var(--spacing) * 1);
388
+ }
383
389
  .left-1\/2 {
384
390
  left: calc(1 / 2 * 100%);
385
391
  }
386
392
  .left-2 {
387
393
  left: calc(var(--spacing) * 2);
388
394
  }
395
+ .left-2\.5 {
396
+ left: calc(var(--spacing) * 2.5);
397
+ }
389
398
  .left-3 {
390
399
  left: calc(var(--spacing) * 3);
391
400
  }
@@ -602,6 +611,9 @@
602
611
  .table {
603
612
  display: table;
604
613
  }
614
+ .aspect-\[9\/16\] {
615
+ aspect-ratio: 9/16;
616
+ }
605
617
  .aspect-square {
606
618
  aspect-ratio: 1 / 1;
607
619
  }
@@ -723,6 +735,9 @@
723
735
  .h-screen {
724
736
  height: 100vh;
725
737
  }
738
+ .max-h-40 {
739
+ max-height: calc(var(--spacing) * 40);
740
+ }
726
741
  .max-h-48 {
727
742
  max-height: calc(var(--spacing) * 48);
728
743
  }
@@ -777,6 +792,9 @@
777
792
  .min-h-\[44px\] {
778
793
  min-height: 44px;
779
794
  }
795
+ .min-h-\[60px\] {
796
+ min-height: 60px;
797
+ }
780
798
  .min-h-\[72px\] {
781
799
  min-height: 72px;
782
800
  }
@@ -792,6 +810,9 @@
792
810
  .min-h-\[200px\] {
793
811
  min-height: 200px;
794
812
  }
813
+ .min-h-\[300px\] {
814
+ min-height: 300px;
815
+ }
795
816
  .min-h-full {
796
817
  min-height: 100%;
797
818
  }
@@ -1065,6 +1086,9 @@
1065
1086
  .min-w-4 {
1066
1087
  min-width: calc(var(--spacing) * 4);
1067
1088
  }
1089
+ .min-w-40 {
1090
+ min-width: calc(var(--spacing) * 40);
1091
+ }
1068
1092
  .min-w-\[8rem\] {
1069
1093
  min-width: 8rem;
1070
1094
  }
@@ -1614,6 +1638,10 @@
1614
1638
  border-left-style: var(--tw-border-style);
1615
1639
  border-left-width: 1px;
1616
1640
  }
1641
+ .border-l-2 {
1642
+ border-left-style: var(--tw-border-style);
1643
+ border-left-width: 2px;
1644
+ }
1617
1645
  .border-dashed {
1618
1646
  --tw-border-style: dashed;
1619
1647
  border-style: dashed;
@@ -1931,6 +1959,9 @@
1931
1959
  background-color: color-mix(in oklab, var(--color-amber-500) 10%, transparent);
1932
1960
  }
1933
1961
  }
1962
+ .bg-black {
1963
+ background-color: var(--color-black);
1964
+ }
1934
1965
  .bg-black\/40 {
1935
1966
  background-color: color-mix(in srgb, #000 40%, transparent);
1936
1967
  @supports (color: color-mix(in lab, red, red)) {
@@ -2039,6 +2070,12 @@
2039
2070
  background-color: color-mix(in oklab, var(--color-white) 10%, transparent);
2040
2071
  }
2041
2072
  }
2073
+ .bg-white\/40 {
2074
+ background-color: color-mix(in srgb, #fff 40%, transparent);
2075
+ @supports (color: color-mix(in lab, red, red)) {
2076
+ background-color: color-mix(in oklab, var(--color-white) 40%, transparent);
2077
+ }
2078
+ }
2042
2079
  .bg-yellow-500 {
2043
2080
  background-color: var(--color-yellow-500);
2044
2081
  }
@@ -2078,6 +2115,9 @@
2078
2115
  .object-contain {
2079
2116
  object-fit: contain;
2080
2117
  }
2118
+ .object-cover {
2119
+ object-fit: cover;
2120
+ }
2081
2121
  .p-0 {
2082
2122
  padding: calc(var(--spacing) * 0);
2083
2123
  }
@@ -2270,6 +2310,9 @@
2270
2310
  .pt-16 {
2271
2311
  padding-top: calc(var(--spacing) * 16);
2272
2312
  }
2313
+ .pr-1 {
2314
+ padding-right: calc(var(--spacing) * 1);
2315
+ }
2273
2316
  .pr-2 {
2274
2317
  padding-right: calc(var(--spacing) * 2);
2275
2318
  }
@@ -2309,6 +2352,9 @@
2309
2352
  .pl-2 {
2310
2353
  padding-left: calc(var(--spacing) * 2);
2311
2354
  }
2355
+ .pl-3 {
2356
+ padding-left: calc(var(--spacing) * 3);
2357
+ }
2312
2358
  .pl-4 {
2313
2359
  padding-left: calc(var(--spacing) * 4);
2314
2360
  }
@@ -2678,6 +2724,9 @@
2678
2724
  .text-blue-400 {
2679
2725
  color: var(--color-blue-400);
2680
2726
  }
2727
+ .text-blue-500 {
2728
+ color: var(--color-blue-500);
2729
+ }
2681
2730
  .text-emerald-400 {
2682
2731
  color: var(--color-emerald-400);
2683
2732
  }
@@ -2735,6 +2784,9 @@
2735
2784
  .italic {
2736
2785
  font-style: italic;
2737
2786
  }
2787
+ .not-italic {
2788
+ font-style: normal;
2789
+ }
2738
2790
  .tabular-nums {
2739
2791
  --tw-numeric-spacing: tabular-nums;
2740
2792
  font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
@@ -2758,6 +2810,9 @@
2758
2810
  .opacity-30 {
2759
2811
  opacity: 30%;
2760
2812
  }
2813
+ .opacity-40 {
2814
+ opacity: 40%;
2815
+ }
2761
2816
  .opacity-50 {
2762
2817
  opacity: 50%;
2763
2818
  }
@@ -3204,6 +3259,16 @@
3204
3259
  }
3205
3260
  }
3206
3261
  }
3262
+ .hover\:bg-black\/60 {
3263
+ &:hover {
3264
+ @media (hover: hover) {
3265
+ background-color: color-mix(in srgb, #000 60%, transparent);
3266
+ @supports (color: color-mix(in lab, red, red)) {
3267
+ background-color: color-mix(in oklab, var(--color-black) 60%, transparent);
3268
+ }
3269
+ }
3270
+ }
3271
+ }
3207
3272
  .hover\:bg-blue-600\/30 {
3208
3273
  &:hover {
3209
3274
  @media (hover: hover) {
@@ -3224,6 +3289,16 @@
3224
3289
  }
3225
3290
  }
3226
3291
  }
3292
+ .hover\:bg-green-600\/5 {
3293
+ &:hover {
3294
+ @media (hover: hover) {
3295
+ background-color: color-mix(in srgb, oklch(62.7% 0.194 149.214) 5%, transparent);
3296
+ @supports (color: color-mix(in lab, red, red)) {
3297
+ background-color: color-mix(in oklab, var(--color-green-600) 5%, transparent);
3298
+ }
3299
+ }
3300
+ }
3301
+ }
3227
3302
  .hover\:bg-green-600\/30 {
3228
3303
  &:hover {
3229
3304
  @media (hover: hover) {
@@ -3282,6 +3357,13 @@
3282
3357
  }
3283
3358
  }
3284
3359
  }
3360
+ .hover\:text-green-600 {
3361
+ &:hover {
3362
+ @media (hover: hover) {
3363
+ color: var(--color-green-600);
3364
+ }
3365
+ }
3366
+ }
3285
3367
  .hover\:underline {
3286
3368
  &:hover {
3287
3369
  @media (hover: hover) {
@@ -3607,6 +3689,11 @@
3607
3689
  grid-template-columns: repeat(2, minmax(0, 1fr));
3608
3690
  }
3609
3691
  }
3692
+ .sm\:grid-cols-3 {
3693
+ @media (width >= 40rem) {
3694
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3695
+ }
3696
+ }
3610
3697
  .sm\:grid-cols-4 {
3611
3698
  @media (width >= 40rem) {
3612
3699
  grid-template-columns: repeat(4, minmax(0, 1fr));
@@ -3793,6 +3880,11 @@
3793
3880
  grid-template-columns: repeat(4, minmax(0, 1fr));
3794
3881
  }
3795
3882
  }
3883
+ .xl\:grid-cols-5 {
3884
+ @media (width >= 80rem) {
3885
+ grid-template-columns: repeat(5, minmax(0, 1fr));
3886
+ }
3887
+ }
3796
3888
  .dark\:text-neutral-500 {
3797
3889
  @media (prefers-color-scheme: dark) {
3798
3890
  color: var(--color-neutral-500);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.23.0",
3
+ "version": "0.23.2",
4
4
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -90,6 +90,10 @@
90
90
  "import": "./dist/utils.js",
91
91
  "types": "./dist/utils.d.ts"
92
92
  },
93
+ "./assets": {
94
+ "import": "./dist/assets.js",
95
+ "types": "./dist/assets.d.ts"
96
+ },
93
97
  "./styles": "./dist/styles.css",
94
98
  "./globals.css": "./dist/globals.css",
95
99
  "./tokens.css": "./dist/tokens.css",