ruler-components 0.1.1 → 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.
Files changed (118) hide show
  1. package/dist/index.d.mts +51 -0
  2. package/dist/index.d.ts +51 -0
  3. package/dist/index.js +534 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +498 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +21 -2
  8. package/AGENTS.md +0 -9
  9. package/CLAUDE.md +0 -1
  10. package/app/docs/[slug]/page.tsx +0 -147
  11. package/app/docs/layout.tsx +0 -26
  12. package/app/docs/page.tsx +0 -148
  13. package/app/favicon.ico +0 -0
  14. package/app/globals.css +0 -168
  15. package/app/icon.png +0 -0
  16. package/app/layout.tsx +0 -90
  17. package/app/opengraph-image.tsx +0 -10
  18. package/app/page.tsx +0 -34
  19. package/app/twitter-image.tsx +0 -10
  20. package/components/docs/accordion-doc-page.tsx +0 -352
  21. package/components/docs/alert-doc-page.tsx +0 -293
  22. package/components/docs/allinput-doc-page.tsx +0 -183
  23. package/components/docs/avatar-doc-page.tsx +0 -424
  24. package/components/docs/badge-doc-page.tsx +0 -363
  25. package/components/docs/button-doc-page.tsx +0 -406
  26. package/components/docs/card-doc-page.tsx +0 -364
  27. package/components/docs/checkbox-doc-page.tsx +0 -277
  28. package/components/docs/colors-doc-page.tsx +0 -430
  29. package/components/docs/dialog-doc-page.tsx +0 -364
  30. package/components/docs/docs-footer.tsx +0 -11
  31. package/components/docs/docs-mobile-menu-bar.tsx +0 -22
  32. package/components/docs/docs-mobile-nav-context.tsx +0 -27
  33. package/components/docs/docs-page.tsx +0 -263
  34. package/components/docs/docs-search.tsx +0 -303
  35. package/components/docs/docs-sidebar.tsx +0 -165
  36. package/components/docs/docs-topbar.tsx +0 -32
  37. package/components/docs/dropdown-doc-page.tsx +0 -522
  38. package/components/docs/getting-started-doc-page.tsx +0 -205
  39. package/components/docs/label-doc-page.tsx +0 -173
  40. package/components/docs/loaders-doc-page.tsx +0 -244
  41. package/components/docs/menu-doc-page.tsx +0 -373
  42. package/components/docs/modal-doc-page.tsx +0 -436
  43. package/components/docs/next-steps.tsx +0 -53
  44. package/components/docs/pagination-doc-page.tsx +0 -316
  45. package/components/docs/progress-doc-page.tsx +0 -387
  46. package/components/docs/radio-doc-page.tsx +0 -270
  47. package/components/docs/skeleton-doc-page.tsx +0 -230
  48. package/components/docs/stepper-doc-page.tsx +0 -309
  49. package/components/docs/switch-doc-page.tsx +0 -264
  50. package/components/docs/table-doc-page.tsx +0 -689
  51. package/components/docs/tabs-doc-page.tsx +0 -359
  52. package/components/docs/theming-doc-page.tsx +0 -243
  53. package/components/docs/tooltip-doc-page.tsx +0 -357
  54. package/components/docs/usage-section.tsx +0 -21
  55. package/components/icons/discord.tsx +0 -9
  56. package/components/icons/github.tsx +0 -9
  57. package/components/icons/x.tsx +0 -9
  58. package/components/installation-section.tsx +0 -34
  59. package/components/landing/feature-highlights.tsx +0 -105
  60. package/components/landing/footer-strip.tsx +0 -45
  61. package/components/landing/hero-card.tsx +0 -14
  62. package/components/landing/hero-spotlight.tsx +0 -126
  63. package/components/landing/hero.tsx +0 -64
  64. package/components/landing/navbar.tsx +0 -44
  65. package/components/landing/quick-start-section.tsx +0 -59
  66. package/components/landing/site-footer.tsx +0 -55
  67. package/components/theme-provider.tsx +0 -60
  68. package/components/ui/accordion.tsx +0 -174
  69. package/components/ui/alert.tsx +0 -103
  70. package/components/ui/allinput.tsx +0 -210
  71. package/components/ui/avatar.tsx +0 -179
  72. package/components/ui/badge.tsx +0 -52
  73. package/components/ui/button.tsx +0 -75
  74. package/components/ui/card.tsx +0 -105
  75. package/components/ui/checkbox.tsx +0 -130
  76. package/components/ui/code-block.tsx +0 -60
  77. package/components/ui/data-table.tsx +0 -235
  78. package/components/ui/dialog.tsx +0 -173
  79. package/components/ui/dropdown.tsx +0 -78
  80. package/components/ui/feature-card.tsx +0 -38
  81. package/components/ui/input.tsx +0 -44
  82. package/components/ui/label.tsx +0 -110
  83. package/components/ui/loaders.tsx +0 -139
  84. package/components/ui/menu.tsx +0 -118
  85. package/components/ui/modal.tsx +0 -399
  86. package/components/ui/package-manager-tabs.tsx +0 -40
  87. package/components/ui/pagination.tsx +0 -200
  88. package/components/ui/progress.tsx +0 -134
  89. package/components/ui/radio.tsx +0 -262
  90. package/components/ui/skeleton.tsx +0 -102
  91. package/components/ui/steppers.tsx +0 -309
  92. package/components/ui/switch.tsx +0 -153
  93. package/components/ui/table.tsx +0 -58
  94. package/components/ui/tabs.tsx +0 -166
  95. package/components/ui/theme-toggle.tsx +0 -60
  96. package/components/ui/tooltip.tsx +0 -238
  97. package/data/color-palette.ts +0 -35
  98. package/data/docs-nav.ts +0 -84
  99. package/eslint.config.mjs +0 -18
  100. package/index.ts +0 -8
  101. package/lib/cn.ts +0 -4
  102. package/lib/color.ts +0 -85
  103. package/lib/og-image.tsx +0 -138
  104. package/lib/theme.ts +0 -33
  105. package/next.config.ts +0 -7
  106. package/postcss.config.mjs +0 -7
  107. package/public/dark.png +0 -0
  108. package/public/dark1.png +0 -0
  109. package/public/dark2.png +0 -0
  110. package/public/file.svg +0 -1
  111. package/public/globe.svg +0 -1
  112. package/public/light.png +0 -0
  113. package/public/light1.png +0 -0
  114. package/public/next.svg +0 -1
  115. package/public/vercel.svg +0 -1
  116. package/public/video/hero-demo.mp4 +0 -0
  117. package/public/window.svg +0 -1
  118. 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.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