@refine-studio/ui 0.0.0 → 0.2.0

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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +102 -2
  3. package/dist/components/accordion/accordion.d.ts +15 -0
  4. package/dist/components/accordion/accordion.js +58 -0
  5. package/dist/components/accordion/accordion.js.map +1 -0
  6. package/dist/components/alert/alert.d.ts +24 -0
  7. package/dist/components/alert/alert.js +98 -0
  8. package/dist/components/alert/alert.js.map +1 -0
  9. package/dist/components/alert-dialog/alert-dialog.d.ts +36 -0
  10. package/dist/components/alert-dialog/alert-dialog.js +112 -0
  11. package/dist/components/alert-dialog/alert-dialog.js.map +1 -0
  12. package/dist/components/app-shell/app-shell.d.ts +77 -0
  13. package/dist/components/app-shell/app-shell.js +224 -0
  14. package/dist/components/app-shell/app-shell.js.map +1 -0
  15. package/dist/components/avatar/avatar.d.ts +32 -0
  16. package/dist/components/avatar/avatar.js +83 -0
  17. package/dist/components/avatar/avatar.js.map +1 -0
  18. package/dist/components/badge/badge.d.ts +15 -0
  19. package/dist/components/badge/badge.js +50 -0
  20. package/dist/components/badge/badge.js.map +1 -0
  21. package/dist/components/breadcrumb/breadcrumb.d.ts +24 -0
  22. package/dist/components/breadcrumb/breadcrumb.js +82 -0
  23. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  24. package/dist/components/button/button.d.ts +15 -0
  25. package/dist/components/button/button.js +75 -0
  26. package/dist/components/button/button.js.map +1 -0
  27. package/dist/components/card/card.d.ts +46 -0
  28. package/dist/components/card/card.js +124 -0
  29. package/dist/components/card/card.js.map +1 -0
  30. package/dist/components/checkbox/checkbox.d.ts +6 -0
  31. package/dist/components/checkbox/checkbox.js +31 -0
  32. package/dist/components/checkbox/checkbox.js.map +1 -0
  33. package/dist/components/chip/chip.d.ts +25 -0
  34. package/dist/components/chip/chip.js +54 -0
  35. package/dist/components/chip/chip.js.map +1 -0
  36. package/dist/components/code/code.d.ts +15 -0
  37. package/dist/components/code/code.js +63 -0
  38. package/dist/components/code/code.js.map +1 -0
  39. package/dist/components/collapsible/collapsible.d.ts +14 -0
  40. package/dist/components/collapsible/collapsible.js +55 -0
  41. package/dist/components/collapsible/collapsible.js.map +1 -0
  42. package/dist/components/combobox/combobox.d.ts +33 -0
  43. package/dist/components/combobox/combobox.js +244 -0
  44. package/dist/components/combobox/combobox.js.map +1 -0
  45. package/dist/components/command-menu/command-menu.d.ts +35 -0
  46. package/dist/components/command-menu/command-menu.js +116 -0
  47. package/dist/components/command-menu/command-menu.js.map +1 -0
  48. package/dist/components/context-menu/context-menu.d.ts +45 -0
  49. package/dist/components/context-menu/context-menu.js +136 -0
  50. package/dist/components/context-menu/context-menu.js.map +1 -0
  51. package/dist/components/data-table/data-table.d.ts +49 -0
  52. package/dist/components/data-table/data-table.js +171 -0
  53. package/dist/components/data-table/data-table.js.map +1 -0
  54. package/dist/components/data-table/sort-rows.d.ts +6 -0
  55. package/dist/components/data-table/sort-rows.js +33 -0
  56. package/dist/components/data-table/sort-rows.js.map +1 -0
  57. package/dist/components/dialog/dialog.d.ts +42 -0
  58. package/dist/components/dialog/dialog.js +118 -0
  59. package/dist/components/dialog/dialog.js.map +1 -0
  60. package/dist/components/dropdown-menu/dropdown-menu.d.ts +45 -0
  61. package/dist/components/dropdown-menu/dropdown-menu.js +137 -0
  62. package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -0
  63. package/dist/components/dropdown-menu/menu-styles.d.ts +10 -0
  64. package/dist/components/dropdown-menu/menu-styles.js +34 -0
  65. package/dist/components/dropdown-menu/menu-styles.js.map +1 -0
  66. package/dist/components/empty-state/empty-state.d.ts +12 -0
  67. package/dist/components/empty-state/empty-state.js +46 -0
  68. package/dist/components/empty-state/empty-state.js.map +1 -0
  69. package/dist/components/eyebrow/eyebrow.d.ts +9 -0
  70. package/dist/components/eyebrow/eyebrow.js +25 -0
  71. package/dist/components/eyebrow/eyebrow.js.map +1 -0
  72. package/dist/components/field/field.d.ts +56 -0
  73. package/dist/components/field/field.js +135 -0
  74. package/dist/components/field/field.js.map +1 -0
  75. package/dist/components/glow-border/glow-border.d.ts +9 -0
  76. package/dist/components/glow-border/glow-border.js +39 -0
  77. package/dist/components/glow-border/glow-border.js.map +1 -0
  78. package/dist/components/hex-field/hex-field.d.ts +12 -0
  79. package/dist/components/hex-field/hex-field.js +86 -0
  80. package/dist/components/hex-field/hex-field.js.map +1 -0
  81. package/dist/components/input/input.d.ts +14 -0
  82. package/dist/components/input/input.js +52 -0
  83. package/dist/components/input/input.js.map +1 -0
  84. package/dist/components/kbd/kbd.d.ts +9 -0
  85. package/dist/components/kbd/kbd.js +26 -0
  86. package/dist/components/kbd/kbd.js.map +1 -0
  87. package/dist/components/label/label.d.ts +6 -0
  88. package/dist/components/label/label.js +17 -0
  89. package/dist/components/label/label.js.map +1 -0
  90. package/dist/components/logo/logo-paths.d.ts +5 -0
  91. package/dist/components/logo/logo-paths.js +20 -0
  92. package/dist/components/logo/logo-paths.js.map +1 -0
  93. package/dist/components/logo/logo.d.ts +18 -0
  94. package/dist/components/logo/logo.js +94 -0
  95. package/dist/components/logo/logo.js.map +1 -0
  96. package/dist/components/marquee/marquee.d.ts +15 -0
  97. package/dist/components/marquee/marquee.js +54 -0
  98. package/dist/components/marquee/marquee.js.map +1 -0
  99. package/dist/components/page-header/page-header.d.ts +15 -0
  100. package/dist/components/page-header/page-header.js +50 -0
  101. package/dist/components/page-header/page-header.js.map +1 -0
  102. package/dist/components/pagination/pagination.d.ts +28 -0
  103. package/dist/components/pagination/pagination.js +95 -0
  104. package/dist/components/pagination/pagination.js.map +1 -0
  105. package/dist/components/popover/popover.d.ts +14 -0
  106. package/dist/components/popover/popover.js +48 -0
  107. package/dist/components/popover/popover.js.map +1 -0
  108. package/dist/components/progress/progress.d.ts +14 -0
  109. package/dist/components/progress/progress.js +41 -0
  110. package/dist/components/progress/progress.js.map +1 -0
  111. package/dist/components/radio-group/radio-group.d.ts +10 -0
  112. package/dist/components/radio-group/radio-group.js +33 -0
  113. package/dist/components/radio-group/radio-group.js.map +1 -0
  114. package/dist/components/section-heading/section-heading.d.ts +18 -0
  115. package/dist/components/section-heading/section-heading.js +57 -0
  116. package/dist/components/section-heading/section-heading.js.map +1 -0
  117. package/dist/components/select/select.d.ts +32 -0
  118. package/dist/components/select/select.js +100 -0
  119. package/dist/components/select/select.js.map +1 -0
  120. package/dist/components/separator/separator.d.ts +10 -0
  121. package/dist/components/separator/separator.js +37 -0
  122. package/dist/components/separator/separator.js.map +1 -0
  123. package/dist/components/sheet/sheet.d.ts +29 -0
  124. package/dist/components/sheet/sheet.js +130 -0
  125. package/dist/components/sheet/sheet.js.map +1 -0
  126. package/dist/components/skeleton/skeleton.d.ts +5 -0
  127. package/dist/components/skeleton/skeleton.js +18 -0
  128. package/dist/components/skeleton/skeleton.js.map +1 -0
  129. package/dist/components/slider/slider.d.ts +10 -0
  130. package/dist/components/slider/slider.js +36 -0
  131. package/dist/components/slider/slider.js.map +1 -0
  132. package/dist/components/spinner/spinner.d.ts +9 -0
  133. package/dist/components/spinner/spinner.js +40 -0
  134. package/dist/components/spinner/spinner.js.map +1 -0
  135. package/dist/components/spotlight/spotlight.d.ts +9 -0
  136. package/dist/components/spotlight/spotlight.js +32 -0
  137. package/dist/components/spotlight/spotlight.js.map +1 -0
  138. package/dist/components/starfield/starfield.d.ts +11 -0
  139. package/dist/components/starfield/starfield.js +76 -0
  140. package/dist/components/starfield/starfield.js.map +1 -0
  141. package/dist/components/stat/stat.d.ts +28 -0
  142. package/dist/components/stat/stat.js +100 -0
  143. package/dist/components/stat/stat.js.map +1 -0
  144. package/dist/components/switch/switch.d.ts +13 -0
  145. package/dist/components/switch/switch.js +44 -0
  146. package/dist/components/switch/switch.js.map +1 -0
  147. package/dist/components/table/table.d.ts +52 -0
  148. package/dist/components/table/table.js +96 -0
  149. package/dist/components/table/table.js.map +1 -0
  150. package/dist/components/tabs/tabs.d.ts +24 -0
  151. package/dist/components/tabs/tabs.js +89 -0
  152. package/dist/components/tabs/tabs.js.map +1 -0
  153. package/dist/components/textarea/textarea.d.ts +5 -0
  154. package/dist/components/textarea/textarea.js +20 -0
  155. package/dist/components/textarea/textarea.js.map +1 -0
  156. package/dist/components/theme-switcher/theme-switcher.d.ts +7 -0
  157. package/dist/components/theme-switcher/theme-switcher.js +57 -0
  158. package/dist/components/theme-switcher/theme-switcher.js.map +1 -0
  159. package/dist/components/toaster/toaster.d.ts +7 -0
  160. package/dist/components/toaster/toaster.js +43 -0
  161. package/dist/components/toaster/toaster.js.map +1 -0
  162. package/dist/components/toggle-group/toggle-group.d.ts +24 -0
  163. package/dist/components/toggle-group/toggle-group.js +84 -0
  164. package/dist/components/toggle-group/toggle-group.js.map +1 -0
  165. package/dist/components/tooltip/tooltip.d.ts +19 -0
  166. package/dist/components/tooltip/tooltip.js +49 -0
  167. package/dist/components/tooltip/tooltip.js.map +1 -0
  168. package/dist/fonts/geist-cyrillic-ext-wght-normal.woff2 +0 -0
  169. package/dist/fonts/geist-cyrillic-wght-normal.woff2 +0 -0
  170. package/dist/fonts/geist-latin-ext-wght-normal.woff2 +0 -0
  171. package/dist/fonts/geist-latin-wght-normal.woff2 +0 -0
  172. package/dist/fonts/geist-mono-cyrillic-ext-wght-normal.woff2 +0 -0
  173. package/dist/fonts/geist-mono-cyrillic-wght-normal.woff2 +0 -0
  174. package/dist/fonts/geist-mono-latin-ext-wght-normal.woff2 +0 -0
  175. package/dist/fonts/geist-mono-latin-wght-normal.woff2 +0 -0
  176. package/dist/fonts/geist-mono-symbols2-wght-normal.woff2 +0 -0
  177. package/dist/fonts/geist-mono-vietnamese-wght-normal.woff2 +0 -0
  178. package/dist/fonts/geist-mono.LICENSE +93 -0
  179. package/dist/fonts/geist-vietnamese-wght-normal.woff2 +0 -0
  180. package/dist/fonts/geist.LICENSE +93 -0
  181. package/dist/icons/icon.d.ts +10 -0
  182. package/dist/icons/icon.js +13 -0
  183. package/dist/icons/icon.js.map +1 -0
  184. package/dist/icons/refine-icon-names.d.ts +5 -0
  185. package/dist/icons/refine-icon-names.js +16 -0
  186. package/dist/icons/refine-icon-names.js.map +1 -0
  187. package/dist/icons/refine-icons.d.ts +467 -0
  188. package/dist/icons/refine-icons.js +473 -0
  189. package/dist/icons/refine-icons.js.map +1 -0
  190. package/dist/icons/with-refine-weight.d.ts +11 -0
  191. package/dist/icons/with-refine-weight.js +25 -0
  192. package/dist/icons/with-refine-weight.js.map +1 -0
  193. package/dist/index.d.ts +61 -0
  194. package/dist/index.js +61 -0
  195. package/dist/lib/cn.d.ts +5 -0
  196. package/dist/lib/cn.js +49 -0
  197. package/dist/lib/cn.js.map +1 -0
  198. package/dist/lib/use-breakpoint.d.ts +16 -0
  199. package/dist/lib/use-breakpoint.js +52 -0
  200. package/dist/lib/use-breakpoint.js.map +1 -0
  201. package/dist/styles.css +697 -0
  202. package/dist/theme/theme-provider.d.ts +31 -0
  203. package/dist/theme/theme-provider.js +115 -0
  204. package/dist/theme/theme-provider.js.map +1 -0
  205. package/dist/theme/theme-scope.d.ts +12 -0
  206. package/dist/theme/theme-scope.js +22 -0
  207. package/dist/theme/theme-scope.js.map +1 -0
  208. package/dist/theme/theme.d.ts +20 -0
  209. package/dist/theme/theme.js +37 -0
  210. package/dist/theme/theme.js.map +1 -0
  211. package/package.json +91 -5
