@skylab-kulubu/skylcn-ui 0.1.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 (253) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +100 -0
  3. package/dist/assets/skylab-mark.d.ts +5 -0
  4. package/dist/assets/skylab-mark.d.ts.map +1 -0
  5. package/dist/assets/skylab-mark.js +29 -0
  6. package/dist/assets/skylab-mark.js.map +1 -0
  7. package/dist/charts/chart-frame.d.ts +42 -0
  8. package/dist/charts/chart-frame.d.ts.map +1 -0
  9. package/dist/charts/chart-frame.js +33 -0
  10. package/dist/charts/chart-frame.js.map +1 -0
  11. package/dist/charts/charts.d.ts +84 -0
  12. package/dist/charts/charts.d.ts.map +1 -0
  13. package/dist/charts/charts.js +194 -0
  14. package/dist/charts/charts.js.map +1 -0
  15. package/dist/charts/index.d.ts +3 -0
  16. package/dist/charts/index.d.ts.map +1 -0
  17. package/dist/charts/index.js +3 -0
  18. package/dist/charts/index.js.map +1 -0
  19. package/dist/components/accordion.d.ts +7 -0
  20. package/dist/components/accordion.d.ts.map +1 -0
  21. package/dist/components/accordion.js +17 -0
  22. package/dist/components/accordion.js.map +1 -0
  23. package/dist/components/app-shell.d.ts +96 -0
  24. package/dist/components/app-shell.d.ts.map +1 -0
  25. package/dist/components/app-shell.js +191 -0
  26. package/dist/components/app-shell.js.map +1 -0
  27. package/dist/components/avatar.d.ts +28 -0
  28. package/dist/components/avatar.d.ts.map +1 -0
  29. package/dist/components/avatar.js +26 -0
  30. package/dist/components/avatar.js.map +1 -0
  31. package/dist/components/badge.d.ts +41 -0
  32. package/dist/components/badge.d.ts.map +1 -0
  33. package/dist/components/badge.js +42 -0
  34. package/dist/components/badge.js.map +1 -0
  35. package/dist/components/bar-list.d.ts +33 -0
  36. package/dist/components/bar-list.d.ts.map +1 -0
  37. package/dist/components/bar-list.js +31 -0
  38. package/dist/components/bar-list.js.map +1 -0
  39. package/dist/components/breadcrumbs.d.ts +16 -0
  40. package/dist/components/breadcrumbs.d.ts.map +1 -0
  41. package/dist/components/breadcrumbs.js +21 -0
  42. package/dist/components/breadcrumbs.js.map +1 -0
  43. package/dist/components/button.d.ts +30 -0
  44. package/dist/components/button.d.ts.map +1 -0
  45. package/dist/components/button.js +51 -0
  46. package/dist/components/button.js.map +1 -0
  47. package/dist/components/calendar.d.ts +44 -0
  48. package/dist/components/calendar.d.ts.map +1 -0
  49. package/dist/components/calendar.js +93 -0
  50. package/dist/components/calendar.js.map +1 -0
  51. package/dist/components/card.d.ts +38 -0
  52. package/dist/components/card.d.ts.map +1 -0
  53. package/dist/components/card.js +38 -0
  54. package/dist/components/card.js.map +1 -0
  55. package/dist/components/carousel.d.ts +42 -0
  56. package/dist/components/carousel.d.ts.map +1 -0
  57. package/dist/components/carousel.js +92 -0
  58. package/dist/components/carousel.js.map +1 -0
  59. package/dist/components/checkbox.d.ts +3 -0
  60. package/dist/components/checkbox.d.ts.map +1 -0
  61. package/dist/components/checkbox.js +9 -0
  62. package/dist/components/checkbox.js.map +1 -0
  63. package/dist/components/command.d.ts +31 -0
  64. package/dist/components/command.d.ts.map +1 -0
  65. package/dist/components/command.js +91 -0
  66. package/dist/components/command.js.map +1 -0
  67. package/dist/components/copy-button.d.ts +10 -0
  68. package/dist/components/copy-button.d.ts.map +1 -0
  69. package/dist/components/copy-button.js +23 -0
  70. package/dist/components/copy-button.js.map +1 -0
  71. package/dist/components/data-list.d.ts +70 -0
  72. package/dist/components/data-list.d.ts.map +1 -0
  73. package/dist/components/data-list.js +119 -0
  74. package/dist/components/data-list.js.map +1 -0
  75. package/dist/components/dialog.d.ts +41 -0
  76. package/dist/components/dialog.d.ts.map +1 -0
  77. package/dist/components/dialog.js +49 -0
  78. package/dist/components/dialog.js.map +1 -0
  79. package/dist/components/display-extra.d.ts +91 -0
  80. package/dist/components/display-extra.d.ts.map +1 -0
  81. package/dist/components/display-extra.js +91 -0
  82. package/dist/components/display-extra.js.map +1 -0
  83. package/dist/components/drawer.d.ts +22 -0
  84. package/dist/components/drawer.d.ts.map +1 -0
  85. package/dist/components/drawer.js +50 -0
  86. package/dist/components/drawer.js.map +1 -0
  87. package/dist/components/feedback.d.ts +63 -0
  88. package/dist/components/feedback.d.ts.map +1 -0
  89. package/dist/components/feedback.js +59 -0
  90. package/dist/components/feedback.js.map +1 -0
  91. package/dist/components/field.d.ts +21 -0
  92. package/dist/components/field.d.ts.map +1 -0
  93. package/dist/components/field.js +38 -0
  94. package/dist/components/field.js.map +1 -0
  95. package/dist/components/form-extra.d.ts +58 -0
  96. package/dist/components/form-extra.d.ts.map +1 -0
  97. package/dist/components/form-extra.js +51 -0
  98. package/dist/components/form-extra.js.map +1 -0
  99. package/dist/components/icon-swap.d.ts +15 -0
  100. package/dist/components/icon-swap.d.ts.map +1 -0
  101. package/dist/components/icon-swap.js +13 -0
  102. package/dist/components/icon-swap.js.map +1 -0
  103. package/dist/components/list.d.ts +43 -0
  104. package/dist/components/list.d.ts.map +1 -0
  105. package/dist/components/list.js +30 -0
  106. package/dist/components/list.js.map +1 -0
  107. package/dist/components/menu.d.ts +41 -0
  108. package/dist/components/menu.d.ts.map +1 -0
  109. package/dist/components/menu.js +67 -0
  110. package/dist/components/menu.js.map +1 -0
  111. package/dist/components/month-calendar.d.ts +38 -0
  112. package/dist/components/month-calendar.d.ts.map +1 -0
  113. package/dist/components/month-calendar.js +64 -0
  114. package/dist/components/month-calendar.js.map +1 -0
  115. package/dist/components/motion.d.ts +43 -0
  116. package/dist/components/motion.d.ts.map +1 -0
  117. package/dist/components/motion.js +56 -0
  118. package/dist/components/motion.js.map +1 -0
  119. package/dist/components/navigation-menu.d.ts +28 -0
  120. package/dist/components/navigation-menu.d.ts.map +1 -0
  121. package/dist/components/navigation-menu.js +26 -0
  122. package/dist/components/navigation-menu.js.map +1 -0
  123. package/dist/components/page-header.d.ts +45 -0
  124. package/dist/components/page-header.d.ts.map +1 -0
  125. package/dist/components/page-header.js +37 -0
  126. package/dist/components/page-header.js.map +1 -0
  127. package/dist/components/pagination.d.ts +19 -0
  128. package/dist/components/pagination.d.ts.map +1 -0
  129. package/dist/components/pagination.js +70 -0
  130. package/dist/components/pagination.js.map +1 -0
  131. package/dist/components/popover.d.ts +10 -0
  132. package/dist/components/popover.d.ts.map +1 -0
  133. package/dist/components/popover.js +15 -0
  134. package/dist/components/popover.js.map +1 -0
  135. package/dist/components/preview-card.d.ts +11 -0
  136. package/dist/components/preview-card.d.ts.map +1 -0
  137. package/dist/components/preview-card.js +18 -0
  138. package/dist/components/preview-card.js.map +1 -0
  139. package/dist/components/proportion-bar.d.ts +16 -0
  140. package/dist/components/proportion-bar.d.ts.map +1 -0
  141. package/dist/components/proportion-bar.js +20 -0
  142. package/dist/components/proportion-bar.js.map +1 -0
  143. package/dist/components/radio-group.d.ts +11 -0
  144. package/dist/components/radio-group.d.ts.map +1 -0
  145. package/dist/components/radio-group.js +13 -0
  146. package/dist/components/radio-group.js.map +1 -0
  147. package/dist/components/reveal.d.ts +19 -0
  148. package/dist/components/reveal.d.ts.map +1 -0
  149. package/dist/components/reveal.js +25 -0
  150. package/dist/components/reveal.js.map +1 -0
  151. package/dist/components/segmented-control.d.ts +16 -0
  152. package/dist/components/segmented-control.d.ts.map +1 -0
  153. package/dist/components/segmented-control.js +21 -0
  154. package/dist/components/segmented-control.js.map +1 -0
  155. package/dist/components/select.d.ts +25 -0
  156. package/dist/components/select.d.ts.map +1 -0
  157. package/dist/components/select.js +33 -0
  158. package/dist/components/select.js.map +1 -0
  159. package/dist/components/side-nav.d.ts +33 -0
  160. package/dist/components/side-nav.d.ts.map +1 -0
  161. package/dist/components/side-nav.js +52 -0
  162. package/dist/components/side-nav.js.map +1 -0
  163. package/dist/components/skeleton.d.ts +4 -0
  164. package/dist/components/skeleton.d.ts.map +1 -0
  165. package/dist/components/skeleton.js +7 -0
  166. package/dist/components/skeleton.js.map +1 -0
  167. package/dist/components/skylab-loader.d.ts +10 -0
  168. package/dist/components/skylab-loader.d.ts.map +1 -0
  169. package/dist/components/skylab-loader.js +12 -0
  170. package/dist/components/skylab-loader.js.map +1 -0
  171. package/dist/components/sparkline.d.ts +12 -0
  172. package/dist/components/sparkline.d.ts.map +1 -0
  173. package/dist/components/sparkline.js +26 -0
  174. package/dist/components/sparkline.js.map +1 -0
  175. package/dist/components/state-card.d.ts +27 -0
  176. package/dist/components/state-card.d.ts.map +1 -0
  177. package/dist/components/state-card.js +17 -0
  178. package/dist/components/state-card.js.map +1 -0
  179. package/dist/components/switch.d.ts +15 -0
  180. package/dist/components/switch.d.ts.map +1 -0
  181. package/dist/components/switch.js +12 -0
  182. package/dist/components/switch.js.map +1 -0
  183. package/dist/components/tabs.d.ts +8 -0
  184. package/dist/components/tabs.d.ts.map +1 -0
  185. package/dist/components/tabs.js +17 -0
  186. package/dist/components/tabs.js.map +1 -0
  187. package/dist/components/toast.d.ts +17 -0
  188. package/dist/components/toast.d.ts.map +1 -0
  189. package/dist/components/toast.js +30 -0
  190. package/dist/components/toast.js.map +1 -0
  191. package/dist/components/tooltip.d.ts +15 -0
  192. package/dist/components/tooltip.d.ts.map +1 -0
  193. package/dist/components/tooltip.js +13 -0
  194. package/dist/components/tooltip.js.map +1 -0
  195. package/dist/components/tree.d.ts +26 -0
  196. package/dist/components/tree.d.ts.map +1 -0
  197. package/dist/components/tree.js +92 -0
  198. package/dist/components/tree.js.map +1 -0
  199. package/dist/components/trend-badge.d.ts +13 -0
  200. package/dist/components/trend-badge.d.ts.map +1 -0
  201. package/dist/components/trend-badge.js +22 -0
  202. package/dist/components/trend-badge.js.map +1 -0
  203. package/dist/data-table/data-table.d.ts +59 -0
  204. package/dist/data-table/data-table.d.ts.map +1 -0
  205. package/dist/data-table/data-table.js +207 -0
  206. package/dist/data-table/data-table.js.map +1 -0
  207. package/dist/data-table/index.d.ts +2 -0
  208. package/dist/data-table/index.d.ts.map +1 -0
  209. package/dist/data-table/index.js +2 -0
  210. package/dist/data-table/index.js.map +1 -0
  211. package/dist/index.d.ts +57 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +57 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/lib/cn.d.ts +2 -0
  216. package/dist/lib/cn.d.ts.map +1 -0
  217. package/dist/lib/cn.js +2 -0
  218. package/dist/lib/cn.js.map +1 -0
  219. package/dist/lib/motion-preference.d.ts +11 -0
  220. package/dist/lib/motion-preference.d.ts.map +1 -0
  221. package/dist/lib/motion-preference.js +42 -0
  222. package/dist/lib/motion-preference.js.map +1 -0
  223. package/dist/lib/motion-tokens.d.ts +55 -0
  224. package/dist/lib/motion-tokens.d.ts.map +1 -0
  225. package/dist/lib/motion-tokens.js +26 -0
  226. package/dist/lib/motion-tokens.js.map +1 -0
  227. package/dist/lib/motion.d.ts +3 -0
  228. package/dist/lib/motion.d.ts.map +1 -0
  229. package/dist/lib/motion.js +19 -0
  230. package/dist/lib/motion.js.map +1 -0
  231. package/dist/lib/provider.d.ts +160 -0
  232. package/dist/lib/provider.d.ts.map +1 -0
  233. package/dist/lib/provider.js +156 -0
  234. package/dist/lib/provider.js.map +1 -0
  235. package/dist/lib/theme-script.d.ts +15 -0
  236. package/dist/lib/theme-script.d.ts.map +1 -0
  237. package/dist/lib/theme-script.js +15 -0
  238. package/dist/lib/theme-script.js.map +1 -0
  239. package/dist/lib/theme.d.ts +13 -0
  240. package/dist/lib/theme.d.ts.map +1 -0
  241. package/dist/lib/theme.js +78 -0
  242. package/dist/lib/theme.js.map +1 -0
  243. package/dist/lib/use-pending-indicator.d.ts +7 -0
  244. package/dist/lib/use-pending-indicator.d.ts.map +1 -0
  245. package/dist/lib/use-pending-indicator.js +27 -0
  246. package/dist/lib/use-pending-indicator.js.map +1 -0
  247. package/dist/lib/use-reduced-motion.d.ts +7 -0
  248. package/dist/lib/use-reduced-motion.d.ts.map +1 -0
  249. package/dist/lib/use-reduced-motion.js +28 -0
  250. package/dist/lib/use-reduced-motion.js.map +1 -0
  251. package/dist/styles/theme.css +368 -0
  252. package/dist/styles/tokens.css +248 -0
  253. package/package.json +90 -0
