@roy-ui/ui 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UploadFiles-CFRCBFZK.css +448 -0
- package/dist/{chunk-4SGMAZBG.js → chunk-B6LXWGX5.js} +2 -2
- package/dist/{chunk-4SGMAZBG.js.map → chunk-B6LXWGX5.js.map} +1 -1
- package/dist/chunk-DAA5LXWQ.js +4 -0
- package/dist/chunk-DAA5LXWQ.js.map +1 -0
- package/dist/{chunk-PGV55XSZ.js → chunk-MO7UPMW7.js} +2 -2
- package/dist/{chunk-PGV55XSZ.js.map → chunk-MO7UPMW7.js.map} +1 -1
- package/dist/chunk-ORTCK34Y.js +4 -0
- package/dist/chunk-ORTCK34Y.js.map +1 -0
- package/dist/{chunk-B7QN2JTN.js → chunk-TBBQRMCG.js} +3 -3
- package/dist/{chunk-B7QN2JTN.js.map → chunk-TBBQRMCG.js.map} +1 -1
- package/dist/chunk-XVN2VWF5.js +363 -0
- package/dist/chunk-XVN2VWF5.js.map +1 -0
- package/dist/components/button/index.js +2 -1
- package/dist/components/card/index.js +3 -2
- package/dist/components/text-morph/index.js +2 -1
- package/dist/components/upload-files/index.d.ts +56 -0
- package/dist/components/upload-files/index.js +6 -0
- package/dist/components/upload-files/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -3
- package/package.json +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/card/ImageCarousel.tsx","../src/components/card/Card.tsx"],"names":["jsx","forwardRef","jsxs","Fragment"],"mappings":"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","file":"chunk-B7QN2JTN.js","sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport './ImageCarousel.css';\n\nexport interface CarouselImage {\n src: string;\n alt?: string;\n}\n\nexport interface ImageCarouselProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Slides, in order. A single image renders without dots or drag. */\n images: CarouselImage[];\n /** Controlled active index. Leave undefined for uncontrolled. */\n index?: number;\n /** Starting index when uncontrolled. Default 0. */\n defaultIndex?: number;\n /** Fires with the new index on every change (drag, dot, or keyboard). */\n onIndexChange?: (index: number) => void;\n /** Show the pagination dots. Auto-hidden for a single image. Default true. */\n showDots?: boolean;\n /** Allow pointer drag / swipe between slides. Default true. */\n draggable?: boolean;\n /** Aspect ratio of the media box, e.g. \"4 / 3\" or \"1 / 1\". Default \"4 / 3\". */\n ratio?: string;\n /** Overlay slot painted on top of the image — a badge, a gradient, anything. */\n overlay?: ReactNode;\n /** Advance to the next slide on a timer, looping back to the first. Default false. */\n autoplay?: boolean;\n /** Milliseconds between auto-advances. Default 2500. */\n autoplayInterval?: number;\n /** Pause autoplay while the pointer is over the gallery. Default true. */\n pauseOnHover?: boolean;\n}\n\n/** How far you have to drag, as a fraction of the width, before it commits. */\nconst COMMIT_THRESHOLD = 0.18;\n/** Resistance applied when dragging past the first or last slide. */\nconst RUBBER_BAND = 0.35;\n\nexport const ImageCarousel = forwardRef<HTMLDivElement, ImageCarouselProps>(\n (\n {\n images,\n index,\n defaultIndex = 0,\n onIndexChange,\n showDots = true,\n draggable = true,\n ratio = '4 / 3',\n overlay,\n autoplay = false,\n autoplayInterval = 2500,\n pauseOnHover = true,\n className = '',\n style,\n ...rest\n },\n ref,\n ) => {\n const count = images.length;\n const multiple = count > 1;\n const labelId = useId();\n\n const [internal, setInternal] = useState(() =>\n Math.max(0, Math.min(count - 1, defaultIndex)),\n );\n const active = index ?? internal;\n\n const commit = useCallback(\n (next: number) => {\n const clamped = Math.max(0, Math.min(count - 1, next));\n if (clamped === active) return;\n if (index === undefined) setInternal(clamped);\n onIndexChange?.(clamped);\n },\n [active, count, index, onIndexChange],\n );\n\n // Drag state. `drag` is the live pixel offset of the current gesture.\n const viewportRef = useRef<HTMLDivElement>(null);\n const startX = useRef(0);\n const widthRef = useRef(0);\n const [drag, setDrag] = useState(0);\n const [dragging, setDragging] = useState(false);\n const [hovered, setHovered] = useState(false);\n\n // Autoplay — one timeout, re-armed whenever `active` changes (so a manual\n // dot tap or swipe also restarts the clock). Paused on hover and drag, and\n // skipped entirely under reduced-motion.\n useEffect(() => {\n if (!autoplay || !multiple || dragging) return;\n if (pauseOnHover && hovered) return;\n if (\n typeof window !== 'undefined' &&\n window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n ) {\n return;\n }\n const id = window.setTimeout(\n () => commit(active + 1 >= count ? 0 : active + 1),\n autoplayInterval,\n );\n return () => window.clearTimeout(id);\n }, [\n autoplay,\n autoplayInterval,\n pauseOnHover,\n hovered,\n dragging,\n multiple,\n active,\n count,\n commit,\n ]);\n\n const onPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggable || !multiple || e.button !== 0) return;\n widthRef.current = viewportRef.current?.offsetWidth ?? 0;\n startX.current = e.clientX;\n setDragging(true);\n viewportRef.current?.setPointerCapture(e.pointerId);\n };\n\n const onPointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return;\n let dx = e.clientX - startX.current;\n const atStart = active === 0 && dx > 0;\n const atEnd = active === count - 1 && dx < 0;\n if (atStart || atEnd) dx *= RUBBER_BAND;\n setDrag(dx);\n };\n\n const endDrag = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return;\n setDragging(false);\n viewportRef.current?.releasePointerCapture?.(e.pointerId);\n const threshold = (widthRef.current || 1) * COMMIT_THRESHOLD;\n if (drag <= -threshold) commit(active + 1);\n else if (drag >= threshold) commit(active - 1);\n setDrag(0);\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!multiple) return;\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n commit(active + 1);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n commit(active - 1);\n }\n };\n\n // Slide the track by whole slides, then add the in-flight drag offset.\n const trackStyle: CSSProperties = {\n transform: `translate3d(calc(${-active * 100}% + ${drag}px), 0, 0)`,\n };\n\n const classes = [\n 'royui-carousel',\n showDots && multiple ? 'royui-carousel--has-dots' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={ref}\n className={classes}\n style={{ ['--royui-carousel-ratio' as string]: ratio, ...style }}\n role=\"group\"\n aria-roledescription=\"carousel\"\n aria-label=\"Property images\"\n {...rest}\n >\n <div\n ref={viewportRef}\n className=\"royui-carousel__viewport\"\n tabIndex={multiple ? 0 : undefined}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n onMouseEnter={\n autoplay && pauseOnHover ? () => setHovered(true) : undefined\n }\n onMouseLeave={\n autoplay && pauseOnHover ? () => setHovered(false) : undefined\n }\n >\n <div\n className={[\n 'royui-carousel__track',\n dragging ? 'royui-carousel__track--dragging' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={trackStyle}\n >\n {images.map((img, i) => (\n <div className=\"royui-carousel__slide\" key={`${img.src}-${i}`}>\n <img\n className=\"royui-carousel__img\"\n src={img.src}\n alt={img.alt ?? ''}\n draggable={false}\n loading={i === 0 ? 'eager' : 'lazy'}\n aria-hidden={i !== active}\n />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"royui-carousel__scrim\" aria-hidden=\"true\" />\n\n {overlay != null && (\n <div className=\"royui-carousel__overlay\">{overlay}</div>\n )}\n\n {showDots && multiple && (\n <div\n className=\"royui-carousel__dots\"\n role=\"tablist\"\n aria-label=\"Choose image\"\n >\n {images.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === active}\n aria-label={`Image ${i + 1} of ${count}`}\n className={[\n 'royui-carousel__dot',\n i === active ? 'royui-carousel__dot--active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => commit(i)}\n />\n ))}\n </div>\n )}\n\n <span\n id={labelId}\n className=\"royui-carousel__status\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {multiple ? `Image ${active + 1} of ${count}` : ''}\n </span>\n </div>\n );\n },\n);\n\nImageCarousel.displayName = 'ImageCarousel';\n","'use client';\n\nimport {\n Fragment,\n forwardRef,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { Button, type ButtonProps } from '../button';\nimport { ImageCarousel, type CarouselImage } from './ImageCarousel';\nimport './Card.css';\n\nexport interface CardStat {\n /** Small leading glyph. Inherits the muted stat color via currentColor. */\n icon?: ReactNode;\n /** The figure, full-strength — e.g. \"264 m²\" or \"4\". */\n value: ReactNode;\n /** Dimmed descriptor after the figure — e.g. \"Living\" or \"Bedrooms\". */\n label?: ReactNode;\n}\n\nexport interface CardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'onChange'> {\n /** Gallery shown at the top, with swipe + dot pagination. */\n images: CarouselImage[];\n /** Pill label over the image, e.g. \"Prime Pick\". Hidden when omitted. */\n badge?: ReactNode;\n /** Glyph inside the badge. Defaults to a gold star. */\n badgeIcon?: ReactNode;\n /** Headline figure, e.g. \"$250,000\". */\n price: ReactNode;\n /** Muted qualifier next to the price, e.g. \"List price\". */\n priceLabel?: ReactNode;\n /** Secondary line under the price — owner, address, etc. */\n subtitle?: ReactNode;\n /** Inline figures separated by hairline dividers, e.g. living area and rooms. */\n stats?: CardStat[];\n /** Footer attribution. Becomes a link when authorHref is set. */\n author?: ReactNode;\n /** Makes the author name a link. */\n authorHref?: string;\n /** Extra attributes for the author link — target, rel, onClick, etc. */\n authorProps?: AnchorHTMLAttributes<HTMLAnchorElement>;\n /** Right-aligned footer note, e.g. \"2 days ago\". */\n meta?: ReactNode;\n /** Label for the action button. Pass null to drop the button entirely. */\n actionLabel?: ReactNode;\n /** Click handler for the action button. */\n onAction?: () => void;\n /** Escape hatch onto the underlying Button (variant, color, loading, …). */\n actionProps?: Partial<ButtonProps>;\n /** Aspect ratio of the gallery. Default \"4 / 3\". */\n ratio?: string;\n /** Auto-advance the gallery on a timer, looping. Default false. */\n autoplay?: boolean;\n /** Milliseconds between auto-advances. Default 2500. */\n autoplayInterval?: number;\n /** Starting gallery index. */\n defaultIndex?: number;\n /** Fires when the gallery moves. */\n onIndexChange?: (index: number) => void;\n /** Lift + image-zoom on hover. Default true. */\n hoverEffect?: boolean;\n /**\n * Colour scheme. \"auto\" (default) follows the system via prefers-color-scheme;\n * \"light\" is a premium off-white surface, \"dark\" a near-black one.\n */\n theme?: 'light' | 'dark' | 'auto';\n}\n\nconst StarIcon = () => (\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 2.5l2.7 5.9 6.4.7-4.8 4.3 1.3 6.3L12 16.9 6.4 19.7l1.3-6.3L2.9 9.1l6.4-.7L12 2.5z\" />\n </svg>\n);\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n images,\n badge,\n badgeIcon,\n price,\n priceLabel,\n subtitle,\n stats,\n author,\n authorHref,\n authorProps,\n meta,\n actionLabel = 'View Details',\n onAction,\n actionProps,\n ratio = '4 / 3',\n autoplay = false,\n autoplayInterval = 2500,\n defaultIndex,\n onIndexChange,\n hoverEffect = true,\n theme = 'auto',\n className = '',\n ...rest\n },\n ref,\n ) => {\n const classes = [\n 'royui-card',\n hoverEffect ? 'royui-card--interactive' : '',\n theme === 'dark' ? 'royui-card--dark' : '',\n theme === 'auto' ? 'royui-card--auto' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const overlay =\n badge != null ? (\n <span className=\"royui-card__badge\">\n <span className=\"royui-card__badge-icon\">\n {badgeIcon ?? <StarIcon />}\n </span>\n {badge}\n </span>\n ) : undefined;\n\n return (\n <div ref={ref} className={classes} {...rest}>\n <ImageCarousel\n images={images}\n ratio={ratio}\n autoplay={autoplay}\n autoplayInterval={autoplayInterval}\n defaultIndex={defaultIndex}\n onIndexChange={onIndexChange}\n overlay={overlay}\n />\n\n <div className=\"royui-card__body\">\n <div className=\"royui-card__price-row\">\n <span className=\"royui-card__price\">{price}</span>\n {priceLabel != null && (\n <span className=\"royui-card__price-label\">{priceLabel}</span>\n )}\n </div>\n\n {subtitle != null && (\n <p className=\"royui-card__subtitle\">{subtitle}</p>\n )}\n\n {stats && stats.length > 0 && (\n <>\n <div className=\"royui-card__divider\" />\n <div className=\"royui-card__stats\">\n {stats.map((stat, i) => (\n <Fragment key={i}>\n {i > 0 && (\n <span\n className=\"royui-card__stat-sep\"\n aria-hidden=\"true\"\n />\n )}\n <span className=\"royui-card__stat\">\n {stat.icon && (\n <span\n className=\"royui-card__stat-icon\"\n aria-hidden=\"true\"\n >\n {stat.icon}\n </span>\n )}\n <span className=\"royui-card__stat-value\">{stat.value}</span>\n {stat.label != null && (\n <span className=\"royui-card__stat-label\">\n {stat.label}\n </span>\n )}\n </span>\n </Fragment>\n ))}\n </div>\n </>\n )}\n\n {(author != null || meta != null) && (\n <div className=\"royui-card__footer\">\n {author != null && (\n <span className=\"royui-card__author\">\n By{' '}\n {authorHref ? (\n <a\n href={authorHref}\n className=\"royui-card__author-link\"\n {...authorProps}\n >\n {author}\n </a>\n ) : (\n <span className=\"royui-card__author-link\">{author}</span>\n )}\n </span>\n )}\n {meta != null && (\n <span className=\"royui-card__meta\">{meta}</span>\n )}\n </div>\n )}\n </div>\n\n {actionLabel != null && (\n <div className=\"royui-card__action\">\n <Button fullWidth onClick={onAction} {...actionProps}>\n {actionLabel}\n </Button>\n </div>\n )}\n </div>\n );\n },\n);\n\nCard.displayName = 'Card';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/card/ImageCarousel.tsx","../src/components/card/Card.tsx"],"names":["jsx","forwardRef","jsxs","Fragment"],"mappings":"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","file":"chunk-TBBQRMCG.js","sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport './ImageCarousel.css';\n\nexport interface CarouselImage {\n src: string;\n alt?: string;\n}\n\nexport interface ImageCarouselProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Slides, in order. A single image renders without dots or drag. */\n images: CarouselImage[];\n /** Controlled active index. Leave undefined for uncontrolled. */\n index?: number;\n /** Starting index when uncontrolled. Default 0. */\n defaultIndex?: number;\n /** Fires with the new index on every change (drag, dot, or keyboard). */\n onIndexChange?: (index: number) => void;\n /** Show the pagination dots. Auto-hidden for a single image. Default true. */\n showDots?: boolean;\n /** Allow pointer drag / swipe between slides. Default true. */\n draggable?: boolean;\n /** Aspect ratio of the media box, e.g. \"4 / 3\" or \"1 / 1\". Default \"4 / 3\". */\n ratio?: string;\n /** Overlay slot painted on top of the image — a badge, a gradient, anything. */\n overlay?: ReactNode;\n /** Advance to the next slide on a timer, looping back to the first. Default false. */\n autoplay?: boolean;\n /** Milliseconds between auto-advances. Default 2500. */\n autoplayInterval?: number;\n /** Pause autoplay while the pointer is over the gallery. Default true. */\n pauseOnHover?: boolean;\n}\n\n/** How far you have to drag, as a fraction of the width, before it commits. */\nconst COMMIT_THRESHOLD = 0.18;\n/** Resistance applied when dragging past the first or last slide. */\nconst RUBBER_BAND = 0.35;\n\nexport const ImageCarousel = forwardRef<HTMLDivElement, ImageCarouselProps>(\n (\n {\n images,\n index,\n defaultIndex = 0,\n onIndexChange,\n showDots = true,\n draggable = true,\n ratio = '4 / 3',\n overlay,\n autoplay = false,\n autoplayInterval = 2500,\n pauseOnHover = true,\n className = '',\n style,\n ...rest\n },\n ref,\n ) => {\n const count = images.length;\n const multiple = count > 1;\n const labelId = useId();\n\n const [internal, setInternal] = useState(() =>\n Math.max(0, Math.min(count - 1, defaultIndex)),\n );\n const active = index ?? internal;\n\n const commit = useCallback(\n (next: number) => {\n const clamped = Math.max(0, Math.min(count - 1, next));\n if (clamped === active) return;\n if (index === undefined) setInternal(clamped);\n onIndexChange?.(clamped);\n },\n [active, count, index, onIndexChange],\n );\n\n // Drag state. `drag` is the live pixel offset of the current gesture.\n const viewportRef = useRef<HTMLDivElement>(null);\n const startX = useRef(0);\n const widthRef = useRef(0);\n const [drag, setDrag] = useState(0);\n const [dragging, setDragging] = useState(false);\n const [hovered, setHovered] = useState(false);\n\n // Autoplay — one timeout, re-armed whenever `active` changes (so a manual\n // dot tap or swipe also restarts the clock). Paused on hover and drag, and\n // skipped entirely under reduced-motion.\n useEffect(() => {\n if (!autoplay || !multiple || dragging) return;\n if (pauseOnHover && hovered) return;\n if (\n typeof window !== 'undefined' &&\n window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n ) {\n return;\n }\n const id = window.setTimeout(\n () => commit(active + 1 >= count ? 0 : active + 1),\n autoplayInterval,\n );\n return () => window.clearTimeout(id);\n }, [\n autoplay,\n autoplayInterval,\n pauseOnHover,\n hovered,\n dragging,\n multiple,\n active,\n count,\n commit,\n ]);\n\n const onPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggable || !multiple || e.button !== 0) return;\n widthRef.current = viewportRef.current?.offsetWidth ?? 0;\n startX.current = e.clientX;\n setDragging(true);\n viewportRef.current?.setPointerCapture(e.pointerId);\n };\n\n const onPointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return;\n let dx = e.clientX - startX.current;\n const atStart = active === 0 && dx > 0;\n const atEnd = active === count - 1 && dx < 0;\n if (atStart || atEnd) dx *= RUBBER_BAND;\n setDrag(dx);\n };\n\n const endDrag = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragging) return;\n setDragging(false);\n viewportRef.current?.releasePointerCapture?.(e.pointerId);\n const threshold = (widthRef.current || 1) * COMMIT_THRESHOLD;\n if (drag <= -threshold) commit(active + 1);\n else if (drag >= threshold) commit(active - 1);\n setDrag(0);\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!multiple) return;\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n commit(active + 1);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n commit(active - 1);\n }\n };\n\n // Slide the track by whole slides, then add the in-flight drag offset.\n const trackStyle: CSSProperties = {\n transform: `translate3d(calc(${-active * 100}% + ${drag}px), 0, 0)`,\n };\n\n const classes = [\n 'royui-carousel',\n showDots && multiple ? 'royui-carousel--has-dots' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={ref}\n className={classes}\n style={{ ['--royui-carousel-ratio' as string]: ratio, ...style }}\n role=\"group\"\n aria-roledescription=\"carousel\"\n aria-label=\"Property images\"\n {...rest}\n >\n <div\n ref={viewportRef}\n className=\"royui-carousel__viewport\"\n tabIndex={multiple ? 0 : undefined}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n onMouseEnter={\n autoplay && pauseOnHover ? () => setHovered(true) : undefined\n }\n onMouseLeave={\n autoplay && pauseOnHover ? () => setHovered(false) : undefined\n }\n >\n <div\n className={[\n 'royui-carousel__track',\n dragging ? 'royui-carousel__track--dragging' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n style={trackStyle}\n >\n {images.map((img, i) => (\n <div className=\"royui-carousel__slide\" key={`${img.src}-${i}`}>\n <img\n className=\"royui-carousel__img\"\n src={img.src}\n alt={img.alt ?? ''}\n draggable={false}\n loading={i === 0 ? 'eager' : 'lazy'}\n aria-hidden={i !== active}\n />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"royui-carousel__scrim\" aria-hidden=\"true\" />\n\n {overlay != null && (\n <div className=\"royui-carousel__overlay\">{overlay}</div>\n )}\n\n {showDots && multiple && (\n <div\n className=\"royui-carousel__dots\"\n role=\"tablist\"\n aria-label=\"Choose image\"\n >\n {images.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === active}\n aria-label={`Image ${i + 1} of ${count}`}\n className={[\n 'royui-carousel__dot',\n i === active ? 'royui-carousel__dot--active' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => commit(i)}\n />\n ))}\n </div>\n )}\n\n <span\n id={labelId}\n className=\"royui-carousel__status\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {multiple ? `Image ${active + 1} of ${count}` : ''}\n </span>\n </div>\n );\n },\n);\n\nImageCarousel.displayName = 'ImageCarousel';\n","'use client';\n\nimport {\n Fragment,\n forwardRef,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { Button, type ButtonProps } from '../button';\nimport { ImageCarousel, type CarouselImage } from './ImageCarousel';\nimport './Card.css';\n\nexport interface CardStat {\n /** Small leading glyph. Inherits the muted stat color via currentColor. */\n icon?: ReactNode;\n /** The figure, full-strength — e.g. \"264 m²\" or \"4\". */\n value: ReactNode;\n /** Dimmed descriptor after the figure — e.g. \"Living\" or \"Bedrooms\". */\n label?: ReactNode;\n}\n\nexport interface CardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'onChange'> {\n /** Gallery shown at the top, with swipe + dot pagination. */\n images: CarouselImage[];\n /** Pill label over the image, e.g. \"Prime Pick\". Hidden when omitted. */\n badge?: ReactNode;\n /** Glyph inside the badge. Defaults to a gold star. */\n badgeIcon?: ReactNode;\n /** Headline figure, e.g. \"$250,000\". */\n price: ReactNode;\n /** Muted qualifier next to the price, e.g. \"List price\". */\n priceLabel?: ReactNode;\n /** Secondary line under the price — owner, address, etc. */\n subtitle?: ReactNode;\n /** Inline figures separated by hairline dividers, e.g. living area and rooms. */\n stats?: CardStat[];\n /** Footer attribution. Becomes a link when authorHref is set. */\n author?: ReactNode;\n /** Makes the author name a link. */\n authorHref?: string;\n /** Extra attributes for the author link — target, rel, onClick, etc. */\n authorProps?: AnchorHTMLAttributes<HTMLAnchorElement>;\n /** Right-aligned footer note, e.g. \"2 days ago\". */\n meta?: ReactNode;\n /** Label for the action button. Pass null to drop the button entirely. */\n actionLabel?: ReactNode;\n /** Click handler for the action button. */\n onAction?: () => void;\n /** Escape hatch onto the underlying Button (variant, color, loading, …). */\n actionProps?: Partial<ButtonProps>;\n /** Aspect ratio of the gallery. Default \"4 / 3\". */\n ratio?: string;\n /** Auto-advance the gallery on a timer, looping. Default false. */\n autoplay?: boolean;\n /** Milliseconds between auto-advances. Default 2500. */\n autoplayInterval?: number;\n /** Starting gallery index. */\n defaultIndex?: number;\n /** Fires when the gallery moves. */\n onIndexChange?: (index: number) => void;\n /** Lift + image-zoom on hover. Default true. */\n hoverEffect?: boolean;\n /**\n * Colour scheme. \"auto\" (default) follows the system via prefers-color-scheme;\n * \"light\" is a premium off-white surface, \"dark\" a near-black one.\n */\n theme?: 'light' | 'dark' | 'auto';\n}\n\nconst StarIcon = () => (\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 2.5l2.7 5.9 6.4.7-4.8 4.3 1.3 6.3L12 16.9 6.4 19.7l1.3-6.3L2.9 9.1l6.4-.7L12 2.5z\" />\n </svg>\n);\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n images,\n badge,\n badgeIcon,\n price,\n priceLabel,\n subtitle,\n stats,\n author,\n authorHref,\n authorProps,\n meta,\n actionLabel = 'View Details',\n onAction,\n actionProps,\n ratio = '4 / 3',\n autoplay = false,\n autoplayInterval = 2500,\n defaultIndex,\n onIndexChange,\n hoverEffect = true,\n theme = 'auto',\n className = '',\n ...rest\n },\n ref,\n ) => {\n const classes = [\n 'royui-card',\n hoverEffect ? 'royui-card--interactive' : '',\n theme === 'dark' ? 'royui-card--dark' : '',\n theme === 'auto' ? 'royui-card--auto' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const overlay =\n badge != null ? (\n <span className=\"royui-card__badge\">\n <span className=\"royui-card__badge-icon\">\n {badgeIcon ?? <StarIcon />}\n </span>\n {badge}\n </span>\n ) : undefined;\n\n return (\n <div ref={ref} className={classes} {...rest}>\n <ImageCarousel\n images={images}\n ratio={ratio}\n autoplay={autoplay}\n autoplayInterval={autoplayInterval}\n defaultIndex={defaultIndex}\n onIndexChange={onIndexChange}\n overlay={overlay}\n />\n\n <div className=\"royui-card__body\">\n <div className=\"royui-card__price-row\">\n <span className=\"royui-card__price\">{price}</span>\n {priceLabel != null && (\n <span className=\"royui-card__price-label\">{priceLabel}</span>\n )}\n </div>\n\n {subtitle != null && (\n <p className=\"royui-card__subtitle\">{subtitle}</p>\n )}\n\n {stats && stats.length > 0 && (\n <>\n <div className=\"royui-card__divider\" />\n <div className=\"royui-card__stats\">\n {stats.map((stat, i) => (\n <Fragment key={i}>\n {i > 0 && (\n <span\n className=\"royui-card__stat-sep\"\n aria-hidden=\"true\"\n />\n )}\n <span className=\"royui-card__stat\">\n {stat.icon && (\n <span\n className=\"royui-card__stat-icon\"\n aria-hidden=\"true\"\n >\n {stat.icon}\n </span>\n )}\n <span className=\"royui-card__stat-value\">{stat.value}</span>\n {stat.label != null && (\n <span className=\"royui-card__stat-label\">\n {stat.label}\n </span>\n )}\n </span>\n </Fragment>\n ))}\n </div>\n </>\n )}\n\n {(author != null || meta != null) && (\n <div className=\"royui-card__footer\">\n {author != null && (\n <span className=\"royui-card__author\">\n By{' '}\n {authorHref ? (\n <a\n href={authorHref}\n className=\"royui-card__author-link\"\n {...authorProps}\n >\n {author}\n </a>\n ) : (\n <span className=\"royui-card__author-link\">{author}</span>\n )}\n </span>\n )}\n {meta != null && (\n <span className=\"royui-card__meta\">{meta}</span>\n )}\n </div>\n )}\n </div>\n\n {actionLabel != null && (\n <div className=\"royui-card__action\">\n <Button fullWidth onClick={onAction} {...actionProps}>\n {actionLabel}\n </Button>\n </div>\n )}\n </div>\n );\n },\n);\n\nCard.displayName = 'Card';\n"]}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { TextMorph } from './chunk-MO7UPMW7.js';
|
|
3
|
+
import { Button } from './chunk-B6LXWGX5.js';
|
|
4
|
+
import { forwardRef, useRef, useState, useMemo, useEffect } from 'react';
|
|
5
|
+
import './UploadFiles-CFRCBFZK.css';
|
|
6
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var DEFAULT_STATUS_WORDS = [
|
|
9
|
+
"Uploading\u2026",
|
|
10
|
+
"Transferring\u2026",
|
|
11
|
+
"Beaming bytes\u2026",
|
|
12
|
+
"Encrypting\u2026",
|
|
13
|
+
"Securing\u2026",
|
|
14
|
+
"Packing bits\u2026",
|
|
15
|
+
"Syncing\u2026",
|
|
16
|
+
"Crunching data\u2026",
|
|
17
|
+
"Pushing pixels\u2026",
|
|
18
|
+
"Almost there\u2026",
|
|
19
|
+
"Hang tight\u2026",
|
|
20
|
+
"Wrangling chunks\u2026",
|
|
21
|
+
"Verifying\u2026",
|
|
22
|
+
"Finalizing\u2026",
|
|
23
|
+
"Just a sec\u2026"
|
|
24
|
+
];
|
|
25
|
+
var EXT_META = {
|
|
26
|
+
pdf: { label: "PDF", color: "#f0524b" },
|
|
27
|
+
doc: { label: "DOC", color: "#3b82f6" },
|
|
28
|
+
docx: { label: "DOCX", color: "#3b82f6" },
|
|
29
|
+
fig: { label: "FIG", color: "#a259ff" },
|
|
30
|
+
png: { label: "PNG", color: "#10b981" },
|
|
31
|
+
jpg: { label: "JPG", color: "#10b981" },
|
|
32
|
+
jpeg: { label: "JPG", color: "#10b981" },
|
|
33
|
+
gif: { label: "GIF", color: "#10b981" },
|
|
34
|
+
svg: { label: "SVG", color: "#f59e0b" },
|
|
35
|
+
zip: { label: "ZIP", color: "#f59e0b" },
|
|
36
|
+
mp4: { label: "MP4", color: "#ec4899" },
|
|
37
|
+
csv: { label: "CSV", color: "#22c55e" },
|
|
38
|
+
json: { label: "JSON", color: "#eab308" },
|
|
39
|
+
default: { label: "FILE", color: "#8b8b94" }
|
|
40
|
+
};
|
|
41
|
+
function extMeta(name) {
|
|
42
|
+
const ext = name.split(".").pop()?.toLowerCase() ?? "";
|
|
43
|
+
return EXT_META[ext] ?? EXT_META.default;
|
|
44
|
+
}
|
|
45
|
+
function trimNum(n) {
|
|
46
|
+
return (Math.round(n * 10) / 10).toString();
|
|
47
|
+
}
|
|
48
|
+
function formatBytes(bytes) {
|
|
49
|
+
if (!Number.isFinite(bytes) || bytes < 0) return "0 B";
|
|
50
|
+
if (bytes < 1024) return `${Math.round(bytes)} B`;
|
|
51
|
+
const kb = bytes / 1024;
|
|
52
|
+
if (kb < 1024) return `${trimNum(kb)} KB`;
|
|
53
|
+
const mb = kb / 1024;
|
|
54
|
+
if (mb < 1024) return `${trimNum(mb)} MB`;
|
|
55
|
+
return `${trimNum(mb / 1024)} GB`;
|
|
56
|
+
}
|
|
57
|
+
function shuffle(input) {
|
|
58
|
+
const a = input.slice();
|
|
59
|
+
for (let i = a.length - 1; i > 0; i--) {
|
|
60
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
61
|
+
[a[i], a[j]] = [a[j], a[i]];
|
|
62
|
+
}
|
|
63
|
+
return a;
|
|
64
|
+
}
|
|
65
|
+
var cn = (...classes) => classes.filter(Boolean).join(" ");
|
|
66
|
+
var UploadGlyph = () => /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", width: "22", height: "22", fill: "none", "aria-hidden": "true", children: [
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
"path",
|
|
69
|
+
{
|
|
70
|
+
d: "M12 15V4m0 0L7.5 8.5M12 4l4.5 4.5",
|
|
71
|
+
stroke: "currentColor",
|
|
72
|
+
strokeWidth: "1.6",
|
|
73
|
+
strokeLinecap: "round",
|
|
74
|
+
strokeLinejoin: "round"
|
|
75
|
+
}
|
|
76
|
+
),
|
|
77
|
+
/* @__PURE__ */ jsx(
|
|
78
|
+
"path",
|
|
79
|
+
{
|
|
80
|
+
d: "M4 14v3.5A2.5 2.5 0 0 0 6.5 20h11a2.5 2.5 0 0 0 2.5-2.5V14",
|
|
81
|
+
stroke: "currentColor",
|
|
82
|
+
strokeWidth: "1.6",
|
|
83
|
+
strokeLinecap: "round"
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
] });
|
|
87
|
+
var CloseGlyph = () => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "16", height: "16", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
|
|
88
|
+
"path",
|
|
89
|
+
{
|
|
90
|
+
d: "M6 6l12 12M18 6L6 18",
|
|
91
|
+
stroke: "currentColor",
|
|
92
|
+
strokeWidth: "1.6",
|
|
93
|
+
strokeLinecap: "round"
|
|
94
|
+
}
|
|
95
|
+
) });
|
|
96
|
+
var TrashGlyph = () => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "17", height: "17", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
|
|
97
|
+
"path",
|
|
98
|
+
{
|
|
99
|
+
d: "M4 7h16M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7m2 0v11.5A1.5 1.5 0 0 1 15.5 20h-7A1.5 1.5 0 0 1 7 18.5V7m3 3.5v6m4-6v6",
|
|
100
|
+
stroke: "currentColor",
|
|
101
|
+
strokeWidth: "1.5",
|
|
102
|
+
strokeLinecap: "round",
|
|
103
|
+
strokeLinejoin: "round"
|
|
104
|
+
}
|
|
105
|
+
) });
|
|
106
|
+
var CheckGlyph = () => /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "13", height: "13", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
|
|
107
|
+
"path",
|
|
108
|
+
{
|
|
109
|
+
d: "M4 12.5l5 5 11-12",
|
|
110
|
+
stroke: "currentColor",
|
|
111
|
+
strokeWidth: "2.2",
|
|
112
|
+
strokeLinecap: "round",
|
|
113
|
+
strokeLinejoin: "round"
|
|
114
|
+
}
|
|
115
|
+
) });
|
|
116
|
+
var KebabGlyph = () => /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 24 24", width: "16", height: "16", fill: "currentColor", "aria-hidden": "true", children: [
|
|
117
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "5", r: "1.7" }),
|
|
118
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "1.7" }),
|
|
119
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "19", r: "1.7" })
|
|
120
|
+
] });
|
|
121
|
+
function FileRow({
|
|
122
|
+
file,
|
|
123
|
+
word,
|
|
124
|
+
onRemove
|
|
125
|
+
}) {
|
|
126
|
+
const meta = extMeta(file.name);
|
|
127
|
+
const pct = file.progress != null ? Math.max(0, Math.min(100, Math.round(file.progress))) : file.size > 0 ? Math.max(0, Math.min(100, Math.round((file.uploaded ?? 0) / file.size * 100))) : 0;
|
|
128
|
+
const isUploading = file.status === "uploading";
|
|
129
|
+
const isError = file.status === "error";
|
|
130
|
+
return /* @__PURE__ */ jsxs("div", { className: "royui-upload__row", "data-status": file.status, children: [
|
|
131
|
+
/* @__PURE__ */ jsx(
|
|
132
|
+
"span",
|
|
133
|
+
{
|
|
134
|
+
className: "royui-upload__badge",
|
|
135
|
+
style: { ["--royui-upload-badge"]: file.icon ? "transparent" : meta.color },
|
|
136
|
+
"aria-hidden": "true",
|
|
137
|
+
children: file.icon ?? /* @__PURE__ */ jsx("span", { className: "royui-upload__badge-label", children: meta.label })
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-upload__row-main", children: [
|
|
141
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-upload__row-top", children: [
|
|
142
|
+
/* @__PURE__ */ jsx("span", { className: "royui-upload__name", title: file.name, children: file.name }),
|
|
143
|
+
/* @__PURE__ */ jsx(
|
|
144
|
+
"button",
|
|
145
|
+
{
|
|
146
|
+
type: "button",
|
|
147
|
+
className: "royui-upload__row-action",
|
|
148
|
+
"aria-label": isUploading ? `Cancel ${file.name}` : `Remove ${file.name}`,
|
|
149
|
+
onClick: () => onRemove?.(file.id),
|
|
150
|
+
children: isUploading ? /* @__PURE__ */ jsx(CloseGlyph, {}) : /* @__PURE__ */ jsx(TrashGlyph, {})
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
] }),
|
|
154
|
+
/* @__PURE__ */ jsxs("div", { className: "royui-upload__meta", children: [
|
|
155
|
+
file.status === "complete" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
156
|
+
/* @__PURE__ */ jsx("span", { children: formatBytes(file.size) }),
|
|
157
|
+
/* @__PURE__ */ jsx("span", { className: "royui-upload__meta-sep", children: "/" }),
|
|
158
|
+
/* @__PURE__ */ jsxs("span", { className: "royui-upload__complete", children: [
|
|
159
|
+
/* @__PURE__ */ jsx(CheckGlyph, {}),
|
|
160
|
+
"Complete"
|
|
161
|
+
] })
|
|
162
|
+
] }),
|
|
163
|
+
isUploading && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
164
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
165
|
+
/* @__PURE__ */ jsx(TextMorph, { value: formatBytes(file.uploaded ?? 0) }),
|
|
166
|
+
" of",
|
|
167
|
+
" ",
|
|
168
|
+
formatBytes(file.size)
|
|
169
|
+
] }),
|
|
170
|
+
/* @__PURE__ */ jsx("span", { className: "royui-upload__meta-sep", children: "/" }),
|
|
171
|
+
/* @__PURE__ */ jsx(
|
|
172
|
+
TextMorph,
|
|
173
|
+
{
|
|
174
|
+
className: "royui-upload__status",
|
|
175
|
+
value: word,
|
|
176
|
+
renderText: (t) => /* @__PURE__ */ jsx("span", { className: "royui-upload__shimmer", children: t })
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
] }),
|
|
180
|
+
isError && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
181
|
+
/* @__PURE__ */ jsx("span", { children: formatBytes(file.size) }),
|
|
182
|
+
/* @__PURE__ */ jsx("span", { className: "royui-upload__meta-sep", children: "/" }),
|
|
183
|
+
/* @__PURE__ */ jsx("span", { className: "royui-upload__error", children: "Failed" })
|
|
184
|
+
] })
|
|
185
|
+
] }),
|
|
186
|
+
isUploading && /* @__PURE__ */ jsxs("div", { className: "royui-upload__progress", children: [
|
|
187
|
+
/* @__PURE__ */ jsx(
|
|
188
|
+
"div",
|
|
189
|
+
{
|
|
190
|
+
className: "royui-upload__bar",
|
|
191
|
+
role: "progressbar",
|
|
192
|
+
"aria-valuenow": pct,
|
|
193
|
+
"aria-valuemin": 0,
|
|
194
|
+
"aria-valuemax": 100,
|
|
195
|
+
children: /* @__PURE__ */ jsx("div", { className: "royui-upload__bar-fill", style: { width: `${pct}%` } })
|
|
196
|
+
}
|
|
197
|
+
),
|
|
198
|
+
/* @__PURE__ */ jsxs("span", { className: "royui-upload__pct", children: [
|
|
199
|
+
pct,
|
|
200
|
+
"%"
|
|
201
|
+
] })
|
|
202
|
+
] })
|
|
203
|
+
] })
|
|
204
|
+
] });
|
|
205
|
+
}
|
|
206
|
+
var UploadFiles = forwardRef(
|
|
207
|
+
function UploadFiles2({
|
|
208
|
+
files,
|
|
209
|
+
title = "Upload files",
|
|
210
|
+
maxSizeLabel = "MAX FILE SIZE: 20 MB",
|
|
211
|
+
accept,
|
|
212
|
+
multiple = true,
|
|
213
|
+
theme = "dark",
|
|
214
|
+
statusWords = DEFAULT_STATUS_WORDS,
|
|
215
|
+
actionLabel,
|
|
216
|
+
onFilesSelected,
|
|
217
|
+
onRemove,
|
|
218
|
+
onRemoveAll,
|
|
219
|
+
onClose,
|
|
220
|
+
onAction,
|
|
221
|
+
className = "",
|
|
222
|
+
...rest
|
|
223
|
+
}, ref) {
|
|
224
|
+
const inputRef = useRef(null);
|
|
225
|
+
const [isDragging, setDragging] = useState(false);
|
|
226
|
+
const [tick, setTick] = useState(0);
|
|
227
|
+
const anyUploading = files.some((f) => f.status === "uploading");
|
|
228
|
+
const words = useMemo(
|
|
229
|
+
() => statusWords.length ? shuffle(statusWords) : DEFAULT_STATUS_WORDS,
|
|
230
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
231
|
+
[]
|
|
232
|
+
);
|
|
233
|
+
useEffect(() => {
|
|
234
|
+
if (!anyUploading) return;
|
|
235
|
+
const id = setInterval(() => setTick((t) => t + 1), 1900);
|
|
236
|
+
return () => clearInterval(id);
|
|
237
|
+
}, [anyUploading]);
|
|
238
|
+
const emit = (list) => {
|
|
239
|
+
if (!list || list.length === 0) return;
|
|
240
|
+
onFilesSelected?.(Array.from(list));
|
|
241
|
+
};
|
|
242
|
+
const classes = cn(
|
|
243
|
+
"royui-upload",
|
|
244
|
+
theme === "dark" && "royui-upload--dark",
|
|
245
|
+
theme === "light" && "royui-upload--light",
|
|
246
|
+
theme === "auto" && "royui-upload--auto",
|
|
247
|
+
className
|
|
248
|
+
);
|
|
249
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: classes, ...rest, children: [
|
|
250
|
+
/* @__PURE__ */ jsxs("header", { className: "royui-upload__header", children: [
|
|
251
|
+
/* @__PURE__ */ jsx("h2", { className: "royui-upload__title", children: title }),
|
|
252
|
+
onClose && /* @__PURE__ */ jsx(
|
|
253
|
+
"button",
|
|
254
|
+
{
|
|
255
|
+
type: "button",
|
|
256
|
+
className: "royui-upload__close",
|
|
257
|
+
"aria-label": "Close",
|
|
258
|
+
onClick: onClose,
|
|
259
|
+
children: /* @__PURE__ */ jsx(CloseGlyph, {})
|
|
260
|
+
}
|
|
261
|
+
)
|
|
262
|
+
] }),
|
|
263
|
+
/* @__PURE__ */ jsxs(
|
|
264
|
+
"div",
|
|
265
|
+
{
|
|
266
|
+
className: cn("royui-upload__dropzone", isDragging && "is-dragging"),
|
|
267
|
+
onDragOver: (e) => {
|
|
268
|
+
e.preventDefault();
|
|
269
|
+
setDragging(true);
|
|
270
|
+
},
|
|
271
|
+
onDragLeave: (e) => {
|
|
272
|
+
e.preventDefault();
|
|
273
|
+
setDragging(false);
|
|
274
|
+
},
|
|
275
|
+
onDrop: (e) => {
|
|
276
|
+
e.preventDefault();
|
|
277
|
+
setDragging(false);
|
|
278
|
+
emit(e.dataTransfer.files);
|
|
279
|
+
},
|
|
280
|
+
children: [
|
|
281
|
+
/* @__PURE__ */ jsx("span", { className: "royui-upload__drop-icon", "aria-hidden": "true", children: /* @__PURE__ */ jsx(UploadGlyph, {}) }),
|
|
282
|
+
/* @__PURE__ */ jsxs("p", { className: "royui-upload__drop-text", children: [
|
|
283
|
+
"Drag and drop or",
|
|
284
|
+
" ",
|
|
285
|
+
/* @__PURE__ */ jsx(
|
|
286
|
+
"button",
|
|
287
|
+
{
|
|
288
|
+
type: "button",
|
|
289
|
+
className: "royui-upload__browse",
|
|
290
|
+
onClick: () => inputRef.current?.click(),
|
|
291
|
+
children: "browse files"
|
|
292
|
+
}
|
|
293
|
+
)
|
|
294
|
+
] }),
|
|
295
|
+
/* @__PURE__ */ jsx("p", { className: "royui-upload__drop-hint", children: maxSizeLabel }),
|
|
296
|
+
/* @__PURE__ */ jsx(
|
|
297
|
+
"input",
|
|
298
|
+
{
|
|
299
|
+
ref: inputRef,
|
|
300
|
+
type: "file",
|
|
301
|
+
accept,
|
|
302
|
+
multiple,
|
|
303
|
+
className: "royui-upload__input",
|
|
304
|
+
onChange: (e) => {
|
|
305
|
+
emit(e.target.files);
|
|
306
|
+
e.target.value = "";
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
)
|
|
310
|
+
]
|
|
311
|
+
}
|
|
312
|
+
),
|
|
313
|
+
files.length > 0 && /* @__PURE__ */ jsx("div", { className: "royui-upload__list", children: files.map((file, i) => /* @__PURE__ */ jsx(
|
|
314
|
+
FileRow,
|
|
315
|
+
{
|
|
316
|
+
file,
|
|
317
|
+
word: words[(tick + i) % words.length],
|
|
318
|
+
onRemove
|
|
319
|
+
},
|
|
320
|
+
file.id
|
|
321
|
+
)) }),
|
|
322
|
+
files.length > 0 && /* @__PURE__ */ jsxs("footer", { className: "royui-upload__footer", children: [
|
|
323
|
+
/* @__PURE__ */ jsx(
|
|
324
|
+
"button",
|
|
325
|
+
{
|
|
326
|
+
type: "button",
|
|
327
|
+
className: "royui-upload__icon-btn",
|
|
328
|
+
"aria-label": "More options",
|
|
329
|
+
children: /* @__PURE__ */ jsx(KebabGlyph, {})
|
|
330
|
+
}
|
|
331
|
+
),
|
|
332
|
+
/* @__PURE__ */ jsxs(
|
|
333
|
+
"button",
|
|
334
|
+
{
|
|
335
|
+
type: "button",
|
|
336
|
+
className: "royui-upload__remove-all",
|
|
337
|
+
onClick: onRemoveAll,
|
|
338
|
+
children: [
|
|
339
|
+
/* @__PURE__ */ jsx(TrashGlyph, {}),
|
|
340
|
+
"Remove all"
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
),
|
|
344
|
+
/* @__PURE__ */ jsx("span", { className: "royui-upload__footer-spacer" }),
|
|
345
|
+
/* @__PURE__ */ jsx(
|
|
346
|
+
Button,
|
|
347
|
+
{
|
|
348
|
+
size: "sm",
|
|
349
|
+
variant: "secondary",
|
|
350
|
+
disabled: anyUploading,
|
|
351
|
+
onClick: onAction,
|
|
352
|
+
children: actionLabel ?? (anyUploading ? /* @__PURE__ */ jsx(TextMorph, { value: "Uploading\u2026" }) : "Done")
|
|
353
|
+
}
|
|
354
|
+
)
|
|
355
|
+
] })
|
|
356
|
+
] });
|
|
357
|
+
}
|
|
358
|
+
);
|
|
359
|
+
UploadFiles.displayName = "UploadFiles";
|
|
360
|
+
|
|
361
|
+
export { UploadFiles };
|
|
362
|
+
//# sourceMappingURL=chunk-XVN2VWF5.js.map
|
|
363
|
+
//# sourceMappingURL=chunk-XVN2VWF5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/upload-files/UploadFiles.tsx"],"names":["UploadFiles"],"mappings":"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","file":"chunk-XVN2VWF5.js","sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { TextMorph } from '../text-morph/TextMorph';\nimport { Button } from '../button/Button';\nimport './UploadFiles.css';\n\nexport type UploadStatus = 'uploading' | 'complete' | 'error';\n\nexport interface UploadFile {\n /** Stable id — used as the React key and passed back to onRemove. */\n id: string;\n /** File name including extension; drives the type badge. */\n name: string;\n /** Total size in bytes. */\n size: number;\n /** Bytes transferred so far. Drives the \"X OF Y\" label and, when\n * `progress` is omitted, the percentage. */\n uploaded?: number;\n /** Progress 0–100. Falls back to uploaded / size when omitted. */\n progress?: number;\n /** Lifecycle state. */\n status: UploadStatus;\n /** Optional override for the file-type badge. */\n icon?: ReactNode;\n}\n\nexport type UploadTheme = 'auto' | 'light' | 'dark';\n\nexport interface UploadFilesProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** The files to render. The component is controlled — it draws this\n * list and emits events; the consumer owns the upload + progress. */\n files: UploadFile[];\n /** Panel heading. Defaults to \"Upload files\". */\n title?: ReactNode;\n /** Caption under the dropzone. Defaults to \"MAX FILE SIZE: 20 MB\". */\n maxSizeLabel?: string;\n /** Forwarded to the hidden file input's `accept`. */\n accept?: string;\n /** Allow selecting multiple files. Defaults to true. */\n multiple?: boolean;\n /** Color scheme. Dark by default; \"auto\" follows the OS. */\n theme?: UploadTheme;\n /** Words cycled (and morphed) in the per-file status while uploading.\n * Defaults to a long, varied upload vocabulary so the wait stays lively. */\n statusWords?: string[];\n /** Footer action button content. Defaults to a state-derived label\n * (\"Uploading…\" while in flight, \"Done\" otherwise). */\n actionLabel?: ReactNode;\n /** Fired with the dropped / browsed File objects. */\n onFilesSelected?: (files: File[]) => void;\n /** Fired when a single row's trash / cancel control is pressed. */\n onRemove?: (id: string) => void;\n /** Fired by the \"Remove all\" footer control. */\n onRemoveAll?: () => void;\n /** When provided, renders the header close (×) button. */\n onClose?: () => void;\n /** Fired by the footer action button. */\n onAction?: () => void;\n}\n\nconst DEFAULT_STATUS_WORDS = [\n 'Uploading…',\n 'Transferring…',\n 'Beaming bytes…',\n 'Encrypting…',\n 'Securing…',\n 'Packing bits…',\n 'Syncing…',\n 'Crunching data…',\n 'Pushing pixels…',\n 'Almost there…',\n 'Hang tight…',\n 'Wrangling chunks…',\n 'Verifying…',\n 'Finalizing…',\n 'Just a sec…',\n];\n\nconst EXT_META: Record<string, { label: string; color: string }> = {\n pdf: { label: 'PDF', color: '#f0524b' },\n doc: { label: 'DOC', color: '#3b82f6' },\n docx: { label: 'DOCX', color: '#3b82f6' },\n fig: { label: 'FIG', color: '#a259ff' },\n png: { label: 'PNG', color: '#10b981' },\n jpg: { label: 'JPG', color: '#10b981' },\n jpeg: { label: 'JPG', color: '#10b981' },\n gif: { label: 'GIF', color: '#10b981' },\n svg: { label: 'SVG', color: '#f59e0b' },\n zip: { label: 'ZIP', color: '#f59e0b' },\n mp4: { label: 'MP4', color: '#ec4899' },\n csv: { label: 'CSV', color: '#22c55e' },\n json: { label: 'JSON', color: '#eab308' },\n default: { label: 'FILE', color: '#8b8b94' },\n};\n\nfunction extMeta(name: string) {\n const ext = name.split('.').pop()?.toLowerCase() ?? '';\n return EXT_META[ext] ?? EXT_META.default!;\n}\n\nfunction trimNum(n: number): string {\n return (Math.round(n * 10) / 10).toString();\n}\n\n/** Human-readable byte size, e.g. 2.7 MB / 14 MB. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return '0 B';\n if (bytes < 1024) return `${Math.round(bytes)} B`;\n const kb = bytes / 1024;\n if (kb < 1024) return `${trimNum(kb)} KB`;\n const mb = kb / 1024;\n if (mb < 1024) return `${trimNum(mb)} MB`;\n return `${trimNum(mb / 1024)} GB`;\n}\n\n/** Deterministic-ish shuffle (Fisher–Yates) so the word order varies per\n * session without two adjacent entries being the same word. */\nfunction shuffle<T>(input: T[]): T[] {\n const a = input.slice();\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j]!, a[i]!];\n }\n return a;\n}\n\nconst cn = (...classes: (string | false | undefined)[]) =>\n classes.filter(Boolean).join(' ');\n\n/* ── Icons ──────────────────────────────────────────────────────────────── */\n\nconst UploadGlyph = () => (\n <svg viewBox=\"0 0 24 24\" width=\"22\" height=\"22\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M12 15V4m0 0L7.5 8.5M12 4l4.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4 14v3.5A2.5 2.5 0 0 0 6.5 20h11a2.5 2.5 0 0 0 2.5-2.5V14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst CloseGlyph = () => (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M6 6l12 12M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst TrashGlyph = () => (\n <svg viewBox=\"0 0 24 24\" width=\"17\" height=\"17\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 7h16M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7m2 0v11.5A1.5 1.5 0 0 1 15.5 20h-7A1.5 1.5 0 0 1 7 18.5V7m3 3.5v6m4-6v6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CheckGlyph = () => (\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4 12.5l5 5 11-12\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst KebabGlyph = () => (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"5\" r=\"1.7\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.7\" />\n <circle cx=\"12\" cy=\"19\" r=\"1.7\" />\n </svg>\n);\n\n/* ── File row ───────────────────────────────────────────────────────────── */\n\nfunction FileRow({\n file,\n word,\n onRemove,\n}: {\n file: UploadFile;\n word: string;\n onRemove?: (id: string) => void;\n}) {\n const meta = extMeta(file.name);\n const pct =\n file.progress != null\n ? Math.max(0, Math.min(100, Math.round(file.progress)))\n : file.size > 0\n ? Math.max(0, Math.min(100, Math.round(((file.uploaded ?? 0) / file.size) * 100)))\n : 0;\n\n const isUploading = file.status === 'uploading';\n const isError = file.status === 'error';\n\n return (\n <div className=\"royui-upload__row\" data-status={file.status}>\n <span\n className=\"royui-upload__badge\"\n style={{ ['--royui-upload-badge' as string]: file.icon ? 'transparent' : meta.color }}\n aria-hidden=\"true\"\n >\n {file.icon ?? <span className=\"royui-upload__badge-label\">{meta.label}</span>}\n </span>\n\n <div className=\"royui-upload__row-main\">\n <div className=\"royui-upload__row-top\">\n <span className=\"royui-upload__name\" title={file.name}>\n {file.name}\n </span>\n <button\n type=\"button\"\n className=\"royui-upload__row-action\"\n aria-label={isUploading ? `Cancel ${file.name}` : `Remove ${file.name}`}\n onClick={() => onRemove?.(file.id)}\n >\n {isUploading ? <CloseGlyph /> : <TrashGlyph />}\n </button>\n </div>\n\n <div className=\"royui-upload__meta\">\n {file.status === 'complete' && (\n <>\n <span>{formatBytes(file.size)}</span>\n <span className=\"royui-upload__meta-sep\">/</span>\n <span className=\"royui-upload__complete\">\n <CheckGlyph />\n Complete\n </span>\n </>\n )}\n {isUploading && (\n <>\n <span>\n <TextMorph value={formatBytes(file.uploaded ?? 0)} /> of{' '}\n {formatBytes(file.size)}\n </span>\n <span className=\"royui-upload__meta-sep\">/</span>\n <TextMorph\n className=\"royui-upload__status\"\n value={word}\n renderText={(t) => (\n <span className=\"royui-upload__shimmer\">{t}</span>\n )}\n />\n </>\n )}\n {isError && (\n <>\n <span>{formatBytes(file.size)}</span>\n <span className=\"royui-upload__meta-sep\">/</span>\n <span className=\"royui-upload__error\">Failed</span>\n </>\n )}\n </div>\n\n {isUploading && (\n <div className=\"royui-upload__progress\">\n <div\n className=\"royui-upload__bar\"\n role=\"progressbar\"\n aria-valuenow={pct}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div className=\"royui-upload__bar-fill\" style={{ width: `${pct}%` }} />\n </div>\n <span className=\"royui-upload__pct\">{pct}%</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Component ──────────────────────────────────────────────────────────── */\n\nexport const UploadFiles = forwardRef<HTMLDivElement, UploadFilesProps>(\n function UploadFiles(\n {\n files,\n title = 'Upload files',\n maxSizeLabel = 'MAX FILE SIZE: 20 MB',\n accept,\n multiple = true,\n theme = 'dark',\n statusWords = DEFAULT_STATUS_WORDS,\n actionLabel,\n onFilesSelected,\n onRemove,\n onRemoveAll,\n onClose,\n onAction,\n className = '',\n ...rest\n },\n ref,\n ) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragging, setDragging] = useState(false);\n const [tick, setTick] = useState(0);\n\n const anyUploading = files.some((f) => f.status === 'uploading');\n\n // Shuffle once per mount so the word order varies between sessions.\n const words = useMemo(\n () => (statusWords.length ? shuffle(statusWords) : DEFAULT_STATUS_WORDS),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n // Advance the shared cycle only while something is in flight.\n useEffect(() => {\n if (!anyUploading) return;\n const id = setInterval(() => setTick((t) => t + 1), 1900);\n return () => clearInterval(id);\n }, [anyUploading]);\n\n const emit = (list: FileList | null) => {\n if (!list || list.length === 0) return;\n onFilesSelected?.(Array.from(list));\n };\n\n const classes = cn(\n 'royui-upload',\n theme === 'dark' && 'royui-upload--dark',\n theme === 'light' && 'royui-upload--light',\n theme === 'auto' && 'royui-upload--auto',\n className,\n );\n\n return (\n <div ref={ref} className={classes} {...rest}>\n <header className=\"royui-upload__header\">\n <h2 className=\"royui-upload__title\">{title}</h2>\n {onClose && (\n <button\n type=\"button\"\n className=\"royui-upload__close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <CloseGlyph />\n </button>\n )}\n </header>\n\n <div\n className={cn('royui-upload__dropzone', isDragging && 'is-dragging')}\n onDragOver={(e) => {\n e.preventDefault();\n setDragging(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n setDragging(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n setDragging(false);\n emit(e.dataTransfer.files);\n }}\n >\n <span className=\"royui-upload__drop-icon\" aria-hidden=\"true\">\n <UploadGlyph />\n </span>\n <p className=\"royui-upload__drop-text\">\n Drag and drop or{' '}\n <button\n type=\"button\"\n className=\"royui-upload__browse\"\n onClick={() => inputRef.current?.click()}\n >\n browse files\n </button>\n </p>\n <p className=\"royui-upload__drop-hint\">{maxSizeLabel}</p>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"royui-upload__input\"\n onChange={(e) => {\n emit(e.target.files);\n e.target.value = '';\n }}\n />\n </div>\n\n {files.length > 0 && (\n <div className=\"royui-upload__list\">\n {files.map((file, i) => (\n <FileRow\n key={file.id}\n file={file}\n word={words[(tick + i) % words.length]!}\n onRemove={onRemove}\n />\n ))}\n </div>\n )}\n\n {files.length > 0 && (\n <footer className=\"royui-upload__footer\">\n <button\n type=\"button\"\n className=\"royui-upload__icon-btn\"\n aria-label=\"More options\"\n >\n <KebabGlyph />\n </button>\n <button\n type=\"button\"\n className=\"royui-upload__remove-all\"\n onClick={onRemoveAll}\n >\n <TrashGlyph />\n Remove all\n </button>\n <span className=\"royui-upload__footer-spacer\" />\n <Button\n size=\"sm\"\n variant=\"secondary\"\n disabled={anyUploading}\n onClick={onAction}\n >\n {actionLabel ??\n (anyUploading ? (\n <TextMorph value=\"Uploading…\" />\n ) : (\n 'Done'\n ))}\n </Button>\n </footer>\n )}\n </div>\n );\n },\n);\n\nUploadFiles.displayName = 'UploadFiles';\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { Card, ImageCarousel } from '../../chunk-
|
|
3
|
-
import '../../chunk-
|
|
2
|
+
export { Card, ImageCarousel } from '../../chunk-TBBQRMCG.js';
|
|
3
|
+
import '../../chunk-ORTCK34Y.js';
|
|
4
|
+
import '../../chunk-B6LXWGX5.js';
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode, HTMLAttributes } from 'react';
|
|
3
|
+
|
|
4
|
+
type UploadStatus = 'uploading' | 'complete' | 'error';
|
|
5
|
+
interface UploadFile {
|
|
6
|
+
/** Stable id — used as the React key and passed back to onRemove. */
|
|
7
|
+
id: string;
|
|
8
|
+
/** File name including extension; drives the type badge. */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Total size in bytes. */
|
|
11
|
+
size: number;
|
|
12
|
+
/** Bytes transferred so far. Drives the "X OF Y" label and, when
|
|
13
|
+
* `progress` is omitted, the percentage. */
|
|
14
|
+
uploaded?: number;
|
|
15
|
+
/** Progress 0–100. Falls back to uploaded / size when omitted. */
|
|
16
|
+
progress?: number;
|
|
17
|
+
/** Lifecycle state. */
|
|
18
|
+
status: UploadStatus;
|
|
19
|
+
/** Optional override for the file-type badge. */
|
|
20
|
+
icon?: ReactNode;
|
|
21
|
+
}
|
|
22
|
+
type UploadTheme = 'auto' | 'light' | 'dark';
|
|
23
|
+
interface UploadFilesProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
|
|
24
|
+
/** The files to render. The component is controlled — it draws this
|
|
25
|
+
* list and emits events; the consumer owns the upload + progress. */
|
|
26
|
+
files: UploadFile[];
|
|
27
|
+
/** Panel heading. Defaults to "Upload files". */
|
|
28
|
+
title?: ReactNode;
|
|
29
|
+
/** Caption under the dropzone. Defaults to "MAX FILE SIZE: 20 MB". */
|
|
30
|
+
maxSizeLabel?: string;
|
|
31
|
+
/** Forwarded to the hidden file input's `accept`. */
|
|
32
|
+
accept?: string;
|
|
33
|
+
/** Allow selecting multiple files. Defaults to true. */
|
|
34
|
+
multiple?: boolean;
|
|
35
|
+
/** Color scheme. Dark by default; "auto" follows the OS. */
|
|
36
|
+
theme?: UploadTheme;
|
|
37
|
+
/** Words cycled (and morphed) in the per-file status while uploading.
|
|
38
|
+
* Defaults to a long, varied upload vocabulary so the wait stays lively. */
|
|
39
|
+
statusWords?: string[];
|
|
40
|
+
/** Footer action button content. Defaults to a state-derived label
|
|
41
|
+
* ("Uploading…" while in flight, "Done" otherwise). */
|
|
42
|
+
actionLabel?: ReactNode;
|
|
43
|
+
/** Fired with the dropped / browsed File objects. */
|
|
44
|
+
onFilesSelected?: (files: File[]) => void;
|
|
45
|
+
/** Fired when a single row's trash / cancel control is pressed. */
|
|
46
|
+
onRemove?: (id: string) => void;
|
|
47
|
+
/** Fired by the "Remove all" footer control. */
|
|
48
|
+
onRemoveAll?: () => void;
|
|
49
|
+
/** When provided, renders the header close (×) button. */
|
|
50
|
+
onClose?: () => void;
|
|
51
|
+
/** Fired by the footer action button. */
|
|
52
|
+
onAction?: () => void;
|
|
53
|
+
}
|
|
54
|
+
declare const UploadFiles: react.ForwardRefExoticComponent<UploadFilesProps & react.RefAttributes<HTMLDivElement>>;
|
|
55
|
+
|
|
56
|
+
export { type UploadFile, UploadFiles, type UploadFilesProps, type UploadStatus, type UploadTheme };
|