@ctrl-ui/react 0.8.11 → 0.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/action-bar.js +2 -2
  2. package/dist/activity.js +1 -1
  3. package/dist/blocks/design-canvas-inspector.js +2 -2
  4. package/dist/blocks/design-canvas.js +2 -2
  5. package/dist/blocks/discussion.js +1 -1
  6. package/dist/blocks/file-explorer.js +2 -2
  7. package/dist/blocks/settings.js +3 -3
  8. package/dist/chat-composer-editor/extensions/mention.js +1 -1
  9. package/dist/chat-composer.js +1 -1
  10. package/dist/chat-layout.js +1 -1
  11. package/dist/context.js +1 -1
  12. package/dist/dynamic-notification.js +1 -1
  13. package/dist/email/theme.js +1 -1
  14. package/dist/filter-bar/parts.js +1 -1
  15. package/dist/filter-bar.js +1 -1
  16. package/dist/inline-citation.js +1 -1
  17. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  18. package/dist/knob-contracts/tabs-knobs.js +2 -0
  19. package/dist/lib/phone-input-format.js +1 -1
  20. package/dist/styles/index.css +1 -0
  21. package/dist/styles/recipes/badge.css +1 -0
  22. package/dist/styles/recipes/button.css +21 -4
  23. package/dist/styles/recipes/code.css +0 -15
  24. package/dist/styles/recipes/field.css +15 -2
  25. package/dist/styles/recipes/resizable.css +0 -26
  26. package/dist/styles/recipes/scroll-area.css +6 -6
  27. package/dist/styles/recipes/sidebar-menu.css +22 -8
  28. package/dist/styles/recipes/sidebar-parts.css +11 -7
  29. package/dist/styles/recipes/sidebar.css +1 -1
  30. package/dist/styles/recipes/tabs-motion.css +99 -0
  31. package/dist/styles/recipes/tabs.css +36 -108
  32. package/dist/ui/alert-dialog.js +1 -1
  33. package/dist/ui/alert.js +1 -1
  34. package/dist/ui/autocomplete.js +1 -1
  35. package/dist/ui/breadcrumb.js +1 -1
  36. package/dist/ui/button.d.ts +6 -3
  37. package/dist/ui/button.js +10 -6
  38. package/dist/ui/card.js +1 -1
  39. package/dist/ui/code-diff.js +1 -1
  40. package/dist/ui/code.js +2 -2
  41. package/dist/ui/collapsible.js +1 -1
  42. package/dist/ui/color-picker.js +1 -1
  43. package/dist/ui/combobox.js +1 -1
  44. package/dist/ui/context-menu.js +1 -1
  45. package/dist/ui/dialog.js +1 -1
  46. package/dist/ui/drawer.js +1 -1
  47. package/dist/ui/dropdown-menu.js +1 -1
  48. package/dist/ui/emoji-icon-picker.js +1 -1
  49. package/dist/ui/emoji-picker.js +1 -1
  50. package/dist/ui/empty.js +1 -1
  51. package/dist/ui/hover-card.js +1 -1
  52. package/dist/ui/icon-picker.js +1 -1
  53. package/dist/ui/input-group.js +1 -1
  54. package/dist/ui/item.js +1 -1
  55. package/dist/ui/menubar.js +1 -1
  56. package/dist/ui/morphing-panel.js +1 -1
  57. package/dist/ui/navigation-menu.js +1 -1
  58. package/dist/ui/phone-input.js +2 -2
  59. package/dist/ui/popover.js +1 -1
  60. package/dist/ui/resizable.js +34 -1
  61. package/dist/ui/rich-tooltip.js +1 -1
  62. package/dist/ui/select.js +1 -1
  63. package/dist/ui/sheet.js +1 -1
  64. package/dist/ui/sidebar-menu.js +4 -3
  65. package/dist/ui/sidebar-provider.js +2 -2
  66. package/dist/ui/sidebar-resize-rail.js +1 -1
  67. package/dist/ui/sidebar.js +1 -1
  68. package/dist/ui/tabs.d.ts +4 -0
  69. package/dist/ui/tabs.js +11 -1
  70. package/dist/ui/timeline.js +1 -1
  71. package/dist/ui/toast.js +1 -1
  72. package/dist/ui/toggle.d.ts +1 -1
  73. package/dist/ui/toggle.js +2 -1
  74. package/dist/ui/toolbar.d.ts +1 -1
  75. package/dist/ui/toolbar.js +1 -1
  76. package/dist/ui/tooltip.js +1 -1
  77. package/dist/ui/tree.js +1 -1
  78. package/dist/ui/trigger-menu.js +1 -1
  79. package/dist/user-ask.js +2 -2
  80. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
