ruler-components 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +51 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +534 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +498 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +21 -2
- package/AGENTS.md +0 -9
- package/CLAUDE.md +0 -1
- package/app/docs/[slug]/page.tsx +0 -147
- package/app/docs/layout.tsx +0 -26
- package/app/docs/page.tsx +0 -148
- package/app/favicon.ico +0 -0
- package/app/globals.css +0 -168
- package/app/icon.png +0 -0
- package/app/layout.tsx +0 -90
- package/app/opengraph-image.tsx +0 -10
- package/app/page.tsx +0 -34
- package/app/twitter-image.tsx +0 -10
- package/components/docs/accordion-doc-page.tsx +0 -352
- package/components/docs/alert-doc-page.tsx +0 -293
- package/components/docs/allinput-doc-page.tsx +0 -183
- package/components/docs/avatar-doc-page.tsx +0 -424
- package/components/docs/badge-doc-page.tsx +0 -363
- package/components/docs/button-doc-page.tsx +0 -406
- package/components/docs/card-doc-page.tsx +0 -364
- package/components/docs/checkbox-doc-page.tsx +0 -277
- package/components/docs/colors-doc-page.tsx +0 -430
- package/components/docs/dialog-doc-page.tsx +0 -364
- package/components/docs/docs-footer.tsx +0 -11
- package/components/docs/docs-mobile-menu-bar.tsx +0 -22
- package/components/docs/docs-mobile-nav-context.tsx +0 -27
- package/components/docs/docs-page.tsx +0 -263
- package/components/docs/docs-search.tsx +0 -303
- package/components/docs/docs-sidebar.tsx +0 -165
- package/components/docs/docs-topbar.tsx +0 -32
- package/components/docs/dropdown-doc-page.tsx +0 -522
- package/components/docs/getting-started-doc-page.tsx +0 -205
- package/components/docs/label-doc-page.tsx +0 -173
- package/components/docs/loaders-doc-page.tsx +0 -244
- package/components/docs/menu-doc-page.tsx +0 -373
- package/components/docs/modal-doc-page.tsx +0 -436
- package/components/docs/next-steps.tsx +0 -53
- package/components/docs/pagination-doc-page.tsx +0 -316
- package/components/docs/progress-doc-page.tsx +0 -387
- package/components/docs/radio-doc-page.tsx +0 -270
- package/components/docs/skeleton-doc-page.tsx +0 -230
- package/components/docs/stepper-doc-page.tsx +0 -309
- package/components/docs/switch-doc-page.tsx +0 -264
- package/components/docs/table-doc-page.tsx +0 -689
- package/components/docs/tabs-doc-page.tsx +0 -359
- package/components/docs/theming-doc-page.tsx +0 -243
- package/components/docs/tooltip-doc-page.tsx +0 -357
- package/components/docs/usage-section.tsx +0 -21
- package/components/icons/discord.tsx +0 -9
- package/components/icons/github.tsx +0 -9
- package/components/icons/x.tsx +0 -9
- package/components/installation-section.tsx +0 -34
- package/components/landing/feature-highlights.tsx +0 -105
- package/components/landing/footer-strip.tsx +0 -45
- package/components/landing/hero-card.tsx +0 -14
- package/components/landing/hero-spotlight.tsx +0 -126
- package/components/landing/hero.tsx +0 -64
- package/components/landing/navbar.tsx +0 -44
- package/components/landing/quick-start-section.tsx +0 -59
- package/components/landing/site-footer.tsx +0 -55
- package/components/theme-provider.tsx +0 -60
- package/components/ui/accordion.tsx +0 -174
- package/components/ui/alert.tsx +0 -103
- package/components/ui/allinput.tsx +0 -210
- package/components/ui/avatar.tsx +0 -179
- package/components/ui/badge.tsx +0 -52
- package/components/ui/button.tsx +0 -75
- package/components/ui/card.tsx +0 -105
- package/components/ui/checkbox.tsx +0 -130
- package/components/ui/code-block.tsx +0 -60
- package/components/ui/data-table.tsx +0 -235
- package/components/ui/dialog.tsx +0 -173
- package/components/ui/dropdown.tsx +0 -78
- package/components/ui/feature-card.tsx +0 -38
- package/components/ui/input.tsx +0 -44
- package/components/ui/label.tsx +0 -110
- package/components/ui/loaders.tsx +0 -139
- package/components/ui/menu.tsx +0 -118
- package/components/ui/modal.tsx +0 -399
- package/components/ui/package-manager-tabs.tsx +0 -40
- package/components/ui/pagination.tsx +0 -200
- package/components/ui/progress.tsx +0 -134
- package/components/ui/radio.tsx +0 -262
- package/components/ui/skeleton.tsx +0 -102
- package/components/ui/steppers.tsx +0 -309
- package/components/ui/switch.tsx +0 -153
- package/components/ui/table.tsx +0 -58
- package/components/ui/tabs.tsx +0 -166
- package/components/ui/theme-toggle.tsx +0 -60
- package/components/ui/tooltip.tsx +0 -238
- package/data/color-palette.ts +0 -35
- package/data/docs-nav.ts +0 -84
- package/eslint.config.mjs +0 -18
- package/index.ts +0 -8
- package/lib/cn.ts +0 -4
- package/lib/color.ts +0 -85
- package/lib/og-image.tsx +0 -138
- package/lib/theme.ts +0 -33
- package/next.config.ts +0 -7
- package/postcss.config.mjs +0 -7
- package/public/dark.png +0 -0
- package/public/dark1.png +0 -0
- package/public/dark2.png +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/light.png +0 -0
- package/public/light1.png +0 -0
- package/public/next.svg +0 -1
- package/public/vercel.svg +0 -1
- package/public/video/hero-demo.mp4 +0 -0
- package/public/window.svg +0 -1
- package/tsconfig.json +0 -34
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../index.ts","../components/ui/progress.tsx","../lib/cn.ts","../components/ui/switch.tsx","../components/ui/tooltip.tsx"],"sourcesContent":["export { Progress } from \"./components/ui/progress\";\nexport type { ProgressProps } from \"./components/ui/progress\";\n\nexport { Switch } from \"./components/ui/switch\";\nexport type { SwitchProps } from \"./components/ui/switch\";\n\nexport { Tooltip } from \"./components/ui/tooltip\";\nexport type { TooltipProps } from \"./components/ui/tooltip\";\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\n\nconst progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full bg-zinc-100 dark:bg-zinc-800/70\",\n {\n variants: {\n size: {\n sm: \"h-1\",\n md: \"h-1.5\",\n lg: \"h-2\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\nconst progressIndicatorVariants = cva(\n \"h-full rounded-full transition-[width] duration-500 ease-[cubic-bezier(0.4,0,0.2,1)]\",\n {\n variants: {\n variant: {\n default: \"bg-zinc-900 dark:bg-zinc-100\",\n success: \"bg-[#28A745] dark:bg-[#5CC975]\",\n warning: \"bg-[#E58E00] dark:bg-[#F5B84A]\",\n error: \"bg-[#D93025] dark:bg-[#F06B62]\",\n },\n },\n defaultVariants: { variant: \"default\" },\n },\n);\n\nconst valuePillVariants = cva(\n \"inline-flex min-w-[2.25rem] items-center justify-end text-[11px] font-medium tabular-nums text-zinc-400 dark:text-zinc-500\",\n {\n variants: {\n variant: {\n default: \"\",\n success: \"\",\n warning: \"\",\n error: \"\",\n },\n },\n defaultVariants: { variant: \"default\" },\n },\n);\n\nexport interface ProgressProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">,\n VariantProps<typeof progressTrackVariants>,\n VariantProps<typeof progressIndicatorVariants> {\n value?: number;\n max?: number;\n label?: string;\n showValue?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n}\n\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n className,\n value = 0,\n max = 100,\n variant,\n size,\n label,\n showValue = false,\n indeterminate = false,\n disabled = false,\n ...props\n },\n ref,\n ) => {\n const clamped = Math.min(max, Math.max(0, value));\n const percentage = max > 0 ? Math.round((clamped / max) * 100) : 0;\n\n return (\n <div\n className={cn(\n \"flex w-full flex-col gap-2.5\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {(label || showValue) && (\n <div className=\"flex items-center justify-between gap-3\">\n {label && (\n <span className=\"text-sm text-zinc-600 dark:text-zinc-300\">\n {label}\n </span>\n )}\n {showValue && !indeterminate && (\n <span className={cn(valuePillVariants({ variant }))}>\n {percentage}%\n </span>\n )}\n </div>\n )}\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate || disabled ? undefined : clamped}\n aria-label={label}\n aria-valuetext={indeterminate ? \"Loading\" : `${percentage}%`}\n aria-disabled={disabled || undefined}\n className={cn(progressTrackVariants({ size }))}\n {...props}\n >\n {indeterminate ? (\n <div\n className={cn(\n progressIndicatorVariants({ variant }),\n \"w-[40%] animate-[progress-indeterminate_1.5s_ease-in-out_infinite]\",\n )}\n />\n ) : (\n <div\n className={cn(progressIndicatorVariants({ variant }))}\n style={{ width: `${percentage}%` }}\n />\n )}\n </div>\n </div>\n );\n },\n);\nProgress.displayName = \"Progress\";\n\nexport { Progress, progressTrackVariants, progressIndicatorVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\n\nconst switchTrackVariants = cva(\n [\n \"relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent transition-colors duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-900/20 focus-visible:ring-offset-2 focus-visible:ring-offset-white\",\n \"dark:focus-visible:ring-zinc-100/20 dark:focus-visible:ring-offset-zinc-950\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:bg-zinc-900 data-[state=unchecked]:bg-zinc-200\",\n \"dark:data-[state=checked]:bg-zinc-100 dark:data-[state=unchecked]:bg-zinc-700\",\n \"hover:data-[state=unchecked]:bg-zinc-300 dark:hover:data-[state=unchecked]:bg-zinc-600\",\n \"hover:data-[state=checked]:bg-zinc-800 dark:hover:data-[state=checked]:bg-zinc-200\",\n ],\n {\n variants: {\n size: {\n sm: \"h-5 w-9\",\n md: \"h-6 w-11\",\n lg: \"h-7 w-[3.25rem]\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\nconst switchThumbVariants = cva(\n \"pointer-events-none absolute left-0.5 top-1/2 block -translate-y-1/2 rounded-full bg-white shadow-sm transition-transform duration-200 dark:bg-zinc-950\",\n {\n variants: {\n size: {\n sm: \"h-3.5 w-3.5 data-[state=checked]:translate-x-4\",\n md: \"h-4 w-4 data-[state=checked]:translate-x-5\",\n lg: \"h-5 w-5 data-[state=checked]:translate-x-6\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\nexport interface SwitchProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\" | \"size\">,\n VariantProps<typeof switchTrackVariants> {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n label?: string;\n description?: string;\n}\n\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n className,\n size,\n checked,\n defaultChecked = false,\n onCheckedChange,\n disabled,\n label,\n description,\n id,\n onClick,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const switchId = id ?? generatedId;\n const isControlled = checked !== undefined;\n const [uncontrolledChecked, setUncontrolledChecked] = React.useState(defaultChecked);\n const isChecked = isControlled ? checked : uncontrolledChecked;\n const state = isChecked ? \"checked\" : \"unchecked\";\n\n const toggle = () => {\n if (disabled) return;\n const next = !isChecked;\n if (!isControlled) setUncontrolledChecked(next);\n onCheckedChange?.(next);\n };\n\n const switchControl = (\n <button\n ref={ref}\n id={switchId}\n type=\"button\"\n role=\"switch\"\n aria-checked={isChecked}\n aria-labelledby={label ? `${switchId}-label` : undefined}\n aria-describedby={description ? `${switchId}-description` : undefined}\n disabled={disabled}\n data-state={state}\n className={cn(switchTrackVariants({ size }), className)}\n onClick={(event) => {\n toggle();\n onClick?.(event);\n }}\n onKeyDown={(event) => {\n if (event.key === \" \") {\n event.preventDefault();\n toggle();\n }\n }}\n {...props}\n >\n <span data-state={state} className={switchThumbVariants({ size })} />\n </button>\n );\n\n if (!label && !description) {\n return switchControl;\n }\n\n return (\n <div\n className={cn(\n \"flex items-start justify-between gap-4\",\n disabled && \"opacity-60\",\n )}\n >\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n {label && (\n <label\n id={`${switchId}-label`}\n htmlFor={switchId}\n className={cn(\n \"text-sm font-medium leading-snug text-zinc-800 dark:text-zinc-100\",\n !disabled && \"cursor-pointer\",\n )}\n >\n {label}\n </label>\n )}\n {description && (\n <p\n id={`${switchId}-description`}\n className=\"text-xs leading-relaxed text-zinc-500 dark:text-zinc-400\"\n >\n {description}\n </p>\n )}\n </div>\n {switchControl}\n </div>\n );\n },\n);\nSwitch.displayName = \"Switch\";\n\nexport { Switch, switchTrackVariants, switchThumbVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\n\nconst tooltipVariants = cva(\n [\n \"pointer-events-none fixed z-50 max-w-[260px] rounded-lg px-3 py-2\",\n \"text-[13px] font-medium leading-normal tracking-tight\",\n \"bg-zinc-900 text-zinc-50\",\n \"shadow-[0_4px_16px_rgba(0,0,0,0.14),0_0_0_1px_rgba(255,255,255,0.06)]\",\n \"dark:bg-zinc-100 dark:text-zinc-900\",\n \"dark:shadow-[0_4px_16px_rgba(0,0,0,0.35),0_0_0_1px_rgba(0,0,0,0.06)]\",\n \"transition-[opacity,transform] duration-200 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n \"will-change-[opacity,transform]\",\n ],\n {\n variants: {\n visible: {\n true: \"opacity-100 scale-100\",\n false: \"opacity-0 scale-[0.97]\",\n },\n side: {\n top: \"origin-bottom\",\n bottom: \"origin-top\",\n left: \"origin-right\",\n right: \"origin-left\",\n },\n },\n defaultVariants: { visible: false, side: \"top\" },\n },\n);\n\ntype TooltipSide = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype TooltipAlign = \"start\" | \"center\" | \"end\";\n\nconst VIEWPORT_PADDING = 10;\nconst ARROW_SIZE = 6;\n\nexport interface TooltipProps extends VariantProps<typeof tooltipVariants> {\n content: React.ReactNode;\n children: React.ReactNode;\n side?: TooltipSide;\n align?: TooltipAlign;\n sideOffset?: number;\n delayDuration?: number;\n disabled?: boolean;\n className?: string;\n}\n\nfunction getTooltipPosition(\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n side: TooltipSide,\n align: TooltipAlign,\n sideOffset: number,\n) {\n const offset = sideOffset + ARROW_SIZE;\n let top = 0;\n let left = 0;\n\n if (side === \"top\") {\n top = triggerRect.top - tooltipRect.height - offset;\n left = alignTooltipHorizontal(triggerRect, tooltipRect, align);\n } else if (side === \"bottom\") {\n top = triggerRect.bottom + offset;\n left = alignTooltipHorizontal(triggerRect, tooltipRect, align);\n } else if (side === \"left\") {\n top = alignTooltipVertical(triggerRect, tooltipRect, align);\n left = triggerRect.left - tooltipRect.width - offset;\n } else {\n top = alignTooltipVertical(triggerRect, tooltipRect, align);\n left = triggerRect.right + offset;\n }\n\n const maxLeft = window.innerWidth - tooltipRect.width - VIEWPORT_PADDING;\n const maxTop = window.innerHeight - tooltipRect.height - VIEWPORT_PADDING;\n\n return {\n top: Math.min(Math.max(top, VIEWPORT_PADDING), maxTop),\n left: Math.min(Math.max(left, VIEWPORT_PADDING), maxLeft),\n };\n}\n\nfunction alignTooltipHorizontal(\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n align: TooltipAlign,\n) {\n if (align === \"start\") return triggerRect.left;\n if (align === \"end\") return triggerRect.right - tooltipRect.width;\n return triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n}\n\nfunction alignTooltipVertical(\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n align: TooltipAlign,\n) {\n if (align === \"start\") return triggerRect.top;\n if (align === \"end\") return triggerRect.bottom - tooltipRect.height;\n return triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n}\n\nfunction TooltipArrow({ side }: { side: TooltipSide }) {\n const position = {\n top: \"bottom-0 left-1/2 -translate-x-1/2 translate-y-[calc(100%-1px)]\",\n bottom: \"top-0 left-1/2 -translate-x-1/2 -translate-y-[calc(100%-1px)] rotate-180\",\n left: \"right-0 top-1/2 -translate-y-1/2 translate-x-[calc(100%-1px)] -rotate-90\",\n right: \"left-0 top-1/2 -translate-y-1/2 -translate-x-[calc(100%-1px)] rotate-90\",\n }[side];\n\n return (\n <svg\n aria-hidden\n width=\"10\"\n height=\"5\"\n viewBox=\"0 0 10 5\"\n className={cn(\n \"absolute text-zinc-900 dark:text-zinc-100\",\n position,\n )}\n >\n <path fill=\"currentColor\" d=\"M0 0h10L5 5 0 0z\" />\n </svg>\n );\n}\n\nfunction Tooltip({\n content,\n children,\n side = \"top\",\n align = \"center\",\n sideOffset = 8,\n delayDuration = 250,\n disabled = false,\n className,\n}: TooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [visible, setVisible] = React.useState(false);\n const [mounted, setMounted] = React.useState(false);\n const [position, setPosition] = React.useState({ top: -9999, left: -9999 });\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const triggerRef = React.useRef<HTMLSpanElement>(null);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n const id = React.useId();\n\n React.useEffect(() => setMounted(true), []);\n\n const clearTimer = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n };\n\n const updatePosition = React.useCallback(() => {\n const trigger = triggerRef.current;\n const tooltip = tooltipRef.current;\n if (!trigger || !tooltip) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const tooltipRect = tooltip.getBoundingClientRect();\n setPosition(getTooltipPosition(triggerRect, tooltipRect, side, align, sideOffset));\n requestAnimationFrame(() => setVisible(true));\n }, [side, align, sideOffset]);\n\n const show = () => {\n if (disabled) return;\n clearTimer();\n timeoutRef.current = setTimeout(() => {\n setVisible(false);\n setOpen(true);\n }, delayDuration);\n };\n\n const hide = () => {\n clearTimer();\n setVisible(false);\n setOpen(false);\n };\n\n React.useEffect(() => clearTimer, []);\n\n React.useLayoutEffect(() => {\n if (!open) return;\n updatePosition();\n const handleUpdate = () => updatePosition();\n window.addEventListener(\"scroll\", handleUpdate, true);\n window.addEventListener(\"resize\", handleUpdate);\n return () => {\n window.removeEventListener(\"scroll\", handleUpdate, true);\n window.removeEventListener(\"resize\", handleUpdate);\n };\n }, [open, updatePosition, content]);\n\n const child = React.Children.only(children);\n const trigger = React.isValidElement(child)\n ? React.cloneElement(\n child as React.ReactElement<{ \"aria-describedby\"?: string }>,\n { \"aria-describedby\": open && visible ? id : undefined },\n )\n : children;\n\n const tooltipNode = open ? (\n <div\n ref={tooltipRef}\n id={id}\n role=\"tooltip\"\n aria-hidden={!visible}\n style={{ top: position.top, left: position.left }}\n className={cn(tooltipVariants({ visible, side }), className)}\n >\n {content}\n <TooltipArrow side={side} />\n </div>\n ) : null;\n\n return (\n <>\n <span\n ref={triggerRef}\n className=\"inline-flex\"\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n {trigger}\n </span>\n {mounted && tooltipNode ? createPortal(tooltipNode, document.body) : null}\n </>\n );\n}\n\nexport { Tooltip, tooltipVariants };\n"],"mappings":"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","names":["React","import_class_variance_authority","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","trigger"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
var __objRest = (source, exclude) => {
|
|
22
|
+
var target = {};
|
|
23
|
+
for (var prop in source)
|
|
24
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
if (source != null && __getOwnPropSymbols)
|
|
27
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
28
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
29
|
+
target[prop] = source[prop];
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// components/ui/progress.tsx
|
|
35
|
+
import * as React from "react";
|
|
36
|
+
import { cva } from "class-variance-authority";
|
|
37
|
+
|
|
38
|
+
// lib/cn.ts
|
|
39
|
+
import { clsx } from "clsx";
|
|
40
|
+
import { twMerge } from "tailwind-merge";
|
|
41
|
+
var cn = (...inputs) => twMerge(clsx(inputs));
|
|
42
|
+
|
|
43
|
+
// components/ui/progress.tsx
|
|
44
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
45
|
+
var progressTrackVariants = cva(
|
|
46
|
+
"relative w-full overflow-hidden rounded-full bg-zinc-100 dark:bg-zinc-800/70",
|
|
47
|
+
{
|
|
48
|
+
variants: {
|
|
49
|
+
size: {
|
|
50
|
+
sm: "h-1",
|
|
51
|
+
md: "h-1.5",
|
|
52
|
+
lg: "h-2"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
defaultVariants: { size: "md" }
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
var progressIndicatorVariants = cva(
|
|
59
|
+
"h-full rounded-full transition-[width] duration-500 ease-[cubic-bezier(0.4,0,0.2,1)]",
|
|
60
|
+
{
|
|
61
|
+
variants: {
|
|
62
|
+
variant: {
|
|
63
|
+
default: "bg-zinc-900 dark:bg-zinc-100",
|
|
64
|
+
success: "bg-[#28A745] dark:bg-[#5CC975]",
|
|
65
|
+
warning: "bg-[#E58E00] dark:bg-[#F5B84A]",
|
|
66
|
+
error: "bg-[#D93025] dark:bg-[#F06B62]"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
defaultVariants: { variant: "default" }
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
var valuePillVariants = cva(
|
|
73
|
+
"inline-flex min-w-[2.25rem] items-center justify-end text-[11px] font-medium tabular-nums text-zinc-400 dark:text-zinc-500",
|
|
74
|
+
{
|
|
75
|
+
variants: {
|
|
76
|
+
variant: {
|
|
77
|
+
default: "",
|
|
78
|
+
success: "",
|
|
79
|
+
warning: "",
|
|
80
|
+
error: ""
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
defaultVariants: { variant: "default" }
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
var Progress = React.forwardRef(
|
|
87
|
+
(_a, ref) => {
|
|
88
|
+
var _b = _a, {
|
|
89
|
+
className,
|
|
90
|
+
value = 0,
|
|
91
|
+
max = 100,
|
|
92
|
+
variant,
|
|
93
|
+
size,
|
|
94
|
+
label,
|
|
95
|
+
showValue = false,
|
|
96
|
+
indeterminate = false,
|
|
97
|
+
disabled = false
|
|
98
|
+
} = _b, props = __objRest(_b, [
|
|
99
|
+
"className",
|
|
100
|
+
"value",
|
|
101
|
+
"max",
|
|
102
|
+
"variant",
|
|
103
|
+
"size",
|
|
104
|
+
"label",
|
|
105
|
+
"showValue",
|
|
106
|
+
"indeterminate",
|
|
107
|
+
"disabled"
|
|
108
|
+
]);
|
|
109
|
+
const clamped = Math.min(max, Math.max(0, value));
|
|
110
|
+
const percentage = max > 0 ? Math.round(clamped / max * 100) : 0;
|
|
111
|
+
return /* @__PURE__ */ jsxs(
|
|
112
|
+
"div",
|
|
113
|
+
{
|
|
114
|
+
className: cn(
|
|
115
|
+
"flex w-full flex-col gap-2.5",
|
|
116
|
+
disabled && "pointer-events-none opacity-50",
|
|
117
|
+
className
|
|
118
|
+
),
|
|
119
|
+
children: [
|
|
120
|
+
(label || showValue) && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
|
|
121
|
+
label && /* @__PURE__ */ jsx("span", { className: "text-sm text-zinc-600 dark:text-zinc-300", children: label }),
|
|
122
|
+
showValue && !indeterminate && /* @__PURE__ */ jsxs("span", { className: cn(valuePillVariants({ variant })), children: [
|
|
123
|
+
percentage,
|
|
124
|
+
"%"
|
|
125
|
+
] })
|
|
126
|
+
] }),
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
"div",
|
|
129
|
+
__spreadProps(__spreadValues({
|
|
130
|
+
ref,
|
|
131
|
+
role: "progressbar",
|
|
132
|
+
"aria-valuemin": 0,
|
|
133
|
+
"aria-valuemax": max,
|
|
134
|
+
"aria-valuenow": indeterminate || disabled ? void 0 : clamped,
|
|
135
|
+
"aria-label": label,
|
|
136
|
+
"aria-valuetext": indeterminate ? "Loading" : `${percentage}%`,
|
|
137
|
+
"aria-disabled": disabled || void 0,
|
|
138
|
+
className: cn(progressTrackVariants({ size }))
|
|
139
|
+
}, props), {
|
|
140
|
+
children: indeterminate ? /* @__PURE__ */ jsx(
|
|
141
|
+
"div",
|
|
142
|
+
{
|
|
143
|
+
className: cn(
|
|
144
|
+
progressIndicatorVariants({ variant }),
|
|
145
|
+
"w-[40%] animate-[progress-indeterminate_1.5s_ease-in-out_infinite]"
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
) : /* @__PURE__ */ jsx(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
className: cn(progressIndicatorVariants({ variant })),
|
|
152
|
+
style: { width: `${percentage}%` }
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
})
|
|
156
|
+
)
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
Progress.displayName = "Progress";
|
|
163
|
+
|
|
164
|
+
// components/ui/switch.tsx
|
|
165
|
+
import * as React2 from "react";
|
|
166
|
+
import { cva as cva2 } from "class-variance-authority";
|
|
167
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
168
|
+
var switchTrackVariants = cva2(
|
|
169
|
+
[
|
|
170
|
+
"relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent transition-colors duration-200",
|
|
171
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-900/20 focus-visible:ring-offset-2 focus-visible:ring-offset-white",
|
|
172
|
+
"dark:focus-visible:ring-zinc-100/20 dark:focus-visible:ring-offset-zinc-950",
|
|
173
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
174
|
+
"data-[state=checked]:bg-zinc-900 data-[state=unchecked]:bg-zinc-200",
|
|
175
|
+
"dark:data-[state=checked]:bg-zinc-100 dark:data-[state=unchecked]:bg-zinc-700",
|
|
176
|
+
"hover:data-[state=unchecked]:bg-zinc-300 dark:hover:data-[state=unchecked]:bg-zinc-600",
|
|
177
|
+
"hover:data-[state=checked]:bg-zinc-800 dark:hover:data-[state=checked]:bg-zinc-200"
|
|
178
|
+
],
|
|
179
|
+
{
|
|
180
|
+
variants: {
|
|
181
|
+
size: {
|
|
182
|
+
sm: "h-5 w-9",
|
|
183
|
+
md: "h-6 w-11",
|
|
184
|
+
lg: "h-7 w-[3.25rem]"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
defaultVariants: { size: "md" }
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
var switchThumbVariants = cva2(
|
|
191
|
+
"pointer-events-none absolute left-0.5 top-1/2 block -translate-y-1/2 rounded-full bg-white shadow-sm transition-transform duration-200 dark:bg-zinc-950",
|
|
192
|
+
{
|
|
193
|
+
variants: {
|
|
194
|
+
size: {
|
|
195
|
+
sm: "h-3.5 w-3.5 data-[state=checked]:translate-x-4",
|
|
196
|
+
md: "h-4 w-4 data-[state=checked]:translate-x-5",
|
|
197
|
+
lg: "h-5 w-5 data-[state=checked]:translate-x-6"
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
defaultVariants: { size: "md" }
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
var Switch = React2.forwardRef(
|
|
204
|
+
(_a, ref) => {
|
|
205
|
+
var _b = _a, {
|
|
206
|
+
className,
|
|
207
|
+
size,
|
|
208
|
+
checked,
|
|
209
|
+
defaultChecked = false,
|
|
210
|
+
onCheckedChange,
|
|
211
|
+
disabled,
|
|
212
|
+
label,
|
|
213
|
+
description,
|
|
214
|
+
id,
|
|
215
|
+
onClick
|
|
216
|
+
} = _b, props = __objRest(_b, [
|
|
217
|
+
"className",
|
|
218
|
+
"size",
|
|
219
|
+
"checked",
|
|
220
|
+
"defaultChecked",
|
|
221
|
+
"onCheckedChange",
|
|
222
|
+
"disabled",
|
|
223
|
+
"label",
|
|
224
|
+
"description",
|
|
225
|
+
"id",
|
|
226
|
+
"onClick"
|
|
227
|
+
]);
|
|
228
|
+
const generatedId = React2.useId();
|
|
229
|
+
const switchId = id != null ? id : generatedId;
|
|
230
|
+
const isControlled = checked !== void 0;
|
|
231
|
+
const [uncontrolledChecked, setUncontrolledChecked] = React2.useState(defaultChecked);
|
|
232
|
+
const isChecked = isControlled ? checked : uncontrolledChecked;
|
|
233
|
+
const state = isChecked ? "checked" : "unchecked";
|
|
234
|
+
const toggle = () => {
|
|
235
|
+
if (disabled) return;
|
|
236
|
+
const next = !isChecked;
|
|
237
|
+
if (!isControlled) setUncontrolledChecked(next);
|
|
238
|
+
onCheckedChange == null ? void 0 : onCheckedChange(next);
|
|
239
|
+
};
|
|
240
|
+
const switchControl = /* @__PURE__ */ jsx2(
|
|
241
|
+
"button",
|
|
242
|
+
__spreadProps(__spreadValues({
|
|
243
|
+
ref,
|
|
244
|
+
id: switchId,
|
|
245
|
+
type: "button",
|
|
246
|
+
role: "switch",
|
|
247
|
+
"aria-checked": isChecked,
|
|
248
|
+
"aria-labelledby": label ? `${switchId}-label` : void 0,
|
|
249
|
+
"aria-describedby": description ? `${switchId}-description` : void 0,
|
|
250
|
+
disabled,
|
|
251
|
+
"data-state": state,
|
|
252
|
+
className: cn(switchTrackVariants({ size }), className),
|
|
253
|
+
onClick: (event) => {
|
|
254
|
+
toggle();
|
|
255
|
+
onClick == null ? void 0 : onClick(event);
|
|
256
|
+
},
|
|
257
|
+
onKeyDown: (event) => {
|
|
258
|
+
if (event.key === " ") {
|
|
259
|
+
event.preventDefault();
|
|
260
|
+
toggle();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}, props), {
|
|
264
|
+
children: /* @__PURE__ */ jsx2("span", { "data-state": state, className: switchThumbVariants({ size }) })
|
|
265
|
+
})
|
|
266
|
+
);
|
|
267
|
+
if (!label && !description) {
|
|
268
|
+
return switchControl;
|
|
269
|
+
}
|
|
270
|
+
return /* @__PURE__ */ jsxs2(
|
|
271
|
+
"div",
|
|
272
|
+
{
|
|
273
|
+
className: cn(
|
|
274
|
+
"flex items-start justify-between gap-4",
|
|
275
|
+
disabled && "opacity-60"
|
|
276
|
+
),
|
|
277
|
+
children: [
|
|
278
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex min-w-0 flex-col gap-0.5", children: [
|
|
279
|
+
label && /* @__PURE__ */ jsx2(
|
|
280
|
+
"label",
|
|
281
|
+
{
|
|
282
|
+
id: `${switchId}-label`,
|
|
283
|
+
htmlFor: switchId,
|
|
284
|
+
className: cn(
|
|
285
|
+
"text-sm font-medium leading-snug text-zinc-800 dark:text-zinc-100",
|
|
286
|
+
!disabled && "cursor-pointer"
|
|
287
|
+
),
|
|
288
|
+
children: label
|
|
289
|
+
}
|
|
290
|
+
),
|
|
291
|
+
description && /* @__PURE__ */ jsx2(
|
|
292
|
+
"p",
|
|
293
|
+
{
|
|
294
|
+
id: `${switchId}-description`,
|
|
295
|
+
className: "text-xs leading-relaxed text-zinc-500 dark:text-zinc-400",
|
|
296
|
+
children: description
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
] }),
|
|
300
|
+
switchControl
|
|
301
|
+
]
|
|
302
|
+
}
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
);
|
|
306
|
+
Switch.displayName = "Switch";
|
|
307
|
+
|
|
308
|
+
// components/ui/tooltip.tsx
|
|
309
|
+
import * as React3 from "react";
|
|
310
|
+
import { createPortal } from "react-dom";
|
|
311
|
+
import { cva as cva3 } from "class-variance-authority";
|
|
312
|
+
import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
313
|
+
var tooltipVariants = cva3(
|
|
314
|
+
[
|
|
315
|
+
"pointer-events-none fixed z-50 max-w-[260px] rounded-lg px-3 py-2",
|
|
316
|
+
"text-[13px] font-medium leading-normal tracking-tight",
|
|
317
|
+
"bg-zinc-900 text-zinc-50",
|
|
318
|
+
"shadow-[0_4px_16px_rgba(0,0,0,0.14),0_0_0_1px_rgba(255,255,255,0.06)]",
|
|
319
|
+
"dark:bg-zinc-100 dark:text-zinc-900",
|
|
320
|
+
"dark:shadow-[0_4px_16px_rgba(0,0,0,0.35),0_0_0_1px_rgba(0,0,0,0.06)]",
|
|
321
|
+
"transition-[opacity,transform] duration-200 ease-[cubic-bezier(0.16,1,0.3,1)]",
|
|
322
|
+
"will-change-[opacity,transform]"
|
|
323
|
+
],
|
|
324
|
+
{
|
|
325
|
+
variants: {
|
|
326
|
+
visible: {
|
|
327
|
+
true: "opacity-100 scale-100",
|
|
328
|
+
false: "opacity-0 scale-[0.97]"
|
|
329
|
+
},
|
|
330
|
+
side: {
|
|
331
|
+
top: "origin-bottom",
|
|
332
|
+
bottom: "origin-top",
|
|
333
|
+
left: "origin-right",
|
|
334
|
+
right: "origin-left"
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
defaultVariants: { visible: false, side: "top" }
|
|
338
|
+
}
|
|
339
|
+
);
|
|
340
|
+
var VIEWPORT_PADDING = 10;
|
|
341
|
+
var ARROW_SIZE = 6;
|
|
342
|
+
function getTooltipPosition(triggerRect, tooltipRect, side, align, sideOffset) {
|
|
343
|
+
const offset = sideOffset + ARROW_SIZE;
|
|
344
|
+
let top = 0;
|
|
345
|
+
let left = 0;
|
|
346
|
+
if (side === "top") {
|
|
347
|
+
top = triggerRect.top - tooltipRect.height - offset;
|
|
348
|
+
left = alignTooltipHorizontal(triggerRect, tooltipRect, align);
|
|
349
|
+
} else if (side === "bottom") {
|
|
350
|
+
top = triggerRect.bottom + offset;
|
|
351
|
+
left = alignTooltipHorizontal(triggerRect, tooltipRect, align);
|
|
352
|
+
} else if (side === "left") {
|
|
353
|
+
top = alignTooltipVertical(triggerRect, tooltipRect, align);
|
|
354
|
+
left = triggerRect.left - tooltipRect.width - offset;
|
|
355
|
+
} else {
|
|
356
|
+
top = alignTooltipVertical(triggerRect, tooltipRect, align);
|
|
357
|
+
left = triggerRect.right + offset;
|
|
358
|
+
}
|
|
359
|
+
const maxLeft = window.innerWidth - tooltipRect.width - VIEWPORT_PADDING;
|
|
360
|
+
const maxTop = window.innerHeight - tooltipRect.height - VIEWPORT_PADDING;
|
|
361
|
+
return {
|
|
362
|
+
top: Math.min(Math.max(top, VIEWPORT_PADDING), maxTop),
|
|
363
|
+
left: Math.min(Math.max(left, VIEWPORT_PADDING), maxLeft)
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
function alignTooltipHorizontal(triggerRect, tooltipRect, align) {
|
|
367
|
+
if (align === "start") return triggerRect.left;
|
|
368
|
+
if (align === "end") return triggerRect.right - tooltipRect.width;
|
|
369
|
+
return triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;
|
|
370
|
+
}
|
|
371
|
+
function alignTooltipVertical(triggerRect, tooltipRect, align) {
|
|
372
|
+
if (align === "start") return triggerRect.top;
|
|
373
|
+
if (align === "end") return triggerRect.bottom - tooltipRect.height;
|
|
374
|
+
return triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;
|
|
375
|
+
}
|
|
376
|
+
function TooltipArrow({ side }) {
|
|
377
|
+
const position = {
|
|
378
|
+
top: "bottom-0 left-1/2 -translate-x-1/2 translate-y-[calc(100%-1px)]",
|
|
379
|
+
bottom: "top-0 left-1/2 -translate-x-1/2 -translate-y-[calc(100%-1px)] rotate-180",
|
|
380
|
+
left: "right-0 top-1/2 -translate-y-1/2 translate-x-[calc(100%-1px)] -rotate-90",
|
|
381
|
+
right: "left-0 top-1/2 -translate-y-1/2 -translate-x-[calc(100%-1px)] rotate-90"
|
|
382
|
+
}[side];
|
|
383
|
+
return /* @__PURE__ */ jsx3(
|
|
384
|
+
"svg",
|
|
385
|
+
{
|
|
386
|
+
"aria-hidden": true,
|
|
387
|
+
width: "10",
|
|
388
|
+
height: "5",
|
|
389
|
+
viewBox: "0 0 10 5",
|
|
390
|
+
className: cn(
|
|
391
|
+
"absolute text-zinc-900 dark:text-zinc-100",
|
|
392
|
+
position
|
|
393
|
+
),
|
|
394
|
+
children: /* @__PURE__ */ jsx3("path", { fill: "currentColor", d: "M0 0h10L5 5 0 0z" })
|
|
395
|
+
}
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
function Tooltip({
|
|
399
|
+
content,
|
|
400
|
+
children,
|
|
401
|
+
side = "top",
|
|
402
|
+
align = "center",
|
|
403
|
+
sideOffset = 8,
|
|
404
|
+
delayDuration = 250,
|
|
405
|
+
disabled = false,
|
|
406
|
+
className
|
|
407
|
+
}) {
|
|
408
|
+
const [open, setOpen] = React3.useState(false);
|
|
409
|
+
const [visible, setVisible] = React3.useState(false);
|
|
410
|
+
const [mounted, setMounted] = React3.useState(false);
|
|
411
|
+
const [position, setPosition] = React3.useState({ top: -9999, left: -9999 });
|
|
412
|
+
const timeoutRef = React3.useRef(null);
|
|
413
|
+
const triggerRef = React3.useRef(null);
|
|
414
|
+
const tooltipRef = React3.useRef(null);
|
|
415
|
+
const id = React3.useId();
|
|
416
|
+
React3.useEffect(() => setMounted(true), []);
|
|
417
|
+
const clearTimer = () => {
|
|
418
|
+
if (timeoutRef.current) {
|
|
419
|
+
clearTimeout(timeoutRef.current);
|
|
420
|
+
timeoutRef.current = null;
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
const updatePosition = React3.useCallback(() => {
|
|
424
|
+
const trigger2 = triggerRef.current;
|
|
425
|
+
const tooltip = tooltipRef.current;
|
|
426
|
+
if (!trigger2 || !tooltip) return;
|
|
427
|
+
const triggerRect = trigger2.getBoundingClientRect();
|
|
428
|
+
const tooltipRect = tooltip.getBoundingClientRect();
|
|
429
|
+
setPosition(getTooltipPosition(triggerRect, tooltipRect, side, align, sideOffset));
|
|
430
|
+
requestAnimationFrame(() => setVisible(true));
|
|
431
|
+
}, [side, align, sideOffset]);
|
|
432
|
+
const show = () => {
|
|
433
|
+
if (disabled) return;
|
|
434
|
+
clearTimer();
|
|
435
|
+
timeoutRef.current = setTimeout(() => {
|
|
436
|
+
setVisible(false);
|
|
437
|
+
setOpen(true);
|
|
438
|
+
}, delayDuration);
|
|
439
|
+
};
|
|
440
|
+
const hide = () => {
|
|
441
|
+
clearTimer();
|
|
442
|
+
setVisible(false);
|
|
443
|
+
setOpen(false);
|
|
444
|
+
};
|
|
445
|
+
React3.useEffect(() => clearTimer, []);
|
|
446
|
+
React3.useLayoutEffect(() => {
|
|
447
|
+
if (!open) return;
|
|
448
|
+
updatePosition();
|
|
449
|
+
const handleUpdate = () => updatePosition();
|
|
450
|
+
window.addEventListener("scroll", handleUpdate, true);
|
|
451
|
+
window.addEventListener("resize", handleUpdate);
|
|
452
|
+
return () => {
|
|
453
|
+
window.removeEventListener("scroll", handleUpdate, true);
|
|
454
|
+
window.removeEventListener("resize", handleUpdate);
|
|
455
|
+
};
|
|
456
|
+
}, [open, updatePosition, content]);
|
|
457
|
+
const child = React3.Children.only(children);
|
|
458
|
+
const trigger = React3.isValidElement(child) ? React3.cloneElement(
|
|
459
|
+
child,
|
|
460
|
+
{ "aria-describedby": open && visible ? id : void 0 }
|
|
461
|
+
) : children;
|
|
462
|
+
const tooltipNode = open ? /* @__PURE__ */ jsxs3(
|
|
463
|
+
"div",
|
|
464
|
+
{
|
|
465
|
+
ref: tooltipRef,
|
|
466
|
+
id,
|
|
467
|
+
role: "tooltip",
|
|
468
|
+
"aria-hidden": !visible,
|
|
469
|
+
style: { top: position.top, left: position.left },
|
|
470
|
+
className: cn(tooltipVariants({ visible, side }), className),
|
|
471
|
+
children: [
|
|
472
|
+
content,
|
|
473
|
+
/* @__PURE__ */ jsx3(TooltipArrow, { side })
|
|
474
|
+
]
|
|
475
|
+
}
|
|
476
|
+
) : null;
|
|
477
|
+
return /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
478
|
+
/* @__PURE__ */ jsx3(
|
|
479
|
+
"span",
|
|
480
|
+
{
|
|
481
|
+
ref: triggerRef,
|
|
482
|
+
className: "inline-flex",
|
|
483
|
+
onMouseEnter: show,
|
|
484
|
+
onMouseLeave: hide,
|
|
485
|
+
onFocus: show,
|
|
486
|
+
onBlur: hide,
|
|
487
|
+
children: trigger
|
|
488
|
+
}
|
|
489
|
+
),
|
|
490
|
+
mounted && tooltipNode ? createPortal(tooltipNode, document.body) : null
|
|
491
|
+
] });
|
|
492
|
+
}
|
|
493
|
+
export {
|
|
494
|
+
Progress,
|
|
495
|
+
Switch,
|
|
496
|
+
Tooltip
|
|
497
|
+
};
|
|
498
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/ui/progress.tsx","../lib/cn.ts","../components/ui/switch.tsx","../components/ui/tooltip.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\n\nconst progressTrackVariants = cva(\n \"relative w-full overflow-hidden rounded-full bg-zinc-100 dark:bg-zinc-800/70\",\n {\n variants: {\n size: {\n sm: \"h-1\",\n md: \"h-1.5\",\n lg: \"h-2\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\nconst progressIndicatorVariants = cva(\n \"h-full rounded-full transition-[width] duration-500 ease-[cubic-bezier(0.4,0,0.2,1)]\",\n {\n variants: {\n variant: {\n default: \"bg-zinc-900 dark:bg-zinc-100\",\n success: \"bg-[#28A745] dark:bg-[#5CC975]\",\n warning: \"bg-[#E58E00] dark:bg-[#F5B84A]\",\n error: \"bg-[#D93025] dark:bg-[#F06B62]\",\n },\n },\n defaultVariants: { variant: \"default\" },\n },\n);\n\nconst valuePillVariants = cva(\n \"inline-flex min-w-[2.25rem] items-center justify-end text-[11px] font-medium tabular-nums text-zinc-400 dark:text-zinc-500\",\n {\n variants: {\n variant: {\n default: \"\",\n success: \"\",\n warning: \"\",\n error: \"\",\n },\n },\n defaultVariants: { variant: \"default\" },\n },\n);\n\nexport interface ProgressProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\">,\n VariantProps<typeof progressTrackVariants>,\n VariantProps<typeof progressIndicatorVariants> {\n value?: number;\n max?: number;\n label?: string;\n showValue?: boolean;\n indeterminate?: boolean;\n disabled?: boolean;\n}\n\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n className,\n value = 0,\n max = 100,\n variant,\n size,\n label,\n showValue = false,\n indeterminate = false,\n disabled = false,\n ...props\n },\n ref,\n ) => {\n const clamped = Math.min(max, Math.max(0, value));\n const percentage = max > 0 ? Math.round((clamped / max) * 100) : 0;\n\n return (\n <div\n className={cn(\n \"flex w-full flex-col gap-2.5\",\n disabled && \"pointer-events-none opacity-50\",\n className,\n )}\n >\n {(label || showValue) && (\n <div className=\"flex items-center justify-between gap-3\">\n {label && (\n <span className=\"text-sm text-zinc-600 dark:text-zinc-300\">\n {label}\n </span>\n )}\n {showValue && !indeterminate && (\n <span className={cn(valuePillVariants({ variant }))}>\n {percentage}%\n </span>\n )}\n </div>\n )}\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate || disabled ? undefined : clamped}\n aria-label={label}\n aria-valuetext={indeterminate ? \"Loading\" : `${percentage}%`}\n aria-disabled={disabled || undefined}\n className={cn(progressTrackVariants({ size }))}\n {...props}\n >\n {indeterminate ? (\n <div\n className={cn(\n progressIndicatorVariants({ variant }),\n \"w-[40%] animate-[progress-indeterminate_1.5s_ease-in-out_infinite]\",\n )}\n />\n ) : (\n <div\n className={cn(progressIndicatorVariants({ variant }))}\n style={{ width: `${percentage}%` }}\n />\n )}\n </div>\n </div>\n );\n },\n);\nProgress.displayName = \"Progress\";\n\nexport { Progress, progressTrackVariants, progressIndicatorVariants };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\n\nconst switchTrackVariants = cva(\n [\n \"relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent transition-colors duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-900/20 focus-visible:ring-offset-2 focus-visible:ring-offset-white\",\n \"dark:focus-visible:ring-zinc-100/20 dark:focus-visible:ring-offset-zinc-950\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:bg-zinc-900 data-[state=unchecked]:bg-zinc-200\",\n \"dark:data-[state=checked]:bg-zinc-100 dark:data-[state=unchecked]:bg-zinc-700\",\n \"hover:data-[state=unchecked]:bg-zinc-300 dark:hover:data-[state=unchecked]:bg-zinc-600\",\n \"hover:data-[state=checked]:bg-zinc-800 dark:hover:data-[state=checked]:bg-zinc-200\",\n ],\n {\n variants: {\n size: {\n sm: \"h-5 w-9\",\n md: \"h-6 w-11\",\n lg: \"h-7 w-[3.25rem]\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\nconst switchThumbVariants = cva(\n \"pointer-events-none absolute left-0.5 top-1/2 block -translate-y-1/2 rounded-full bg-white shadow-sm transition-transform duration-200 dark:bg-zinc-950\",\n {\n variants: {\n size: {\n sm: \"h-3.5 w-3.5 data-[state=checked]:translate-x-4\",\n md: \"h-4 w-4 data-[state=checked]:translate-x-5\",\n lg: \"h-5 w-5 data-[state=checked]:translate-x-6\",\n },\n },\n defaultVariants: { size: \"md\" },\n },\n);\n\nexport interface SwitchProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\" | \"size\">,\n VariantProps<typeof switchTrackVariants> {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n label?: string;\n description?: string;\n}\n\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n className,\n size,\n checked,\n defaultChecked = false,\n onCheckedChange,\n disabled,\n label,\n description,\n id,\n onClick,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const switchId = id ?? generatedId;\n const isControlled = checked !== undefined;\n const [uncontrolledChecked, setUncontrolledChecked] = React.useState(defaultChecked);\n const isChecked = isControlled ? checked : uncontrolledChecked;\n const state = isChecked ? \"checked\" : \"unchecked\";\n\n const toggle = () => {\n if (disabled) return;\n const next = !isChecked;\n if (!isControlled) setUncontrolledChecked(next);\n onCheckedChange?.(next);\n };\n\n const switchControl = (\n <button\n ref={ref}\n id={switchId}\n type=\"button\"\n role=\"switch\"\n aria-checked={isChecked}\n aria-labelledby={label ? `${switchId}-label` : undefined}\n aria-describedby={description ? `${switchId}-description` : undefined}\n disabled={disabled}\n data-state={state}\n className={cn(switchTrackVariants({ size }), className)}\n onClick={(event) => {\n toggle();\n onClick?.(event);\n }}\n onKeyDown={(event) => {\n if (event.key === \" \") {\n event.preventDefault();\n toggle();\n }\n }}\n {...props}\n >\n <span data-state={state} className={switchThumbVariants({ size })} />\n </button>\n );\n\n if (!label && !description) {\n return switchControl;\n }\n\n return (\n <div\n className={cn(\n \"flex items-start justify-between gap-4\",\n disabled && \"opacity-60\",\n )}\n >\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n {label && (\n <label\n id={`${switchId}-label`}\n htmlFor={switchId}\n className={cn(\n \"text-sm font-medium leading-snug text-zinc-800 dark:text-zinc-100\",\n !disabled && \"cursor-pointer\",\n )}\n >\n {label}\n </label>\n )}\n {description && (\n <p\n id={`${switchId}-description`}\n className=\"text-xs leading-relaxed text-zinc-500 dark:text-zinc-400\"\n >\n {description}\n </p>\n )}\n </div>\n {switchControl}\n </div>\n );\n },\n);\nSwitch.displayName = \"Switch\";\n\nexport { Switch, switchTrackVariants, switchThumbVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\n\nconst tooltipVariants = cva(\n [\n \"pointer-events-none fixed z-50 max-w-[260px] rounded-lg px-3 py-2\",\n \"text-[13px] font-medium leading-normal tracking-tight\",\n \"bg-zinc-900 text-zinc-50\",\n \"shadow-[0_4px_16px_rgba(0,0,0,0.14),0_0_0_1px_rgba(255,255,255,0.06)]\",\n \"dark:bg-zinc-100 dark:text-zinc-900\",\n \"dark:shadow-[0_4px_16px_rgba(0,0,0,0.35),0_0_0_1px_rgba(0,0,0,0.06)]\",\n \"transition-[opacity,transform] duration-200 ease-[cubic-bezier(0.16,1,0.3,1)]\",\n \"will-change-[opacity,transform]\",\n ],\n {\n variants: {\n visible: {\n true: \"opacity-100 scale-100\",\n false: \"opacity-0 scale-[0.97]\",\n },\n side: {\n top: \"origin-bottom\",\n bottom: \"origin-top\",\n left: \"origin-right\",\n right: \"origin-left\",\n },\n },\n defaultVariants: { visible: false, side: \"top\" },\n },\n);\n\ntype TooltipSide = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype TooltipAlign = \"start\" | \"center\" | \"end\";\n\nconst VIEWPORT_PADDING = 10;\nconst ARROW_SIZE = 6;\n\nexport interface TooltipProps extends VariantProps<typeof tooltipVariants> {\n content: React.ReactNode;\n children: React.ReactNode;\n side?: TooltipSide;\n align?: TooltipAlign;\n sideOffset?: number;\n delayDuration?: number;\n disabled?: boolean;\n className?: string;\n}\n\nfunction getTooltipPosition(\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n side: TooltipSide,\n align: TooltipAlign,\n sideOffset: number,\n) {\n const offset = sideOffset + ARROW_SIZE;\n let top = 0;\n let left = 0;\n\n if (side === \"top\") {\n top = triggerRect.top - tooltipRect.height - offset;\n left = alignTooltipHorizontal(triggerRect, tooltipRect, align);\n } else if (side === \"bottom\") {\n top = triggerRect.bottom + offset;\n left = alignTooltipHorizontal(triggerRect, tooltipRect, align);\n } else if (side === \"left\") {\n top = alignTooltipVertical(triggerRect, tooltipRect, align);\n left = triggerRect.left - tooltipRect.width - offset;\n } else {\n top = alignTooltipVertical(triggerRect, tooltipRect, align);\n left = triggerRect.right + offset;\n }\n\n const maxLeft = window.innerWidth - tooltipRect.width - VIEWPORT_PADDING;\n const maxTop = window.innerHeight - tooltipRect.height - VIEWPORT_PADDING;\n\n return {\n top: Math.min(Math.max(top, VIEWPORT_PADDING), maxTop),\n left: Math.min(Math.max(left, VIEWPORT_PADDING), maxLeft),\n };\n}\n\nfunction alignTooltipHorizontal(\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n align: TooltipAlign,\n) {\n if (align === \"start\") return triggerRect.left;\n if (align === \"end\") return triggerRect.right - tooltipRect.width;\n return triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n}\n\nfunction alignTooltipVertical(\n triggerRect: DOMRect,\n tooltipRect: DOMRect,\n align: TooltipAlign,\n) {\n if (align === \"start\") return triggerRect.top;\n if (align === \"end\") return triggerRect.bottom - tooltipRect.height;\n return triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n}\n\nfunction TooltipArrow({ side }: { side: TooltipSide }) {\n const position = {\n top: \"bottom-0 left-1/2 -translate-x-1/2 translate-y-[calc(100%-1px)]\",\n bottom: \"top-0 left-1/2 -translate-x-1/2 -translate-y-[calc(100%-1px)] rotate-180\",\n left: \"right-0 top-1/2 -translate-y-1/2 translate-x-[calc(100%-1px)] -rotate-90\",\n right: \"left-0 top-1/2 -translate-y-1/2 -translate-x-[calc(100%-1px)] rotate-90\",\n }[side];\n\n return (\n <svg\n aria-hidden\n width=\"10\"\n height=\"5\"\n viewBox=\"0 0 10 5\"\n className={cn(\n \"absolute text-zinc-900 dark:text-zinc-100\",\n position,\n )}\n >\n <path fill=\"currentColor\" d=\"M0 0h10L5 5 0 0z\" />\n </svg>\n );\n}\n\nfunction Tooltip({\n content,\n children,\n side = \"top\",\n align = \"center\",\n sideOffset = 8,\n delayDuration = 250,\n disabled = false,\n className,\n}: TooltipProps) {\n const [open, setOpen] = React.useState(false);\n const [visible, setVisible] = React.useState(false);\n const [mounted, setMounted] = React.useState(false);\n const [position, setPosition] = React.useState({ top: -9999, left: -9999 });\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const triggerRef = React.useRef<HTMLSpanElement>(null);\n const tooltipRef = React.useRef<HTMLDivElement>(null);\n const id = React.useId();\n\n React.useEffect(() => setMounted(true), []);\n\n const clearTimer = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n };\n\n const updatePosition = React.useCallback(() => {\n const trigger = triggerRef.current;\n const tooltip = tooltipRef.current;\n if (!trigger || !tooltip) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const tooltipRect = tooltip.getBoundingClientRect();\n setPosition(getTooltipPosition(triggerRect, tooltipRect, side, align, sideOffset));\n requestAnimationFrame(() => setVisible(true));\n }, [side, align, sideOffset]);\n\n const show = () => {\n if (disabled) return;\n clearTimer();\n timeoutRef.current = setTimeout(() => {\n setVisible(false);\n setOpen(true);\n }, delayDuration);\n };\n\n const hide = () => {\n clearTimer();\n setVisible(false);\n setOpen(false);\n };\n\n React.useEffect(() => clearTimer, []);\n\n React.useLayoutEffect(() => {\n if (!open) return;\n updatePosition();\n const handleUpdate = () => updatePosition();\n window.addEventListener(\"scroll\", handleUpdate, true);\n window.addEventListener(\"resize\", handleUpdate);\n return () => {\n window.removeEventListener(\"scroll\", handleUpdate, true);\n window.removeEventListener(\"resize\", handleUpdate);\n };\n }, [open, updatePosition, content]);\n\n const child = React.Children.only(children);\n const trigger = React.isValidElement(child)\n ? React.cloneElement(\n child as React.ReactElement<{ \"aria-describedby\"?: string }>,\n { \"aria-describedby\": open && visible ? id : undefined },\n )\n : children;\n\n const tooltipNode = open ? (\n <div\n ref={tooltipRef}\n id={id}\n role=\"tooltip\"\n aria-hidden={!visible}\n style={{ top: position.top, left: position.left }}\n className={cn(tooltipVariants({ visible, side }), className)}\n >\n {content}\n <TooltipArrow side={side} />\n </div>\n ) : null;\n\n return (\n <>\n <span\n ref={triggerRef}\n className=\"inline-flex\"\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n {trigger}\n </span>\n {mounted && tooltipNode ? createPortal(tooltipNode, document.body) : null}\n </>\n );\n}\n\nexport { Tooltip, tooltipVariants };\n"],"mappings":"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","names":["React","cva","jsx","jsxs","cva","React","cva","jsx","jsxs","cva","trigger"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ruler-components",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"module": "./dist/index.mjs",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
4
17
|
"scripts": {
|
|
5
18
|
"dev": "next dev",
|
|
6
19
|
"build": "next build",
|
|
7
20
|
"start": "next start",
|
|
8
|
-
"lint": "eslint"
|
|
21
|
+
"lint": "eslint",
|
|
22
|
+
"build:lib": "tsup"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"react": ">=18",
|
|
26
|
+
"react-dom": ">=18"
|
|
9
27
|
},
|
|
10
28
|
"dependencies": {
|
|
11
29
|
"class-variance-authority": "^0.7.1",
|
|
@@ -25,6 +43,7 @@
|
|
|
25
43
|
"eslint": "^9",
|
|
26
44
|
"eslint-config-next": "16.3.0",
|
|
27
45
|
"tailwindcss": "^4",
|
|
46
|
+
"tsup": "^8.5.0",
|
|
28
47
|
"typescript": "^5"
|
|
29
48
|
}
|
|
30
49
|
}
|
package/AGENTS.md
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
<!-- BEGIN:nextjs-agent-rules -->
|
|
2
|
-
|
|
3
|
-
# This is NOT the Next.js you know
|
|
4
|
-
|
|
5
|
-
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
|
|
6
|
-
|
|
7
|
-
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
|
|
8
|
-
|
|
9
|
-
<!-- END:nextjs-agent-rules -->
|
package/CLAUDE.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@AGENTS.md
|