react-marketing-ui 0.0.1
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/README.md +34 -0
- package/dist/accordion.d.cts +21 -0
- package/dist/accordion.d.ts +21 -0
- package/dist/accordion.d.ts.map +1 -0
- package/dist/accordion.js +230 -0
- package/dist/accordion.js.map +1 -0
- package/dist/accordion.mjs +4 -0
- package/dist/accordion.mjs.map +1 -0
- package/dist/action-swap.d.cts +23 -0
- package/dist/action-swap.d.ts +23 -0
- package/dist/action-swap.d.ts.map +1 -0
- package/dist/action-swap.js +81 -0
- package/dist/action-swap.js.map +1 -0
- package/dist/action-swap.mjs +5 -0
- package/dist/action-swap.mjs.map +1 -0
- package/dist/animated-beam.d.cts +24 -0
- package/dist/animated-beam.d.ts +24 -0
- package/dist/animated-beam.d.ts.map +1 -0
- package/dist/animated-beam.js +130 -0
- package/dist/animated-beam.js.map +1 -0
- package/dist/animated-beam.mjs +4 -0
- package/dist/animated-beam.mjs.map +1 -0
- package/dist/button.d.cts +55 -0
- package/dist/button.d.ts +55 -0
- package/dist/button.d.ts.map +1 -0
- package/dist/button.js +119 -0
- package/dist/button.js.map +1 -0
- package/dist/button.mjs +4 -0
- package/dist/button.mjs.map +1 -0
- package/dist/card.d.cts +20 -0
- package/dist/card.d.ts +20 -0
- package/dist/card.d.ts.map +1 -0
- package/dist/card.js +146 -0
- package/dist/card.js.map +1 -0
- package/dist/card.mjs +5 -0
- package/dist/card.mjs.map +1 -0
- package/dist/chunk-3SB6HUBA.mjs +31 -0
- package/dist/chunk-3SB6HUBA.mjs.map +1 -0
- package/dist/chunk-4PBVBXGY.mjs +84 -0
- package/dist/chunk-4PBVBXGY.mjs.map +1 -0
- package/dist/chunk-4VCFWVSJ.mjs +42 -0
- package/dist/chunk-4VCFWVSJ.mjs.map +1 -0
- package/dist/chunk-5QQAPGR2.mjs +109 -0
- package/dist/chunk-5QQAPGR2.mjs.map +1 -0
- package/dist/chunk-6MB4UKRX.mjs +19 -0
- package/dist/chunk-6MB4UKRX.mjs.map +1 -0
- package/dist/chunk-6T5LR34O.mjs +45 -0
- package/dist/chunk-6T5LR34O.mjs.map +1 -0
- package/dist/chunk-AYLCYDUM.mjs +275 -0
- package/dist/chunk-AYLCYDUM.mjs.map +1 -0
- package/dist/chunk-AYY7D2RJ.mjs +112 -0
- package/dist/chunk-AYY7D2RJ.mjs.map +1 -0
- package/dist/chunk-CTZEI2YS.mjs +324 -0
- package/dist/chunk-CTZEI2YS.mjs.map +1 -0
- package/dist/chunk-DA3I3Y5O.mjs +71 -0
- package/dist/chunk-DA3I3Y5O.mjs.map +1 -0
- package/dist/chunk-EYHT2EWJ.mjs +18 -0
- package/dist/chunk-EYHT2EWJ.mjs.map +1 -0
- package/dist/chunk-IHLGCS63.mjs +36 -0
- package/dist/chunk-IHLGCS63.mjs.map +1 -0
- package/dist/chunk-JVXJ6SFX.mjs +38 -0
- package/dist/chunk-JVXJ6SFX.mjs.map +1 -0
- package/dist/chunk-KBHYXLRG.mjs +13 -0
- package/dist/chunk-KBHYXLRG.mjs.map +1 -0
- package/dist/chunk-KMXUQYR3.mjs +74 -0
- package/dist/chunk-KMXUQYR3.mjs.map +1 -0
- package/dist/chunk-KNPOZ34H.mjs +88 -0
- package/dist/chunk-KNPOZ34H.mjs.map +1 -0
- package/dist/chunk-KRNWCJ4D.mjs +219 -0
- package/dist/chunk-KRNWCJ4D.mjs.map +1 -0
- package/dist/chunk-M5MESV26.mjs +124 -0
- package/dist/chunk-M5MESV26.mjs.map +1 -0
- package/dist/chunk-MJYBPJBA.mjs +115 -0
- package/dist/chunk-MJYBPJBA.mjs.map +1 -0
- package/dist/chunk-NNHPQ67J.mjs +10 -0
- package/dist/chunk-NNHPQ67J.mjs.map +1 -0
- package/dist/chunk-OCZFHVVD.mjs +71 -0
- package/dist/chunk-OCZFHVVD.mjs.map +1 -0
- package/dist/chunk-QAWSH567.mjs +19 -0
- package/dist/chunk-QAWSH567.mjs.map +1 -0
- package/dist/chunk-R2E2J42H.mjs +38 -0
- package/dist/chunk-R2E2J42H.mjs.map +1 -0
- package/dist/chunk-TPGLLSYV.mjs +65 -0
- package/dist/chunk-TPGLLSYV.mjs.map +1 -0
- package/dist/chunk-VJENJHXJ.mjs +72 -0
- package/dist/chunk-VJENJHXJ.mjs.map +1 -0
- package/dist/chunk-W22G7XHR.mjs +104 -0
- package/dist/chunk-W22G7XHR.mjs.map +1 -0
- package/dist/chunk-WDR5VPZJ.mjs +79 -0
- package/dist/chunk-WDR5VPZJ.mjs.map +1 -0
- package/dist/chunk-WLUGKBH7.mjs +37 -0
- package/dist/chunk-WLUGKBH7.mjs.map +1 -0
- package/dist/chunk-WYJYLDUA.mjs +84 -0
- package/dist/chunk-WYJYLDUA.mjs.map +1 -0
- package/dist/chunk-XZEDZVXT.mjs +38 -0
- package/dist/chunk-XZEDZVXT.mjs.map +1 -0
- package/dist/chunk-YKGP5JIL.mjs +328 -0
- package/dist/chunk-YKGP5JIL.mjs.map +1 -0
- package/dist/chunk-YM3U2OBE.mjs +99 -0
- package/dist/chunk-YM3U2OBE.mjs.map +1 -0
- package/dist/dia-text-reveal.css +18 -0
- package/dist/dia-text-reveal.css.map +1 -0
- package/dist/dia-text-reveal.d.cts +37 -0
- package/dist/dia-text-reveal.d.ts +37 -0
- package/dist/dia-text-reveal.d.ts.map +1 -0
- package/dist/dia-text-reveal.js +334 -0
- package/dist/dia-text-reveal.js.map +1 -0
- package/dist/dia-text-reveal.lines.d.cts +23 -0
- package/dist/dia-text-reveal.lines.d.ts +23 -0
- package/dist/dia-text-reveal.lines.d.ts.map +1 -0
- package/dist/dia-text-reveal.mjs +4 -0
- package/dist/dia-text-reveal.mjs.map +1 -0
- package/dist/dia-text-reveal.sweep.d.cts +49 -0
- package/dist/dia-text-reveal.sweep.d.ts +49 -0
- package/dist/dia-text-reveal.sweep.d.ts.map +1 -0
- package/dist/dia-text-reveal.utils.d.cts +3 -0
- package/dist/dia-text-reveal.utils.d.ts +3 -0
- package/dist/dia-text-reveal.utils.d.ts.map +1 -0
- package/dist/elevated-input.d.cts +11 -0
- package/dist/elevated-input.d.ts +11 -0
- package/dist/elevated-input.d.ts.map +1 -0
- package/dist/elevated-input.js +52 -0
- package/dist/elevated-input.js.map +1 -0
- package/dist/elevated-input.mjs +4 -0
- package/dist/elevated-input.mjs.map +1 -0
- package/dist/fade-in.d.cts +43 -0
- package/dist/fade-in.d.ts +43 -0
- package/dist/fade-in.d.ts.map +1 -0
- package/dist/fade-in.js +89 -0
- package/dist/fade-in.js.map +1 -0
- package/dist/fade-in.mjs +4 -0
- package/dist/fade-in.mjs.map +1 -0
- package/dist/feature-card.d.cts +23 -0
- package/dist/feature-card.d.ts +23 -0
- package/dist/feature-card.d.ts.map +1 -0
- package/dist/feature-card.js +38 -0
- package/dist/feature-card.js.map +1 -0
- package/dist/feature-card.mjs +4 -0
- package/dist/feature-card.mjs.map +1 -0
- package/dist/flowchart-parts.d.cts +61 -0
- package/dist/flowchart-parts.d.ts +61 -0
- package/dist/flowchart-parts.d.ts.map +1 -0
- package/dist/flowchart-parts.js +102 -0
- package/dist/flowchart-parts.js.map +1 -0
- package/dist/flowchart-parts.mjs +4 -0
- package/dist/flowchart-parts.mjs.map +1 -0
- package/dist/glossy-button.d.cts +21 -0
- package/dist/glossy-button.d.ts +21 -0
- package/dist/glossy-button.d.ts.map +1 -0
- package/dist/glossy-button.js +87 -0
- package/dist/glossy-button.js.map +1 -0
- package/dist/glossy-button.mjs +4 -0
- package/dist/glossy-button.mjs.map +1 -0
- package/dist/grainient.css +9 -0
- package/dist/grainient.css.map +1 -0
- package/dist/grainient.d.cts +5 -0
- package/dist/grainient.d.ts +5 -0
- package/dist/grainient.d.ts.map +1 -0
- package/dist/grainient.js +330 -0
- package/dist/grainient.js.map +1 -0
- package/dist/grainient.mjs +4 -0
- package/dist/grainient.mjs.map +1 -0
- package/dist/grainient.shader.d.cts +9 -0
- package/dist/grainient.shader.d.ts +9 -0
- package/dist/grainient.shader.d.ts.map +1 -0
- package/dist/grainient.types.d.cts +30 -0
- package/dist/grainient.types.d.ts +30 -0
- package/dist/grainient.types.d.ts.map +1 -0
- package/dist/highlighter.d.cts +47 -0
- package/dist/highlighter.d.ts +47 -0
- package/dist/highlighter.d.ts.map +1 -0
- package/dist/highlighter.js +125 -0
- package/dist/highlighter.js.map +1 -0
- package/dist/highlighter.mjs +5 -0
- package/dist/highlighter.mjs.map +1 -0
- package/dist/index.css +27 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +56 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2723 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +34 -0
- package/dist/index.mjs.map +1 -0
- package/dist/input.d.cts +15 -0
- package/dist/input.d.ts +15 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +110 -0
- package/dist/input.js.map +1 -0
- package/dist/input.mjs +4 -0
- package/dist/input.mjs.map +1 -0
- package/dist/lib/breakpoints.d.cts +36 -0
- package/dist/lib/breakpoints.d.ts +36 -0
- package/dist/lib/breakpoints.d.ts.map +1 -0
- package/dist/lib/breakpoints.js +41 -0
- package/dist/lib/breakpoints.js.map +1 -0
- package/dist/lib/breakpoints.mjs +3 -0
- package/dist/lib/breakpoints.mjs.map +1 -0
- package/dist/lib/cn.js +24 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/cn.mjs +3 -0
- package/dist/lib/cn.mjs.map +1 -0
- package/dist/lib/ease.d.cts +19 -0
- package/dist/lib/ease.d.ts +19 -0
- package/dist/lib/ease.d.ts.map +1 -0
- package/dist/lib/ease.js +16 -0
- package/dist/lib/ease.js.map +1 -0
- package/dist/lib/ease.mjs +3 -0
- package/dist/lib/ease.mjs.map +1 -0
- package/dist/lib/surface.d.cts +14 -0
- package/dist/lib/surface.d.ts +14 -0
- package/dist/lib/surface.d.ts.map +1 -0
- package/dist/lib/surface.js +40 -0
- package/dist/lib/surface.js.map +1 -0
- package/dist/lib/surface.mjs +3 -0
- package/dist/lib/surface.mjs.map +1 -0
- package/dist/lib/use-media-query.d.cts +9 -0
- package/dist/lib/use-media-query.d.ts +9 -0
- package/dist/lib/use-media-query.d.ts.map +1 -0
- package/dist/lib/use-media-query.js +19 -0
- package/dist/lib/use-media-query.js.map +1 -0
- package/dist/lib/use-media-query.mjs +3 -0
- package/dist/lib/use-media-query.mjs.map +1 -0
- package/dist/lib/utils.d.cts +25 -0
- package/dist/lib/utils.d.ts +25 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/liquid-metal.d.cts +24 -0
- package/dist/liquid-metal.d.ts +24 -0
- package/dist/liquid-metal.d.ts.map +1 -0
- package/dist/liquid-metal.js +43 -0
- package/dist/liquid-metal.js.map +1 -0
- package/dist/liquid-metal.mjs +4 -0
- package/dist/liquid-metal.mjs.map +1 -0
- package/dist/navigation-menu-icons.d.cts +5 -0
- package/dist/navigation-menu-icons.d.ts +5 -0
- package/dist/navigation-menu-icons.d.ts.map +1 -0
- package/dist/navigation-menu-icons.js +42 -0
- package/dist/navigation-menu-icons.js.map +1 -0
- package/dist/navigation-menu-icons.mjs +3 -0
- package/dist/navigation-menu-icons.mjs.map +1 -0
- package/dist/navigation-menu-styles.d.cts +45 -0
- package/dist/navigation-menu-styles.d.ts +45 -0
- package/dist/navigation-menu-styles.d.ts.map +1 -0
- package/dist/navigation-menu-styles.js +16 -0
- package/dist/navigation-menu-styles.js.map +1 -0
- package/dist/navigation-menu-styles.mjs +3 -0
- package/dist/navigation-menu-styles.mjs.map +1 -0
- package/dist/navigation-menu.d.cts +18 -0
- package/dist/navigation-menu.d.ts +18 -0
- package/dist/navigation-menu.d.ts.map +1 -0
- package/dist/navigation-menu.js +367 -0
- package/dist/navigation-menu.js.map +1 -0
- package/dist/navigation-menu.mjs +7 -0
- package/dist/navigation-menu.mjs.map +1 -0
- package/dist/password-input.d.cts +6 -0
- package/dist/password-input.d.ts +6 -0
- package/dist/password-input.d.ts.map +1 -0
- package/dist/password-input.js +174 -0
- package/dist/password-input.js.map +1 -0
- package/dist/password-input.mjs +5 -0
- package/dist/password-input.mjs.map +1 -0
- package/dist/rainbow-button.d.cts +16 -0
- package/dist/rainbow-button.d.ts +16 -0
- package/dist/rainbow-button.d.ts.map +1 -0
- package/dist/rainbow-button.js +49 -0
- package/dist/rainbow-button.js.map +1 -0
- package/dist/rainbow-button.mjs +4 -0
- package/dist/rainbow-button.mjs.map +1 -0
- package/dist/range-slider.d.cts +20 -0
- package/dist/range-slider.d.ts +20 -0
- package/dist/range-slider.d.ts.map +1 -0
- package/dist/range-slider.js +85 -0
- package/dist/range-slider.js.map +1 -0
- package/dist/range-slider.mjs +3 -0
- package/dist/range-slider.mjs.map +1 -0
- package/dist/rolling-badge.d.cts +11 -0
- package/dist/rolling-badge.d.ts +11 -0
- package/dist/rolling-badge.d.ts.map +1 -0
- package/dist/rolling-badge.js +71 -0
- package/dist/rolling-badge.js.map +1 -0
- package/dist/rolling-badge.mjs +4 -0
- package/dist/rolling-badge.mjs.map +1 -0
- package/dist/savings-badge.d.cts +10 -0
- package/dist/savings-badge.d.ts +10 -0
- package/dist/savings-badge.d.ts.map +1 -0
- package/dist/savings-badge.js +26 -0
- package/dist/savings-badge.js.map +1 -0
- package/dist/savings-badge.mjs +4 -0
- package/dist/savings-badge.mjs.map +1 -0
- package/dist/shine-border.d.cts +15 -0
- package/dist/shine-border.d.ts +15 -0
- package/dist/shine-border.d.ts.map +1 -0
- package/dist/shine-border.js +47 -0
- package/dist/shine-border.js.map +1 -0
- package/dist/shine-border.mjs +4 -0
- package/dist/shine-border.mjs.map +1 -0
- package/dist/sparkles-text.d.cts +22 -0
- package/dist/sparkles-text.d.ts +22 -0
- package/dist/sparkles-text.d.ts.map +1 -0
- package/dist/sparkles-text.js +87 -0
- package/dist/sparkles-text.js.map +1 -0
- package/dist/sparkles-text.mjs +5 -0
- package/dist/sparkles-text.mjs.map +1 -0
- package/dist/tabs.d.cts +16 -0
- package/dist/tabs.d.ts +16 -0
- package/dist/tabs.d.ts.map +1 -0
- package/dist/tabs.js +121 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tabs.mjs +4 -0
- package/dist/tabs.mjs.map +1 -0
- package/dist/theme-toggle.d.cts +10 -0
- package/dist/theme-toggle.d.ts +10 -0
- package/dist/theme-toggle.d.ts.map +1 -0
- package/dist/theme-toggle.js +251 -0
- package/dist/theme-toggle.js.map +1 -0
- package/dist/theme-toggle.mjs +7 -0
- package/dist/theme-toggle.mjs.map +1 -0
- package/package.json +428 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/input.tsx","../src/components/password-input.tsx"],"names":["twMerge","clsx","useId","useState","jsxs","jsx","useCallback"],"mappings":"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","file":"password-input.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","'use client';\n\nimport { type InputHTMLAttributes, type ReactNode, useId, useState } from 'react';\nimport { cn } from '../lib/utils.js';\n\nconst FIELD_BORDER: Record<string, string> = {\n idle: 'border-(--color-border)',\n focused: 'border-(--color-foreground)/40',\n error: 'border-(--color-destructive)',\n};\n\nconst FIELD_HEIGHT: Record<string, string> = {\n sm: 'h-8',\n md: 'h-9',\n lg: 'h-11',\n};\n\nconst FIELD_SHAPE: Record<string, string> = {\n rounded: 'rounded-lg',\n pill: 'rounded-full',\n};\n\nconst INPUT_SIZE: Record<string, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n};\n\nconst INPUT_PAD: Record<string, string> = {\n sm: 'px-2.5',\n md: 'px-3',\n lg: 'px-3.5',\n};\n\nexport type InputProps = {\n label?: string;\n error?: string | boolean;\n hint?: string;\n leftAdornment?: ReactNode;\n rightAdornment?: ReactNode;\n size?: 'sm' | 'md' | 'lg';\n shape?: 'rounded' | 'pill';\n className?: string;\n inputClassName?: string;\n inputType?: InputHTMLAttributes<HTMLInputElement>['type'];\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'>;\n\nexport function Input({\n label,\n error,\n hint,\n leftAdornment,\n rightAdornment,\n size = 'md',\n shape = 'rounded',\n className,\n inputClassName,\n inputType = 'text',\n id: idProp,\n onFocus,\n onBlur,\n disabled,\n autoFocus,\n ...inputProps\n}: InputProps) {\n const autoId = useId();\n const id = idProp ?? autoId;\n const [focused, setFocused] = useState(false);\n const hasError = Boolean(error);\n const errorMessage = typeof error === 'string' ? error : null;\n const state = hasError ? 'error' : focused ? 'focused' : 'idle';\n const hasLeft = Boolean(leftAdornment);\n const hasRight = Boolean(rightAdornment);\n\n return (\n <div className={cn('flex flex-col gap-1.5', className)}>\n {label ? (\n <label htmlFor={id} className=\"px-1 font-medium text-(--color-foreground) text-sm\">\n {label}\n </label>\n ) : null}\n\n <div\n className={cn(\n 'relative flex flex-row items-center overflow-hidden border',\n FIELD_BORDER[state],\n FIELD_HEIGHT[size],\n FIELD_SHAPE[shape],\n disabled && 'opacity-60',\n )}\n >\n {hasLeft ? (\n <div className=\"pointer-events-none absolute top-0 bottom-0 left-3 z-10 flex items-center justify-center\">\n {leftAdornment}\n </div>\n ) : null}\n\n <input\n id={id}\n type={inputType}\n disabled={disabled}\n // biome-ignore lint/a11y/noAutofocus: forwarded HTML attribute — callers decide whether to autofocus\n autoFocus={autoFocus}\n onFocus={(event_) => {\n setFocused(true);\n onFocus?.(event_);\n }}\n onBlur={(event_) => {\n setFocused(false);\n onBlur?.(event_);\n }}\n className={cn(\n 'h-full min-w-0 flex-1 bg-transparent text-(--color-foreground) outline-none',\n INPUT_SIZE[size],\n hasLeft ? 'pl-10' : INPUT_PAD[size],\n hasRight ? 'pr-10' : INPUT_PAD[size],\n inputClassName,\n )}\n {...inputProps}\n />\n\n {hasRight ? (\n <div className=\"pointer-events-none absolute top-0 right-3 bottom-0 z-10 flex items-center justify-center\">\n {rightAdornment}\n </div>\n ) : null}\n </div>\n\n {errorMessage ? (\n <p role=\"alert\" className=\"px-1 text-(--color-destructive) text-xs\">\n {errorMessage}\n </p>\n ) : hint ? (\n <p className=\"px-1 text-(--color-muted-foreground) text-xs\">{hint}</p>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport { Input, type InputProps } from './input.js';\n\nexport type PasswordInputProps = Omit<InputProps, 'rightAdornment' | 'inputType'> & {\n inputType?: 'password' | 'new-password';\n};\n\nexport function PasswordInput({ inputType = 'password', ...props }: PasswordInputProps) {\n const [visible, setVisible] = useState(false);\n\n const toggle = useCallback(() => setVisible((v) => !v), []);\n\n const eye = (\n <button\n type=\"button\"\n onClick={toggle}\n className=\"pointer-events-auto cursor-pointer text-(--color-muted-foreground) hover:text-(--color-foreground)\"\n aria-label={visible ? 'Hide password' : 'Show password'}\n tabIndex={-1}\n >\n {visible ? <EyeOffIcon className=\"size-5\" /> : <EyeIcon className=\"size-5\" />}\n </button>\n );\n\n return (\n <Input\n {...props}\n inputType={visible ? 'text' : 'password'}\n rightAdornment={eye}\n autoComplete={inputType === 'new-password' ? 'new-password' : 'current-password'}\n />\n );\n}\n\nfunction EyeIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction EyeOffIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"password-input.mjs"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import type { ButtonHTMLAttributes, RefObject } from 'react';
|
|
3
|
+
declare const rainbowButtonVariants: (props?: ({
|
|
4
|
+
variant?: "default" | "outline" | null | undefined;
|
|
5
|
+
size?: "default" | "icon" | "sm" | "lg" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
export interface RainbowButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof rainbowButtonVariants> {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
ref?: RefObject<HTMLButtonElement | null>;
|
|
10
|
+
}
|
|
11
|
+
export declare function RainbowButton({ className, variant, size, asChild, ref, ...props }: RainbowButtonProps): import("react").JSX.Element;
|
|
12
|
+
export declare namespace RainbowButton {
|
|
13
|
+
var displayName: string;
|
|
14
|
+
}
|
|
15
|
+
export { rainbowButtonVariants };
|
|
16
|
+
//# sourceMappingURL=rainbow-button.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import type { ButtonHTMLAttributes, RefObject } from 'react';
|
|
3
|
+
declare const rainbowButtonVariants: (props?: ({
|
|
4
|
+
variant?: "default" | "outline" | null | undefined;
|
|
5
|
+
size?: "default" | "icon" | "sm" | "lg" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
export interface RainbowButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof rainbowButtonVariants> {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
ref?: RefObject<HTMLButtonElement | null>;
|
|
10
|
+
}
|
|
11
|
+
export declare function RainbowButton({ className, variant, size, asChild, ref, ...props }: RainbowButtonProps): import("react").JSX.Element;
|
|
12
|
+
export declare namespace RainbowButton {
|
|
13
|
+
var displayName: string;
|
|
14
|
+
}
|
|
15
|
+
export { rainbowButtonVariants };
|
|
16
|
+
//# sourceMappingURL=rainbow-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rainbow-button.d.ts","sourceRoot":"","sources":["../../src/components/rainbow-button.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7D,QAAA,MAAM,qBAAqB;;;8EA6B1B,CAAC;AAEF,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,YAAY,CAAC,OAAO,qBAAqB,CAAC;IAC7H,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;CAC3C;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAe,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,+BAG7G;yBAHe,aAAa;;;AAO7B,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var reactSlot = require('@radix-ui/react-slot');
|
|
4
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
var rainbowButtonVariants = classVarianceAuthority.cva(
|
|
13
|
+
cn(
|
|
14
|
+
"relative cursor-pointer group transition-transform animate-rainbow",
|
|
15
|
+
"inline-flex items-center justify-center gap-2 shrink-0",
|
|
16
|
+
"rounded-sm outline-none focus-visible:ring-[3px] aria-invalid:border-destructive",
|
|
17
|
+
"text-sm font-medium whitespace-nowrap",
|
|
18
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
19
|
+
"[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0"
|
|
20
|
+
),
|
|
21
|
+
{
|
|
22
|
+
variants: {
|
|
23
|
+
variant: {
|
|
24
|
+
default: "border-0 bg-[linear-gradient(#121213,#121213),linear-gradient(#121213_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] bg-[length:200%] text-primary-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] [border:calc(0.125rem)_solid_transparent] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] before:bg-[length:200%] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))]",
|
|
25
|
+
outline: "border border-input border-b-transparent bg-[linear-gradient(#ffffff,#ffffff),linear-gradient(#ffffff_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] bg-[length:200%] text-accent-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] before:bg-[length:200%] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#0a0a0a,#0a0a0a),linear-gradient(#0a0a0a_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))]"
|
|
26
|
+
},
|
|
27
|
+
size: {
|
|
28
|
+
default: "h-9 px-4 py-2",
|
|
29
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
30
|
+
lg: "h-11 rounded-md px-8",
|
|
31
|
+
icon: "size-9"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
defaultVariants: {
|
|
35
|
+
variant: "default",
|
|
36
|
+
size: "default"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
function RainbowButton({ className, variant, size, asChild = false, ref, ...props }) {
|
|
41
|
+
const Comp = asChild ? reactSlot.Slot : "button";
|
|
42
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Comp, { "data-slot": "button", className: cn(rainbowButtonVariants({ variant, size, className })), ref, ...props });
|
|
43
|
+
}
|
|
44
|
+
RainbowButton.displayName = "RainbowButton";
|
|
45
|
+
|
|
46
|
+
exports.RainbowButton = RainbowButton;
|
|
47
|
+
exports.rainbowButtonVariants = rainbowButtonVariants;
|
|
48
|
+
//# sourceMappingURL=rainbow-button.js.map
|
|
49
|
+
//# sourceMappingURL=rainbow-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/rainbow-button.tsx"],"names":["twMerge","clsx","cva","Slot"],"mappings":";;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,IAAM,qBAAA,GAAwBC,0BAAA;AAAA,EAC5B,EAAA;AAAA,IACE,oEAAA;AAAA,IACA,wDAAA;AAAA,IACA,kFAAA;AAAA,IACA,uCAAA;AAAA,IACA,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,2+BAAA;AAAA,QACF,OAAA,EACE;AAAA,OACJ;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,eAAA;AAAA,QACT,EAAA,EAAI,6BAAA;AAAA,QACJ,EAAA,EAAI,sBAAA;AAAA,QACJ,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAOO,SAAS,aAAA,CAAc,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAO,GAAA,EAAK,GAAG,KAAA,EAAM,EAAuB;AAC9G,EAAA,MAAM,IAAA,GAAO,UAAUC,cAAA,GAAO,QAAA;AAC9B,EAAA,sCAAQ,IAAA,EAAA,EAAK,WAAA,EAAU,QAAA,EAAS,SAAA,EAAW,GAAG,qBAAA,CAAsB,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAC,CAAA,EAAG,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAC3H;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA","file":"rainbow-button.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","'use client';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type { ButtonHTMLAttributes, RefObject } from 'react';\nimport { cn } from '../lib/utils.js';\n\nconst rainbowButtonVariants = cva(\n cn(\n 'relative cursor-pointer group transition-transform animate-rainbow',\n 'inline-flex items-center justify-center gap-2 shrink-0',\n 'rounded-sm outline-none focus-visible:ring-[3px] aria-invalid:border-destructive',\n 'text-sm font-medium whitespace-nowrap',\n 'disabled:pointer-events-none disabled:opacity-50',\n \"[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0\",\n ),\n {\n variants: {\n variant: {\n default:\n 'border-0 bg-[linear-gradient(#121213,#121213),linear-gradient(#121213_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] bg-[length:200%] text-primary-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] [border:calc(0.125rem)_solid_transparent] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] before:bg-[length:200%] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#fff,#fff),linear-gradient(#fff_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))]',\n outline:\n 'border border-input border-b-transparent bg-[linear-gradient(#ffffff,#ffffff),linear-gradient(#ffffff_50%,rgba(18,18,19,0.6)_80%,rgba(18,18,19,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] bg-[length:200%] text-accent-foreground [background-clip:padding-box,border-box,border-box] [background-origin:border-box] before:absolute before:bottom-[-20%] before:left-1/2 before:z-0 before:h-1/5 before:w-3/5 before:-translate-x-1/2 before:animate-rainbow before:bg-[linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))] before:bg-[length:200%] before:[filter:blur(0.75rem)] dark:bg-[linear-gradient(#0a0a0a,#0a0a0a),linear-gradient(#0a0a0a_50%,rgba(255,255,255,0.6)_80%,rgba(0,0,0,0)),linear-gradient(90deg,var(--color-rainbow-1),var(--color-rainbow-5),var(--color-rainbow-3),var(--color-rainbow-4),var(--color-rainbow-2))]',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-11 rounded-md px-8',\n icon: 'size-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface RainbowButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof rainbowButtonVariants> {\n asChild?: boolean;\n ref?: RefObject<HTMLButtonElement | null>;\n}\n\nexport function RainbowButton({ className, variant, size, asChild = false, ref, ...props }: RainbowButtonProps) {\n const Comp = asChild ? Slot : 'button';\n return <Comp data-slot=\"button\" className={cn(rainbowButtonVariants({ variant, size, className }))} ref={ref} {...props} />;\n}\n\nRainbowButton.displayName = 'RainbowButton';\n\nexport { rainbowButtonVariants };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"rainbow-button.mjs"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type Tick = {
|
|
2
|
+
value: number;
|
|
3
|
+
label: string;
|
|
4
|
+
};
|
|
5
|
+
export type RangeSliderProps = {
|
|
6
|
+
label: string;
|
|
7
|
+
value: number;
|
|
8
|
+
/** Allowed values, ascending. The first and last double as the bounds. */
|
|
9
|
+
steps: number[];
|
|
10
|
+
ticks: Tick[];
|
|
11
|
+
valueLabel: string;
|
|
12
|
+
onChange: (v: number) => void;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Slider over an explicit list of allowed values rather than a uniform `step`,
|
|
16
|
+
* so a grid whose span isn't a whole multiple of its increment can still reach
|
|
17
|
+
* its stated ceiling.
|
|
18
|
+
*/
|
|
19
|
+
export declare function RangeSlider({ label, value, steps, ticks, valueLabel, onChange }: RangeSliderProps): import("react").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=range-slider.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type Tick = {
|
|
2
|
+
value: number;
|
|
3
|
+
label: string;
|
|
4
|
+
};
|
|
5
|
+
export type RangeSliderProps = {
|
|
6
|
+
label: string;
|
|
7
|
+
value: number;
|
|
8
|
+
/** Allowed values, ascending. The first and last double as the bounds. */
|
|
9
|
+
steps: number[];
|
|
10
|
+
ticks: Tick[];
|
|
11
|
+
valueLabel: string;
|
|
12
|
+
onChange: (v: number) => void;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Slider over an explicit list of allowed values rather than a uniform `step`,
|
|
16
|
+
* so a grid whose span isn't a whole multiple of its increment can still reach
|
|
17
|
+
* its stated ceiling.
|
|
18
|
+
*/
|
|
19
|
+
export declare function RangeSlider({ label, value, steps, ticks, valueLabel, onChange }: RangeSliderProps): import("react").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=range-slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range-slider.d.ts","sourceRoot":"","sources":["../../src/components/range-slider.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,IAAI,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BAuEjG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
function nearestIndex(steps, value) {
|
|
7
|
+
return steps.reduce((best, s, i) => Math.abs(s - value) < Math.abs(steps[best] - value) ? i : best, 0);
|
|
8
|
+
}
|
|
9
|
+
function RangeSlider({ label, value, steps, ticks, valueLabel, onChange }) {
|
|
10
|
+
const min = steps[0];
|
|
11
|
+
const max = steps.at(-1) ?? min;
|
|
12
|
+
const pct = (value - min) / (max - min) * 100;
|
|
13
|
+
const index = nearestIndex(steps, value);
|
|
14
|
+
const handleChange = react.useCallback(
|
|
15
|
+
(event_) => onChange(steps[Number(event_.target.value)]),
|
|
16
|
+
[onChange, steps]
|
|
17
|
+
);
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
|
|
19
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-5 flex items-baseline justify-between gap-2", children: [
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-semibold text-[15px] text-(--color-foreground)", children: label }),
|
|
21
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-bold font-numeric text-[20px] text-(--color-foreground) tabular-nums", children: valueLabel })
|
|
22
|
+
] }),
|
|
23
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", style: { height: 20 }, children: [
|
|
24
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-(--color-border)" }),
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
className: "pointer-events-none absolute top-1/2 left-0 h-1.5 -translate-y-1/2 rounded-full bg-(--color-foreground)",
|
|
29
|
+
style: { width: `${pct}%` }
|
|
30
|
+
}
|
|
31
|
+
),
|
|
32
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
"input",
|
|
34
|
+
{
|
|
35
|
+
type: "range",
|
|
36
|
+
min: 0,
|
|
37
|
+
max: steps.length - 1,
|
|
38
|
+
step: 1,
|
|
39
|
+
value: index,
|
|
40
|
+
onChange: handleChange,
|
|
41
|
+
className: "peer absolute inset-0 z-10 h-full w-full cursor-pointer opacity-0",
|
|
42
|
+
"aria-label": label,
|
|
43
|
+
"aria-valuetext": valueLabel
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: "pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-(--color-foreground) peer-focus-visible:outline-2 peer-focus-visible:outline-(--color-foreground) peer-focus-visible:outline-offset-2",
|
|
50
|
+
style: {
|
|
51
|
+
left: `${pct}%`,
|
|
52
|
+
width: 16,
|
|
53
|
+
height: 16,
|
|
54
|
+
boxShadow: "0 2px 8px rgba(0,0,0,0.15)"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
] }),
|
|
59
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative mt-2", style: { height: 16 }, children: ticks.map((tick, i) => {
|
|
60
|
+
const tp = (tick.value - min) / (max - min) * 100;
|
|
61
|
+
const isFirst = i === 0;
|
|
62
|
+
const isLast = i === ticks.length - 1;
|
|
63
|
+
let left = `${tp}%`;
|
|
64
|
+
if (isFirst) left = 0;
|
|
65
|
+
else if (isLast) left = void 0;
|
|
66
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
67
|
+
"span",
|
|
68
|
+
{
|
|
69
|
+
className: "absolute font-numeric text-(--color-muted-foreground) text-[11px] tabular-nums",
|
|
70
|
+
style: {
|
|
71
|
+
left,
|
|
72
|
+
right: isLast ? 0 : void 0,
|
|
73
|
+
transform: isFirst || isLast ? void 0 : "translateX(-50%)"
|
|
74
|
+
},
|
|
75
|
+
children: tick.label
|
|
76
|
+
},
|
|
77
|
+
tick.value
|
|
78
|
+
);
|
|
79
|
+
}) })
|
|
80
|
+
] });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
exports.RangeSlider = RangeSlider;
|
|
84
|
+
//# sourceMappingURL=range-slider.js.map
|
|
85
|
+
//# sourceMappingURL=range-slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/range-slider.tsx"],"names":["useCallback","jsxs","jsx"],"mappings":"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","file":"range-slider.js","sourcesContent":["'use client';\n\nimport type { ChangeEvent } from 'react';\nimport { useCallback } from 'react';\n\nexport type Tick = { value: number; label: string };\n\nexport type RangeSliderProps = {\n label: string;\n value: number;\n /** Allowed values, ascending. The first and last double as the bounds. */\n steps: number[];\n ticks: Tick[];\n valueLabel: string;\n onChange: (v: number) => void;\n};\n\n/** Index of the grid step nearest `value`, so an off-grid value still resolves. */\nfunction nearestIndex(steps: number[], value: number) {\n return steps.reduce((best, s, i) => (Math.abs(s - value) < Math.abs(steps[best]! - value) ? i : best), 0);\n}\n\n/**\n * Slider over an explicit list of allowed values rather than a uniform `step`,\n * so a grid whose span isn't a whole multiple of its increment can still reach\n * its stated ceiling.\n */\nexport function RangeSlider({ label, value, steps, ticks, valueLabel, onChange }: RangeSliderProps) {\n const min = steps[0]!;\n const max = steps.at(-1) ?? min;\n const pct = ((value - min) / (max - min)) * 100;\n const index = nearestIndex(steps, value);\n\n const handleChange = useCallback(\n (event_: ChangeEvent<HTMLInputElement>) => onChange(steps[Number(event_.target.value)]!),\n [onChange, steps],\n );\n\n return (\n <div className=\"w-full\">\n <div className=\"mb-5 flex items-baseline justify-between gap-2\">\n <p className=\"font-semibold text-[15px] text-(--color-foreground)\">{label}</p>\n <p className=\"font-bold font-numeric text-[20px] text-(--color-foreground) tabular-nums\">{valueLabel}</p>\n </div>\n\n <div className=\"relative\" style={{ height: 20 }}>\n <div className=\"absolute inset-x-0 top-1/2 h-1.5 -translate-y-1/2 rounded-full bg-(--color-border)\" />\n <div\n className=\"pointer-events-none absolute top-1/2 left-0 h-1.5 -translate-y-1/2 rounded-full bg-(--color-foreground)\"\n style={{ width: `${pct}%` }}\n />\n <input\n type=\"range\"\n min={0}\n max={steps.length - 1}\n step={1}\n value={index}\n onChange={handleChange}\n className=\"peer absolute inset-0 z-10 h-full w-full cursor-pointer opacity-0\"\n aria-label={label}\n aria-valuetext={valueLabel}\n />\n <div\n className=\"pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-(--color-foreground) peer-focus-visible:outline-2 peer-focus-visible:outline-(--color-foreground) peer-focus-visible:outline-offset-2\"\n style={{\n left: `${pct}%`,\n width: 16,\n height: 16,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n }}\n />\n </div>\n\n <div className=\"relative mt-2\" style={{ height: 16 }}>\n {ticks.map((tick, i) => {\n const tp = ((tick.value - min) / (max - min)) * 100;\n const isFirst = i === 0;\n const isLast = i === ticks.length - 1;\n let left: number | string | undefined = `${tp}%`;\n if (isFirst) left = 0;\n else if (isLast) left = undefined;\n return (\n <span\n key={tick.value}\n className=\"absolute font-numeric text-(--color-muted-foreground) text-[11px] tabular-nums\"\n style={{\n left,\n right: isLast ? 0 : undefined,\n transform: isFirst || isLast ? undefined : 'translateX(-50%)',\n }}\n >\n {tick.label}\n </span>\n );\n })}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"range-slider.mjs"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export type BadgeEntry = {
|
|
3
|
+
icon: ReactNode;
|
|
4
|
+
label: string;
|
|
5
|
+
};
|
|
6
|
+
export type RollingBadgeProps = {
|
|
7
|
+
badges: BadgeEntry[];
|
|
8
|
+
className?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function RollingBadge({ badges, className }: RollingBadgeProps): import("react").JSX.Element | null;
|
|
11
|
+
//# sourceMappingURL=rolling-badge.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export type BadgeEntry = {
|
|
3
|
+
icon: ReactNode;
|
|
4
|
+
label: string;
|
|
5
|
+
};
|
|
6
|
+
export type RollingBadgeProps = {
|
|
7
|
+
badges: BadgeEntry[];
|
|
8
|
+
className?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function RollingBadge({ badges, className }: RollingBadgeProps): import("react").JSX.Element | null;
|
|
11
|
+
//# sourceMappingURL=rolling-badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rolling-badge.d.ts","sourceRoot":"","sources":["../../src/components/rolling-badge.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,OAAO,CAAC;AAgC7D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,iBAAiB,sCAoCpE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var framerMotion = require('framer-motion');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
var tick = 0;
|
|
13
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
14
|
+
var timer = null;
|
|
15
|
+
function subscribe(onChange) {
|
|
16
|
+
listeners.add(onChange);
|
|
17
|
+
if (timer === null)
|
|
18
|
+
timer = setInterval(() => {
|
|
19
|
+
tick += 1;
|
|
20
|
+
for (const l of listeners) l();
|
|
21
|
+
}, ROTATE_MS);
|
|
22
|
+
return () => {
|
|
23
|
+
listeners.delete(onChange);
|
|
24
|
+
if (listeners.size === 0 && timer !== null) {
|
|
25
|
+
clearInterval(timer);
|
|
26
|
+
timer = null;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
var getSnapshot = () => tick;
|
|
31
|
+
var getServerSnapshot = () => 0;
|
|
32
|
+
var ROTATE_MS = 4e3;
|
|
33
|
+
function RollingBadge({ badges, className }) {
|
|
34
|
+
const index = react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) % badges.length;
|
|
35
|
+
const badge = badges[index];
|
|
36
|
+
if (badges.length === 0 || !badge) return null;
|
|
37
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
38
|
+
framerMotion.motion.div,
|
|
39
|
+
{
|
|
40
|
+
layout: true,
|
|
41
|
+
className: cn(
|
|
42
|
+
"relative inline-flex h-8 items-center overflow-hidden rounded-full border border-(--color-border) bg-background px-3.5 shadow-sm",
|
|
43
|
+
className
|
|
44
|
+
),
|
|
45
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, mode: "popLayout", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
46
|
+
framerMotion.motion.span,
|
|
47
|
+
{
|
|
48
|
+
layout: "position",
|
|
49
|
+
initial: { y: "120%", opacity: 0 },
|
|
50
|
+
animate: { y: "0%", opacity: 1 },
|
|
51
|
+
exit: { y: "-120%", opacity: 0 },
|
|
52
|
+
transition: {
|
|
53
|
+
type: "spring",
|
|
54
|
+
stiffness: 320,
|
|
55
|
+
damping: 32
|
|
56
|
+
},
|
|
57
|
+
className: "flex items-center gap-1.5 whitespace-nowrap font-medium text-[12.5px]",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-3.5 w-3.5 shrink-0", "aria-hidden": true, children: badge.icon }),
|
|
60
|
+
badge.label
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
index
|
|
64
|
+
) })
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
exports.RollingBadge = RollingBadge;
|
|
70
|
+
//# sourceMappingURL=rolling-badge.js.map
|
|
71
|
+
//# sourceMappingURL=rolling-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/rolling-badge.tsx"],"names":["twMerge","clsx","useSyncExternalStore","jsx","motion","AnimatePresence","jsxs"],"mappings":";;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACEA,IAAI,IAAA,GAAO,CAAA;AACX,IAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,IAAI,KAAA,GAA+C,IAAA;AAEnD,SAAS,UAAU,QAAA,EAAkC;AACnD,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,IAAI,KAAA,KAAU,IAAA;AACZ,IAAA,KAAA,GAAQ,YAAY,MAAM;AACxB,MAAA,IAAA,IAAQ,CAAA;AACR,MAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAAA,IAC/B,GAAG,SAAS,CAAA;AACd,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,CAAA,IAAK,KAAA,KAAU,IAAA,EAAM;AAC1C,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,EACF,CAAA;AACF;AAEA,IAAM,cAAc,MAAM,IAAA;AAC1B,IAAM,oBAAoB,MAAM,CAAA;AAIhC,IAAM,SAAA,GAAY,GAAA;AAYX,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAsB;AACrE,EAAA,MAAM,QAAQC,0BAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,iBAAiB,IAAI,MAAA,CAAO,MAAA;AACvF,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAE1B,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,CAAC,OAAO,OAAO,IAAA;AAE1C,EAAA,uBACEC,cAAA;AAAA,IAACC,mBAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,EAAA;AAAA,QACT,kIAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAD,cAAA,CAACE,4BAAA,EAAA,EAAgB,OAAA,EAAS,KAAA,EAAO,MAAK,WAAA,EACpC,QAAA,kBAAAC,eAAA;AAAA,QAACF,mBAAA,CAAO,IAAA;AAAA,QAAP;AAAA,UAEC,MAAA,EAAO,UAAA;AAAA,UACP,OAAA,EAAS,EAAE,CAAA,EAAG,MAAA,EAAQ,SAAS,CAAA,EAAE;AAAA,UACjC,OAAA,EAAS,EAAE,CAAA,EAAG,IAAA,EAAM,SAAS,CAAA,EAAE;AAAA,UAC/B,IAAA,EAAM,EAAE,CAAA,EAAG,OAAA,EAAS,SAAS,CAAA,EAAE;AAAA,UAC/B,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,SAAA,EAAW,GAAA;AAAA,YACX,OAAA,EAAS;AAAA,WACX;AAAA,UACA,SAAA,EAAU,uEAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAD,cAAA,CAAC,UAAK,SAAA,EAAU,sBAAA,EAAuB,aAAA,EAAa,IAAA,EACjD,gBAAM,IAAA,EACT,CAAA;AAAA,YACC,KAAA,CAAM;AAAA;AAAA,SAAA;AAAA,QAfF;AAAA,OAgBP,EACF;AAAA;AAAA,GACF;AAEJ","file":"rolling-badge.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","'use client';\n\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { type ReactNode, useSyncExternalStore } from 'react';\nimport { cn } from '../lib/utils.js';\n\n/* ── One-shot ticking store ─────────────────────────────── */\n\nlet tick = 0;\nconst listeners = new Set<() => void>();\nlet timer: ReturnType<typeof setInterval> | null = null;\n\nfunction subscribe(onChange: () => void): () => void {\n listeners.add(onChange);\n if (timer === null)\n timer = setInterval(() => {\n tick += 1;\n for (const l of listeners) l();\n }, ROTATE_MS);\n return () => {\n listeners.delete(onChange);\n if (listeners.size === 0 && timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n };\n}\n\nconst getSnapshot = () => tick;\nconst getServerSnapshot = () => 0;\n\n/* ── Component ──────────────────────────────────────────── */\n\nconst ROTATE_MS = 4000;\n\nexport type BadgeEntry = {\n icon: ReactNode;\n label: string;\n};\n\nexport type RollingBadgeProps = {\n badges: BadgeEntry[];\n className?: string;\n};\n\nexport function RollingBadge({ badges, className }: RollingBadgeProps) {\n const index = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) % badges.length;\n const badge = badges[index];\n\n if (badges.length === 0 || !badge) return null;\n\n return (\n <motion.div\n layout={true}\n className={cn(\n 'relative inline-flex h-8 items-center overflow-hidden rounded-full border border-(--color-border) bg-background px-3.5 shadow-sm',\n className,\n )}\n >\n <AnimatePresence initial={false} mode=\"popLayout\">\n <motion.span\n key={index}\n layout=\"position\"\n initial={{ y: '120%', opacity: 0 }}\n animate={{ y: '0%', opacity: 1 }}\n exit={{ y: '-120%', opacity: 0 }}\n transition={{\n type: 'spring',\n stiffness: 320,\n damping: 32,\n }}\n className=\"flex items-center gap-1.5 whitespace-nowrap font-medium text-[12.5px]\"\n >\n <span className=\"h-3.5 w-3.5 shrink-0\" aria-hidden={true}>\n {badge.icon}\n </span>\n {badge.label}\n </motion.span>\n </AnimatePresence>\n </motion.div>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"rolling-badge.mjs"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Soft emerald pill for money-saved callouts — the per-provider delta in the
|
|
4
|
+
* estimate chart.
|
|
5
|
+
*
|
|
6
|
+
* The wording differs per call site, so the label stays in `children`; only the
|
|
7
|
+
* pill treatment is shared.
|
|
8
|
+
*/
|
|
9
|
+
export declare function SavingsBadge({ className, ...props }: React.ComponentProps<'span'>): React.JSX.Element;
|
|
10
|
+
//# sourceMappingURL=savings-badge.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Soft emerald pill for money-saved callouts — the per-provider delta in the
|
|
4
|
+
* estimate chart.
|
|
5
|
+
*
|
|
6
|
+
* The wording differs per call site, so the label stays in `children`; only the
|
|
7
|
+
* pill treatment is shared.
|
|
8
|
+
*/
|
|
9
|
+
export declare function SavingsBadge({ className, ...props }: React.ComponentProps<'span'>): React.JSX.Element;
|
|
10
|
+
//# sourceMappingURL=savings-badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings-badge.d.ts","sourceRoot":"","sources":["../../src/components/savings-badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAUjF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var clsx = require('clsx');
|
|
4
|
+
var tailwindMerge = require('tailwind-merge');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
// src/lib/utils.ts
|
|
8
|
+
function cn(...inputs) {
|
|
9
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
10
|
+
}
|
|
11
|
+
function SavingsBadge({ className, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
13
|
+
"span",
|
|
14
|
+
{
|
|
15
|
+
className: cn(
|
|
16
|
+
"rounded-full bg-emerald-500/15 px-2.5 py-0.5 font-numeric font-semibold text-[11px] text-emerald-500 tabular-nums",
|
|
17
|
+
className
|
|
18
|
+
),
|
|
19
|
+
...props
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.SavingsBadge = SavingsBadge;
|
|
25
|
+
//# sourceMappingURL=savings-badge.js.map
|
|
26
|
+
//# sourceMappingURL=savings-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/savings-badge.tsx"],"names":["twMerge","clsx","jsx"],"mappings":";;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACIO,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAiC;AAClF,EAAA,uBACEC,cAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,mHAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"savings-badge.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","import type * as React from 'react';\nimport { cn } from '../lib/utils.js';\n\n/**\n * Soft emerald pill for money-saved callouts — the per-provider delta in the\n * estimate chart.\n *\n * The wording differs per call site, so the label stays in `children`; only the\n * pill treatment is shared.\n */\nexport function SavingsBadge({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n 'rounded-full bg-emerald-500/15 px-2.5 py-0.5 font-numeric font-semibold text-[11px] text-emerald-500 tabular-nums',\n className,\n )}\n {...props}\n />\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"savings-badge.mjs"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
export interface ShineBorderProps extends HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** Width of the border in pixels. @default 1 */
|
|
4
|
+
borderWidth?: number;
|
|
5
|
+
/** Duration of the animation in seconds. @default 14 */
|
|
6
|
+
duration?: number;
|
|
7
|
+
/** Color of the border — single color or array of colors. @default "#000000" */
|
|
8
|
+
shineColor?: string | string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* An animated background-border effect that sits absolutely on top of
|
|
12
|
+
* its positioned parent. Add `relative` to the parent container.
|
|
13
|
+
*/
|
|
14
|
+
export declare function ShineBorder({ borderWidth, duration, shineColor, className, style, ...props }: ShineBorderProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=shine-border.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
export interface ShineBorderProps extends HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** Width of the border in pixels. @default 1 */
|
|
4
|
+
borderWidth?: number;
|
|
5
|
+
/** Duration of the animation in seconds. @default 14 */
|
|
6
|
+
duration?: number;
|
|
7
|
+
/** Color of the border — single color or array of colors. @default "#000000" */
|
|
8
|
+
shineColor?: string | string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* An animated background-border effect that sits absolutely on top of
|
|
12
|
+
* its positioned parent. Add `relative` to the parent container.
|
|
13
|
+
*/
|
|
14
|
+
export declare function ShineBorder({ borderWidth, duration, shineColor, className, style, ...props }: ShineBorderProps): import("react").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=shine-border.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shine-border.d.ts","sourceRoot":"","sources":["../../src/components/shine-border.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,WAAW,gBAAiB,SAAQ,cAAc,CAAC,cAAc,CAAC;IACtE,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,WAAe,EACf,QAAa,EACb,UAAsB,EACtB,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,gBAAgB,+BAwBlB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var clsx = require('clsx');
|
|
4
|
+
var tailwindMerge = require('tailwind-merge');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
function validCssVars(style) {
|
|
11
|
+
return style;
|
|
12
|
+
}
|
|
13
|
+
function ShineBorder({
|
|
14
|
+
borderWidth = 1,
|
|
15
|
+
duration = 14,
|
|
16
|
+
shineColor = "#000000",
|
|
17
|
+
className,
|
|
18
|
+
style,
|
|
19
|
+
...props
|
|
20
|
+
}) {
|
|
21
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
style: validCssVars({
|
|
25
|
+
"--border-width": `${borderWidth}px`,
|
|
26
|
+
"--duration": `${duration}s`,
|
|
27
|
+
backgroundImage: `radial-gradient(transparent,transparent, ${Array.isArray(shineColor) ? shineColor.join(",") : shineColor},transparent,transparent)`,
|
|
28
|
+
backgroundSize: "300% 300%",
|
|
29
|
+
mask: "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
|
|
30
|
+
WebkitMask: "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
|
|
31
|
+
WebkitMaskComposite: "xor",
|
|
32
|
+
maskComposite: "exclude",
|
|
33
|
+
padding: "var(--border-width)",
|
|
34
|
+
...style
|
|
35
|
+
}),
|
|
36
|
+
className: cn(
|
|
37
|
+
"pointer-events-none absolute inset-0 size-full rounded-[inherit] will-change-[background-position] motion-safe:animate-shine",
|
|
38
|
+
className
|
|
39
|
+
),
|
|
40
|
+
...props
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
exports.ShineBorder = ShineBorder;
|
|
46
|
+
//# sourceMappingURL=shine-border.js.map
|
|
47
|
+
//# sourceMappingURL=shine-border.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/shine-border.tsx"],"names":["twMerge","clsx","jsx"],"mappings":";;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AAiBO,SAAS,aAAa,KAAA,EAA6C;AACxE,EAAA,OAAO,KAAA;AACT;ACPO,SAAS,WAAA,CAAY;AAAA,EAC1B,WAAA,GAAc,CAAA;AAAA,EACd,QAAA,GAAW,EAAA;AAAA,EACX,UAAA,GAAa,SAAA;AAAA,EACb,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAO,YAAA,CAAa;AAAA,QAClB,gBAAA,EAAkB,GAAG,WAAW,CAAA,EAAA,CAAA;AAAA,QAChC,YAAA,EAAc,GAAG,QAAQ,CAAA,CAAA,CAAA;AAAA,QACzB,eAAA,EAAiB,CAAA,yCAAA,EACf,KAAA,CAAM,OAAA,CAAQ,UAAU,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,GAAI,UACrD,CAAA,yBAAA,CAAA;AAAA,QACA,cAAA,EAAgB,WAAA;AAAA,QAChB,IAAA,EAAM,kEAAA;AAAA,QACN,UAAA,EAAY,kEAAA;AAAA,QACZ,mBAAA,EAAqB,KAAA;AAAA,QACrB,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,qBAAA;AAAA,QACT,GAAG;AAAA,OACJ,CAAA;AAAA,MACD,SAAA,EAAW,EAAA;AAAA,QACT,8HAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"shine-border.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","'use client';\n\nimport type { HTMLAttributes } from 'react';\nimport { cn, validCssVars } from '../lib/utils.js';\n\nexport interface ShineBorderProps extends HTMLAttributes<HTMLDivElement> {\n /** Width of the border in pixels. @default 1 */\n borderWidth?: number;\n /** Duration of the animation in seconds. @default 14 */\n duration?: number;\n /** Color of the border — single color or array of colors. @default \"#000000\" */\n shineColor?: string | string[];\n}\n\n/**\n * An animated background-border effect that sits absolutely on top of\n * its positioned parent. Add `relative` to the parent container.\n */\nexport function ShineBorder({\n borderWidth = 1,\n duration = 14,\n shineColor = '#000000',\n className,\n style,\n ...props\n}: ShineBorderProps) {\n return (\n <div\n style={validCssVars({\n '--border-width': `${borderWidth}px`,\n '--duration': `${duration}s`,\n backgroundImage: `radial-gradient(transparent,transparent, ${\n Array.isArray(shineColor) ? shineColor.join(',') : shineColor\n },transparent,transparent)`,\n backgroundSize: '300% 300%',\n mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n maskComposite: 'exclude',\n padding: 'var(--border-width)',\n ...style,\n })}\n className={cn(\n 'pointer-events-none absolute inset-0 size-full rounded-[inherit] will-change-[background-position] motion-safe:animate-shine',\n className,\n )}\n {...props}\n />\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"shine-border.mjs"}
|