- import { createContext, useContext, useRef, useState } from "react";
3
+ import { createContext, useContext, useEffect, useRef, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Group, Panel, Separator } from "react-resizable-panels";
6
6
  //#region src/ui/resizable.tsx
@@ -13,6 +13,32 @@ const FLOATING_ARROW_DIRECTIONS = {
13
13
  ArrowLeft: -1,
14
14
  ArrowRight: 1
15
15
  };
16
+ function useResizeCursor(handleRef, disableCursor) {
17
+ useEffect(() => {
18
+ const handle = handleRef.current;
19
+ if (!handle || disableCursor) return;
20
+ const ownerDocument = handle.ownerDocument;
21
+ const cursorStyle = ownerDocument.createElement("style");
22
+ function updateCursor() {
23
+ const state = handle?.getAttribute("data-separator");
24
+ if (state === "hover" || state === "active") {
25
+ const cursor = handle?.getAttribute("data-axis") === "vertical" ? "col-resize" : "row-resize";
26
+ cursorStyle.textContent = `*, *:hover { cursor: ${cursor} !important; }`;
27
+ if (!cursorStyle.isConnected) ownerDocument.head.append(cursorStyle);
28
+ } else cursorStyle.remove();
29
+ }
30
+ const observer = new MutationObserver(updateCursor);
31
+ observer.observe(handle, {
32
+ attributes: true,
33
+ attributeFilter: ["data-separator", "data-axis"]
34
+ });
35
+ updateCursor();
36
+ return () => {
37
+ observer.disconnect();
38
+ cursorStyle.remove();
39
+ };
40
+ }, [handleRef, disableCursor]);
41
+ }
16
42
  function ResizablePanelGroup({ className, orientation = "horizontal", variant = "framed", disableCursor = false, children, ...props }) {
17
43
  return /* @__PURE__ */ jsx(ResizableGroupContext.Provider, {
18
44
  value: {
@@ -44,6 +70,8 @@ function ResizablePanel({ className, ...props }) {
44
70
  }
45
71
  function ResizableHandle({ className, variant = "solid", withHandle, children, "aria-label": ariaLabel = "Resize panel", ...props }) {
46
72
  const { orientation, disableCursor } = useContext(ResizableGroupContext);
73
+ const handleRef = useRef(null);
74
+ useResizeCursor(handleRef, disableCursor);
47
75
  const axis = orientation === "horizontal" ? "vertical" : "horizontal";
48
76
  return /* @__PURE__ */ jsxs(Separator, {
49
77
  "data-control-ui": "resizable",
@@ -55,6 +83,7 @@ function ResizableHandle({ className, variant = "solid", withHandle, children, "
55
83
  className: cn("relative flex items-center justify-center", axis === "vertical" ? "w-px touch-pan-y" : "h-px touch-pan-x", className),
56
84
  "aria-label": ariaLabel,
57
85
  ...props,
86
+ elementRef: handleRef,
58
87
  children: [withHandle ? /* @__PURE__ */ jsx("span", {
59
88
  "data-control-ui": "resizable",
60
89
  "data-control-family": "resizable",
@@ -72,6 +101,8 @@ function ResizableFloatingPanel({ side = "right", size: controlledSize, defaultS
72
101
  const [focused, setFocused] = useState(false);
73
102
  const [resizing, setResizing] = useState(false);
74
103
  const panelRef = useRef(null);
104
+ const handleRef = useRef(null);
105
+ useResizeCursor(handleRef, false);
75
106
  const resizeRef = useRef(null);
76
107
  const size = controlledSize ?? uncontrolledSize;
77
108
  const growthPerPointerPx = side === "right" ? -1 : 1;
@@ -144,6 +175,7 @@ function ResizableFloatingPanel({ side = "right", size: controlledSize, defaultS
144
175
  }),
145
176
  children,
146
177
  /* @__PURE__ */ jsx("div", {
178
+ ref: handleRef,
147
179
  role: "separator",
148
180
  tabIndex: 0,
149
181
  "aria-label": handleLabel,
@@ -163,6 +195,7 @@ function ResizableFloatingPanel({ side = "right", size: controlledSize, defaultS
163
195
  onPointerMove: updateResize,
164
196
  onPointerUp: endResize,
165
197
  onPointerCancel: endResize,
198
+ onLostPointerCapture: endResize,
166
199
  onPointerEnter: () => setHovered(true),
167
200
  onPointerLeave: () => setHovered(false),
168
201
  onFocus: () => setFocused(true),
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { controlEffectsAttribute } from "../skin.js";
3
2
  import { cn } from "../lib/cn.js";
3
+ import { controlEffectsAttribute } from "../skin.js";
4
4
  import { useSkin } from "../skin-provider.js";
5
5
  import { prefersReducedMotion } from "../lib/motion.js";
6
6
  import { PopupArrowShape } from "../popup-parts.js";
package/dist/ui/select.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { controlEffectsAttribute } from "../skin.js";
3
2
  import { cn } from "../lib/cn.js";
3
+ import { controlEffectsAttribute } from "../skin.js";
4
4
  import { useSkin } from "../skin-provider.js";
5
5
  import { Button } from "./button.js";
6
6
  import { ScrollArea } from "./scroll-area.js";
package/dist/ui/sheet.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { controlEffectsAttribute } from "../skin.js";
3
2
  import { cn } from "../lib/cn.js";
3
+ import { controlEffectsAttribute } from "../skin.js";
4
4
  import { useSkin } from "../skin-provider.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Dialog } from "@base-ui/react/dialog";
@@ -5,8 +5,8 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.js";
5
5
  import { SidebarSurfaceContext, useSidebar } from "./sidebar-provider.js";
6
6
  import { TrackHighlight } from "../extensions/track-highlight.js";
7
7
  import { createContext, useContext, useRef, useState } from "react";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
8
  import { useRender } from "@base-ui/react/use-render";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/ui/sidebar-menu.tsx
11
11
  const sidebarMenuButtonVariants = ["default", "outline"];
12
12
  const sidebarMenuButtonSizes = [
@@ -66,7 +66,7 @@ const SidebarMenuContext = createContext("none");
66
66
  function SidebarMenu({ className, indicator, style, children, ...props }) {
67
67
  const skin = useSkin();
68
68
  const resolvedIndicator = indicator ?? skin.indicators?.sidebar ?? "none";
69
- const hasHighlight = resolvedIndicator !== "none";
69
+ const hasHighlight = resolvedIndicator === "slide";
70
70
  const list = /* @__PURE__ */ jsx("ul", {
71
71
  "data-control-ui": "sidebar",
72
72
  "data-control-family": "sidebar",
@@ -131,7 +131,8 @@ function SidebarMenuButton({ render, isActive = false, variant = "default", size
131
131
  "data-size": size,
132
132
  "data-variant": variant,
133
133
  "data-active": isActive || void 0,
134
- "data-track-item": indicator !== "none" ? "" : void 0,
134
+ "data-indicator": indicator,
135
+ "data-track-item": indicator === "slide" ? "" : void 0,
135
136
  className: cn("peer/menu-button flex items-center overflow-hidden text-start disabled:pointer-events-none aria-disabled:pointer-events-none [&>span]:truncate [&>svg]:size-4 [&>svg]:shrink-0", className),
136
137
  children
137
138
  }
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { useSkin } from "../skin-provider.js";
4
- import { TooltipProvider } from "./tooltip.js";
5
4
  import { SIDEBAR_COOKIE_NAME } from "../control-props.js";
5
+ import { TooltipProvider } from "./tooltip.js";
6
6
  import { useIsMobile } from "../hooks/use-mobile.js";
7
7
  import { createContext, useContext, useEffect, useId, useLayoutEffect, useRef, useState } from "react";
8
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
8
  import { useRender } from "@base-ui/react/use-render";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/ui/sidebar-provider.tsx
11
11
  const SIDEBAR_COOKIE_MAX_AGE = 604800;
12
12
  const SIDEBAR_WIDTH = "16rem";
@@ -2,8 +2,8 @@
2
2
  import { cn } from "../lib/cn.js";
3
3
  import { useSidebar, useSidebarElements, useSidebarSurface } from "./sidebar-provider.js";
4
4
  import { useEffect, useLayoutEffect, useRef, useState } from "react";
5
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
5
  import { useRender } from "@base-ui/react/use-render";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/ui/sidebar-resize-rail.tsx
8
8
  const DRAG_THRESHOLD_PX = 5;
9
9
  const KEYBOARD_STEP_PX = 10;
@@ -8,9 +8,9 @@ import { SidebarProvider, SidebarSurfaceContext, useSidebar, useSidebarElements,
8
8
  import { SidebarResizeRail } from "./sidebar-resize-rail.js";
9
9
  import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, sidebarMenuButtonSizes, sidebarMenuButtonVariants } from "./sidebar-menu.js";
10
10
  import { useState } from "react";
11
+ import { useRender } from "@base-ui/react/use-render";
11
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
12
13
  import { PanelLeftIcon } from "lucide-react";
13
- import { useRender } from "@base-ui/react/use-render";
14
14
  import { createPortal } from "react-dom";
15
15
  //#region src/ui/sidebar.tsx
16
16
  const SIDEBAR_WIDTH_MOBILE = "18rem";
package/dist/ui/tabs.d.ts CHANGED
@@ -32,6 +32,10 @@ export type TabsPanelProps = Omit<ComponentProps<"div">, "style"> & {
32
32
  value: string;
33
33
  keepMounted?: boolean;
34
34
  };
35
+ export type TabsSurfaceProps = Omit<ComponentProps<"div">, "style"> & {
36
+ style?: CSSProperties & TabsKnobStyle;
37
+ };
38
+ export declare function TabsSurface({ className, ...props }: TabsSurfaceProps): import("react").JSX.Element;
35
39
  export declare function Tabs<TValue extends string = string>({ className, onValueChange, children, ...props }: TabsProps<TValue>): import("react").JSX.Element;
36
40
  export declare function TabsList({ size, variant, className, children, style, ...props }: TabsListProps): import("react").JSX.Element;
37
41
  export declare function TabsTab({ className, ...props }: TabsTabProps): import("react").JSX.Element;
package/dist/ui/tabs.js CHANGED
@@ -4,6 +4,16 @@ import { Children, Fragment, createContext, isValidElement, useContext, useEffec
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Tabs as Tabs$1 } from "@base-ui/react/tabs";
6
6
  //#region src/ui/tabs.tsx
7
+ function TabsSurface({ className, ...props }) {
8
+ return /* @__PURE__ */ jsx("div", {
9
+ "data-control-ui": "tabs",
10
+ "data-control-family": "tabs",
11
+ "data-slot": "surface",
12
+ "data-surface": "panel",
13
+ className,
14
+ ...props
15
+ });
16
+ }
7
17
  function refreshTabsPanelHeight(panel) {
8
18
  if (panel.node.inert || panel.node.hidden) return;
9
19
  panel.height = panel.node.getBoundingClientRect().height;
@@ -160,4 +170,4 @@ function TabsPanel({ className, value, ref, ...props }) {
160
170
  });
161
171
  }
162
172
  //#endregion
163
- export { Tabs, TabsList, TabsPanel, TabsTab };
173
+ export { Tabs, TabsList, TabsPanel, TabsSurface, TabsTab };
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
- import { jsx } from "react/jsx-runtime";
4
3
  import { useRender } from "@base-ui/react/use-render";
4
+ import { jsx } from "react/jsx-runtime";
5
5
  //#region src/ui/timeline.tsx
6
6
  function Timeline({ className, ...props }) {
7
7
  return /* @__PURE__ */ jsx("ol", {
package/dist/ui/toast.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { controlEffectsAttribute } from "../skin.js";
3
2
  import { cn } from "../lib/cn.js";
3
+ import { controlEffectsAttribute } from "../skin.js";
4
4
  import { useSkin } from "../skin-provider.js";
5
5
  import { Button } from "./button.js";
6
6
  import { PopupCloseButton } from "../popup-parts.js";
@@ -15,6 +15,6 @@ export type ToggleGroupProps<TValue extends string = string> = Omit<ComponentPro
15
15
  orientation?: "horizontal" | "vertical";
16
16
  indicator?: HoverIndicator;
17
17
  };
18
- export declare function Toggle({ variant, size, tone, active, iconOnly, showCheck, className, pressed, defaultPressed, onPressedChange, value, disabled, children, ...props }: ToggleProps): import("react").JSX.Element;
18
+ export declare function Toggle({ variant, size, tone, active, iconOnly, layout, showCheck, className, pressed, defaultPressed, onPressedChange, value, disabled, children, ...props }: ToggleProps): import("react").JSX.Element;
19
19
  export declare function ToggleGroup<TValue extends string = string>({ className, orientation, indicator, children, ...props }: ToggleGroupProps<TValue>): import("react").JSX.Element;
20
20
  //#endregion
package/dist/ui/toggle.js CHANGED
@@ -8,7 +8,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { Toggle as Toggle$1 } from "@base-ui/react/toggle";
9
9
  import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
10
10
  //#region src/ui/toggle.tsx
11
- function Toggle({ variant = "surface", size = "sm", tone = "neutral", active, iconOnly = false, showCheck = false, className, pressed, defaultPressed, onPressedChange, value, disabled, children, ...props }) {
11
+ function Toggle({ variant = "surface", size = "sm", tone = "neutral", active, iconOnly = false, layout = "inline", showCheck = false, className, pressed, defaultPressed, onPressedChange, value, disabled, children, ...props }) {
12
12
  const tracksHover = useContext(ButtonTrackContext);
13
13
  return /* @__PURE__ */ jsx(Toggle$1, {
14
14
  "data-track-item": tracksHover ? "" : void 0,
@@ -31,6 +31,7 @@ function Toggle({ variant = "surface", size = "sm", tone = "neutral", active, ic
31
31
  "data-tone": tone,
32
32
  "data-size": size,
33
33
  "data-icon-only": iconOnly ? "true" : void 0,
34
+ "data-layout": layout,
34
35
  className: cn(buttonStructureClasses, renderProps.className, className),
35
36
  children: /* @__PURE__ */ jsxs("span", {
36
37
  "data-control-ui": "toggle",
@@ -1,6 +1,6 @@
1
1
  import { ToolbarKnobStyle } from "../knob-contracts/toolbar-knobs.js";
2
- import { CSSProperties, ComponentProps } from "react";
3
2
  import { Toolbar as Toolbar$1 } from "@base-ui/react/toolbar";
3
+ import { CSSProperties, ComponentProps } from "react";
4
4
  //#region src/ui/toolbar.d.ts
5
5
  export type ToolbarVariant = "default" | "inverse" | "floating";
6
6
  export type ToolbarLinkVariant = "default" | "track";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../lib/cn.js";
3
- import { jsx, jsxs } from "react/jsx-runtime";
4
3
  import { Toolbar as Toolbar$1 } from "@base-ui/react/toolbar";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/ui/toolbar.tsx
6
6
  function Toolbar({ orientation = "horizontal", variant = "default", className, children, ...props }) {
7
7
  return /* @__PURE__ */ jsxs(Toolbar$1.Root, {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { controlEffectsAttribute } from "../skin.js";
3
2
  import { cn } from "../lib/cn.js";
3
+ import { controlEffectsAttribute } from "../skin.js";
4
4
  import { useSkin } from "../skin-provider.js";
5
5
  import { PopupArrowShape } from "../popup-parts.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
package/dist/ui/tree.js CHANGED
@@ -3,9 +3,9 @@ import { cn } from "../lib/cn.js";
3
3
  import { useSkin } from "../skin-provider.js";
4
4
  import { TrackHighlight } from "../extensions/track-highlight.js";
5
5
  import { Children, createContext, isValidElement, useContext, useEffect, useId, useRef, useState } from "react";
6
+ import { useRender } from "@base-ui/react/use-render";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  import { ChevronRightIcon } from "lucide-react";
8
- import { useRender } from "@base-ui/react/use-render";
9
9
  import { Collapsible } from "@base-ui/react/collapsible";
10
10
  //#region src/ui/tree.tsx
11
11
  const TYPEAHEAD_TIMEOUT = 500;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { controlEffectsAttribute } from "../skin.js";
3
2
  import { cn } from "../lib/cn.js";
3
+ import { controlEffectsAttribute } from "../skin.js";
4
4
  import { useSkin } from "../skin-provider.js";
5
5
  import { ScrollArea } from "./scroll-area.js";
6
6
  import { popupItemStructureClasses } from "../surface-variants.js";
package/dist/user-ask.js CHANGED
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { cn } from "./lib/cn.js";
3
- import { useUserAsk } from "./hooks/use-user-ask.js";
4
3
  import { Button } from "./ui/button.js";
5
- import { Kbd } from "./ui/kbd.js";
6
4
  import { LiveStatus } from "./ui/live-status.js";
5
+ import { useUserAsk } from "./hooks/use-user-ask.js";
6
+ import { Kbd } from "./ui/kbd.js";
7
7
  import { createContext, useContext, useEffect, useId, useRef, useState } from "react";
8
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
9
  import { Check, ChevronLeft, ChevronRight, PencilLine } from "lucide-react";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ctrl-ui/react",
3
- "version": "0.8.11",
3
+ "version": "0.8.13",
4
4
  "description": "Control UI components, blocks, and primitives with neutral defaults and consumer-owned themes.",
5
5
  "license": "MIT",
6
6
  "repository": {