@@ -0,0 +1,25 @@
1
+ import type { ReactNode } from 'react';
2
+ export type SelectOption = string | {
3
+ value: string;
4
+ label: ReactNode;
5
+ disabled?: boolean;
6
+ hint?: ReactNode;
7
+ };
8
+ export type SelectProps = {
9
+ value: string | null | undefined;
10
+ onValueChange: (value: string) => void;
11
+ options: readonly SelectOption[];
12
+ placeholder?: ReactNode;
13
+ /** `box` is a form control; `inline` is a compact text trigger inside a sentence or a row. */
14
+ variant?: 'box' | 'inline';
15
+ size?: 'sm' | 'md';
16
+ /** Text colour of the chosen value, such as a status colour. */
17
+ tone?: string;
18
+ renderOption?: (option: SelectOption) => ReactNode;
19
+ disabled?: boolean;
20
+ name?: string;
21
+ className?: string;
22
+ 'aria-label'?: string;
23
+ };
24
+ export declare function Select({ value, onValueChange, options, placeholder, variant, size, tone, renderOption, disabled, name, className, 'aria-label': ariaLabel, }: SelectProps): import("react").JSX.Element;
25
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,MAAM,YAAY,GACtB,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAKrF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,SAAS,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,aAAa,EACb,OAAO,EACP,WAAW,EACX,OAAe,EACf,IAAW,EACX,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,YAAY,EAAE,SAAS,GACxB,EAAE,WAAW,+BAyGb"}
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Select as SelectPrimitive } from '@base-ui/react/select';
4
+ import { Check, ChevronDown } from 'lucide-react';
5
+ import { cn } from '../lib/cn.js';
6
+ import { popupMotionFast } from '../lib/motion.js';
7
+ import { useSkylcn } from '../lib/provider.js';
8
+ const valueOf = (option) => (typeof option === 'string' ? option : option.value);
9
+ const labelOf = (option) => (typeof option === 'string' ? option : option.label);
10
+ export function Select({ value, onValueChange, options, placeholder, variant = 'box', size = 'md', tone, renderOption, disabled, name, className, 'aria-label': ariaLabel, }) {
11
+ const { messages } = useSkylcn();
12
+ const selected = options.find((option) => valueOf(option) === value);
13
+ const inline = variant === 'inline';
14
+ return (_jsxs(SelectPrimitive.Root, { value: value ?? null, onValueChange: (next) => {
15
+ if (typeof next === 'string')
16
+ onValueChange(next);
17
+ }, disabled: disabled, name: name, children: [_jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", "aria-label": ariaLabel, className: cn('group/select font-medium outline-hidden focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-60', 'transition-[color,background-color,border-color] duration-(--motion-duration-fast) ease-enter', inline
18
+ ? 'inline-flex max-w-full items-center gap-0.5 rounded px-1 py-0.5 text-2xs hover:bg-accent data-popup-open:bg-accent'
19
+ : [
20
+ 'flex w-full items-center justify-between border border-input bg-input-background hover:border-border-strong',
21
+ 'data-popup-open:border-skylab-400/50 data-popup-open:ring-1 data-popup-open:ring-skylab-400/20',
22
+ size === 'sm'
23
+ ? 'rounded-md px-2 py-1.5 text-2xs pointer-coarse:min-h-9 pointer-coarse:text-xs'
24
+ : 'rounded-lg px-3 py-2.5 text-xs pointer-coarse:min-h-11 pointer-coarse:text-sm',
25
+ ], selected
26
+ ? (tone ?? (inline ? 'text-foreground' : 'text-secondary-foreground'))
27
+ : 'text-subtle-foreground', className), children: [_jsx(SelectPrimitive.Value, { className: "truncate", children: () => (selected ? labelOf(selected) : (placeholder ?? messages.select)) }), _jsx(SelectPrimitive.Icon, { className: cn('shrink-0 transition-transform duration-(--motion-duration-base) ease-enter group-data-popup-open/select:rotate-180', inline ? 'ml-0.5 text-faint-foreground' : 'ml-2 text-subtle-foreground'), children: _jsx(ChevronDown, { className: inline ? 'size-2.5' : size === 'sm' ? 'size-3' : 'size-3.5' }) })] }), _jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Positioner, { alignItemWithTrigger: false, sideOffset: 4, align: "start", className: "z-50 outline-hidden", children: _jsx(SelectPrimitive.Popup, { "data-slot": "select-content", className: cn('rounded-lg border border-border bg-popover shadow-overlay outline-hidden', popupMotionFast, inline ? 'max-w-72 min-w-44' : 'w-(--anchor-width) min-w-40'), children: _jsx(SelectPrimitive.List, { className: "scrollbar max-h-60 overflow-y-auto p-1", children: options.length === 0 ? (_jsx("div", { className: "px-2 py-3 text-center text-xs text-subtle-foreground", children: messages.noOptions })) : (options.map((option) => {
28
+ const optionValue = valueOf(option);
29
+ const hint = typeof option === 'string' ? null : option.hint;
30
+ return (_jsxs(SelectPrimitive.Item, { value: optionValue, disabled: typeof option !== 'string' && option.disabled, className: cn('group/item flex w-full items-center justify-between gap-2 rounded-md px-2 py-2 text-left text-xs text-secondary-foreground outline-hidden select-none pointer-coarse:py-2.5 pointer-coarse:text-sm', 'transition-colors duration-(--motion-duration-instant)', 'data-highlighted:bg-accent data-highlighted:text-foreground-strong', 'data-selected:bg-skylab-500/20 data-selected:text-skylab-300', 'data-disabled:cursor-not-allowed data-disabled:text-faint-foreground'), children: [_jsx(SelectPrimitive.ItemText, { className: "truncate", children: renderOption ? renderOption(option) : labelOf(option) }), _jsx(SelectPrimitive.ItemIndicator, { className: "shrink-0 text-skylab-400", children: _jsx(Check, { className: "size-3" }) }), hint ? (_jsx("span", { className: "shrink-0 text-3xs text-subtle-foreground group-data-selected/item:hidden", children: hint })) : null] }, optionValue));
31
+ })) }) }) }) })] }));
32
+ }
33
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAK/C,MAAM,OAAO,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/F,MAAM,OAAO,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAmB/F,MAAM,UAAU,MAAM,CAAC,EACrB,KAAK,EACL,aAAa,EACb,OAAO,EACP,WAAW,EACX,OAAO,GAAG,KAAK,EACf,IAAI,GAAG,IAAI,EACX,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,YAAY,EAAE,SAAS,GACX;IACZ,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,OAAO,KAAK,QAAQ,CAAC;IAEpC,OAAO,CACL,MAAC,eAAe,CAAC,IAAI,IACnB,KAAK,EAAE,KAAK,IAAI,IAAI,EACpB,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YACtB,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,EACD,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,IAAI,aAEV,MAAC,eAAe,CAAC,OAAO,iBACZ,gBAAgB,gBACd,SAAS,EACrB,SAAS,EAAE,EAAE,CACX,sIAAsI,EACtI,+FAA+F,EAC/F,MAAM;oBACJ,CAAC,CAAC,oHAAoH;oBACtH,CAAC,CAAC;wBACE,6GAA6G;wBAC7G,gGAAgG;wBAChG,IAAI,KAAK,IAAI;4BACX,CAAC,CAAC,+EAA+E;4BACjF,CAAC,CAAC,+EAA+E;qBACpF,EACL,QAAQ;oBACN,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;oBACtE,CAAC,CAAC,wBAAwB,EAC5B,SAAS,CACV,aAED,KAAC,eAAe,CAAC,KAAK,IAAC,SAAS,EAAC,UAAU,YACxC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,GAClD,EACxB,KAAC,eAAe,CAAC,IAAI,IACnB,SAAS,EAAE,EAAE,CACX,oHAAoH,EACpH,MAAM,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,6BAA6B,CACxE,YAED,KAAC,WAAW,IAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAI,GAClE,IACC,EAC1B,KAAC,eAAe,CAAC,MAAM,cACrB,KAAC,eAAe,CAAC,UAAU,IACzB,oBAAoB,EAAE,KAAK,EAC3B,UAAU,EAAE,CAAC,EACb,KAAK,EAAC,OAAO,EACb,SAAS,EAAC,qBAAqB,YAE/B,KAAC,eAAe,CAAC,KAAK,iBACV,gBAAgB,EAC1B,SAAS,EAAE,EAAE,CACX,0EAA0E,EAC1E,eAAe,EACf,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,6BAA6B,CAC7D,YAED,KAAC,eAAe,CAAC,IAAI,IAAC,SAAS,EAAC,wCAAwC,YACrE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,cAAK,SAAS,EAAC,sDAAsD,YAClE,QAAQ,CAAC,SAAS,GACf,CACP,CAAC,CAAC,CAAC,CACF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gCACrB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gCACpC,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gCAC7D,OAAO,CACL,MAAC,eAAe,CAAC,IAAI,IAEnB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,EACvD,SAAS,EAAE,EAAE,CACX,oMAAoM,EACpM,wDAAwD,EACxD,oEAAoE,EACpE,8DAA8D,EAC9D,sEAAsE,CACvE,aAED,KAAC,eAAe,CAAC,QAAQ,IAAC,SAAS,EAAC,UAAU,YAC3C,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAC7B,EAC3B,KAAC,eAAe,CAAC,aAAa,IAAC,SAAS,EAAC,0BAA0B,YACjE,KAAC,KAAK,IAAC,SAAS,EAAC,QAAQ,GAAG,GACE,EAC/B,IAAI,CAAC,CAAC,CAAC,CACN,eAAM,SAAS,EAAC,0EAA0E,YACvF,IAAI,GACA,CACR,CAAC,CAAC,CAAC,IAAI,KArBH,WAAW,CAsBK,CACxB,CAAC;4BACJ,CAAC,CAAC,CACH,GACoB,GACD,GACG,GACN,IACJ,CACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from 'react';
2
+ export type SideNavItem = {
3
+ href: string;
4
+ label: string;
5
+ badge?: ReactNode;
6
+ };
7
+ export type SideNavSection = {
8
+ label?: string;
9
+ items: readonly SideNavItem[];
10
+ };
11
+ export type SideNavProps = {
12
+ /** Names the navigation, such as "Bileşenler" or "Ayarlar". */
13
+ 'aria-label': string;
14
+ sections: readonly SideNavSection[];
15
+ activeHref?: string;
16
+ /** Adds a box that narrows the list by name, for long lists. */
17
+ searchable?: boolean;
18
+ /** A glimpse of each item shown beside it on hover or focus, on wide screens only. */
19
+ preview?: (item: SideNavItem) => ReactNode;
20
+ className?: string;
21
+ };
22
+ /**
23
+ * A page's own navigation beside its content: the component list of a docs
24
+ * page, the folders of a mailbox, the sections of settings. A sticky column
25
+ * from the lg breakpoint; below it, a button that opens the list in a panel.
26
+ */
27
+ export declare function SideNav({ 'aria-label': label, sections, activeHref, searchable, preview, className, }: SideNavProps): import("react").JSX.Element;
28
+ /** Lays a SideNav beside the page content from the lg breakpoint, above it on smaller screens. */
29
+ export declare function SideNavLayout({ nav, children }: {
30
+ nav: ReactNode;
31
+ children: ReactNode;
32
+ }): import("react").JSX.Element;
33
+ //# sourceMappingURL=side-nav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-nav.d.ts","sourceRoot":"","sources":["../../src/components/side-nav.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASxD,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,YAAY,GAAG;IACzB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sFAAsF;IACtF,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,SAAS,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAsFF;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,YAAY,EAAE,KAAK,EACnB,QAAQ,EACR,UAAU,EACV,UAAkB,EAClB,OAAO,EACP,SAAS,GACV,EAAE,YAAY,+BAmEd;AAED,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;IAAE,GAAG,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAOvF"}
@@ -0,0 +1,52 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { ChevronsUpDown } from 'lucide-react';
4
+ import { LayoutGroup, m } from 'motion/react';
5
+ import { useId, useState } from 'react';
6
+ import { cn } from '../lib/cn.js';
7
+ import { transitions } from '../lib/motion-tokens.js';
8
+ import { useSkylcn } from '../lib/provider.js';
9
+ import { Button } from './button.js';
10
+ import { Drawer, DrawerBody, DrawerContent, DrawerHeader, DrawerTitle } from './drawer.js';
11
+ import { PreviewCard, PreviewCardContent, PreviewCardTrigger } from './preview-card.js';
12
+ import { SearchInput } from './page-header.js';
13
+ function List({ sections, activeHref, query, onNavigate, preview, }) {
14
+ const { Link, messages } = useSkylcn();
15
+ const group = useId();
16
+ const q = query.trim().toLocaleLowerCase('tr-TR');
17
+ const shown = sections
18
+ .map((section) => ({
19
+ ...section,
20
+ items: section.items.filter((item) => !q || item.label.toLocaleLowerCase('tr-TR').includes(q)),
21
+ }))
22
+ .filter((section) => section.items.length > 0);
23
+ if (shown.length === 0) {
24
+ return _jsx("p", { className: "px-2 py-3 text-xs text-muted-foreground", children: messages.noResults });
25
+ }
26
+ return (_jsx(LayoutGroup, { id: group, children: _jsx("div", { className: "flex flex-col gap-4", children: shown.map((section, i) => (_jsxs("div", { className: "flex flex-col gap-0.5", children: [section.label ? (_jsx("p", { className: "px-2 pb-1 text-3xs font-medium tracking-label text-subtle-foreground uppercase", children: section.label })) : null, _jsx("ul", { className: "flex flex-col gap-0.5", children: section.items.map((item) => {
27
+ const active = item.href === activeHref;
28
+ const link = (_jsxs(Link, { href: item.href, "aria-current": active ? 'page' : undefined, onClick: onNavigate, className: cn('relative isolate flex items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-hidden pointer-coarse:py-2.5', 'transition-colors duration-(--motion-duration-fast) focus-visible:ring-2 focus-visible:ring-ring', active
29
+ ? 'text-foreground-strong'
30
+ : 'text-muted-foreground hover:bg-accent hover:text-foreground'), children: [active ? (_jsx(m.span, { layoutId: "side-nav-active", "aria-hidden": true, className: "absolute inset-0 -z-10 rounded-md bg-accent-strong", transition: transitions.layout })) : null, _jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }), item.badge ? _jsx("span", { className: "shrink-0", children: item.badge }) : null] }));
31
+ return (_jsx("li", { children: preview ? (_jsxs(PreviewCard, { children: [_jsx(PreviewCardTrigger, { render: link }), _jsx(PreviewCardContent, { children: preview(item) })] })) : (link) }, item.href));
32
+ }) })] }, section.label ?? i))) }) }));
33
+ }
34
+ /**
35
+ * A page's own navigation beside its content: the component list of a docs
36
+ * page, the folders of a mailbox, the sections of settings. A sticky column
37
+ * from the lg breakpoint; below it, a button that opens the list in a panel.
38
+ */
39
+ export function SideNav({ 'aria-label': label, sections, activeHref, searchable = false, preview, className, }) {
40
+ const { messages } = useSkylcn();
41
+ const [query, setQuery] = useState('');
42
+ const [open, setOpen] = useState(false);
43
+ const current = sections
44
+ .flatMap((section) => section.items)
45
+ .find((item) => item.href === activeHref);
46
+ return (_jsxs(_Fragment, { children: [_jsxs("nav", { "aria-label": label, "data-slot": "side-nav", className: cn('sticky top-6 scrollbar-hidden hidden max-h-[calc(100dvh-7rem)] flex-col gap-3 overflow-y-auto lg:flex', className), children: [searchable ? (_jsx(SearchInput, { value: query, onValueChange: setQuery, placeholder: messages.filterItems, className: "max-w-none min-w-0 flex-none" })) : null, _jsx(List, { sections: sections, activeHref: activeHref, query: query, preview: preview })] }), _jsxs("div", { className: "lg:hidden", children: [_jsxs(Button, { className: "w-full justify-between", onClick: () => setOpen(true), "aria-haspopup": "dialog", children: [_jsxs("span", { className: "truncate", children: [_jsx("span", { className: "text-subtle-foreground", children: label }), current ? _jsxs("span", { className: "text-foreground", children: [" \u00B7 ", current.label] }) : null] }), _jsx(ChevronsUpDown, { className: "text-subtle-foreground" })] }), _jsx(Drawer, { open: open, onOpenChange: setOpen, side: "bottom", children: _jsxs(DrawerContent, { children: [_jsx(DrawerHeader, { children: _jsx(DrawerTitle, { children: label }) }), _jsxs(DrawerBody, { className: "flex flex-col gap-3", children: [searchable ? (_jsx(SearchInput, { value: query, onValueChange: setQuery, placeholder: messages.filterItems, className: "max-w-none" })) : null, _jsx(List, { sections: sections, activeHref: activeHref, query: query, onNavigate: () => setOpen(false) })] })] }) })] })] }));
47
+ }
48
+ /** Lays a SideNav beside the page content from the lg breakpoint, above it on smaller screens. */
49
+ export function SideNavLayout({ nav, children }) {
50
+ return (_jsxs("div", { className: "flex flex-col gap-6 lg:grid lg:grid-cols-[13rem_minmax(0,1fr)] lg:items-start lg:gap-10", children: [nav, _jsx("div", { className: "min-w-0", children: children })] }));
51
+ }
52
+ //# sourceMappingURL=side-nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"side-nav.js","sourceRoot":"","sources":["../../src/components/side-nav.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ComponentProps } from 'react';
2
+ /** A shimmering placeholder in the shape of the content that is loading. */
3
+ export declare function Skeleton({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
4
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,+BAStE"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/cn.js';
3
+ /** A shimmering placeholder in the shape of the content that is loading. */
4
+ export function Skeleton({ className, ...props }) {
5
+ return (_jsx("div", { "data-slot": "skeleton", "aria-hidden": true, className: cn('shimmer-block rounded-md', className), ...props }));
6
+ }
7
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAyB;IACrE,OAAO,CACL,2BACY,UAAU,uBAEpB,SAAS,EAAE,EAAE,CAAC,0BAA0B,EAAE,SAAS,CAAC,KAChD,KAAK,GACT,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type SkylabLoaderProps = {
2
+ /** Box size in CSS pixels. 16 to 24 inside buttons, 64 to 80 for page states. */
3
+ size?: number;
4
+ /** `done` holds the mark still, for the moment the wait ends. */
5
+ state?: 'loading' | 'done';
6
+ className?: string;
7
+ };
8
+ /** The SKY LAB mark lighting up from its centre; the one loading indicator of every product. */
9
+ export declare function SkylabLoader({ size, state, className }: SkylabLoaderProps): import("react").JSX.Element;
10
+ //# sourceMappingURL=skylab-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skylab-loader.d.ts","sourceRoot":"","sources":["../../src/components/skylab-loader.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,EAAE,IAAS,EAAE,KAAiB,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BA+B1F"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { SKYLAB_MARK_PATHS, SKYLAB_MARK_RADII, SKYLAB_MARK_VIEWBOX, } from '../assets/skylab-mark.js';
3
+ import { cn } from '../lib/cn.js';
4
+ const RADIATE_SPREAD_MS = 700;
5
+ /** The SKY LAB mark lighting up from its centre; the one loading indicator of every product. */
6
+ export function SkylabLoader({ size = 80, state = 'loading', className }) {
7
+ const animate = state === 'loading';
8
+ return (_jsx("svg", { "data-slot": "skylab-loader", viewBox: SKYLAB_MARK_VIEWBOX, width: size, height: size, fill: "currentColor", "aria-hidden": true, className: cn('shrink-0 text-secondary-foreground', animate && 'skylcn-mark-radiate', className), children: _jsx("g", { fillRule: "evenodd", children: SKYLAB_MARK_PATHS.map((d, i) => (_jsx("path", { d: d, style: animate
9
+ ? { animationDelay: `${Math.round(SKYLAB_MARK_RADII[i] * RADIATE_SPREAD_MS)}ms` }
10
+ : undefined }, i))) }) }));
11
+ }
12
+ //# sourceMappingURL=skylab-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skylab-loader.js","sourceRoot":"","sources":["../../src/components/skylab-loader.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAU9B,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,SAAS,EAAE,SAAS,EAAqB;IACzF,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC;IACpC,OAAO,CACL,2BACY,eAAe,EACzB,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,IAAI,EAAC,cAAc,uBAEnB,SAAS,EAAE,EAAE,CACX,oCAAoC,EACpC,OAAO,IAAI,qBAAqB,EAChC,SAAS,CACV,YAED,YAAG,QAAQ,EAAC,SAAS,YAClB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,eAEE,CAAC,EAAE,CAAC,EACJ,KAAK,EACH,OAAO;oBACL,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAE,GAAG,iBAAiB,CAAC,IAAI,EAAE;oBAClF,CAAC,CAAC,SAAS,IALV,CAAC,CAON,CACH,CAAC,GACA,GACA,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type SparklineProps = {
2
+ /** The figures in time order; the last one is the current period. */
3
+ values: readonly number[];
4
+ className?: string;
5
+ };
6
+ /**
7
+ * A small trend line without axes, for stat cards: the history in a quiet
8
+ * grey and the current period marked in the brand colour. Decorative, so the
9
+ * figure it sits beside must say the value.
10
+ */
11
+ export declare function Sparkline({ values, className }: SparklineProps): import("react").JSX.Element | null;
12
+ //# sourceMappingURL=sparkline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkline.d.ts","sourceRoot":"","sources":["../../src/components/sparkline.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG;IAC3B,qEAAqE;IACrE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,cAAc,sCAqC9D"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from '../lib/cn.js';
3
+ const WIDTH = 100;
4
+ const HEIGHT = 32;
5
+ const PAD = 3;
6
+ /**
7
+ * A small trend line without axes, for stat cards: the history in a quiet
8
+ * grey and the current period marked in the brand colour. Decorative, so the
9
+ * figure it sits beside must say the value.
10
+ */
11
+ export function Sparkline({ values, className }) {
12
+ if (values.length < 2)
13
+ return null;
14
+ const min = Math.min(...values);
15
+ const span = Math.max(...values) - min || 1;
16
+ const points = values.map((value, i) => [
17
+ PAD + (i / (values.length - 1)) * (WIDTH - PAD * 2),
18
+ PAD + (1 - (value - min) / span) * (HEIGHT - PAD * 2),
19
+ ]);
20
+ const path = points
21
+ .map(([x, y], i) => `${i ? 'L' : 'M'}${x.toFixed(2)} ${y.toFixed(2)}`)
22
+ .join(' ');
23
+ const [lastX, lastY] = points.at(-1);
24
+ return (_jsxs("div", { "data-slot": "sparkline", "aria-hidden": true, className: cn('relative h-8 w-full', className), children: [_jsx("svg", { viewBox: `0 0 ${WIDTH} ${HEIGHT}`, preserveAspectRatio: "none", className: "absolute inset-0 size-full overflow-visible", children: _jsx("path", { d: path, fill: "none", stroke: "var(--subtle-foreground)", strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round", vectorEffect: "non-scaling-stroke" }) }), _jsx("span", { className: "absolute size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-chart-1 ring-2 ring-background", style: { left: `${(lastX / WIDTH) * 100}%`, top: `${(lastY / HEIGHT) * 100}%` } })] }));
25
+ }
26
+ //# sourceMappingURL=sparkline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkline.js","sourceRoot":"","sources":["../../src/components/sparkline.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,GAAG,GAAG,CAAC,CAAC;AAQd;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAkB;IAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;QACnD,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;KACtD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM;SAChB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IAEtC,OAAO,CACL,4BAAe,WAAW,uBAAa,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,aACpF,cACE,OAAO,EAAE,OAAO,KAAK,IAAI,MAAM,EAAE,EACjC,mBAAmB,EAAC,MAAM,EAC1B,SAAS,EAAC,6CAA6C,YAEvD,eACE,CAAC,EAAE,IAAI,EACP,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,0BAA0B,EACjC,WAAW,EAAE,GAAG,EAChB,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,YAAY,EAAC,oBAAoB,GACjC,GACE,EAEN,eACE,SAAS,EAAC,kGAAkG,EAC5G,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAM,GAAG,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,KAAM,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GACjF,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { LucideIcon } from 'lucide-react';
2
+ import type { ReactNode } from 'react';
3
+ declare const TONE_ICON: {
4
+ readonly neutral: "text-secondary-foreground";
5
+ readonly danger: "text-destructive";
6
+ readonly warning: "text-warning";
7
+ readonly brand: "text-skylab-300";
8
+ };
9
+ export type StateCardProps = {
10
+ /** Defaults to the "loading" label while `loading` is set. */
11
+ title?: ReactNode;
12
+ description?: ReactNode;
13
+ icon?: LucideIcon;
14
+ loading?: boolean;
15
+ tone?: keyof typeof TONE_ICON;
16
+ /** A line under the text, such as a status badge. */
17
+ meta?: ReactNode;
18
+ /** Content above the icon, such as an illustration. */
19
+ top?: ReactNode;
20
+ className?: string;
21
+ /** Actions under the text. */
22
+ children?: ReactNode;
23
+ };
24
+ /** A centred loading, empty, error or permission state for a page or a panel. */
25
+ export declare function StateCard({ title, description, icon: Icon, loading, tone, meta, top, className, children, }: StateCardProps): import("react").JSX.Element;
26
+ export {};
27
+ //# sourceMappingURL=state-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-card.d.ts","sourceRoot":"","sources":["../../src/components/state-card.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,QAAA,MAAM,SAAS;;;;;CAKL,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG;IAC3B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,OAAO,SAAS,CAAC;IAC9B,qDAAqD;IACrD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,uDAAuD;IACvD,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,WAAW,EACX,IAAI,EAAE,IAAI,EACV,OAAe,EACf,IAAgB,EAChB,IAAI,EACJ,GAAG,EACH,SAAS,EACT,QAAQ,GACT,EAAE,cAAc,+BAqChB"}
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from '../lib/cn.js';
4
+ import { useSkylcn } from '../lib/provider.js';
5
+ import { SkylabLoader } from './skylab-loader.js';
6
+ const TONE_ICON = {
7
+ neutral: 'text-secondary-foreground',
8
+ danger: 'text-destructive',
9
+ warning: 'text-warning',
10
+ brand: 'text-skylab-300',
11
+ };
12
+ /** A centred loading, empty, error or permission state for a page or a panel. */
13
+ export function StateCard({ title, description, icon: Icon, loading = false, tone = 'neutral', meta, top, className, children, }) {
14
+ const { messages } = useSkylcn();
15
+ return (_jsx("div", { "data-slot": "state-card", role: loading ? 'status' : undefined, "aria-live": loading ? 'polite' : undefined, className: cn('flex w-full flex-1 items-center justify-center px-6 py-10', className), children: _jsxs("div", { className: "mx-auto flex w-full max-w-md enter-rise-lg flex-col items-center text-center", children: [top ? _jsx("div", { className: "mb-8 w-full max-w-85", children: top }) : null, loading ? (_jsx(SkylabLoader, { size: 72 })) : Icon ? (_jsx(Icon, { className: cn('size-9 drop-shadow-[0_6px_18px_rgb(0_0_0/0.35)]', TONE_ICON[tone]), strokeWidth: 1.75 })) : null, _jsxs("div", { className: cn('flex flex-col gap-2 text-balance', loading ? 'mt-5' : 'mt-4'), children: [_jsx("p", { className: cn('text-sm font-semibold', loading ? 'shimmer-text text-muted-foreground' : 'text-foreground'), children: title ?? (loading ? messages.loading : null) }), description ? (_jsx("p", { className: "text-xs leading-relaxed text-muted-foreground", children: description })) : null] }), meta ? _jsx("div", { className: "mt-4", children: meta }) : null, children ? _jsx("div", { className: "mt-5 w-full", children: children }) : null] }) }));
16
+ }
17
+ //# sourceMappingURL=state-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-card.js","sourceRoot":"","sources":["../../src/components/state-card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAIb,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,SAAS,GAAG;IAChB,OAAO,EAAE,2BAA2B;IACpC,MAAM,EAAE,kBAAkB;IAC1B,OAAO,EAAE,cAAc;IACvB,KAAK,EAAE,iBAAiB;CAChB,CAAC;AAkBX,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,WAAW,EACX,IAAI,EAAE,IAAI,EACV,OAAO,GAAG,KAAK,EACf,IAAI,GAAG,SAAS,EAChB,IAAI,EACJ,GAAG,EACH,SAAS,EACT,QAAQ,GACO;IACf,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IACjC,OAAO,CACL,2BACY,YAAY,EACtB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,eACzB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACzC,SAAS,EAAE,EAAE,CAAC,2DAA2D,EAAE,SAAS,CAAC,YAErF,eAAK,SAAS,EAAC,8EAA8E,aAC1F,GAAG,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,sBAAsB,YAAE,GAAG,GAAO,CAAC,CAAC,CAAC,IAAI,EAC9D,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,GAAI,CAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACT,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CAAC,iDAAiD,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EACjF,WAAW,EAAE,IAAI,GACjB,CACH,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAE,EAAE,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAC/E,YACE,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,iBAAiB,CACnE,YAEA,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAC3C,EACH,WAAW,CAAC,CAAC,CAAC,CACb,YAAG,SAAS,EAAC,+CAA+C,YAAE,WAAW,GAAK,CAC/E,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,IAAI,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,MAAM,YAAE,IAAI,GAAO,CAAC,CAAC,CAAC,IAAI,EAChD,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,aAAa,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,IAC5D,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Switch as SwitchPrimitive } from '@base-ui/react/switch';
2
+ import type { ReactNode } from 'react';
3
+ export type SwitchProps = SwitchPrimitive.Root.Props;
4
+ export declare function Switch({ className, ...props }: SwitchProps): import("react").JSX.Element;
5
+ export type ToggleRowProps = Omit<SwitchProps, 'children'> & {
6
+ title: ReactNode;
7
+ description?: ReactNode;
8
+ /** Fades the row to show it has no effect right now. */
9
+ dimmed?: boolean;
10
+ /** Content between the text and the switch, such as a badge. */
11
+ adornment?: ReactNode;
12
+ };
13
+ /** A bordered row with a title, a hint and a switch; the settings panels' toggle. */
14
+ export declare function ToggleRow({ title, description, dimmed, adornment, className, ...props }: ToggleRowProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../src/components/switch.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAErD,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,+BAsB1D;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;IAC3D,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,WAAW,EACX,MAAc,EACd,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,+BAsBhB"}
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Switch as SwitchPrimitive } from '@base-ui/react/switch';
4
+ import { cn } from '../lib/cn.js';
5
+ export function Switch({ className, ...props }) {
6
+ return (_jsx(SwitchPrimitive.Root, { "data-slot": "switch", className: cn('relative inline-flex h-6 w-10 shrink-0 cursor-pointer items-center rounded-full border border-border bg-muted px-0.5 outline-hidden after:absolute after:-inset-2', 'transition-[background-color,border-color] duration-(--motion-duration-base) ease-enter', 'focus-visible:ring-2 focus-visible:ring-ring', 'data-checked:border-skylab-400/50 data-checked:bg-skylab-400/20', 'data-disabled:cursor-not-allowed data-disabled:opacity-50', className), ...props, children: _jsx(SwitchPrimitive.Thumb, { className: cn('size-4.5 rounded-full bg-white shadow-sm shadow-black/30', 'transition-transform duration-(--motion-duration-base) ease-enter data-checked:translate-x-4') }) }));
7
+ }
8
+ /** A bordered row with a title, a hint and a switch; the settings panels' toggle. */
9
+ export function ToggleRow({ title, description, dimmed = false, adornment, className, ...props }) {
10
+ return (_jsxs("label", { "data-slot": "toggle-row", className: cn('flex cursor-pointer items-center justify-between gap-3 rounded-lg border border-border px-3 py-2.5 transition-opacity duration-(--motion-duration-slow)', dimmed && 'opacity-40', className), children: [_jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "block text-sm font-semibold text-foreground", children: title }), description ? (_jsx("span", { className: "block text-2xs text-subtle-foreground", children: description })) : null] }), _jsxs("span", { className: "flex shrink-0 items-center gap-3", children: [adornment, _jsx(Switch, { ...props })] })] }));
11
+ }
12
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../src/components/switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAIlC,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAe;IACzD,OAAO,CACL,KAAC,eAAe,CAAC,IAAI,iBACT,QAAQ,EAClB,SAAS,EAAE,EAAE,CACX,mKAAmK,EACnK,yFAAyF,EACzF,8CAA8C,EAC9C,iEAAiE,EACjE,2DAA2D,EAC3D,SAAS,CACV,KACG,KAAK,YAET,KAAC,eAAe,CAAC,KAAK,IACpB,SAAS,EAAE,EAAE,CACX,0DAA0D,EAC1D,8FAA8F,CAC/F,GACD,GACmB,CACxB,CAAC;AACJ,CAAC;AAWD,qFAAqF;AACrF,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,WAAW,EACX,MAAM,GAAG,KAAK,EACd,SAAS,EACT,SAAS,EACT,GAAG,KAAK,EACO;IACf,OAAO,CACL,8BACY,YAAY,EACtB,SAAS,EAAE,EAAE,CACX,yJAAyJ,EACzJ,MAAM,IAAI,YAAY,EACtB,SAAS,CACV,aAED,gBAAM,SAAS,EAAC,SAAS,aACvB,eAAM,SAAS,EAAC,6CAA6C,YAAE,KAAK,GAAQ,EAC3E,WAAW,CAAC,CAAC,CAAC,CACb,eAAM,SAAS,EAAC,uCAAuC,YAAE,WAAW,GAAQ,CAC7E,CAAC,CAAC,CAAC,IAAI,IACH,EACP,gBAAM,SAAS,EAAC,kCAAkC,aAC/C,SAAS,EACV,KAAC,MAAM,OAAK,KAAK,GAAI,IAChB,IACD,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Tabs as TabsPrimitive } from '@base-ui/react/tabs';
2
+ export declare const Tabs: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").TabsRootProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
3
+ /** The row of tabs; an underline slides to the chosen one. Scrolls sideways when it does not fit. */
4
+ export declare function TabsList({ className, children, ...props }: TabsPrimitive.List.Props): import("react").JSX.Element;
5
+ export declare function Tab({ className, ...props }: TabsPrimitive.Tab.Props): import("react").JSX.Element;
6
+ /** A tab's content; it fades in when chosen. */
7
+ export declare function TabsPanel({ className, ...props }: TabsPrimitive.Panel.Props): import("react").JSX.Element;
8
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAG5D,eAAO,MAAM,IAAI,gJAAqB,CAAC;AAEvC,qGAAqG;AACrG,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,+BAcnF;AAED,wBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,+BAanE;AAED,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,+BAQ3E"}
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Tabs as TabsPrimitive } from '@base-ui/react/tabs';
4
+ import { cn } from '../lib/cn.js';
5
+ export const Tabs = TabsPrimitive.Root;
6
+ /** The row of tabs; an underline slides to the chosen one. Scrolls sideways when it does not fit. */
7
+ export function TabsList({ className, children, ...props }) {
8
+ return (_jsxs(TabsPrimitive.List, { "data-slot": "tabs-list", className: cn('relative scrollbar-hidden flex items-center gap-1 overflow-x-auto border-b border-border', className), ...props, children: [children, _jsx(TabsPrimitive.Indicator, { className: "absolute bottom-0 left-0 h-0.5 w-(--active-tab-width) translate-x-(--active-tab-left) rounded-full bg-skylab-400 transition-[translate,width] duration-(--motion-duration-base) ease-enter" })] }));
9
+ }
10
+ export function Tab({ className, ...props }) {
11
+ return (_jsx(TabsPrimitive.Tab, { "data-slot": "tab", className: cn('relative flex h-9 shrink-0 items-center gap-2 rounded-t-md px-3 text-sm whitespace-nowrap text-muted-foreground outline-hidden pointer-coarse:h-11', 'transition-colors duration-(--motion-duration-fast) hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset', 'data-selected:text-foreground data-disabled:text-faint-foreground [&_svg]:size-4', className), ...props }));
12
+ }
13
+ /** A tab's content; it fades in when chosen. */
14
+ export function TabsPanel({ className, ...props }) {
15
+ return (_jsx(TabsPrimitive.Panel, { "data-slot": "tabs-panel", className: cn('enter-fade pt-4 outline-hidden', className), ...props }));
16
+ }
17
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;AAEvC,qGAAqG;AACrG,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA4B;IAClF,OAAO,CACL,MAAC,aAAa,CAAC,IAAI,iBACP,WAAW,EACrB,SAAS,EAAE,EAAE,CACX,0FAA0F,EAC1F,SAAS,CACV,KACG,KAAK,aAER,QAAQ,EACT,KAAC,aAAa,CAAC,SAAS,IAAC,SAAS,EAAC,4LAA4L,GAAG,IAC/M,CACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA2B;IAClE,OAAO,CACL,KAAC,aAAa,CAAC,GAAG,iBACN,KAAK,EACf,SAAS,EAAE,EAAE,CACX,oJAAoJ,EACpJ,iJAAiJ,EACjJ,kFAAkF,EAClF,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA6B;IAC1E,OAAO,CACL,KAAC,aAAa,CAAC,KAAK,iBACR,YAAY,EACtB,SAAS,EAAE,EAAE,CAAC,gCAAgC,EAAE,SAAS,CAAC,KACtD,KAAK,GACT,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Toast as ToastPrimitive } from '@base-ui/react/toast';
2
+ import type { ReactNode } from 'react';
3
+ /**
4
+ * Adds a toast from anywhere under ToastProvider:
5
+ * `toast.add({ title, description, type: 'success' })`. Errors and toasts
6
+ * with an action stay until closed; pass `actionProps` for an undo.
7
+ */
8
+ export declare const useToast: typeof ToastPrimitive.useToastManager;
9
+ /**
10
+ * Hosts the toasts of an app, stacked at the bottom right (full width on
11
+ * phones). Plain toasts leave after five seconds, paused while hovered or focused.
12
+ */
13
+ export declare function ToastProvider({ children, timeout, }: {
14
+ children: ReactNode;
15
+ timeout?: number;
16
+ }): import("react").JSX.Element;
17
+ //# sourceMappingURL=toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/components/toast.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAYvC;;;;GAIG;AACH,eAAO,MAAM,QAAQ,uCAAiC,CAAC;AA2CvD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAc,GACf,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,+BAWA"}
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Toast as ToastPrimitive } from '@base-ui/react/toast';
4
+ import { CircleAlert, CircleCheck, Info, X } from 'lucide-react';
5
+ import { cn } from '../lib/cn.js';
6
+ import { useSkylcn } from '../lib/provider.js';
7
+ const ICON = {
8
+ success: _jsx(CircleCheck, { className: "size-4 text-success", "aria-hidden": true }),
9
+ error: _jsx(CircleAlert, { className: "size-4 text-destructive", "aria-hidden": true }),
10
+ info: _jsx(Info, { className: "size-4 text-info", "aria-hidden": true }),
11
+ };
12
+ /**
13
+ * Adds a toast from anywhere under ToastProvider:
14
+ * `toast.add({ title, description, type: 'success' })`. Errors and toasts
15
+ * with an action stay until closed; pass `actionProps` for an undo.
16
+ */
17
+ export const useToast = ToastPrimitive.useToastManager;
18
+ function Toasts() {
19
+ const { toasts } = ToastPrimitive.useToastManager();
20
+ const { messages } = useSkylcn();
21
+ return toasts.map((toast) => (_jsx(ToastPrimitive.Root, { toast: toast, swipeDirection: ['right', 'down'], className: cn('[--gap:0.625rem] [--offset-y:calc(var(--toast-offset-y)*-1+var(--toast-index)*var(--gap)*-1+var(--toast-swipe-movement-y))] [--peek:0.5rem] [--scale:calc(max(0,1-(var(--toast-index)*0.06)))]', 'absolute right-0 bottom-0 z-[calc(100-var(--toast-index))] w-full origin-bottom rounded-xl border border-border bg-popover p-3 pr-10 text-foreground shadow-overlay select-none', '[transform:translateX(var(--toast-swipe-movement-x))_translateY(calc(var(--toast-swipe-movement-y)-var(--toast-index)*var(--peek)))_scale(var(--scale))]', 'data-expanded:[transform:translateX(var(--toast-swipe-movement-x))_translateY(var(--offset-y))]', 'transition-[transform,opacity] duration-(--motion-duration-slow) ease-enter', 'data-ending-style:opacity-0 data-limited:opacity-0 data-starting-style:[transform:translateY(120%)]', 'data-[swipe-direction=right]:data-ending-style:[transform:translateX(calc(var(--toast-swipe-movement-x)+120%))_translateY(var(--offset-y))] [&[data-ending-style]:not([data-swipe-direction])]:[transform:translateY(120%)]', "after:absolute after:top-full after:left-0 after:h-[calc(var(--gap)+1px)] after:w-full after:content-['']"), children: _jsxs(ToastPrimitive.Content, { className: "flex gap-2.5", children: [toast.type && toast.type in ICON ? (_jsx("span", { className: "mt-0.5", children: ICON[toast.type] })) : null, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(ToastPrimitive.Title, { className: "text-sm font-medium text-foreground" }), _jsx(ToastPrimitive.Description, { className: "mt-0.5 text-xs leading-relaxed text-muted-foreground" }), toast.actionProps ? (_jsx(ToastPrimitive.Action, { className: "mt-2 rounded-md border border-border px-2.5 py-1 text-xs font-medium text-secondary-foreground outline-hidden transition-colors hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring" })) : null] }), _jsx(ToastPrimitive.Close, { "aria-label": messages.close, className: "absolute top-2.5 right-2.5 grid size-6 place-items-center rounded-md text-subtle-foreground outline-hidden hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(X, { className: "size-3.5" }) })] }) }, toast.id)));
22
+ }
23
+ /**
24
+ * Hosts the toasts of an app, stacked at the bottom right (full width on
25
+ * phones). Plain toasts leave after five seconds, paused while hovered or focused.
26
+ */
27
+ export function ToastProvider({ children, timeout = 5000, }) {
28
+ return (_jsxs(ToastPrimitive.Provider, { timeout: timeout, children: [children, _jsx(ToastPrimitive.Portal, { children: _jsx(ToastPrimitive.Viewport, { className: "fixed right-4 bottom-4 z-[60] mx-auto w-[calc(100vw-2rem)] sm:right-6 sm:bottom-6 sm:w-90", children: _jsx(Toasts, {}) }) })] }));
29
+ }
30
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","sourceRoot":"","sources":["../../src/components/toast.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,MAAM,IAAI,GAAG;IACX,OAAO,EAAE,KAAC,WAAW,IAAC,SAAS,EAAC,qBAAqB,wBAAe;IACpE,KAAK,EAAE,KAAC,WAAW,IAAC,SAAS,EAAC,yBAAyB,wBAAe;IACtE,IAAI,EAAE,KAAC,IAAI,IAAC,SAAS,EAAC,kBAAkB,wBAAe;CAC/C,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC;AAEvD,SAAS,MAAM;IACb,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;IACjC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B,KAAC,cAAc,CAAC,IAAI,IAElB,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EACjC,SAAS,EAAE,EAAE,CACX,gMAAgM,EAChM,iLAAiL,EACjL,0JAA0J,EAC1J,iGAAiG,EACjG,6EAA6E,EAC7E,qGAAqG,EACrG,6NAA6N,EAC7N,2GAA2G,CAC5G,YAED,MAAC,cAAc,CAAC,OAAO,IAAC,SAAS,EAAC,cAAc,aAC7C,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAClC,eAAM,SAAS,EAAC,QAAQ,YAAE,IAAI,CAAC,KAAK,CAAC,IAAiB,CAAC,GAAQ,CAChE,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,gBAAgB,aAC7B,KAAC,cAAc,CAAC,KAAK,IAAC,SAAS,EAAC,qCAAqC,GAAG,EACxE,KAAC,cAAc,CAAC,WAAW,IAAC,SAAS,EAAC,sDAAsD,GAAG,EAC9F,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CACnB,KAAC,cAAc,CAAC,MAAM,IAAC,SAAS,EAAC,8LAA8L,GAAG,CACnO,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,KAAC,cAAc,CAAC,KAAK,kBACP,QAAQ,CAAC,KAAK,EAC1B,SAAS,EAAC,+LAA+L,YAEzM,KAAC,CAAC,IAAC,SAAS,EAAC,UAAU,GAAG,GACL,IACA,IA/BpB,KAAK,CAAC,EAAE,CAgCO,CACvB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAO,GAAG,IAAI,GAIf;IACC,OAAO,CACL,MAAC,cAAc,CAAC,QAAQ,IAAC,OAAO,EAAE,OAAO,aACtC,QAAQ,EACT,KAAC,cAAc,CAAC,MAAM,cACpB,KAAC,cAAc,CAAC,QAAQ,IAAC,SAAS,EAAC,2FAA2F,YAC5H,KAAC,MAAM,KAAG,GACc,GACJ,IACA,CAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ReactElement, ReactNode } from 'react';
2
+ /** Shares one open delay across tooltips, so moving between them feels instant. */
3
+ export declare function TooltipProvider({ delay, children, }: {
4
+ delay?: number;
5
+ children: ReactNode;
6
+ }): import("react").JSX.Element;
7
+ export type TooltipProps = {
8
+ label: ReactNode;
9
+ /** The element the tooltip describes; it must accept a ref. */
10
+ children: ReactElement;
11
+ side?: 'top' | 'bottom' | 'left' | 'right';
12
+ className?: string;
13
+ };
14
+ export declare function Tooltip({ label, children, side, className }: TooltipProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../src/components/tooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,EAC9B,KAAW,EACX,QAAQ,GACT,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB,+BAEA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,+DAA+D;IAC/D,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAe,EAAE,SAAS,EAAE,EAAE,YAAY,+BAoBpF"}
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';
4
+ import { cn } from '../lib/cn.js';
5
+ import { popupMotionFast } from '../lib/motion.js';
6
+ /** Shares one open delay across tooltips, so moving between them feels instant. */
7
+ export function TooltipProvider({ delay = 400, children, }) {
8
+ return _jsx(TooltipPrimitive.Provider, { delay: delay, children: children });
9
+ }
10
+ export function Tooltip({ label, children, side = 'bottom', className }) {
11
+ return (_jsxs(TooltipPrimitive.Root, { children: [_jsx(TooltipPrimitive.Trigger, { render: children }), _jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Positioner, { side: side, sideOffset: 6, className: "z-50", children: _jsx(TooltipPrimitive.Popup, { "data-slot": "tooltip", className: cn('rounded-md border border-border-strong bg-popover px-1.5 py-0.5 text-3xs font-medium text-secondary-foreground shadow-lg', popupMotionFast, className), children: label }) }) })] }));
12
+ }
13
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"","sources":["../../src/components/tooltip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,GAAG,GAAG,EACX,QAAQ,GAIT;IACC,OAAO,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA6B,CAAC;AACzF,CAAC;AAUD,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,QAAQ,EAAE,SAAS,EAAgB;IACnF,OAAO,CACL,MAAC,gBAAgB,CAAC,IAAI,eACpB,KAAC,gBAAgB,CAAC,OAAO,IAAC,MAAM,EAAE,QAAQ,GAAI,EAC9C,KAAC,gBAAgB,CAAC,MAAM,cACtB,KAAC,gBAAgB,CAAC,UAAU,IAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAC,MAAM,YACtE,KAAC,gBAAgB,CAAC,KAAK,iBACX,SAAS,EACnB,SAAS,EAAE,EAAE,CACX,0HAA0H,EAC1H,eAAe,EACf,SAAS,CACV,YAEA,KAAK,GACiB,GACG,GACN,IACJ,CACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type LucideIcon } from 'lucide-react';
2
+ import { type ReactNode } from 'react';
3
+ export type TreeNode = {
4
+ id: string;
5
+ label: ReactNode;
6
+ icon?: LucideIcon;
7
+ /** Shown at the end of the row, such as a member count. */
8
+ meta?: ReactNode;
9
+ children?: readonly TreeNode[];
10
+ };
11
+ export type TreeProps = {
12
+ nodes: readonly TreeNode[];
13
+ 'aria-label': string;
14
+ selected?: string | null;
15
+ onSelect?: (id: string) => void;
16
+ /** Branches open at first. */
17
+ defaultExpanded?: readonly string[];
18
+ className?: string;
19
+ };
20
+ /**
21
+ * Nested items, such as Keycloak groups or folders. One row takes Tab; arrows
22
+ * move, Right opens or steps in, Left closes or steps out, Home and End jump,
23
+ * Enter picks.
24
+ */
25
+ export declare function Tree({ nodes, 'aria-label': label, selected, onSelect, defaultExpanded, className, }: TreeProps): import("react").JSX.Element;
26
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/components/tree.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAiD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAItF,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,8BAA8B;IAC9B,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,EACnB,KAAK,EACL,YAAY,EAAE,KAAK,EACnB,QAAe,EACf,QAAQ,EACR,eAAoB,EACpB,SAAS,GACV,EAAE,SAAS,+BA8HX"}