@@ -0,0 +1,224 @@
1
+ "use client";
2
+ import { cn } from "../../lib/cn.js";
3
+ import { RefineIconBarLeft } from "../../icons/refine-icons.js";
4
+ import { useBreakpoint } from "../../lib/use-breakpoint.js";
5
+ import { Dialog, Slot } from "radix-ui";
6
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ import { createContext, use, useState } from "react";
8
+ // src/components/app-shell/app-shell.tsx
9
+ var AppShellContext = createContext(null);
10
+ /**
11
+ * Returns the shell's sidebar state and whether it shows the phone layout; throws outside an `AppShell`.
12
+ */
13
+ var useAppShell = () => {
14
+ const context = use(AppShellContext);
15
+ if (!context) throw new Error("useAppShell must be used inside an AppShell.");
16
+ return context;
17
+ };
18
+ /**
19
+ * Lays out an internal tool as sidebar plus content, and owns whether the sidebar is collapsed to a rail or open as a mobile drawer.
20
+ */
21
+ var AppShell = ({ className, collapsed: controlledCollapsed, defaultCollapsed = false, onCollapsedChange, ...props }) => {
22
+ const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultCollapsed);
23
+ const [mobileOpen, setMobileOpen] = useState(false);
24
+ const collapsed = controlledCollapsed ?? uncontrolledCollapsed;
25
+ const isMobile = !useBreakpoint("md");
26
+ /**
27
+ * Updates the collapsed state and reports it to a controlling parent.
28
+ */
29
+ const setCollapsed = (nextCollapsed) => {
30
+ setUncontrolledCollapsed(nextCollapsed);
31
+ onCollapsedChange?.(nextCollapsed);
32
+ };
33
+ return /* @__PURE__ */ jsx(AppShellContext, {
34
+ value: {
35
+ collapsed,
36
+ isMobile,
37
+ mobileOpen,
38
+ setCollapsed,
39
+ setMobileOpen
40
+ },
41
+ children: /* @__PURE__ */ jsx("div", {
42
+ className: cn("flex min-h-dvh bg-canvas text-foreground", className),
43
+ "data-slot": "app-shell",
44
+ ...props
45
+ })
46
+ });
47
+ };
48
+ /**
49
+ * Renders the navigation column: a sticky panel that collapses to an icon rail from `md` up, and an off-canvas drawer below it.
50
+ */
51
+ var AppShellSidebar = ({ children, className, label = "Navigation", ...props }) => {
52
+ const { collapsed, mobileOpen, setMobileOpen } = useAppShell();
53
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("aside", {
54
+ className: cn("group/sidebar sticky top-0 hidden h-dvh w-64 shrink-0 flex-col gap-2 border-r border-border bg-background md:flex", "transition-[width] duration-300 ease-out-expo data-[collapsed=true]:w-16", className),
55
+ "data-collapsed": collapsed,
56
+ "data-slot": "app-shell-sidebar",
57
+ ...props,
58
+ children
59
+ }), /* @__PURE__ */ jsx(Dialog.Root, {
60
+ open: mobileOpen,
61
+ onOpenChange: setMobileOpen,
62
+ children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [/* @__PURE__ */ jsx(Dialog.Overlay, { className: cn("fixed inset-0 z-40 bg-scrim backdrop-blur-sm md:hidden", "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0") }), /* @__PURE__ */ jsxs(Dialog.Content, {
63
+ "aria-describedby": void 0,
64
+ className: cn("group/sidebar fixed inset-y-0 left-0 z-50 flex w-72 flex-col gap-2 border-r border-border bg-background shadow-float md:hidden", "duration-300 data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:animate-in data-[state=open]:slide-in-from-left"),
65
+ "data-collapsed": false,
66
+ children: [/* @__PURE__ */ jsx(Dialog.Title, {
67
+ className: "sr-only",
68
+ children: label
69
+ }), children]
70
+ })] })
71
+ })] });
72
+ };
73
+ /**
74
+ * Holds the brand row at the top of the sidebar; hides everything but the first child when collapsed.
75
+ */
76
+ var SidebarHeader = ({ className, ...props }) => {
77
+ return /* @__PURE__ */ jsx("div", {
78
+ className: cn("flex h-14 shrink-0 items-center gap-2 border-b border-border px-4 group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:px-0", className),
79
+ "data-slot": "sidebar-header",
80
+ ...props
81
+ });
82
+ };
83
+ /**
84
+ * Scrolls the sidebar's sections when they outgrow the viewport.
85
+ */
86
+ var SidebarContent = ({ className, ...props }) => {
87
+ return /* @__PURE__ */ jsx("div", {
88
+ className: cn("flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto px-3 py-3", className),
89
+ "data-slot": "sidebar-content",
90
+ ...props
91
+ });
92
+ };
93
+ /**
94
+ * Groups related items under a mono caption, which turns into a hairline when the sidebar is a rail.
95
+ */
96
+ var SidebarSection = ({ children, className, title, ...props }) => {
97
+ return /* @__PURE__ */ jsxs("div", {
98
+ className: cn("flex flex-col gap-0.5", className),
99
+ "data-slot": "sidebar-section",
100
+ role: "group",
101
+ ...props,
102
+ children: [title && /* @__PURE__ */ jsxs("div", {
103
+ className: "mb-1 flex h-5 items-center px-2",
104
+ children: [/* @__PURE__ */ jsx("span", {
105
+ className: "eyebrow truncate text-subtle group-data-[collapsed=true]/sidebar:sr-only",
106
+ children: title
107
+ }), /* @__PURE__ */ jsx("span", {
108
+ "aria-hidden": true,
109
+ className: "hidden h-px w-full bg-border group-data-[collapsed=true]/sidebar:block",
110
+ role: "presentation"
111
+ })]
112
+ }), children]
113
+ });
114
+ };
115
+ /**
116
+ * Renders one navigation entry with icon, optional website-style number and badge; pass a router link as the child with `asChild`.
117
+ */
118
+ var SidebarItem = ({ active = false, asChild = false, badge, children, className, icon, label, number, onClick, ...props }) => {
119
+ const { collapsed, setMobileOpen } = useAppShell();
120
+ const Component = asChild ? Slot.Root : "button";
121
+ const formattedNumber = typeof number === "number" ? number.toString().padStart(2, "0") : number;
122
+ return /* @__PURE__ */ jsxs(Component, {
123
+ "aria-current": active ? "page" : void 0,
124
+ className: cn("group/item relative flex h-control-md w-full items-center gap-3 rounded-control px-2.5 text-left text-body-sm text-muted-foreground outline-none select-none focus-ring", "[&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0", "group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:px-0", "transition-colors hover:bg-hover hover:text-foreground", "active:bg-pressed aria-[current=page]:bg-card aria-[current=page]:font-medium aria-[current=page]:text-foreground aria-[current=page]:shadow-soft aria-[current=page]:ring-1 aria-[current=page]:ring-border", "disabled:pointer-events-none disabled:opacity-45", className),
125
+ "data-slot": "sidebar-item",
126
+ title: collapsed ? label : void 0,
127
+ type: asChild ? void 0 : "button",
128
+ onClick: (event) => {
129
+ setMobileOpen(false);
130
+ onClick?.(event);
131
+ },
132
+ ...props,
133
+ children: [
134
+ asChild && /* @__PURE__ */ jsx(Slot.Slottable, { children }),
135
+ icon && /* @__PURE__ */ jsx("span", {
136
+ className: "flex text-subtle group-hover/item:text-foreground group-aria-[current=page]/item:text-gem-ink",
137
+ children: icon
138
+ }),
139
+ formattedNumber !== void 0 && /* @__PURE__ */ jsx("span", {
140
+ className: "font-mono text-caption text-subtle tabular-nums group-data-[collapsed=true]/sidebar:hidden",
141
+ children: formattedNumber
142
+ }),
143
+ /* @__PURE__ */ jsx("span", {
144
+ className: "flex-1 truncate group-data-[collapsed=true]/sidebar:sr-only",
145
+ children: label
146
+ }),
147
+ badge !== void 0 && /* @__PURE__ */ jsx("span", {
148
+ className: cn("inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-gem-soft px-1.5 font-mono text-caption text-gem-ink tabular-nums", "group-data-[collapsed=true]/sidebar:absolute group-data-[collapsed=true]/sidebar:top-1 group-data-[collapsed=true]/sidebar:right-1 group-data-[collapsed=true]/sidebar:size-2 group-data-[collapsed=true]/sidebar:min-w-0 group-data-[collapsed=true]/sidebar:bg-gem group-data-[collapsed=true]/sidebar:p-0"),
149
+ children: /* @__PURE__ */ jsx("span", {
150
+ className: "group-data-[collapsed=true]/sidebar:sr-only",
151
+ children: badge
152
+ })
153
+ })
154
+ ]
155
+ });
156
+ };
157
+ /**
158
+ * Pins account and settings controls to the bottom of the sidebar.
159
+ */
160
+ var SidebarFooter = ({ className, ...props }) => {
161
+ return /* @__PURE__ */ jsx("div", {
162
+ className: cn("mt-auto flex shrink-0 items-center gap-3 border-t border-border p-3 group-data-[collapsed=true]/sidebar:justify-center", className),
163
+ "data-slot": "sidebar-footer",
164
+ ...props
165
+ });
166
+ };
167
+ /**
168
+ * Toggles the sidebar: collapses it to a rail from `md` up and opens the drawer below it.
169
+ */
170
+ var AppShellSidebarTrigger = ({ className, onClick, ...props }) => {
171
+ const { collapsed, isMobile, mobileOpen, setCollapsed, setMobileOpen } = useAppShell();
172
+ return /* @__PURE__ */ jsxs("button", {
173
+ className: cn("inline-flex size-control-sm shrink-0 items-center justify-center rounded-control text-muted-foreground transition-colors focus-ring", "hover:bg-hover hover:text-foreground", "active:bg-pressed", className),
174
+ "data-slot": "app-shell-sidebar-trigger",
175
+ title: "Toggle sidebar",
176
+ type: "button",
177
+ onClick: (event) => {
178
+ if (isMobile) setMobileOpen(!mobileOpen);
179
+ else setCollapsed(!collapsed);
180
+ onClick?.(event);
181
+ },
182
+ ...props,
183
+ children: [/* @__PURE__ */ jsx(RefineIconBarLeft, {
184
+ "aria-hidden": true,
185
+ className: "size-4"
186
+ }), /* @__PURE__ */ jsx("span", {
187
+ className: "sr-only",
188
+ children: "Toggle sidebar"
189
+ })]
190
+ });
191
+ };
192
+ /**
193
+ * Stacks the header and page content to the right of the sidebar.
194
+ */
195
+ var AppShellMain = ({ className, ...props }) => {
196
+ return /* @__PURE__ */ jsx("div", {
197
+ className: cn("flex min-w-0 flex-1 flex-col", className),
198
+ "data-slot": "app-shell-main",
199
+ ...props
200
+ });
201
+ };
202
+ /**
203
+ * Renders the sticky, frosted top bar of the content column, like the refine.studio header.
204
+ */
205
+ var AppShellHeader = ({ className, ...props }) => {
206
+ return /* @__PURE__ */ jsx("header", {
207
+ className: cn("sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border px-4 glass md:px-6", className),
208
+ "data-slot": "app-shell-header",
209
+ ...props
210
+ });
211
+ };
212
+ /**
213
+ * Holds the page itself, padded and capped for readable line lengths on very wide screens.
214
+ */
215
+ var AppShellContent = ({ className, ...props }) => {
216
+ return /* @__PURE__ */ jsx("main", {
217
+ className: cn("mx-auto flex w-full max-w-7xl flex-1 flex-col gap-8 p-4 md:p-8", className),
218
+ "data-slot": "app-shell-content",
219
+ ...props
220
+ });
221
+ };
222
+ export { AppShell, AppShellContent, AppShellHeader, AppShellMain, AppShellSidebar, AppShellSidebarTrigger, SidebarContent, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, useAppShell };
223
+
224
+ //# sourceMappingURL=app-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell.js","names":["_Fragment","DialogPrimitive"],"sources":["../../../src/components/app-shell/app-shell.tsx"],"sourcesContent":["'use client';\n\nimport { Dialog as DialogPrimitive, Slot } from 'radix-ui';\nimport { type ComponentProps, createContext, type ReactNode, use, useState } from 'react';\n\nimport { cn } from '../../lib/cn';\nimport { useBreakpoint } from '../../lib/use-breakpoint';\nimport { RefineIconBarLeft } from '../../icons/refine-icons';\n\ninterface AppShellContextValue {\n collapsed: boolean;\n /** Whether the shell shows its phone layout: the sidebar as a drawer, below `md`. `true` on the server. */\n isMobile: boolean;\n mobileOpen: boolean;\n setCollapsed: (collapsed: boolean) => void;\n setMobileOpen: (mobileOpen: boolean) => void;\n}\n\nconst AppShellContext = createContext<AppShellContextValue | null>(null);\n\n/**\n * Returns the shell's sidebar state and whether it shows the phone layout; throws outside an `AppShell`.\n */\nexport const useAppShell = () => {\n const context = use(AppShellContext);\n if (!context) throw new Error('useAppShell must be used inside an AppShell.');\n\n return context;\n};\n\ninterface AppShellProps extends ComponentProps<'div'> {\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\n/**\n * Lays out an internal tool as sidebar plus content, and owns whether the sidebar is collapsed to a rail or open as a mobile drawer.\n */\nexport const AppShell = ({\n className,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n ...props\n}: AppShellProps) => {\n const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultCollapsed);\n const [mobileOpen, setMobileOpen] = useState(false);\n const collapsed = controlledCollapsed ?? uncontrolledCollapsed;\n const isMobile = !useBreakpoint('md');\n\n /**\n * Updates the collapsed state and reports it to a controlling parent.\n */\n const setCollapsed = (nextCollapsed: boolean) => {\n setUncontrolledCollapsed(nextCollapsed);\n onCollapsedChange?.(nextCollapsed);\n };\n\n return (\n <AppShellContext value={{ collapsed, isMobile, mobileOpen, setCollapsed, setMobileOpen }}>\n <div className={cn('flex min-h-dvh bg-canvas text-foreground', className)} data-slot=\"app-shell\" {...props} />\n </AppShellContext>\n );\n};\n\ninterface AppShellSidebarProps extends ComponentProps<'aside'> {\n label?: string;\n}\n\n/**\n * Renders the navigation column: a sticky panel that collapses to an icon rail from `md` up, and an off-canvas drawer below it.\n */\nexport const AppShellSidebar = ({ children, className, label = 'Navigation', ...props }: AppShellSidebarProps) => {\n const { collapsed, mobileOpen, setMobileOpen } = useAppShell();\n\n return (\n <>\n <aside\n className={cn(\n // base\n 'group/sidebar sticky top-0 hidden h-dvh w-64 shrink-0 flex-col gap-2 border-r border-border bg-background md:flex',\n // animation\n 'transition-[width] duration-300 ease-out-expo data-[collapsed=true]:w-16',\n className,\n )}\n data-collapsed={collapsed}\n data-slot=\"app-shell-sidebar\"\n {...props}\n >\n {children}\n </aside>\n <DialogPrimitive.Root open={mobileOpen} onOpenChange={setMobileOpen}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(\n // base\n 'fixed inset-0 z-40 bg-scrim backdrop-blur-sm md:hidden',\n // animation\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0',\n )}\n />\n <DialogPrimitive.Content\n aria-describedby={undefined}\n className={cn(\n // base\n 'group/sidebar fixed inset-y-0 left-0 z-50 flex w-72 flex-col gap-2 border-r border-border bg-background shadow-float md:hidden',\n // animation\n 'duration-300 data-[state=closed]:animate-out data-[state=closed]:slide-out-to-left data-[state=open]:animate-in data-[state=open]:slide-in-from-left',\n )}\n data-collapsed={false}\n >\n <DialogPrimitive.Title className=\"sr-only\">{label}</DialogPrimitive.Title>\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n </>\n );\n};\n\n/**\n * Holds the brand row at the top of the sidebar; hides everything but the first child when collapsed.\n */\nexport const SidebarHeader = ({ className, ...props }: ComponentProps<'div'>) => {\n return (\n <div\n className={cn(\n 'flex h-14 shrink-0 items-center gap-2 border-b border-border px-4 group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:px-0',\n className,\n )}\n data-slot=\"sidebar-header\"\n {...props}\n />\n );\n};\n\n/**\n * Scrolls the sidebar's sections when they outgrow the viewport.\n */\nexport const SidebarContent = ({ className, ...props }: ComponentProps<'div'>) => {\n return (\n <div\n className={cn('flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto px-3 py-3', className)}\n data-slot=\"sidebar-content\"\n {...props}\n />\n );\n};\n\ninterface SidebarSectionProps extends Omit<ComponentProps<'div'>, 'title'> {\n title?: ReactNode;\n}\n\n/**\n * Groups related items under a mono caption, which turns into a hairline when the sidebar is a rail.\n */\nexport const SidebarSection = ({ children, className, title, ...props }: SidebarSectionProps) => {\n return (\n <div className={cn('flex flex-col gap-0.5', className)} data-slot=\"sidebar-section\" role=\"group\" {...props}>\n {title && (\n <div className=\"mb-1 flex h-5 items-center px-2\">\n <span className=\"eyebrow truncate text-subtle group-data-[collapsed=true]/sidebar:sr-only\">{title}</span>\n <span\n aria-hidden\n className=\"hidden h-px w-full bg-border group-data-[collapsed=true]/sidebar:block\"\n role=\"presentation\"\n />\n </div>\n )}\n {children}\n </div>\n );\n};\n\ninterface SidebarItemProps extends ComponentProps<'button'> {\n active?: boolean;\n asChild?: boolean;\n badge?: ReactNode;\n icon?: ReactNode;\n label: string;\n number?: number | string;\n}\n\n/**\n * Renders one navigation entry with icon, optional website-style number and badge; pass a router link as the child with `asChild`.\n */\nexport const SidebarItem = ({\n active = false,\n asChild = false,\n badge,\n children,\n className,\n icon,\n label,\n number,\n onClick,\n ...props\n}: SidebarItemProps) => {\n const { collapsed, setMobileOpen } = useAppShell();\n const Component = asChild ? Slot.Root : 'button';\n const formattedNumber = typeof number === 'number' ? number.toString().padStart(2, '0') : number;\n\n return (\n <Component\n aria-current={active ? 'page' : undefined}\n className={cn(\n // base\n 'group/item relative flex h-control-md w-full items-center gap-3 rounded-control px-2.5 text-left text-body-sm text-muted-foreground outline-none select-none focus-ring',\n \"[&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0\",\n 'group-data-[collapsed=true]/sidebar:justify-center group-data-[collapsed=true]/sidebar:px-0',\n // hover\n 'transition-colors hover:bg-hover hover:text-foreground',\n // active\n 'active:bg-pressed aria-[current=page]:bg-card aria-[current=page]:font-medium aria-[current=page]:text-foreground aria-[current=page]:shadow-soft aria-[current=page]:ring-1 aria-[current=page]:ring-border',\n // disabled\n 'disabled:pointer-events-none disabled:opacity-45',\n className,\n )}\n data-slot=\"sidebar-item\"\n title={collapsed ? label : undefined}\n type={asChild ? undefined : 'button'}\n onClick={(event) => {\n setMobileOpen(false);\n onClick?.(event);\n }}\n {...props}\n >\n {asChild && <Slot.Slottable>{children}</Slot.Slottable>}\n {icon && <span className=\"flex text-subtle group-hover/item:text-foreground group-aria-[current=page]/item:text-gem-ink\">{icon}</span>}\n {formattedNumber !== undefined && (\n <span className=\"font-mono text-caption text-subtle tabular-nums group-data-[collapsed=true]/sidebar:hidden\">\n {formattedNumber}\n </span>\n )}\n <span className=\"flex-1 truncate group-data-[collapsed=true]/sidebar:sr-only\">{label}</span>\n {badge !== undefined && (\n <span\n className={cn(\n 'inline-flex h-5 min-w-5 items-center justify-center rounded-full bg-gem-soft px-1.5 font-mono text-caption text-gem-ink tabular-nums',\n 'group-data-[collapsed=true]/sidebar:absolute group-data-[collapsed=true]/sidebar:top-1 group-data-[collapsed=true]/sidebar:right-1 group-data-[collapsed=true]/sidebar:size-2 group-data-[collapsed=true]/sidebar:min-w-0 group-data-[collapsed=true]/sidebar:bg-gem group-data-[collapsed=true]/sidebar:p-0',\n )}\n >\n <span className=\"group-data-[collapsed=true]/sidebar:sr-only\">{badge}</span>\n </span>\n )}\n </Component>\n );\n};\n\n/**\n * Pins account and settings controls to the bottom of the sidebar.\n */\nexport const SidebarFooter = ({ className, ...props }: ComponentProps<'div'>) => {\n return (\n <div\n className={cn(\n 'mt-auto flex shrink-0 items-center gap-3 border-t border-border p-3 group-data-[collapsed=true]/sidebar:justify-center',\n className,\n )}\n data-slot=\"sidebar-footer\"\n {...props}\n />\n );\n};\n\n/**\n * Toggles the sidebar: collapses it to a rail from `md` up and opens the drawer below it.\n */\nexport const AppShellSidebarTrigger = ({ className, onClick, ...props }: ComponentProps<'button'>) => {\n const { collapsed, isMobile, mobileOpen, setCollapsed, setMobileOpen } = useAppShell();\n\n return (\n <button\n className={cn(\n // base\n 'inline-flex size-control-sm shrink-0 items-center justify-center rounded-control text-muted-foreground transition-colors focus-ring',\n // hover\n 'hover:bg-hover hover:text-foreground',\n // active\n 'active:bg-pressed',\n className,\n )}\n data-slot=\"app-shell-sidebar-trigger\"\n title=\"Toggle sidebar\"\n type=\"button\"\n onClick={(event) => {\n if (isMobile) setMobileOpen(!mobileOpen);\n else setCollapsed(!collapsed);\n onClick?.(event);\n }}\n {...props}\n >\n <RefineIconBarLeft aria-hidden className=\"size-4\" />\n <span className=\"sr-only\">Toggle sidebar</span>\n </button>\n );\n};\n\n/**\n * Stacks the header and page content to the right of the sidebar.\n */\nexport const AppShellMain = ({ className, ...props }: ComponentProps<'div'>) => {\n return <div className={cn('flex min-w-0 flex-1 flex-col', className)} data-slot=\"app-shell-main\" {...props} />;\n};\n\n/**\n * Renders the sticky, frosted top bar of the content column, like the refine.studio header.\n */\nexport const AppShellHeader = ({ className, ...props }: ComponentProps<'header'>) => {\n return (\n <header\n className={cn('sticky top-0 z-30 flex h-14 shrink-0 items-center gap-3 border-b border-border px-4 glass md:px-6', className)}\n data-slot=\"app-shell-header\"\n {...props}\n />\n );\n};\n\n/**\n * Holds the page itself, padded and capped for readable line lengths on very wide screens.\n */\nexport const AppShellContent = ({ className, ...props }: ComponentProps<'main'>) => {\n return (\n <main\n className={cn('mx-auto flex w-full max-w-7xl flex-1 flex-col gap-8 p-4 md:p-8', className)}\n data-slot=\"app-shell-content\"\n {...props}\n />\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import { Avatar as AvatarPrimitive } from 'radix-ui';
3
+ import { type ComponentProps } from 'react';
4
+ export declare const avatarVariants: (props?: ({
5
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | null | undefined;
6
+ shape?: "round" | "square" | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ declare const STATUS_CLASS_BY_STATUS: {
9
+ away: string;
10
+ busy: string;
11
+ offline: string;
12
+ online: string;
13
+ };
14
+ interface AvatarProps extends Omit<ComponentProps<typeof AvatarPrimitive.Root>, 'children'>, VariantProps<typeof avatarVariants> {
15
+ alt?: string;
16
+ fallback: string;
17
+ src?: string;
18
+ status?: keyof typeof STATUS_CLASS_BY_STATUS;
19
+ }
20
+ /**
21
+ * Shows a person's picture, falling back to their initials while it loads or when it fails, with an optional presence dot.
22
+ */
23
+ export declare const Avatar: ({ alt, className, fallback, shape, size, src, status, ...props }: AvatarProps) => import("react").JSX.Element;
24
+ interface AvatarGroupProps extends ComponentProps<'div'> {
25
+ max?: number;
26
+ size?: VariantProps<typeof avatarVariants>['size'];
27
+ }
28
+ /**
29
+ * Stacks avatars with an overlap and collapses everything past `max` into a "+n" counter.
30
+ */
31
+ export declare const AvatarGroup: ({ children, className, max, size, ...props }: AvatarGroupProps) => import("react").JSX.Element;
32
+ export {};
@@ -0,0 +1,83 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { Avatar } from "radix-ui";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { cva } from "class-variance-authority";
5
+ import { Children } from "react";
6
+ // src/components/avatar/avatar.tsx
7
+ var avatarVariants = cva(["relative inline-flex shrink-0 items-center justify-center bg-muted font-semibold text-muted-foreground select-none"], {
8
+ variants: {
9
+ size: {
10
+ xs: "size-6 text-caption",
11
+ sm: "size-8 text-caption",
12
+ md: "size-10 text-body-sm",
13
+ lg: "size-12 text-body",
14
+ xl: "size-16 text-headline-sm"
15
+ },
16
+ shape: {
17
+ round: "rounded-full",
18
+ square: "rounded-control"
19
+ }
20
+ },
21
+ defaultVariants: {
22
+ size: "md",
23
+ shape: "round"
24
+ }
25
+ });
26
+ var STATUS_CLASS_BY_STATUS = {
27
+ away: "bg-warning",
28
+ busy: "bg-danger",
29
+ offline: "bg-subtle",
30
+ online: "bg-success"
31
+ };
32
+ /**
33
+ * Shows a person's picture, falling back to their initials while it loads or when it fails, with an optional presence dot.
34
+ */
35
+ var Avatar$1 = ({ alt, className, fallback, shape, size, src, status, ...props }) => {
36
+ return /* @__PURE__ */ jsxs(Avatar.Root, {
37
+ className: cn(avatarVariants({
38
+ shape,
39
+ size
40
+ }), className),
41
+ "data-slot": "avatar",
42
+ ...props,
43
+ children: [/* @__PURE__ */ jsxs("span", {
44
+ className: "absolute inset-0 overflow-hidden rounded-[inherit]",
45
+ children: [src && /* @__PURE__ */ jsx(Avatar.Image, {
46
+ alt: alt ?? fallback,
47
+ className: "size-full object-cover",
48
+ src
49
+ }), /* @__PURE__ */ jsx(Avatar.Fallback, {
50
+ className: "flex size-full items-center justify-center",
51
+ delayMs: src ? 400 : 0,
52
+ children: fallback
53
+ })]
54
+ }), status && /* @__PURE__ */ jsx("span", {
55
+ className: cn("absolute right-0 bottom-0 size-[28%] min-h-2 min-w-2 rounded-full ring-2 ring-background", STATUS_CLASS_BY_STATUS[status]),
56
+ title: status,
57
+ children: /* @__PURE__ */ jsx("span", {
58
+ className: "sr-only",
59
+ children: status
60
+ })
61
+ })]
62
+ });
63
+ };
64
+ /**
65
+ * Stacks avatars with an overlap and collapses everything past `max` into a "+n" counter.
66
+ */
67
+ var AvatarGroup = ({ children, className, max = 4, size, ...props }) => {
68
+ const avatars = Children.toArray(children);
69
+ const hiddenCount = avatars.length - max;
70
+ return /* @__PURE__ */ jsxs("div", {
71
+ className: cn("flex items-center -space-x-2 *:ring-2 *:ring-background", className),
72
+ "data-slot": "avatar-group",
73
+ ...props,
74
+ children: [avatars.slice(0, max), hiddenCount > 0 && /* @__PURE__ */ jsxs("span", {
75
+ className: cn(avatarVariants({ size }), "bg-secondary text-secondary-foreground"),
76
+ title: `${hiddenCount} more`,
77
+ children: ["+", hiddenCount]
78
+ })]
79
+ });
80
+ };
81
+ export { Avatar$1 as Avatar, AvatarGroup, avatarVariants };
82
+
83
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","names":["Avatar","AvatarPrimitive"],"sources":["../../../src/components/avatar/avatar.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Avatar as AvatarPrimitive } from 'radix-ui';\nimport { Children, type ComponentProps } from 'react';\n\nimport { cn } from '../../lib/cn';\n\nexport const avatarVariants = cva(\n [\n // base\n 'relative inline-flex shrink-0 items-center justify-center bg-muted font-semibold text-muted-foreground select-none',\n ],\n {\n variants: {\n size: {\n xs: 'size-6 text-caption',\n sm: 'size-8 text-caption',\n md: 'size-10 text-body-sm',\n lg: 'size-12 text-body',\n xl: 'size-16 text-headline-sm',\n },\n shape: {\n round: 'rounded-full',\n square: 'rounded-control',\n },\n },\n defaultVariants: {\n size: 'md',\n shape: 'round',\n },\n },\n);\n\nconst STATUS_CLASS_BY_STATUS = {\n away: 'bg-warning',\n busy: 'bg-danger',\n offline: 'bg-subtle',\n online: 'bg-success',\n} satisfies Record<string, string>;\n\ninterface AvatarProps\n extends Omit<ComponentProps<typeof AvatarPrimitive.Root>, 'children'>, VariantProps<typeof avatarVariants> {\n alt?: string;\n fallback: string;\n src?: string;\n status?: keyof typeof STATUS_CLASS_BY_STATUS;\n}\n\n/**\n * Shows a person's picture, falling back to their initials while it loads or when it fails, with an optional presence dot.\n */\nexport const Avatar = ({ alt, className, fallback, shape, size, src, status, ...props }: AvatarProps) => {\n return (\n <AvatarPrimitive.Root className={cn(avatarVariants({ shape, size }), className)} data-slot=\"avatar\" {...props}>\n <span className=\"absolute inset-0 overflow-hidden rounded-[inherit]\">\n {src && <AvatarPrimitive.Image alt={alt ?? fallback} className=\"size-full object-cover\" src={src} />}\n <AvatarPrimitive.Fallback className=\"flex size-full items-center justify-center\" delayMs={src ? 400 : 0}>\n {fallback}\n </AvatarPrimitive.Fallback>\n </span>\n {status && (\n <span\n className={cn(\n 'absolute right-0 bottom-0 size-[28%] min-h-2 min-w-2 rounded-full ring-2 ring-background',\n STATUS_CLASS_BY_STATUS[status],\n )}\n title={status}\n >\n <span className=\"sr-only\">{status}</span>\n </span>\n )}\n </AvatarPrimitive.Root>\n );\n};\n\ninterface AvatarGroupProps extends ComponentProps<'div'> {\n max?: number;\n size?: VariantProps<typeof avatarVariants>['size'];\n}\n\n/**\n * Stacks avatars with an overlap and collapses everything past `max` into a \"+n\" counter.\n */\nexport const AvatarGroup = ({ children, className, max = 4, size, ...props }: AvatarGroupProps) => {\n const avatars = Children.toArray(children);\n const hiddenCount = avatars.length - max;\n\n return (\n <div\n className={cn('flex items-center -space-x-2 *:ring-2 *:ring-background', className)}\n data-slot=\"avatar-group\"\n {...props}\n >\n {avatars.slice(0, max)}\n {hiddenCount > 0 && (\n <span className={cn(avatarVariants({ size }), 'bg-secondary text-secondary-foreground')} title={`${hiddenCount} more`}>\n +{hiddenCount}\n </span>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;AAMA,IAAa,iBAAiB,IAC5B,CAEE,oHACF,GACA;CACE,UAAU;EACR,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EACA,OAAO;GACL,OAAO;GACP,QAAQ;EACV;CACF;CACA,iBAAiB;EACf,MAAM;EACN,OAAO;CACT;AACF,CACF;AAEA,IAAM,yBAAyB;CAC7B,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;AACV;;;;AAaA,IAAaA,YAAU,EAAE,KAAK,WAAW,UAAU,OAAO,MAAM,KAAK,QAAQ,GAAG,YAAyB;CACvG,OACE,qBAACC,OAAgB,MAAjB;EAAsB,WAAW,GAAG,eAAe;GAAE;GAAO;EAAK,CAAC,GAAG,SAAS;EAAG,aAAU;EAAS,GAAI;EAAxG,UAAA,CACE,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACG,OAAO,oBAACA,OAAgB,OAAjB;IAAuB,KAAK,OAAO;IAAU,WAAU;IAA8B;GAAM,CAAA,GACnG,oBAACA,OAAgB,UAAjB;IAA0B,WAAU;IAA6C,SAAS,MAAM,MAAM;IACnG,UAAA;GACuB,CAAA,CACtB;EACL,CAAA,GAAA,UACC,oBAAC,QAAD;GACE,WAAW,GACT,4FACA,uBAAuB,OACzB;GACA,OAAO;GAEP,UAAA,oBAAC,QAAD;IAAM,WAAU;IAAW,UAAA;GAAa,CAAA;EACpC,CAAA,CAEY;;AAE1B;;;;AAUA,IAAa,eAAe,EAAE,UAAU,WAAW,MAAM,GAAG,MAAM,GAAG,YAA8B;CACjG,MAAM,UAAU,SAAS,QAAQ,QAAQ;CACzC,MAAM,cAAc,QAAQ,SAAS;CAErC,OACE,qBAAC,OAAD;EACE,WAAW,GAAG,2DAA2D,SAAS;EAClF,aAAU;EACV,GAAI;EAHN,UAAA,CAKG,QAAQ,MAAM,GAAG,GAAG,GACpB,cAAc,KACb,qBAAC,QAAD;GAAM,WAAW,GAAG,eAAe,EAAE,KAAK,CAAC,GAAG,wCAAwC;GAAG,OAAO,GAAG,YAAY;GAA/G,UAAA,CAAuH,KACnH,WACE;EAEL,CAAA,CAAA;;AAET"}
@@ -0,0 +1,15 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import type { ComponentProps } from 'react';
3
+ export declare const badgeVariants: (props?: ({
4
+ variant?: "gem" | "outline" | "danger" | "warning" | "neutral" | "info" | "success" | "orange" | "violet" | null | undefined;
5
+ size?: "sm" | "md" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ interface BadgeProps extends ComponentProps<'span'>, VariantProps<typeof badgeVariants> {
8
+ asChild?: boolean;
9
+ dot?: boolean;
10
+ }
11
+ /**
12
+ * Labels a status or category as a pill; `dot` prefixes it with a small marker in the current text colour.
13
+ */
14
+ export declare const Badge: ({ asChild, children, className, dot, size, variant, ...props }: BadgeProps) => import("react").JSX.Element;
15
+ export {};
@@ -0,0 +1,50 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { Slot } from "radix-ui";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { cva } from "class-variance-authority";
5
+ // src/components/badge/badge.tsx
6
+ var badgeVariants = cva(["inline-flex w-fit shrink-0 items-center gap-1.5 rounded-full border font-medium whitespace-nowrap", "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-[1.1em]"], {
7
+ variants: {
8
+ variant: {
9
+ neutral: "border-transparent bg-secondary text-secondary-foreground",
10
+ gem: "border-transparent bg-gem-soft text-gem-ink",
11
+ outline: "border-border bg-background text-foreground",
12
+ success: "border-transparent bg-success-soft text-success-ink",
13
+ warning: "border-transparent bg-warning-soft text-warning-ink",
14
+ orange: "border-transparent bg-orange-soft text-orange-ink",
15
+ danger: "border-transparent bg-danger-soft text-danger-ink",
16
+ info: "border-transparent bg-info-soft text-info-ink",
17
+ violet: "border-transparent bg-violet-soft text-violet-ink"
18
+ },
19
+ size: {
20
+ sm: "h-5 px-2 text-caption",
21
+ md: "h-6 px-2.5 text-body-sm"
22
+ }
23
+ },
24
+ defaultVariants: {
25
+ variant: "neutral",
26
+ size: "md"
27
+ }
28
+ });
29
+ /**
30
+ * Labels a status or category as a pill; `dot` prefixes it with a small marker in the current text colour.
31
+ */
32
+ var Badge = ({ asChild = false, children, className, dot = false, size, variant, ...props }) => {
33
+ const Component = asChild ? Slot.Root : "span";
34
+ return /* @__PURE__ */ jsxs(Component, {
35
+ className: cn(badgeVariants({
36
+ size,
37
+ variant
38
+ }), className),
39
+ "data-slot": "badge",
40
+ ...props,
41
+ children: [dot && !asChild && /* @__PURE__ */ jsx("span", {
42
+ "aria-hidden": true,
43
+ className: "size-1.5 rounded-full bg-current",
44
+ role: "presentation"
45
+ }), children]
46
+ });
47
+ };
48
+ export { Badge, badgeVariants };
49
+
50
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","names":[],"sources":["../../../src/components/badge/badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../../lib/cn';\n\nexport const badgeVariants = cva(\n [\n // base\n 'inline-flex w-fit shrink-0 items-center gap-1.5 rounded-full border font-medium whitespace-nowrap',\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-[1.1em]\",\n ],\n {\n variants: {\n variant: {\n neutral: 'border-transparent bg-secondary text-secondary-foreground',\n gem: 'border-transparent bg-gem-soft text-gem-ink',\n outline: 'border-border bg-background text-foreground',\n success: 'border-transparent bg-success-soft text-success-ink',\n warning: 'border-transparent bg-warning-soft text-warning-ink',\n orange: 'border-transparent bg-orange-soft text-orange-ink',\n danger: 'border-transparent bg-danger-soft text-danger-ink',\n info: 'border-transparent bg-info-soft text-info-ink',\n violet: 'border-transparent bg-violet-soft text-violet-ink',\n },\n size: {\n sm: 'h-5 px-2 text-caption',\n md: 'h-6 px-2.5 text-body-sm',\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: 'md',\n },\n },\n);\n\ninterface BadgeProps extends ComponentProps<'span'>, VariantProps<typeof badgeVariants> {\n asChild?: boolean;\n dot?: boolean;\n}\n\n/**\n * Labels a status or category as a pill; `dot` prefixes it with a small marker in the current text colour.\n */\nexport const Badge = ({ asChild = false, children, className, dot = false, size, variant, ...props }: BadgeProps) => {\n const Component = asChild ? Slot.Root : 'span';\n\n return (\n <Component className={cn(badgeVariants({ size, variant }), className)} data-slot=\"badge\" {...props}>\n {dot && !asChild && <span aria-hidden className=\"size-1.5 rounded-full bg-current\" role=\"presentation\" />}\n {children}\n </Component>\n );\n};\n"],"mappings":";;;;;AAMA,IAAa,gBAAgB,IAC3B,CAEE,qGACA,yFACF,GACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,KAAK;GACL,SAAS;GACT,SAAS;GACT,SAAS;GACT,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,QAAQ;EACV;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;EACN;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;CACR;AACF,CACF;;;;AAUA,IAAa,SAAS,EAAE,UAAU,OAAO,UAAU,WAAW,MAAM,OAAO,MAAM,SAAS,GAAG,YAAwB;CACnH,MAAM,YAAY,UAAU,KAAK,OAAO;CAExC,OACE,qBAAC,WAAD;EAAW,WAAW,GAAG,cAAc;GAAE;GAAM;EAAQ,CAAC,GAAG,SAAS;EAAG,aAAU;EAAQ,GAAI;EAA7F,UAAA,CACG,OAAO,CAAC,WAAW,oBAAC,QAAD;GAAM,eAAA;GAAY,WAAU;GAAmC,MAAK;EAAgB,CAAA,GACvG,QACQ;;AAEf"}
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps } from 'react';
2
+ /**
3
+ * Marks up the trail as a navigation landmark.
4
+ */
5
+ export declare const Breadcrumb: ({ ...props }: ComponentProps<"nav">) => import("react").JSX.Element;
6
+ export declare const BreadcrumbList: ({ className, ...props }: ComponentProps<"ol">) => import("react").JSX.Element;
7
+ export declare const BreadcrumbItem: ({ className, ...props }: ComponentProps<"li">) => import("react").JSX.Element;
8
+ interface BreadcrumbLinkProps extends ComponentProps<'a'> {
9
+ asChild?: boolean;
10
+ }
11
+ /**
12
+ * Links to an ancestor page; pass `asChild` to render your router's link.
13
+ */
14
+ export declare const BreadcrumbLink: ({ asChild, className, ...props }: BreadcrumbLinkProps) => import("react").JSX.Element;
15
+ /**
16
+ * Names the current page and marks it as such for assistive technology.
17
+ */
18
+ export declare const BreadcrumbPage: ({ className, ...props }: ComponentProps<"span">) => import("react").JSX.Element;
19
+ export declare const BreadcrumbSeparator: ({ children, className, ...props }: ComponentProps<"li">) => import("react").JSX.Element;
20
+ /**
21
+ * Stands in for collapsed middle crumbs.
22
+ */
23
+ export declare const BreadcrumbEllipsis: ({ className, ...props }: ComponentProps<"span">) => import("react").JSX.Element;
24
+ export {};
@@ -0,0 +1,82 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { RefineIconChevronRight, RefineIconMoreHorizontal } from "../../icons/refine-icons.js";
3
+ import { Slot } from "radix-ui";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ // src/components/breadcrumb/breadcrumb.tsx
6
+ /**
7
+ * Marks up the trail as a navigation landmark.
8
+ */
9
+ var Breadcrumb = ({ ...props }) => {
10
+ return /* @__PURE__ */ jsx("nav", {
11
+ "aria-label": "Breadcrumb",
12
+ "data-slot": "breadcrumb",
13
+ ...props
14
+ });
15
+ };
16
+ var BreadcrumbList = ({ className, ...props }) => {
17
+ return /* @__PURE__ */ jsx("ol", {
18
+ className: cn("flex flex-wrap items-center gap-1.5 text-body-sm break-words text-muted-foreground", className),
19
+ "data-slot": "breadcrumb-list",
20
+ ...props
21
+ });
22
+ };
23
+ var BreadcrumbItem = ({ className, ...props }) => {
24
+ return /* @__PURE__ */ jsx("li", {
25
+ className: cn("inline-flex items-center gap-1.5", className),
26
+ "data-slot": "breadcrumb-item",
27
+ ...props
28
+ });
29
+ };
30
+ /**
31
+ * Links to an ancestor page; pass `asChild` to render your router's link.
32
+ */
33
+ var BreadcrumbLink = ({ asChild = false, className, ...props }) => {
34
+ const Component = asChild ? Slot.Root : "a";
35
+ return /* @__PURE__ */ jsx(Component, {
36
+ className: cn("rounded-sm transition-colors hover:text-foreground focus-ring", className),
37
+ "data-slot": "breadcrumb-link",
38
+ ...props
39
+ });
40
+ };
41
+ /**
42
+ * Names the current page and marks it as such for assistive technology.
43
+ */
44
+ var BreadcrumbPage = ({ className, ...props }) => {
45
+ return /* @__PURE__ */ jsx("span", {
46
+ "aria-current": "page",
47
+ className: cn("font-medium text-foreground", className),
48
+ "data-slot": "breadcrumb-page",
49
+ ...props
50
+ });
51
+ };
52
+ var BreadcrumbSeparator = ({ children, className, ...props }) => {
53
+ return /* @__PURE__ */ jsx("li", {
54
+ "aria-hidden": true,
55
+ className: cn("text-subtle [&>svg]:size-3.5", className),
56
+ "data-slot": "breadcrumb-separator",
57
+ role: "presentation",
58
+ ...props,
59
+ children: children ?? /* @__PURE__ */ jsx(RefineIconChevronRight, {})
60
+ });
61
+ };
62
+ /**
63
+ * Stands in for collapsed middle crumbs.
64
+ */
65
+ var BreadcrumbEllipsis = ({ className, ...props }) => {
66
+ return /* @__PURE__ */ jsxs("span", {
67
+ className: cn("flex size-5 items-center justify-center", className),
68
+ "data-slot": "breadcrumb-ellipsis",
69
+ ...props,
70
+ children: [/* @__PURE__ */ jsx(RefineIconMoreHorizontal, {
71
+ "aria-hidden": true,
72
+ className: "size-4",
73
+ role: "presentation"
74
+ }), /* @__PURE__ */ jsx("span", {
75
+ className: "sr-only",
76
+ children: "More pages"
77
+ })]
78
+ });
79
+ };
80
+ export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator };
81
+
82
+ //# sourceMappingURL=breadcrumb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumb.js","names":[],"sources":["../../../src/components/breadcrumb/breadcrumb.tsx"],"sourcesContent":["import { Slot } from 'radix-ui';\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '../../lib/cn';\nimport { RefineIconChevronRight, RefineIconMoreHorizontal } from '../../icons/refine-icons';\n\n/**\n * Marks up the trail as a navigation landmark.\n */\nexport const Breadcrumb = ({ ...props }: ComponentProps<'nav'>) => {\n return <nav aria-label=\"Breadcrumb\" data-slot=\"breadcrumb\" {...props} />;\n};\n\nexport const BreadcrumbList = ({ className, ...props }: ComponentProps<'ol'>) => {\n return (\n <ol\n className={cn('flex flex-wrap items-center gap-1.5 text-body-sm break-words text-muted-foreground', className)}\n data-slot=\"breadcrumb-list\"\n {...props}\n />\n );\n};\n\nexport const BreadcrumbItem = ({ className, ...props }: ComponentProps<'li'>) => {\n return <li className={cn('inline-flex items-center gap-1.5', className)} data-slot=\"breadcrumb-item\" {...props} />;\n};\n\ninterface BreadcrumbLinkProps extends ComponentProps<'a'> {\n asChild?: boolean;\n}\n\n/**\n * Links to an ancestor page; pass `asChild` to render your router's link.\n */\nexport const BreadcrumbLink = ({ asChild = false, className, ...props }: BreadcrumbLinkProps) => {\n const Component = asChild ? Slot.Root : 'a';\n\n return (\n <Component\n className={cn('rounded-sm transition-colors hover:text-foreground focus-ring', className)}\n data-slot=\"breadcrumb-link\"\n {...props}\n />\n );\n};\n\n/**\n * Names the current page and marks it as such for assistive technology.\n */\nexport const BreadcrumbPage = ({ className, ...props }: ComponentProps<'span'>) => {\n return (\n <span\n aria-current=\"page\"\n className={cn('font-medium text-foreground', className)}\n data-slot=\"breadcrumb-page\"\n {...props}\n />\n );\n};\n\nexport const BreadcrumbSeparator = ({ children, className, ...props }: ComponentProps<'li'>) => {\n return (\n <li\n aria-hidden\n className={cn('text-subtle [&>svg]:size-3.5', className)}\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n {...props}\n >\n {children ?? <RefineIconChevronRight />}\n </li>\n );\n};\n\n/**\n * Stands in for collapsed middle crumbs.\n */\nexport const BreadcrumbEllipsis = ({ className, ...props }: ComponentProps<'span'>) => {\n return (\n <span\n className={cn('flex size-5 items-center justify-center', className)}\n data-slot=\"breadcrumb-ellipsis\"\n {...props}\n >\n <RefineIconMoreHorizontal aria-hidden className=\"size-4\" role=\"presentation\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n};\n"],"mappings":";;;;;;;;AASA,IAAa,cAAc,EAAE,GAAG,YAAmC;CACjE,OAAO,oBAAC,OAAD;EAAK,cAAW;EAAa,aAAU;EAAa,GAAI;CAAQ,CAAA;AACzE;AAEA,IAAa,kBAAkB,EAAE,WAAW,GAAG,YAAkC;CAC/E,OACE,oBAAC,MAAD;EACE,WAAW,GAAG,sFAAsF,SAAS;EAC7G,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,kBAAkB,EAAE,WAAW,GAAG,YAAkC;CAC/E,OAAO,oBAAC,MAAD;EAAI,WAAW,GAAG,oCAAoC,SAAS;EAAG,aAAU;EAAkB,GAAI;CAAQ,CAAA;AACnH;;;;AASA,IAAa,kBAAkB,EAAE,UAAU,OAAO,WAAW,GAAG,YAAiC;CAC/F,MAAM,YAAY,UAAU,KAAK,OAAO;CAExC,OACE,oBAAC,WAAD;EACE,WAAW,GAAG,iEAAiE,SAAS;EACxF,aAAU;EACV,GAAI;CACL,CAAA;AAEL;;;;AAKA,IAAa,kBAAkB,EAAE,WAAW,GAAG,YAAoC;CACjF,OACE,oBAAC,QAAD;EACE,gBAAa;EACb,WAAW,GAAG,+BAA+B,SAAS;EACtD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,IAAa,uBAAuB,EAAE,UAAU,WAAW,GAAG,YAAkC;CAC9F,OACE,oBAAC,MAAD;EACE,eAAA;EACA,WAAW,GAAG,gCAAgC,SAAS;EACvD,aAAU;EACV,MAAK;EACL,GAAI;EAEH,UAAA,YAAY,oBAAC,wBAAD,CAAyB,CAAA;CACpC,CAAA;AAER;;;;AAKA,IAAa,sBAAsB,EAAE,WAAW,GAAG,YAAoC;CACrF,OACE,qBAAC,QAAD;EACE,WAAW,GAAG,2CAA2C,SAAS;EAClE,aAAU;EACV,GAAI;EAHN,UAAA,CAKE,oBAAC,0BAAD;GAA0B,eAAA;GAAY,WAAU;GAAS,MAAK;EAAgB,CAAA,GAC9E,oBAAC,QAAD;GAAM,WAAU;GAAU,UAAA;EAAgB,CAAA,CACtC;;AAEV"}
@@ -0,0 +1,15 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import type { ComponentProps } from 'react';
3
+ export declare const buttonVariants: (props?: ({
4
+ variant?: "link" | "primary" | "gem" | "secondary" | "outline" | "ghost" | "danger" | null | undefined;
5
+ size?: "xs" | "sm" | "md" | "lg" | "xl" | "icon-sm" | "icon" | "icon-lg" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ interface ButtonProps extends ComponentProps<'button'>, VariantProps<typeof buttonVariants> {
8
+ asChild?: boolean;
9
+ loading?: boolean;
10
+ }
11
+ /**
12
+ * Renders an action; while `loading` it keeps its width, swaps its content for a spinner and refuses clicks.
13
+ */
14
+ export declare const Button: ({ asChild, children, className, disabled, loading, size, type, variant, ...props }: ButtonProps) => import("react").JSX.Element;
15
+ export {};