@spark-ui/components 16.0.2 → 16.0.3

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.
@@ -1,6 +1,11 @@
1
1
  import { ComponentPropsWithRef, PropsWithChildren } from 'react';
2
2
  import { RatingDisplayStarProps } from './RatingDisplayStar';
3
3
  export interface RatingDisplayProps extends PropsWithChildren<ComponentPropsWithRef<'div'>> {
4
+ /**
5
+ * When true, merges props onto the single child element instead of rendering a div.
6
+ * Use to render the root as a link or another custom element.
7
+ */
8
+ asChild?: boolean;
4
9
  /**
5
10
  * The rating value to display, on a scale from 0 to 5.
6
11
  */
@@ -21,6 +26,6 @@ export interface RatingDisplayProps extends PropsWithChildren<ComponentPropsWith
21
26
  }
22
27
  export type RatingDisplayRootProps = RatingDisplayProps;
23
28
  export declare const RatingDisplay: {
24
- ({ value, size, count, ref, children, ...rest }: RatingDisplayProps): import("react/jsx-runtime").JSX.Element;
29
+ ({ value, size, count, asChild, ref, children, ...rest }: RatingDisplayProps): import("react/jsx-runtime").JSX.Element;
25
30
  displayName: string;
26
31
  };
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),x=require("react"),o=require("class-variance-authority"),N=require("@spark-ui/icons/StarFill"),V=require("@spark-ui/icons/StarOutline"),y=require("../Icon-CF0W0LKr.js"),D=x.createContext(null),j=({value:t,size:a,count:s,children:e})=>n.jsx(D.Provider,{value:{value:t,size:a,count:s},children:e}),d=()=>{const t=x.useContext(D);if(!t)throw new Error("RatingDisplay compound components must be used within RatingDisplay.");return t},v=({value:t=0,size:a="md",count:s,ref:e,children:r,...i})=>{const l=t??0;return n.jsx(j,{value:l,size:a,count:s,children:n.jsx("div",{ref:e,className:"gap-x-sm relative inline-flex items-center","data-spark-component":"rating-display",...i,children:r})})};v.displayName="RatingDisplay";const b=o.cva("text-on-surface/dim-1",{variants:{size:{sm:"text-caption",md:"text-body-2",lg:"text-display-3"}},defaultVariants:{size:"md"}}),p=({className:t,children:a,...s})=>{const{count:e,size:r}=d();if(e===void 0)return null;const i=typeof a=="function"?a(e):a??e;return n.jsxs("span",{className:b({size:r??"md",className:t}),...s,children:["(",i,")"]})};p.displayName="RatingDisplay.Count";const h=o.cva(["relative block after:absolute after:block after:inset-0"],{variants:{gap:{sm:["after:w-[calc(100%+(var(--spacing-sm)))]","last-of-type:after:content-none"],md:["after:w-[calc(100%+(var(--spacing-md)))]","last-of-type:after:content-none"]}},defaultVariants:{gap:"sm"}}),f=o.cva("",{variants:{size:{sm:"text-caption-link",md:"text-body-1",lg:"text-display-3"},design:{filled:["text-main-variant"],outlined:["text-on-surface/dim-3"]}}}),z=({value:t,size:a})=>n.jsxs("div",{"data-spark-component":"rating-display-star","data-part":"star",className:h({gap:a==="lg"?"md":"sm"}),children:[n.jsx("div",{className:o.cx("z-raised absolute overflow-hidden"),style:{width:t*100+"%"},children:n.jsx(y.Icon,{className:f({size:a,design:"filled"}),children:n.jsx(N.StarFill,{})})}),n.jsx(y.Icon,{className:f({size:a,design:"outlined"}),children:n.jsx(V.StarOutline,{})})]});function C(t){return Math.round(t/.5)*.5}function w(t){const a=Intl.DateTimeFormat().resolvedOptions().locale;return new Intl.NumberFormat(a,{minimumFractionDigits:0,maximumFractionDigits:1}).format(t)}function k({value:t,index:a}){if(t===void 0)return 0;const s=a+1,e=C(t);return Math.ceil(e)<s?0:e>=s?1:.5}function q(t){return t===void 0||t<1?0:t<4?.5:1}const m=({size:t,variant:a="default",getFillMode:s})=>{const{value:e,size:r}=d(),i=t??r,l=c=>s?s({index:c,value:e}):a==="single-star"?q(e):k({index:c,value:e}),S=a==="single-star"?[l(0)]:Array.from({length:5},(c,u)=>l(u));return n.jsx("div",{"data-spark-component":"rating-display-stars",className:o.cx(i==="lg"?"gap-x-md":"gap-x-sm","flex"),children:S.map((c,u)=>n.jsx(z,{size:i,value:c},u))})};m.displayName="RatingDisplay.Stars";const I=o.cva("text-on-surface font-bold",{variants:{size:{sm:"text-caption",md:"text-body-2",lg:"text-display-3"}},defaultVariants:{size:"md"}}),g=({className:t,children:a,...s})=>{const{value:e,size:r}=d(),i=w(e),l=typeof a=="function"?a(i,e):a??i;return n.jsx("span",{"data-spark-component":"rating-display-value",className:I({size:r??"md",className:t}),...s,children:l})};g.displayName="RatingDisplay.Value";const R=Object.assign(v,{Stars:m,Value:g,Count:p});R.displayName="RatingDisplay";m.displayName="RatingDisplay.Stars";g.displayName="RatingDisplay.Value";p.displayName="RatingDisplay.Count";exports.RatingDisplay=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),N=require("../Slot-DQ8z2zsy.js"),D=require("react"),c=require("class-variance-authority"),V=require("@spark-ui/icons/StarFill"),j=require("@spark-ui/icons/StarOutline"),f=require("../Icon-CF0W0LKr.js"),v=D.createContext(null),b=({value:t,size:a,count:n,children:e})=>s.jsx(v.Provider,{value:{value:t,size:a,count:n},children:e}),p=()=>{const t=D.useContext(v);if(!t)throw new Error("RatingDisplay compound components must be used within RatingDisplay.");return t},S=({value:t=0,size:a="md",count:n,asChild:e=!1,ref:r,children:i,...o})=>{const u=t??0,l=e?N.Slot:"div";return s.jsx(b,{value:u,size:a,count:n,children:s.jsx(l,{ref:r,className:"gap-x-sm relative inline-flex items-center","data-spark-component":"rating-display",...o,children:i})})};S.displayName="RatingDisplay";const h=c.cva("text-on-surface/dim-1",{variants:{size:{sm:"text-caption",md:"text-body-2",lg:"text-display-3"}},defaultVariants:{size:"md"}}),m=({className:t,children:a,...n})=>{const{count:e,size:r}=p();if(e===void 0)return null;const i=typeof a=="function"?a(e):a??e;return s.jsxs("span",{className:h({size:r??"md",className:t}),...n,children:["(",i,")"]})};m.displayName="RatingDisplay.Count";const z=c.cva(["relative block after:absolute after:block after:inset-0"],{variants:{gap:{sm:["after:w-[calc(100%+(var(--spacing-sm)))]","last-of-type:after:content-none"],md:["after:w-[calc(100%+(var(--spacing-md)))]","last-of-type:after:content-none"]}},defaultVariants:{gap:"sm"}}),x=c.cva("",{variants:{size:{sm:"text-caption-link",md:"text-body-1",lg:"text-display-3"},design:{filled:["text-main-variant"],outlined:["text-on-surface/dim-3"]}}}),C=({value:t,size:a})=>s.jsxs("div",{"data-spark-component":"rating-display-star","data-part":"star",className:z({gap:a==="lg"?"md":"sm"}),children:[s.jsx("div",{className:c.cx("z-raised absolute overflow-hidden"),style:{width:t*100+"%"},children:s.jsx(f.Icon,{className:x({size:a,design:"filled"}),children:s.jsx(V.StarFill,{})})}),s.jsx(f.Icon,{className:x({size:a,design:"outlined"}),children:s.jsx(j.StarOutline,{})})]});function w(t){return Math.round(t/.5)*.5}function k(t){const a=Intl.DateTimeFormat().resolvedOptions().locale;return new Intl.NumberFormat(a,{minimumFractionDigits:0,maximumFractionDigits:1}).format(t)}function q({value:t,index:a}){if(t===void 0)return 0;const n=a+1,e=w(t);return Math.ceil(e)<n?0:e>=n?1:.5}function I(t){return t===void 0||t<1?0:t<4?.5:1}const g=({size:t,variant:a="default",getFillMode:n})=>{const{value:e,size:r}=p(),i=t??r,o=l=>n?n({index:l,value:e}):a==="single-star"?I(e):q({index:l,value:e}),u=a==="single-star"?[o(0)]:Array.from({length:5},(l,d)=>o(d));return s.jsx("div",{"data-spark-component":"rating-display-stars",className:c.cx(i==="lg"?"gap-x-md":"gap-x-sm","flex"),children:u.map((l,d)=>s.jsx(C,{size:i,value:l},d))})};g.displayName="RatingDisplay.Stars";const F=c.cva("text-on-surface font-bold",{variants:{size:{sm:"text-caption",md:"text-body-2",lg:"text-display-3"}},defaultVariants:{size:"md"}}),y=({className:t,children:a,...n})=>{const{value:e,size:r}=p(),i=k(e),o=typeof a=="function"?a(i,e):a??i;return s.jsx("span",{"data-spark-component":"rating-display-value",className:F({size:r??"md",className:t}),...n,children:o})};y.displayName="RatingDisplay.Value";const R=Object.assign(S,{Stars:g,Value:y,Count:m});R.displayName="RatingDisplay";g.displayName="RatingDisplay.Stars";y.displayName="RatingDisplay.Value";m.displayName="RatingDisplay.Count";exports.RatingDisplay=R;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/rating-display/RatingDisplayContext.tsx","../../src/rating-display/RatingDisplay.tsx","../../src/rating-display/RatingDisplayCount.tsx","../../src/rating-display/RatingDisplayStar.tsx","../../src/rating-display/utils.ts","../../src/rating-display/RatingDisplayStars.tsx","../../src/rating-display/RatingDisplayValue.tsx","../../src/rating-display/index.ts"],"sourcesContent":["import { createContext, type PropsWithChildren, useContext } from 'react'\n\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\ninterface RatingDisplayContextValue {\n value: number\n size: RatingDisplayStarProps['size']\n count?: number\n}\n\nconst RatingDisplayContext = createContext<RatingDisplayContextValue | null>(null)\n\ninterface RatingDisplayProviderProps extends PropsWithChildren<RatingDisplayContextValue> {}\n\nexport const RatingDisplayProvider = ({\n value,\n size,\n count,\n children,\n}: RatingDisplayProviderProps) => {\n return (\n <RatingDisplayContext.Provider value={{ value, size, count }}>\n {children}\n </RatingDisplayContext.Provider>\n )\n}\n\nexport const useRatingDisplay = () => {\n const context = useContext(RatingDisplayContext)\n if (!context) {\n throw new Error('RatingDisplay compound components must be used within RatingDisplay.')\n }\n\n return context\n}\n","import { type ComponentPropsWithRef, type PropsWithChildren } from 'react'\n\nimport { RatingDisplayProvider } from './RatingDisplayContext'\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\nexport interface RatingDisplayProps extends PropsWithChildren<ComponentPropsWithRef<'div'>> {\n /**\n * The rating value to display, on a scale from 0 to 5.\n */\n value?: number\n /**\n * Sets the size of the stars.\n * @default 'md'\n */\n size?: RatingDisplayStarProps['size']\n /**\n * Optional count value available to `RatingDisplay.Count`.\n */\n count?: number\n /**\n * Accessible description of the rating content.\n */\n 'aria-label': string\n}\n\nexport type RatingDisplayRootProps = RatingDisplayProps\n\nexport const RatingDisplay = ({\n value = 0,\n size = 'md',\n count,\n ref,\n children,\n ...rest\n}: RatingDisplayProps) => {\n const ratingValue = value ?? 0\n\n return (\n <RatingDisplayProvider value={ratingValue} size={size} count={count}>\n <div\n ref={ref}\n className=\"gap-x-sm relative inline-flex items-center\"\n data-spark-component=\"rating-display\"\n {...rest}\n >\n {children}\n </div>\n </RatingDisplayProvider>\n )\n}\n\nRatingDisplay.displayName = 'RatingDisplay'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\n\nexport interface RatingDisplayCountProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom count content.\n * Pass a render function to receive the count value and return the content to render.\n */\n children?: ReactNode | ((count: number) => ReactNode)\n}\n\nconst ratingDisplayCountStyles = cva('text-on-surface/dim-1', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayCount = ({ className, children, ...rest }: RatingDisplayCountProps) => {\n const { count, size } = useRatingDisplay()\n if (count === undefined) return null\n const renderedCount = typeof children === 'function' ? children(count) : (children ?? count)\n\n return (\n <span className={ratingDisplayCountStyles({ size: size ?? 'md', className })} {...rest}>\n ({renderedCount})\n </span>\n )\n}\n\nRatingDisplayCount.displayName = 'RatingDisplay.Count'\n","import { StarFill } from '@spark-ui/icons/StarFill'\nimport { StarOutline } from '@spark-ui/icons/StarOutline'\nimport { cva, cx, type VariantProps } from 'class-variance-authority'\n\nimport { Icon } from '../icon'\nimport type { StarValue } from './types'\n\nconst ratingDisplayStarStyles = cva(['relative block after:absolute after:block after:inset-0'], {\n variants: {\n gap: {\n sm: ['after:w-[calc(100%+(var(--spacing-sm)))]', 'last-of-type:after:content-none'],\n md: ['after:w-[calc(100%+(var(--spacing-md)))]', 'last-of-type:after:content-none'],\n },\n },\n defaultVariants: {\n gap: 'sm',\n },\n})\n\nconst ratingDisplayStarIconStyles = cva('', {\n variants: {\n size: {\n sm: 'text-caption-link',\n md: 'text-body-1',\n lg: 'text-display-3',\n },\n design: {\n filled: ['text-main-variant'],\n outlined: ['text-on-surface/dim-3'],\n },\n },\n})\n\ntype RatingDisplayStarstylesProps = Omit<VariantProps<typeof ratingDisplayStarStyles>, never>\ntype RatingDisplayStarIconStylesProps = Omit<\n VariantProps<typeof ratingDisplayStarIconStyles>,\n 'design'\n>\n\nexport interface RatingDisplayStarProps\n extends RatingDisplayStarstylesProps,\n RatingDisplayStarIconStylesProps {\n value: StarValue\n}\n\nexport const RatingDisplayStar = ({ value, size }: RatingDisplayStarProps) => {\n return (\n <div\n data-spark-component=\"rating-display-star\"\n data-part=\"star\"\n className={ratingDisplayStarStyles({\n gap: size === 'lg' ? 'md' : 'sm',\n })}\n >\n <div className={cx('z-raised absolute overflow-hidden')} style={{ width: value * 100 + '%' }}>\n <Icon\n className={ratingDisplayStarIconStyles({\n size,\n design: 'filled',\n })}\n >\n <StarFill />\n </Icon>\n </div>\n\n <Icon className={ratingDisplayStarIconStyles({ size, design: 'outlined' })}>\n <StarOutline />\n </Icon>\n </div>\n )\n}\n","import { type StarValue } from './types'\n\nfunction getNearestHalfDecimal(num: number): number {\n return Math.round(num / 0.5) * 0.5\n}\n\nfunction formatRatingValue(value: number): string {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 1,\n }).format(value)\n}\n\nfunction getStarValue({ value, index }: { value?: number; index: number }): StarValue {\n if (value === undefined) return 0\n\n const starPosition = index + 1\n const formattedValue = getNearestHalfDecimal(value)\n\n if (Math.ceil(formattedValue) < starPosition) return 0\n\n return formattedValue >= starPosition ? 1 : 0.5\n}\n\nfunction getSingleStarValue(value?: number): StarValue {\n if (value === undefined) return 0\n if (value < 1) return 0\n if (value < 4) return 0.5\n return 1\n}\n\nfunction splitAt<T>(arr: T[], index: number): [T[], T[]] {\n const prev = arr.slice(0, index)\n const next = arr.slice(index)\n\n return [prev, next]\n}\n\nexport { formatRatingValue, getNearestHalfDecimal, getSingleStarValue, getStarValue, splitAt }\n","import { cx } from 'class-variance-authority'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { RatingDisplayStar, type RatingDisplayStarProps } from './RatingDisplayStar'\nimport type { StarValue } from './types'\nimport { getSingleStarValue, getStarValue } from './utils'\n\nexport interface RatingDisplayStarsProps {\n size?: RatingDisplayStarProps['size']\n /**\n * Sets the rendering mode for stars.\n * @default 'default'\n */\n variant?: 'default' | 'single-star'\n /**\n * Custom fill algorithm for each star.\n * By default, stars are rounded to the nearest 0.5.\n */\n getFillMode?: ({ value, index }: { value?: number; index: number }) => StarValue\n}\n\nexport const RatingDisplayStars = ({\n size,\n variant = 'default',\n getFillMode,\n}: RatingDisplayStarsProps) => {\n const { value, size: contextSize } = useRatingDisplay()\n const resolvedSize = size ?? contextSize\n const getDisplayValue = (index: number) => {\n if (getFillMode) {\n return getFillMode({ index, value })\n }\n\n return variant === 'single-star' ? getSingleStarValue(value) : getStarValue({ index, value })\n }\n\n const stars =\n variant === 'single-star'\n ? [getDisplayValue(0)]\n : Array.from({ length: 5 }, (_, index) => getDisplayValue(index))\n\n return (\n <div\n data-spark-component=\"rating-display-stars\"\n className={cx(resolvedSize === 'lg' ? 'gap-x-md' : 'gap-x-sm', 'flex')}\n >\n {stars.map((starValue, index) => (\n <RatingDisplayStar key={index} size={resolvedSize} value={starValue} />\n ))}\n </div>\n )\n}\n\nRatingDisplayStars.displayName = 'RatingDisplay.Stars'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { formatRatingValue } from './utils'\n\nexport interface RatingDisplayValueProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom value content.\n * Pass a render function to receive the formatted value (first arg) and raw value (second arg),\n * then return the content to render.\n */\n children?: ReactNode | ((formattedValue: string, value: number) => ReactNode)\n}\n\nconst ratingDisplayValueStyles = cva('text-on-surface font-bold', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayValue = ({ className, children, ...rest }: RatingDisplayValueProps) => {\n const { value, size } = useRatingDisplay()\n const formattedValue = formatRatingValue(value)\n const renderedValue =\n typeof children === 'function' ? children(formattedValue, value) : (children ?? formattedValue)\n\n return (\n <span\n data-spark-component=\"rating-display-value\"\n className={ratingDisplayValueStyles({ size: size ?? 'md', className })}\n {...rest}\n >\n {renderedValue}\n </span>\n )\n}\n\nRatingDisplayValue.displayName = 'RatingDisplay.Value'\n","import { RatingDisplay as Root } from './RatingDisplay'\nimport { RatingDisplayCount as Count } from './RatingDisplayCount'\nimport { RatingDisplayStars as Stars } from './RatingDisplayStars'\nimport { RatingDisplayValue as Value } from './RatingDisplayValue'\n\nexport const RatingDisplay: typeof Root & {\n Stars: typeof Stars\n Value: typeof Value\n Count: typeof Count\n} = Object.assign(Root, {\n Stars,\n Value,\n Count,\n})\n\nRatingDisplay.displayName = 'RatingDisplay'\nStars.displayName = 'RatingDisplay.Stars'\nValue.displayName = 'RatingDisplay.Value'\nCount.displayName = 'RatingDisplay.Count'\n\nexport { type RatingDisplayProps, type RatingDisplayRootProps } from './RatingDisplay'\nexport { type RatingDisplayStarsProps } from './RatingDisplayStars'\nexport { type RatingDisplayValueProps } from './RatingDisplayValue'\nexport { type RatingDisplayCountProps } from './RatingDisplayCount'\nexport type { StarValue } from './types'\n"],"names":["RatingDisplayContext","createContext","RatingDisplayProvider","value","size","count","children","jsx","useRatingDisplay","context","useContext","RatingDisplay","ref","rest","ratingValue","ratingDisplayCountStyles","cva","RatingDisplayCount","className","renderedCount","jsxs","ratingDisplayStarStyles","ratingDisplayStarIconStyles","RatingDisplayStar","cx","Icon","StarFill","StarOutline","getNearestHalfDecimal","num","formatRatingValue","locale","getStarValue","index","starPosition","formattedValue","getSingleStarValue","RatingDisplayStars","variant","getFillMode","contextSize","resolvedSize","getDisplayValue","stars","_","starValue","ratingDisplayValueStyles","RatingDisplayValue","renderedValue","Root","Stars","Value","Count"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/rating-display/RatingDisplayContext.tsx","../../src/rating-display/RatingDisplay.tsx","../../src/rating-display/RatingDisplayCount.tsx","../../src/rating-display/RatingDisplayStar.tsx","../../src/rating-display/utils.ts","../../src/rating-display/RatingDisplayStars.tsx","../../src/rating-display/RatingDisplayValue.tsx","../../src/rating-display/index.ts"],"sourcesContent":["import { createContext, type PropsWithChildren, useContext } from 'react'\n\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\ninterface RatingDisplayContextValue {\n value: number\n size: RatingDisplayStarProps['size']\n count?: number\n}\n\nconst RatingDisplayContext = createContext<RatingDisplayContextValue | null>(null)\n\ninterface RatingDisplayProviderProps extends PropsWithChildren<RatingDisplayContextValue> {}\n\nexport const RatingDisplayProvider = ({\n value,\n size,\n count,\n children,\n}: RatingDisplayProviderProps) => {\n return (\n <RatingDisplayContext.Provider value={{ value, size, count }}>\n {children}\n </RatingDisplayContext.Provider>\n )\n}\n\nexport const useRatingDisplay = () => {\n const context = useContext(RatingDisplayContext)\n if (!context) {\n throw new Error('RatingDisplay compound components must be used within RatingDisplay.')\n }\n\n return context\n}\n","import { type ComponentPropsWithRef, type PropsWithChildren } from 'react'\n\nimport { Slot } from '../slot'\nimport { RatingDisplayProvider } from './RatingDisplayContext'\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\nexport interface RatingDisplayProps extends PropsWithChildren<ComponentPropsWithRef<'div'>> {\n /**\n * When true, merges props onto the single child element instead of rendering a div.\n * Use to render the root as a link or another custom element.\n */\n asChild?: boolean\n /**\n * The rating value to display, on a scale from 0 to 5.\n */\n value?: number\n /**\n * Sets the size of the stars.\n * @default 'md'\n */\n size?: RatingDisplayStarProps['size']\n /**\n * Optional count value available to `RatingDisplay.Count`.\n */\n count?: number\n /**\n * Accessible description of the rating content.\n */\n 'aria-label': string\n}\n\nexport type RatingDisplayRootProps = RatingDisplayProps\n\nexport const RatingDisplay = ({\n value = 0,\n size = 'md',\n count,\n asChild = false,\n ref,\n children,\n ...rest\n}: RatingDisplayProps) => {\n const ratingValue = value ?? 0\n const Component = asChild ? Slot : 'div'\n\n return (\n <RatingDisplayProvider value={ratingValue} size={size} count={count}>\n <Component\n ref={ref}\n className=\"gap-x-sm relative inline-flex items-center\"\n data-spark-component=\"rating-display\"\n {...rest}\n >\n {children}\n </Component>\n </RatingDisplayProvider>\n )\n}\n\nRatingDisplay.displayName = 'RatingDisplay'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\n\nexport interface RatingDisplayCountProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom count content.\n * Pass a render function to receive the count value and return the content to render.\n */\n children?: ReactNode | ((count: number) => ReactNode)\n}\n\nconst ratingDisplayCountStyles = cva('text-on-surface/dim-1', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayCount = ({ className, children, ...rest }: RatingDisplayCountProps) => {\n const { count, size } = useRatingDisplay()\n if (count === undefined) return null\n const renderedCount = typeof children === 'function' ? children(count) : (children ?? count)\n\n return (\n <span className={ratingDisplayCountStyles({ size: size ?? 'md', className })} {...rest}>\n ({renderedCount})\n </span>\n )\n}\n\nRatingDisplayCount.displayName = 'RatingDisplay.Count'\n","import { StarFill } from '@spark-ui/icons/StarFill'\nimport { StarOutline } from '@spark-ui/icons/StarOutline'\nimport { cva, cx, type VariantProps } from 'class-variance-authority'\n\nimport { Icon } from '../icon'\nimport type { StarValue } from './types'\n\nconst ratingDisplayStarStyles = cva(['relative block after:absolute after:block after:inset-0'], {\n variants: {\n gap: {\n sm: ['after:w-[calc(100%+(var(--spacing-sm)))]', 'last-of-type:after:content-none'],\n md: ['after:w-[calc(100%+(var(--spacing-md)))]', 'last-of-type:after:content-none'],\n },\n },\n defaultVariants: {\n gap: 'sm',\n },\n})\n\nconst ratingDisplayStarIconStyles = cva('', {\n variants: {\n size: {\n sm: 'text-caption-link',\n md: 'text-body-1',\n lg: 'text-display-3',\n },\n design: {\n filled: ['text-main-variant'],\n outlined: ['text-on-surface/dim-3'],\n },\n },\n})\n\ntype RatingDisplayStarstylesProps = Omit<VariantProps<typeof ratingDisplayStarStyles>, never>\ntype RatingDisplayStarIconStylesProps = Omit<\n VariantProps<typeof ratingDisplayStarIconStyles>,\n 'design'\n>\n\nexport interface RatingDisplayStarProps\n extends RatingDisplayStarstylesProps,\n RatingDisplayStarIconStylesProps {\n value: StarValue\n}\n\nexport const RatingDisplayStar = ({ value, size }: RatingDisplayStarProps) => {\n return (\n <div\n data-spark-component=\"rating-display-star\"\n data-part=\"star\"\n className={ratingDisplayStarStyles({\n gap: size === 'lg' ? 'md' : 'sm',\n })}\n >\n <div className={cx('z-raised absolute overflow-hidden')} style={{ width: value * 100 + '%' }}>\n <Icon\n className={ratingDisplayStarIconStyles({\n size,\n design: 'filled',\n })}\n >\n <StarFill />\n </Icon>\n </div>\n\n <Icon className={ratingDisplayStarIconStyles({ size, design: 'outlined' })}>\n <StarOutline />\n </Icon>\n </div>\n )\n}\n","import { type StarValue } from './types'\n\nfunction getNearestHalfDecimal(num: number): number {\n return Math.round(num / 0.5) * 0.5\n}\n\nfunction formatRatingValue(value: number): string {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 1,\n }).format(value)\n}\n\nfunction getStarValue({ value, index }: { value?: number; index: number }): StarValue {\n if (value === undefined) return 0\n\n const starPosition = index + 1\n const formattedValue = getNearestHalfDecimal(value)\n\n if (Math.ceil(formattedValue) < starPosition) return 0\n\n return formattedValue >= starPosition ? 1 : 0.5\n}\n\nfunction getSingleStarValue(value?: number): StarValue {\n if (value === undefined) return 0\n if (value < 1) return 0\n if (value < 4) return 0.5\n return 1\n}\n\nfunction splitAt<T>(arr: T[], index: number): [T[], T[]] {\n const prev = arr.slice(0, index)\n const next = arr.slice(index)\n\n return [prev, next]\n}\n\nexport { formatRatingValue, getNearestHalfDecimal, getSingleStarValue, getStarValue, splitAt }\n","import { cx } from 'class-variance-authority'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { RatingDisplayStar, type RatingDisplayStarProps } from './RatingDisplayStar'\nimport type { StarValue } from './types'\nimport { getSingleStarValue, getStarValue } from './utils'\n\nexport interface RatingDisplayStarsProps {\n size?: RatingDisplayStarProps['size']\n /**\n * Sets the rendering mode for stars.\n * @default 'default'\n */\n variant?: 'default' | 'single-star'\n /**\n * Custom fill algorithm for each star.\n * By default, stars are rounded to the nearest 0.5.\n */\n getFillMode?: ({ value, index }: { value?: number; index: number }) => StarValue\n}\n\nexport const RatingDisplayStars = ({\n size,\n variant = 'default',\n getFillMode,\n}: RatingDisplayStarsProps) => {\n const { value, size: contextSize } = useRatingDisplay()\n const resolvedSize = size ?? contextSize\n const getDisplayValue = (index: number) => {\n if (getFillMode) {\n return getFillMode({ index, value })\n }\n\n return variant === 'single-star' ? getSingleStarValue(value) : getStarValue({ index, value })\n }\n\n const stars =\n variant === 'single-star'\n ? [getDisplayValue(0)]\n : Array.from({ length: 5 }, (_, index) => getDisplayValue(index))\n\n return (\n <div\n data-spark-component=\"rating-display-stars\"\n className={cx(resolvedSize === 'lg' ? 'gap-x-md' : 'gap-x-sm', 'flex')}\n >\n {stars.map((starValue, index) => (\n <RatingDisplayStar key={index} size={resolvedSize} value={starValue} />\n ))}\n </div>\n )\n}\n\nRatingDisplayStars.displayName = 'RatingDisplay.Stars'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { formatRatingValue } from './utils'\n\nexport interface RatingDisplayValueProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom value content.\n * Pass a render function to receive the formatted value (first arg) and raw value (second arg),\n * then return the content to render.\n */\n children?: ReactNode | ((formattedValue: string, value: number) => ReactNode)\n}\n\nconst ratingDisplayValueStyles = cva('text-on-surface font-bold', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayValue = ({ className, children, ...rest }: RatingDisplayValueProps) => {\n const { value, size } = useRatingDisplay()\n const formattedValue = formatRatingValue(value)\n const renderedValue =\n typeof children === 'function' ? children(formattedValue, value) : (children ?? formattedValue)\n\n return (\n <span\n data-spark-component=\"rating-display-value\"\n className={ratingDisplayValueStyles({ size: size ?? 'md', className })}\n {...rest}\n >\n {renderedValue}\n </span>\n )\n}\n\nRatingDisplayValue.displayName = 'RatingDisplay.Value'\n","import { RatingDisplay as Root } from './RatingDisplay'\nimport { RatingDisplayCount as Count } from './RatingDisplayCount'\nimport { RatingDisplayStars as Stars } from './RatingDisplayStars'\nimport { RatingDisplayValue as Value } from './RatingDisplayValue'\n\nexport const RatingDisplay: typeof Root & {\n Stars: typeof Stars\n Value: typeof Value\n Count: typeof Count\n} = Object.assign(Root, {\n Stars,\n Value,\n Count,\n})\n\nRatingDisplay.displayName = 'RatingDisplay'\nStars.displayName = 'RatingDisplay.Stars'\nValue.displayName = 'RatingDisplay.Value'\nCount.displayName = 'RatingDisplay.Count'\n\nexport { type RatingDisplayProps, type RatingDisplayRootProps } from './RatingDisplay'\nexport { type RatingDisplayStarsProps } from './RatingDisplayStars'\nexport { type RatingDisplayValueProps } from './RatingDisplayValue'\nexport { type RatingDisplayCountProps } from './RatingDisplayCount'\nexport type { StarValue } from './types'\n"],"names":["RatingDisplayContext","createContext","RatingDisplayProvider","value","size","count","children","jsx","useRatingDisplay","context","useContext","RatingDisplay","asChild","ref","rest","ratingValue","Component","Slot","ratingDisplayCountStyles","cva","RatingDisplayCount","className","renderedCount","jsxs","ratingDisplayStarStyles","ratingDisplayStarIconStyles","RatingDisplayStar","cx","Icon","StarFill","StarOutline","getNearestHalfDecimal","num","formatRatingValue","locale","getStarValue","index","starPosition","formattedValue","getSingleStarValue","RatingDisplayStars","variant","getFillMode","contextSize","resolvedSize","getDisplayValue","stars","_","starValue","ratingDisplayValueStyles","RatingDisplayValue","renderedValue","Root","Stars","Value","Count"],"mappings":"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"}
@@ -1,38 +1,40 @@
1
- import { jsx as i, jsxs as D } from "react/jsx-runtime";
2
- import { createContext as S, useContext as V } from "react";
3
- import { cva as c, cx as x } from "class-variance-authority";
4
- import { StarFill as z } from "@spark-ui/icons/StarFill";
5
- import { StarOutline as b } from "@spark-ui/icons/StarOutline";
1
+ import { jsx as s, jsxs as x } from "react/jsx-runtime";
2
+ import { a as N } from "../Slot-D2Bbf8Gw.mjs";
3
+ import { createContext as V, useContext as z } from "react";
4
+ import { cva as c, cx as v } from "class-variance-authority";
5
+ import { StarFill as b } from "@spark-ui/icons/StarFill";
6
+ import { StarOutline as h } from "@spark-ui/icons/StarOutline";
6
7
  import { I as y } from "../Icon-Ck-dhfLd.mjs";
7
- const v = S(null), h = ({
8
+ const R = V(null), C = ({
8
9
  value: t,
9
10
  size: a,
10
11
  count: n,
11
12
  children: e
12
- }) => /* @__PURE__ */ i(v.Provider, { value: { value: t, size: a, count: n }, children: e }), p = () => {
13
- const t = V(v);
13
+ }) => /* @__PURE__ */ s(R.Provider, { value: { value: t, size: a, count: n }, children: e }), p = () => {
14
+ const t = z(R);
14
15
  if (!t)
15
16
  throw new Error("RatingDisplay compound components must be used within RatingDisplay.");
16
17
  return t;
17
- }, R = ({
18
+ }, S = ({
18
19
  value: t = 0,
19
20
  size: a = "md",
20
21
  count: n,
21
- ref: e,
22
- children: r,
23
- ...s
24
- }) => /* @__PURE__ */ i(h, { value: t ?? 0, size: a, count: n, children: /* @__PURE__ */ i(
25
- "div",
22
+ asChild: e = !1,
23
+ ref: r,
24
+ children: i,
25
+ ...o
26
+ }) => /* @__PURE__ */ s(C, { value: t ?? 0, size: a, count: n, children: /* @__PURE__ */ s(
27
+ e ? N : "div",
26
28
  {
27
- ref: e,
29
+ ref: r,
28
30
  className: "gap-x-sm relative inline-flex items-center",
29
31
  "data-spark-component": "rating-display",
30
- ...s,
31
- children: r
32
+ ...o,
33
+ children: i
32
34
  }
33
35
  ) });
34
- R.displayName = "RatingDisplay";
35
- const C = c("text-on-surface/dim-1", {
36
+ S.displayName = "RatingDisplay";
37
+ const w = c("text-on-surface/dim-1", {
36
38
  variants: {
37
39
  size: {
38
40
  sm: "text-caption",
@@ -46,15 +48,15 @@ const C = c("text-on-surface/dim-1", {
46
48
  }), d = ({ className: t, children: a, ...n }) => {
47
49
  const { count: e, size: r } = p();
48
50
  if (e === void 0) return null;
49
- const s = typeof a == "function" ? a(e) : a ?? e;
50
- return /* @__PURE__ */ D("span", { className: C({ size: r ?? "md", className: t }), ...n, children: [
51
+ const i = typeof a == "function" ? a(e) : a ?? e;
52
+ return /* @__PURE__ */ x("span", { className: w({ size: r ?? "md", className: t }), ...n, children: [
51
53
  "(",
52
- s,
54
+ i,
53
55
  ")"
54
56
  ] });
55
57
  };
56
58
  d.displayName = "RatingDisplay.Count";
57
- const w = c(["relative block after:absolute after:block after:inset-0"], {
59
+ const k = c(["relative block after:absolute after:block after:inset-0"], {
58
60
  variants: {
59
61
  gap: {
60
62
  sm: ["after:w-[calc(100%+(var(--spacing-sm)))]", "last-of-type:after:content-none"],
@@ -64,7 +66,7 @@ const w = c(["relative block after:absolute after:block after:inset-0"], {
64
66
  defaultVariants: {
65
67
  gap: "sm"
66
68
  }
67
- }), f = c("", {
69
+ }), D = c("", {
68
70
  variants: {
69
71
  size: {
70
72
  sm: "text-caption-link",
@@ -76,45 +78,45 @@ const w = c(["relative block after:absolute after:block after:inset-0"], {
76
78
  outlined: ["text-on-surface/dim-3"]
77
79
  }
78
80
  }
79
- }), k = ({ value: t, size: a }) => /* @__PURE__ */ D(
81
+ }), I = ({ value: t, size: a }) => /* @__PURE__ */ x(
80
82
  "div",
81
83
  {
82
84
  "data-spark-component": "rating-display-star",
83
85
  "data-part": "star",
84
- className: w({
86
+ className: k({
85
87
  gap: a === "lg" ? "md" : "sm"
86
88
  }),
87
89
  children: [
88
- /* @__PURE__ */ i("div", { className: x("z-raised absolute overflow-hidden"), style: { width: t * 100 + "%" }, children: /* @__PURE__ */ i(
90
+ /* @__PURE__ */ s("div", { className: v("z-raised absolute overflow-hidden"), style: { width: t * 100 + "%" }, children: /* @__PURE__ */ s(
89
91
  y,
90
92
  {
91
- className: f({
93
+ className: D({
92
94
  size: a,
93
95
  design: "filled"
94
96
  }),
95
- children: /* @__PURE__ */ i(z, {})
97
+ children: /* @__PURE__ */ s(b, {})
96
98
  }
97
99
  ) }),
98
- /* @__PURE__ */ i(y, { className: f({ size: a, design: "outlined" }), children: /* @__PURE__ */ i(b, {}) })
100
+ /* @__PURE__ */ s(y, { className: D({ size: a, design: "outlined" }), children: /* @__PURE__ */ s(h, {}) })
99
101
  ]
100
102
  }
101
103
  );
102
- function I(t) {
104
+ function F(t) {
103
105
  return Math.round(t / 0.5) * 0.5;
104
106
  }
105
- function F(t) {
107
+ function j(t) {
106
108
  const a = Intl.DateTimeFormat().resolvedOptions().locale;
107
109
  return new Intl.NumberFormat(a, {
108
110
  minimumFractionDigits: 0,
109
111
  maximumFractionDigits: 1
110
112
  }).format(t);
111
113
  }
112
- function j({ value: t, index: a }) {
114
+ function O({ value: t, index: a }) {
113
115
  if (t === void 0) return 0;
114
- const n = a + 1, e = I(t);
116
+ const n = a + 1, e = F(t);
115
117
  return Math.ceil(e) < n ? 0 : e >= n ? 1 : 0.5;
116
118
  }
117
- function O(t) {
119
+ function P(t) {
118
120
  return t === void 0 || t < 1 ? 0 : t < 4 ? 0.5 : 1;
119
121
  }
120
122
  const u = ({
@@ -122,18 +124,18 @@ const u = ({
122
124
  variant: a = "default",
123
125
  getFillMode: n
124
126
  }) => {
125
- const { value: e, size: r } = p(), s = t ?? r, l = (o) => n ? n({ index: o, value: e }) : a === "single-star" ? O(e) : j({ index: o, value: e }), N = a === "single-star" ? [l(0)] : Array.from({ length: 5 }, (o, m) => l(m));
126
- return /* @__PURE__ */ i(
127
+ const { value: e, size: r } = p(), i = t ?? r, o = (l) => n ? n({ index: l, value: e }) : a === "single-star" ? P(e) : O({ index: l, value: e }), f = a === "single-star" ? [o(0)] : Array.from({ length: 5 }, (l, m) => o(m));
128
+ return /* @__PURE__ */ s(
127
129
  "div",
128
130
  {
129
131
  "data-spark-component": "rating-display-stars",
130
- className: x(s === "lg" ? "gap-x-md" : "gap-x-sm", "flex"),
131
- children: N.map((o, m) => /* @__PURE__ */ i(k, { size: s, value: o }, m))
132
+ className: v(i === "lg" ? "gap-x-md" : "gap-x-sm", "flex"),
133
+ children: f.map((l, m) => /* @__PURE__ */ s(I, { size: i, value: l }, m))
132
134
  }
133
135
  );
134
136
  };
135
137
  u.displayName = "RatingDisplay.Stars";
136
- const P = c("text-on-surface font-bold", {
138
+ const A = c("text-on-surface font-bold", {
137
139
  variants: {
138
140
  size: {
139
141
  sm: "text-caption",
@@ -145,28 +147,28 @@ const P = c("text-on-surface font-bold", {
145
147
  size: "md"
146
148
  }
147
149
  }), g = ({ className: t, children: a, ...n }) => {
148
- const { value: e, size: r } = p(), s = F(e), l = typeof a == "function" ? a(s, e) : a ?? s;
149
- return /* @__PURE__ */ i(
150
+ const { value: e, size: r } = p(), i = j(e), o = typeof a == "function" ? a(i, e) : a ?? i;
151
+ return /* @__PURE__ */ s(
150
152
  "span",
151
153
  {
152
154
  "data-spark-component": "rating-display-value",
153
- className: P({ size: r ?? "md", className: t }),
155
+ className: A({ size: r ?? "md", className: t }),
154
156
  ...n,
155
- children: l
157
+ children: o
156
158
  }
157
159
  );
158
160
  };
159
161
  g.displayName = "RatingDisplay.Value";
160
- const A = Object.assign(R, {
162
+ const E = Object.assign(S, {
161
163
  Stars: u,
162
164
  Value: g,
163
165
  Count: d
164
166
  });
165
- A.displayName = "RatingDisplay";
167
+ E.displayName = "RatingDisplay";
166
168
  u.displayName = "RatingDisplay.Stars";
167
169
  g.displayName = "RatingDisplay.Value";
168
170
  d.displayName = "RatingDisplay.Count";
169
171
  export {
170
- A as RatingDisplay
172
+ E as RatingDisplay
171
173
  };
172
174
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/rating-display/RatingDisplayContext.tsx","../../src/rating-display/RatingDisplay.tsx","../../src/rating-display/RatingDisplayCount.tsx","../../src/rating-display/RatingDisplayStar.tsx","../../src/rating-display/utils.ts","../../src/rating-display/RatingDisplayStars.tsx","../../src/rating-display/RatingDisplayValue.tsx","../../src/rating-display/index.ts"],"sourcesContent":["import { createContext, type PropsWithChildren, useContext } from 'react'\n\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\ninterface RatingDisplayContextValue {\n value: number\n size: RatingDisplayStarProps['size']\n count?: number\n}\n\nconst RatingDisplayContext = createContext<RatingDisplayContextValue | null>(null)\n\ninterface RatingDisplayProviderProps extends PropsWithChildren<RatingDisplayContextValue> {}\n\nexport const RatingDisplayProvider = ({\n value,\n size,\n count,\n children,\n}: RatingDisplayProviderProps) => {\n return (\n <RatingDisplayContext.Provider value={{ value, size, count }}>\n {children}\n </RatingDisplayContext.Provider>\n )\n}\n\nexport const useRatingDisplay = () => {\n const context = useContext(RatingDisplayContext)\n if (!context) {\n throw new Error('RatingDisplay compound components must be used within RatingDisplay.')\n }\n\n return context\n}\n","import { type ComponentPropsWithRef, type PropsWithChildren } from 'react'\n\nimport { RatingDisplayProvider } from './RatingDisplayContext'\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\nexport interface RatingDisplayProps extends PropsWithChildren<ComponentPropsWithRef<'div'>> {\n /**\n * The rating value to display, on a scale from 0 to 5.\n */\n value?: number\n /**\n * Sets the size of the stars.\n * @default 'md'\n */\n size?: RatingDisplayStarProps['size']\n /**\n * Optional count value available to `RatingDisplay.Count`.\n */\n count?: number\n /**\n * Accessible description of the rating content.\n */\n 'aria-label': string\n}\n\nexport type RatingDisplayRootProps = RatingDisplayProps\n\nexport const RatingDisplay = ({\n value = 0,\n size = 'md',\n count,\n ref,\n children,\n ...rest\n}: RatingDisplayProps) => {\n const ratingValue = value ?? 0\n\n return (\n <RatingDisplayProvider value={ratingValue} size={size} count={count}>\n <div\n ref={ref}\n className=\"gap-x-sm relative inline-flex items-center\"\n data-spark-component=\"rating-display\"\n {...rest}\n >\n {children}\n </div>\n </RatingDisplayProvider>\n )\n}\n\nRatingDisplay.displayName = 'RatingDisplay'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\n\nexport interface RatingDisplayCountProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom count content.\n * Pass a render function to receive the count value and return the content to render.\n */\n children?: ReactNode | ((count: number) => ReactNode)\n}\n\nconst ratingDisplayCountStyles = cva('text-on-surface/dim-1', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayCount = ({ className, children, ...rest }: RatingDisplayCountProps) => {\n const { count, size } = useRatingDisplay()\n if (count === undefined) return null\n const renderedCount = typeof children === 'function' ? children(count) : (children ?? count)\n\n return (\n <span className={ratingDisplayCountStyles({ size: size ?? 'md', className })} {...rest}>\n ({renderedCount})\n </span>\n )\n}\n\nRatingDisplayCount.displayName = 'RatingDisplay.Count'\n","import { StarFill } from '@spark-ui/icons/StarFill'\nimport { StarOutline } from '@spark-ui/icons/StarOutline'\nimport { cva, cx, type VariantProps } from 'class-variance-authority'\n\nimport { Icon } from '../icon'\nimport type { StarValue } from './types'\n\nconst ratingDisplayStarStyles = cva(['relative block after:absolute after:block after:inset-0'], {\n variants: {\n gap: {\n sm: ['after:w-[calc(100%+(var(--spacing-sm)))]', 'last-of-type:after:content-none'],\n md: ['after:w-[calc(100%+(var(--spacing-md)))]', 'last-of-type:after:content-none'],\n },\n },\n defaultVariants: {\n gap: 'sm',\n },\n})\n\nconst ratingDisplayStarIconStyles = cva('', {\n variants: {\n size: {\n sm: 'text-caption-link',\n md: 'text-body-1',\n lg: 'text-display-3',\n },\n design: {\n filled: ['text-main-variant'],\n outlined: ['text-on-surface/dim-3'],\n },\n },\n})\n\ntype RatingDisplayStarstylesProps = Omit<VariantProps<typeof ratingDisplayStarStyles>, never>\ntype RatingDisplayStarIconStylesProps = Omit<\n VariantProps<typeof ratingDisplayStarIconStyles>,\n 'design'\n>\n\nexport interface RatingDisplayStarProps\n extends RatingDisplayStarstylesProps,\n RatingDisplayStarIconStylesProps {\n value: StarValue\n}\n\nexport const RatingDisplayStar = ({ value, size }: RatingDisplayStarProps) => {\n return (\n <div\n data-spark-component=\"rating-display-star\"\n data-part=\"star\"\n className={ratingDisplayStarStyles({\n gap: size === 'lg' ? 'md' : 'sm',\n })}\n >\n <div className={cx('z-raised absolute overflow-hidden')} style={{ width: value * 100 + '%' }}>\n <Icon\n className={ratingDisplayStarIconStyles({\n size,\n design: 'filled',\n })}\n >\n <StarFill />\n </Icon>\n </div>\n\n <Icon className={ratingDisplayStarIconStyles({ size, design: 'outlined' })}>\n <StarOutline />\n </Icon>\n </div>\n )\n}\n","import { type StarValue } from './types'\n\nfunction getNearestHalfDecimal(num: number): number {\n return Math.round(num / 0.5) * 0.5\n}\n\nfunction formatRatingValue(value: number): string {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 1,\n }).format(value)\n}\n\nfunction getStarValue({ value, index }: { value?: number; index: number }): StarValue {\n if (value === undefined) return 0\n\n const starPosition = index + 1\n const formattedValue = getNearestHalfDecimal(value)\n\n if (Math.ceil(formattedValue) < starPosition) return 0\n\n return formattedValue >= starPosition ? 1 : 0.5\n}\n\nfunction getSingleStarValue(value?: number): StarValue {\n if (value === undefined) return 0\n if (value < 1) return 0\n if (value < 4) return 0.5\n return 1\n}\n\nfunction splitAt<T>(arr: T[], index: number): [T[], T[]] {\n const prev = arr.slice(0, index)\n const next = arr.slice(index)\n\n return [prev, next]\n}\n\nexport { formatRatingValue, getNearestHalfDecimal, getSingleStarValue, getStarValue, splitAt }\n","import { cx } from 'class-variance-authority'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { RatingDisplayStar, type RatingDisplayStarProps } from './RatingDisplayStar'\nimport type { StarValue } from './types'\nimport { getSingleStarValue, getStarValue } from './utils'\n\nexport interface RatingDisplayStarsProps {\n size?: RatingDisplayStarProps['size']\n /**\n * Sets the rendering mode for stars.\n * @default 'default'\n */\n variant?: 'default' | 'single-star'\n /**\n * Custom fill algorithm for each star.\n * By default, stars are rounded to the nearest 0.5.\n */\n getFillMode?: ({ value, index }: { value?: number; index: number }) => StarValue\n}\n\nexport const RatingDisplayStars = ({\n size,\n variant = 'default',\n getFillMode,\n}: RatingDisplayStarsProps) => {\n const { value, size: contextSize } = useRatingDisplay()\n const resolvedSize = size ?? contextSize\n const getDisplayValue = (index: number) => {\n if (getFillMode) {\n return getFillMode({ index, value })\n }\n\n return variant === 'single-star' ? getSingleStarValue(value) : getStarValue({ index, value })\n }\n\n const stars =\n variant === 'single-star'\n ? [getDisplayValue(0)]\n : Array.from({ length: 5 }, (_, index) => getDisplayValue(index))\n\n return (\n <div\n data-spark-component=\"rating-display-stars\"\n className={cx(resolvedSize === 'lg' ? 'gap-x-md' : 'gap-x-sm', 'flex')}\n >\n {stars.map((starValue, index) => (\n <RatingDisplayStar key={index} size={resolvedSize} value={starValue} />\n ))}\n </div>\n )\n}\n\nRatingDisplayStars.displayName = 'RatingDisplay.Stars'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { formatRatingValue } from './utils'\n\nexport interface RatingDisplayValueProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom value content.\n * Pass a render function to receive the formatted value (first arg) and raw value (second arg),\n * then return the content to render.\n */\n children?: ReactNode | ((formattedValue: string, value: number) => ReactNode)\n}\n\nconst ratingDisplayValueStyles = cva('text-on-surface font-bold', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayValue = ({ className, children, ...rest }: RatingDisplayValueProps) => {\n const { value, size } = useRatingDisplay()\n const formattedValue = formatRatingValue(value)\n const renderedValue =\n typeof children === 'function' ? children(formattedValue, value) : (children ?? formattedValue)\n\n return (\n <span\n data-spark-component=\"rating-display-value\"\n className={ratingDisplayValueStyles({ size: size ?? 'md', className })}\n {...rest}\n >\n {renderedValue}\n </span>\n )\n}\n\nRatingDisplayValue.displayName = 'RatingDisplay.Value'\n","import { RatingDisplay as Root } from './RatingDisplay'\nimport { RatingDisplayCount as Count } from './RatingDisplayCount'\nimport { RatingDisplayStars as Stars } from './RatingDisplayStars'\nimport { RatingDisplayValue as Value } from './RatingDisplayValue'\n\nexport const RatingDisplay: typeof Root & {\n Stars: typeof Stars\n Value: typeof Value\n Count: typeof Count\n} = Object.assign(Root, {\n Stars,\n Value,\n Count,\n})\n\nRatingDisplay.displayName = 'RatingDisplay'\nStars.displayName = 'RatingDisplay.Stars'\nValue.displayName = 'RatingDisplay.Value'\nCount.displayName = 'RatingDisplay.Count'\n\nexport { type RatingDisplayProps, type RatingDisplayRootProps } from './RatingDisplay'\nexport { type RatingDisplayStarsProps } from './RatingDisplayStars'\nexport { type RatingDisplayValueProps } from './RatingDisplayValue'\nexport { type RatingDisplayCountProps } from './RatingDisplayCount'\nexport type { StarValue } from './types'\n"],"names":["RatingDisplayContext","createContext","RatingDisplayProvider","value","size","count","children","jsx","useRatingDisplay","context","useContext","RatingDisplay","ref","rest","ratingDisplayCountStyles","cva","RatingDisplayCount","className","renderedCount","jsxs","ratingDisplayStarStyles","ratingDisplayStarIconStyles","RatingDisplayStar","cx","Icon","StarFill","StarOutline","getNearestHalfDecimal","num","formatRatingValue","locale","getStarValue","index","starPosition","formattedValue","getSingleStarValue","RatingDisplayStars","variant","getFillMode","contextSize","resolvedSize","getDisplayValue","stars","_","starValue","ratingDisplayValueStyles","RatingDisplayValue","renderedValue","Root","Stars","Value","Count"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/rating-display/RatingDisplayContext.tsx","../../src/rating-display/RatingDisplay.tsx","../../src/rating-display/RatingDisplayCount.tsx","../../src/rating-display/RatingDisplayStar.tsx","../../src/rating-display/utils.ts","../../src/rating-display/RatingDisplayStars.tsx","../../src/rating-display/RatingDisplayValue.tsx","../../src/rating-display/index.ts"],"sourcesContent":["import { createContext, type PropsWithChildren, useContext } from 'react'\n\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\ninterface RatingDisplayContextValue {\n value: number\n size: RatingDisplayStarProps['size']\n count?: number\n}\n\nconst RatingDisplayContext = createContext<RatingDisplayContextValue | null>(null)\n\ninterface RatingDisplayProviderProps extends PropsWithChildren<RatingDisplayContextValue> {}\n\nexport const RatingDisplayProvider = ({\n value,\n size,\n count,\n children,\n}: RatingDisplayProviderProps) => {\n return (\n <RatingDisplayContext.Provider value={{ value, size, count }}>\n {children}\n </RatingDisplayContext.Provider>\n )\n}\n\nexport const useRatingDisplay = () => {\n const context = useContext(RatingDisplayContext)\n if (!context) {\n throw new Error('RatingDisplay compound components must be used within RatingDisplay.')\n }\n\n return context\n}\n","import { type ComponentPropsWithRef, type PropsWithChildren } from 'react'\n\nimport { Slot } from '../slot'\nimport { RatingDisplayProvider } from './RatingDisplayContext'\nimport type { RatingDisplayStarProps } from './RatingDisplayStar'\n\nexport interface RatingDisplayProps extends PropsWithChildren<ComponentPropsWithRef<'div'>> {\n /**\n * When true, merges props onto the single child element instead of rendering a div.\n * Use to render the root as a link or another custom element.\n */\n asChild?: boolean\n /**\n * The rating value to display, on a scale from 0 to 5.\n */\n value?: number\n /**\n * Sets the size of the stars.\n * @default 'md'\n */\n size?: RatingDisplayStarProps['size']\n /**\n * Optional count value available to `RatingDisplay.Count`.\n */\n count?: number\n /**\n * Accessible description of the rating content.\n */\n 'aria-label': string\n}\n\nexport type RatingDisplayRootProps = RatingDisplayProps\n\nexport const RatingDisplay = ({\n value = 0,\n size = 'md',\n count,\n asChild = false,\n ref,\n children,\n ...rest\n}: RatingDisplayProps) => {\n const ratingValue = value ?? 0\n const Component = asChild ? Slot : 'div'\n\n return (\n <RatingDisplayProvider value={ratingValue} size={size} count={count}>\n <Component\n ref={ref}\n className=\"gap-x-sm relative inline-flex items-center\"\n data-spark-component=\"rating-display\"\n {...rest}\n >\n {children}\n </Component>\n </RatingDisplayProvider>\n )\n}\n\nRatingDisplay.displayName = 'RatingDisplay'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\n\nexport interface RatingDisplayCountProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom count content.\n * Pass a render function to receive the count value and return the content to render.\n */\n children?: ReactNode | ((count: number) => ReactNode)\n}\n\nconst ratingDisplayCountStyles = cva('text-on-surface/dim-1', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayCount = ({ className, children, ...rest }: RatingDisplayCountProps) => {\n const { count, size } = useRatingDisplay()\n if (count === undefined) return null\n const renderedCount = typeof children === 'function' ? children(count) : (children ?? count)\n\n return (\n <span className={ratingDisplayCountStyles({ size: size ?? 'md', className })} {...rest}>\n ({renderedCount})\n </span>\n )\n}\n\nRatingDisplayCount.displayName = 'RatingDisplay.Count'\n","import { StarFill } from '@spark-ui/icons/StarFill'\nimport { StarOutline } from '@spark-ui/icons/StarOutline'\nimport { cva, cx, type VariantProps } from 'class-variance-authority'\n\nimport { Icon } from '../icon'\nimport type { StarValue } from './types'\n\nconst ratingDisplayStarStyles = cva(['relative block after:absolute after:block after:inset-0'], {\n variants: {\n gap: {\n sm: ['after:w-[calc(100%+(var(--spacing-sm)))]', 'last-of-type:after:content-none'],\n md: ['after:w-[calc(100%+(var(--spacing-md)))]', 'last-of-type:after:content-none'],\n },\n },\n defaultVariants: {\n gap: 'sm',\n },\n})\n\nconst ratingDisplayStarIconStyles = cva('', {\n variants: {\n size: {\n sm: 'text-caption-link',\n md: 'text-body-1',\n lg: 'text-display-3',\n },\n design: {\n filled: ['text-main-variant'],\n outlined: ['text-on-surface/dim-3'],\n },\n },\n})\n\ntype RatingDisplayStarstylesProps = Omit<VariantProps<typeof ratingDisplayStarStyles>, never>\ntype RatingDisplayStarIconStylesProps = Omit<\n VariantProps<typeof ratingDisplayStarIconStyles>,\n 'design'\n>\n\nexport interface RatingDisplayStarProps\n extends RatingDisplayStarstylesProps,\n RatingDisplayStarIconStylesProps {\n value: StarValue\n}\n\nexport const RatingDisplayStar = ({ value, size }: RatingDisplayStarProps) => {\n return (\n <div\n data-spark-component=\"rating-display-star\"\n data-part=\"star\"\n className={ratingDisplayStarStyles({\n gap: size === 'lg' ? 'md' : 'sm',\n })}\n >\n <div className={cx('z-raised absolute overflow-hidden')} style={{ width: value * 100 + '%' }}>\n <Icon\n className={ratingDisplayStarIconStyles({\n size,\n design: 'filled',\n })}\n >\n <StarFill />\n </Icon>\n </div>\n\n <Icon className={ratingDisplayStarIconStyles({ size, design: 'outlined' })}>\n <StarOutline />\n </Icon>\n </div>\n )\n}\n","import { type StarValue } from './types'\n\nfunction getNearestHalfDecimal(num: number): number {\n return Math.round(num / 0.5) * 0.5\n}\n\nfunction formatRatingValue(value: number): string {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 1,\n }).format(value)\n}\n\nfunction getStarValue({ value, index }: { value?: number; index: number }): StarValue {\n if (value === undefined) return 0\n\n const starPosition = index + 1\n const formattedValue = getNearestHalfDecimal(value)\n\n if (Math.ceil(formattedValue) < starPosition) return 0\n\n return formattedValue >= starPosition ? 1 : 0.5\n}\n\nfunction getSingleStarValue(value?: number): StarValue {\n if (value === undefined) return 0\n if (value < 1) return 0\n if (value < 4) return 0.5\n return 1\n}\n\nfunction splitAt<T>(arr: T[], index: number): [T[], T[]] {\n const prev = arr.slice(0, index)\n const next = arr.slice(index)\n\n return [prev, next]\n}\n\nexport { formatRatingValue, getNearestHalfDecimal, getSingleStarValue, getStarValue, splitAt }\n","import { cx } from 'class-variance-authority'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { RatingDisplayStar, type RatingDisplayStarProps } from './RatingDisplayStar'\nimport type { StarValue } from './types'\nimport { getSingleStarValue, getStarValue } from './utils'\n\nexport interface RatingDisplayStarsProps {\n size?: RatingDisplayStarProps['size']\n /**\n * Sets the rendering mode for stars.\n * @default 'default'\n */\n variant?: 'default' | 'single-star'\n /**\n * Custom fill algorithm for each star.\n * By default, stars are rounded to the nearest 0.5.\n */\n getFillMode?: ({ value, index }: { value?: number; index: number }) => StarValue\n}\n\nexport const RatingDisplayStars = ({\n size,\n variant = 'default',\n getFillMode,\n}: RatingDisplayStarsProps) => {\n const { value, size: contextSize } = useRatingDisplay()\n const resolvedSize = size ?? contextSize\n const getDisplayValue = (index: number) => {\n if (getFillMode) {\n return getFillMode({ index, value })\n }\n\n return variant === 'single-star' ? getSingleStarValue(value) : getStarValue({ index, value })\n }\n\n const stars =\n variant === 'single-star'\n ? [getDisplayValue(0)]\n : Array.from({ length: 5 }, (_, index) => getDisplayValue(index))\n\n return (\n <div\n data-spark-component=\"rating-display-stars\"\n className={cx(resolvedSize === 'lg' ? 'gap-x-md' : 'gap-x-sm', 'flex')}\n >\n {stars.map((starValue, index) => (\n <RatingDisplayStar key={index} size={resolvedSize} value={starValue} />\n ))}\n </div>\n )\n}\n\nRatingDisplayStars.displayName = 'RatingDisplay.Stars'\n","import { cva } from 'class-variance-authority'\nimport { type ComponentPropsWithRef, type ReactNode } from 'react'\n\nimport { useRatingDisplay } from './RatingDisplayContext'\nimport { formatRatingValue } from './utils'\n\nexport interface RatingDisplayValueProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {\n /**\n * Custom value content.\n * Pass a render function to receive the formatted value (first arg) and raw value (second arg),\n * then return the content to render.\n */\n children?: ReactNode | ((formattedValue: string, value: number) => ReactNode)\n}\n\nconst ratingDisplayValueStyles = cva('text-on-surface font-bold', {\n variants: {\n size: {\n sm: 'text-caption',\n md: 'text-body-2',\n lg: 'text-display-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nexport const RatingDisplayValue = ({ className, children, ...rest }: RatingDisplayValueProps) => {\n const { value, size } = useRatingDisplay()\n const formattedValue = formatRatingValue(value)\n const renderedValue =\n typeof children === 'function' ? children(formattedValue, value) : (children ?? formattedValue)\n\n return (\n <span\n data-spark-component=\"rating-display-value\"\n className={ratingDisplayValueStyles({ size: size ?? 'md', className })}\n {...rest}\n >\n {renderedValue}\n </span>\n )\n}\n\nRatingDisplayValue.displayName = 'RatingDisplay.Value'\n","import { RatingDisplay as Root } from './RatingDisplay'\nimport { RatingDisplayCount as Count } from './RatingDisplayCount'\nimport { RatingDisplayStars as Stars } from './RatingDisplayStars'\nimport { RatingDisplayValue as Value } from './RatingDisplayValue'\n\nexport const RatingDisplay: typeof Root & {\n Stars: typeof Stars\n Value: typeof Value\n Count: typeof Count\n} = Object.assign(Root, {\n Stars,\n Value,\n Count,\n})\n\nRatingDisplay.displayName = 'RatingDisplay'\nStars.displayName = 'RatingDisplay.Stars'\nValue.displayName = 'RatingDisplay.Value'\nCount.displayName = 'RatingDisplay.Count'\n\nexport { type RatingDisplayProps, type RatingDisplayRootProps } from './RatingDisplay'\nexport { type RatingDisplayStarsProps } from './RatingDisplayStars'\nexport { type RatingDisplayValueProps } from './RatingDisplayValue'\nexport { type RatingDisplayCountProps } from './RatingDisplayCount'\nexport type { StarValue } from './types'\n"],"names":["RatingDisplayContext","createContext","RatingDisplayProvider","value","size","count","children","jsx","useRatingDisplay","context","useContext","RatingDisplay","asChild","ref","rest","Slot","ratingDisplayCountStyles","cva","RatingDisplayCount","className","renderedCount","jsxs","ratingDisplayStarStyles","ratingDisplayStarIconStyles","RatingDisplayStar","cx","Icon","StarFill","StarOutline","getNearestHalfDecimal","num","formatRatingValue","locale","getStarValue","index","starPosition","formattedValue","getSingleStarValue","RatingDisplayStars","variant","getFillMode","contextSize","resolvedSize","getDisplayValue","stars","_","starValue","ratingDisplayValueStyles","RatingDisplayValue","renderedValue","Root","Stars","Value","Count"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spark-ui/components",
3
- "version": "16.0.2",
3
+ "version": "16.0.3",
4
4
  "license": "MIT",
5
5
  "description": "Spark (Leboncoin design system) components.",
6
6
  "exports": {
@@ -54,9 +54,9 @@
54
54
  "@react-aria/toast": "^3.0.0-beta.18",
55
55
  "@react-stately/numberfield": "3.9.11",
56
56
  "@react-stately/toast": "^3.0.0-beta.7",
57
- "@spark-ui/hooks": "^16.0.2",
58
- "@spark-ui/icons": "^16.0.2",
59
- "@spark-ui/internal-utils": "^16.0.2",
57
+ "@spark-ui/hooks": "^16.0.3",
58
+ "@spark-ui/icons": "^16.0.3",
59
+ "@spark-ui/internal-utils": "^16.0.3",
60
60
  "@zag-js/pagination": "1.30.0",
61
61
  "@zag-js/react": "1.30.0",
62
62
  "class-variance-authority": "0.7.1",