@banzamel/mineralui 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +1 -1
  2. package/dist/{MDetailList-Gh5Y0UOx.js → MDetailList-CELXTmJw.js} +21 -12
  3. package/dist/MDetailList-CELXTmJw.js.map +1 -0
  4. package/dist/MDetailList-t0ixZflO.cjs +2 -0
  5. package/dist/MDetailList-t0ixZflO.cjs.map +1 -0
  6. package/dist/{cards-EAgezJB6.js → cards-C2t-pM0r.js} +13 -12
  7. package/dist/cards-C2t-pM0r.js.map +1 -0
  8. package/dist/{cards-DWNtiO72.cjs → cards-D7_hH3Q8.cjs} +2 -2
  9. package/dist/cards-D7_hH3Q8.cjs.map +1 -0
  10. package/dist/cards.cjs +1 -1
  11. package/dist/cards.js +1 -1
  12. package/dist/components/data/MTaskList/MTaskList.d.ts +1 -1
  13. package/dist/components/data/MTaskList/MTaskList.types.d.ts +3 -1
  14. package/dist/components/inputs/MInputUrl/MInputUrl.d.ts +3 -0
  15. package/dist/components/inputs/MInputUrl/MInputUrl.types.d.ts +27 -0
  16. package/dist/components/inputs/MInputUrl/index.d.ts +2 -0
  17. package/dist/components/inputs/index.d.ts +2 -0
  18. package/dist/{data-CDZvakQ8.cjs → data-0_KXny56.cjs} +2 -2
  19. package/dist/data-0_KXny56.cjs.map +1 -0
  20. package/dist/{data-B5KYb0SW.js → data-9Ej9tlwW.js} +8 -8
  21. package/dist/{data-B5KYb0SW.js.map → data-9Ej9tlwW.js.map} +1 -1
  22. package/dist/data.cjs +1 -1
  23. package/dist/data.js +1 -1
  24. package/dist/display.cjs +1 -1
  25. package/dist/display.js +1 -1
  26. package/dist/{dropdowns-C9jREjLg.js → dropdowns-BJ8s18h2.js} +2 -2
  27. package/dist/{dropdowns-C9jREjLg.js.map → dropdowns-BJ8s18h2.js.map} +1 -1
  28. package/dist/{dropdowns-BP2HBR-x.cjs → dropdowns-BLd4lyr6.cjs} +2 -2
  29. package/dist/{dropdowns-BP2HBR-x.cjs.map → dropdowns-BLd4lyr6.cjs.map} +1 -1
  30. package/dist/dropdowns.cjs +1 -1
  31. package/dist/dropdowns.js +1 -1
  32. package/dist/{form-D5F1kTIA.cjs → form-Bni0Gf_s.cjs} +2 -2
  33. package/dist/{form-D5F1kTIA.cjs.map → form-Bni0Gf_s.cjs.map} +1 -1
  34. package/dist/{form-CWoOQ_qo.js → form-CFhDAU18.js} +2 -2
  35. package/dist/{form-CWoOQ_qo.js.map → form-CFhDAU18.js.map} +1 -1
  36. package/dist/form.cjs +1 -1
  37. package/dist/form.js +1 -1
  38. package/dist/index.cjs +1 -1
  39. package/dist/index.js +14 -14
  40. package/dist/inputs-BpdfT9Hp.cjs +2 -0
  41. package/dist/inputs-BpdfT9Hp.cjs.map +1 -0
  42. package/dist/{inputs-bbwdb6m3.js → inputs-CyDoEfL3.js} +333 -284
  43. package/dist/inputs-CyDoEfL3.js.map +1 -0
  44. package/dist/inputs.cjs +1 -1
  45. package/dist/inputs.js +3 -3
  46. package/dist/style-runtime.cjs +1 -1
  47. package/dist/style-runtime.js +1 -1
  48. package/dist/styles.css +1 -1
  49. package/dist/utils/validators.d.ts +14 -0
  50. package/dist/utils.cjs +1 -1
  51. package/dist/utils.js +2 -2
  52. package/dist/{validators-DRhikiAi.cjs → validators-B6yWdsu2.cjs} +2 -2
  53. package/dist/{validators-DRhikiAi.cjs.map → validators-B6yWdsu2.cjs.map} +1 -1
  54. package/dist/{validators-D5OCyV2h.js → validators-DVYOtFnw.js} +19 -2
  55. package/dist/{validators-D5OCyV2h.js.map → validators-DVYOtFnw.js.map} +1 -1
  56. package/package.json +1 -1
  57. package/dist/MDetailList-CpwrF22b.cjs +0 -2
  58. package/dist/MDetailList-CpwrF22b.cjs.map +0 -1
  59. package/dist/MDetailList-Gh5Y0UOx.js.map +0 -1
  60. package/dist/cards-DWNtiO72.cjs.map +0 -1
  61. package/dist/cards-EAgezJB6.js.map +0 -1
  62. package/dist/data-CDZvakQ8.cjs.map +0 -1
  63. package/dist/inputs-D38ib0gM.cjs +0 -2
  64. package/dist/inputs-D38ib0gM.cjs.map +0 -1
  65. package/dist/inputs-bbwdb6m3.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards-D7_hH3Q8.cjs","names":[],"sources":["../src/components/cards/shared/MCardColor.utils.tsx","../src/components/cards/MCardActionArea/MCardActionArea.tsx","../src/components/cards/MCardPayment/MCardPayment.tsx","../src/components/cards/MCardPaymentMethod/MCardPaymentMethod.tsx","../src/components/cards/ServiceCardsShared/ServiceCardsShared.tsx","../src/components/cards/MCardOffer/MCardOffer.tsx","../src/components/cards/MCardCourse/MCardCourse.tsx","../src/components/cards/MCardTile/MCardTile.tsx","../src/components/cards/MCardProduct/MCardProduct.tsx","../src/components/cards/MCardEvent/MCardEvent.tsx","../src/components/cards/MCardWidget/MCardWidget.tsx","../src/components/cards/MStatCard/MStatCard.tsx","../src/components/cards/MCardGrid/MCardGrid.tsx","../src/components/cards/MCardDaySchedule/MCardDaySchedule.tsx","../src/components/cards/MCardDocumentTree/MCardDocumentTree.tsx"],"sourcesContent":["import {Children, cloneElement, isValidElement} from 'react'\nimport type {ReactElement, ReactNode} from 'react'\nimport type {MColor} from '../../../theme'\nimport {MButton} from '../../controls'\n\nfunction getElementTypeName(type: unknown) {\n if (typeof type === 'string') {\n return type\n }\n\n if (typeof type === 'function') {\n const component = type as {displayName?: string; name?: string}\n\n return component.displayName ?? component.name ?? ''\n }\n\n if (typeof type === 'object' && type !== null) {\n const maybeType = type as {\n displayName?: string\n render?: {displayName?: string; name?: string}\n }\n\n return maybeType.displayName ?? maybeType.render?.displayName ?? maybeType.render?.name ?? ''\n }\n\n return ''\n}\n\nfunction shouldInheritColor(element: ReactElement) {\n const props = element.props as {color?: unknown}\n\n if (props.color !== undefined) {\n return false\n }\n\n if (element.type === MButton) {\n return true\n }\n\n const typeName = getElementTypeName(element.type)\n\n return typeName.startsWith('M') && typeName.endsWith('Icon')\n}\n\nexport function tintCardChildren(children: ReactNode, color?: MColor): ReactNode {\n if (!color) {\n return children\n }\n\n return Children.map(children, (child) => {\n if (!isValidElement(child)) {\n return child\n }\n\n const element = child as ReactElement<{children?: ReactNode}>\n const props = element.props\n const tintedChildren = props.children ? tintCardChildren(props.children, color) : props.children\n const nextProps: Record<string, unknown> = {}\n\n if (tintedChildren !== props.children) {\n nextProps.children = tintedChildren\n }\n\n if (shouldInheritColor(element)) {\n nextProps.color = color\n }\n\n if (!Object.keys(nextProps).length) {\n return element\n }\n\n return cloneElement(element, nextProps)\n })\n}\n","import type {PointerEvent} from 'react'\nimport type {MCardActionAreaProps} from './MCardActionArea.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {resolveMCardAction, tintCardChildren} from '../shared'\nimport './MCardActionArea.css'\n\nexport function MCardActionArea({\n component,\n to,\n href,\n target,\n rel,\n color,\n interactive = true,\n clickEffect,\n rippleColor,\n className,\n children,\n onPointerDown,\n type,\n ...rest\n}: MCardActionAreaProps) {\n const {\n component: Component,\n href: resolvedHref,\n to: resolvedTo,\n isInteractive,\n } = resolveMCardAction({\n component,\n href,\n to,\n interactive,\n hasClickHandler: Boolean(rest.onClick),\n hasPointerHandler: Boolean(onPointerDown),\n fallbackComponent: 'button',\n })\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLElement>({\n effect: clickEffect ?? (isInteractive ? 'ripple' : 'none'),\n disabled: !isInteractive,\n color: rippleColor,\n })\n\n return (\n <Component\n href={Component === 'a' || component ? resolvedHref : undefined}\n to={resolvedTo}\n target={target}\n rel={rel}\n type={Component === 'button' ? (type ?? 'button') : undefined}\n className={cn(\n 'card-action-area',\n color && `color-${color}`,\n isInteractive && 'interactive',\n effectClassName,\n className\n )}\n onPointerDown={(event: PointerEvent<HTMLElement>) => {\n handlePointerDown(event)\n onPointerDown?.(event as PointerEvent<HTMLButtonElement>)\n }}\n {...rest}\n >\n {effectLayer}\n <span className=\"card-action-area-content\">{tintCardChildren(children, color)}</span>\n </Component>\n )\n}\n","import type {PointerEvent} from 'react'\nimport type {MCardPaymentProps} from './MCardPayment.types'\nimport {cn} from '../../../utils/cn'\nimport {creditCardBrands, detectCardBrand} from '../../../utils/creditCards'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {resolveMCardAction} from '../shared'\nimport './MCardPayment.css'\n\nfunction maskNumber(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n if (digits.length <= 4) return digits\n const last4 = digits.slice(-4)\n return `\\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 \\u2022\\u2022\\u2022\\u2022 ${last4}`\n}\n\n// Display-only payment card with balance, masked number, holder name and brand badge.\nexport function MCardPayment({\n component,\n to,\n href,\n target,\n rel,\n holder,\n number,\n expiry,\n brand,\n brandIcon,\n balance,\n balanceLabel = 'Current balance',\n color,\n interactive = false,\n clickEffect,\n rippleColor,\n className,\n onPointerDown,\n ...rest\n}: MCardPaymentProps) {\n const detectedDetails = detectCardBrand(number)\n const detected = brand ?? detectedDetails.brand\n const brandDetails = creditCardBrands.find((rule) => rule.brand === detected) ?? detectedDetails\n const masked = maskNumber(number)\n const brandLabel = brandDetails.iconLabel\n const {\n component: Component,\n href: resolvedHref,\n to: resolvedTo,\n isInteractive,\n } = resolveMCardAction({\n component,\n href,\n to,\n interactive,\n hasClickHandler: Boolean(rest.onClick),\n hasPointerHandler: Boolean(onPointerDown),\n })\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect ?? (isInteractive ? 'ripple' : 'none'),\n disabled: !isInteractive,\n color: rippleColor,\n })\n\n return (\n <Component\n href={Component === 'a' || component ? resolvedHref : undefined}\n to={resolvedTo}\n target={target}\n rel={rel}\n className={cn(\n 'card-payment',\n color || 'primary',\n isInteractive && 'interactive',\n effectClassName,\n className\n )}\n onPointerDown={(event: PointerEvent<HTMLDivElement>) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n {balance !== undefined && (\n <div>\n <p className=\"cp-balance-label\">{balanceLabel}</p>\n <p className=\"cp-balance\">{balance}</p>\n </div>\n )}\n\n <div className=\"cp-row\">\n <span className={cn('cp-brand', !brandIcon && detected)}>{brandIcon ?? brandLabel}</span>\n <span className=\"cp-number\">{masked}</span>\n </div>\n\n <div className=\"cp-details\">\n <div>\n <p className=\"cp-field-label\">MCard holder</p>\n <p className=\"cp-field-value\">{holder}</p>\n </div>\n <div>\n <p className=\"cp-field-label\">Expiration date</p>\n <p className=\"cp-field-value\">{expiry}</p>\n </div>\n </div>\n </Component>\n )\n}\n","import type {MCardPaymentMethodProps} from './MCardPaymentMethod.types'\nimport {cn} from '../../../utils/cn'\nimport {creditCardBrands} from '../../../utils/creditCards'\nimport {MArrowRightIcon} from '../../../icons'\nimport {MBadge} from '../../feedback'\nimport {MInline} from '../../layout'\nimport {MLink, MText} from '../../typography'\nimport {MInputExpDate} from '../../inputs/MInputExpDate'\nimport {MInputCVC} from '../../inputs/MInputCVC'\nimport './MCardPaymentMethod.css'\n\nfunction resolveBrandLabel(brand: NonNullable<MCardPaymentMethodProps['brand']>) {\n return creditCardBrands.find((item) => item.brand === brand)?.iconLabel ?? 'CARD'\n}\n\nexport function MCardPaymentMethod({\n title = 'Your payment methods',\n actionLabel = 'Change',\n actionHref = '#',\n onAction,\n brand = 'visa',\n brandIcon,\n last4,\n badgeLabel,\n summary,\n helperText = 'All fields are required, unless stated otherwise.',\n expiryLabel = 'Expiration date',\n cvcLabel = 'Security code',\n expiryProps,\n cvcProps,\n color,\n className,\n ...rest\n}: MCardPaymentMethodProps) {\n const expirySummary = expiryProps?.value ?? expiryProps?.defaultValue\n const resolvedBadgeLabel = badgeLabel === undefined ? 'Default' : badgeLabel\n const derivedSummary = expirySummary\n ? `Credit card - Expiration date ${String(expirySummary).replace('/', '.')}`\n : 'Credit card'\n const resolvedSummary = summary === undefined ? derivedSummary : summary\n const brandLabel = resolveBrandLabel(brand)\n const resolvedExpiryProps = {\n clearable: true,\n ...expiryProps,\n }\n\n return (\n <div className={cn('card-payment-method', color || 'primary', className)} {...rest}>\n <div className={'cpm-header'}>\n <h3 className={'cpm-title'}>{title}</h3>\n <MLink\n href={actionHref}\n tone={'accent'}\n underline={'none'}\n className={'cpm-action'}\n onClick={(event) => {\n if (onAction) {\n event.preventDefault()\n onAction()\n }\n }}\n >\n {actionLabel}\n <MArrowRightIcon />\n </MLink>\n </div>\n\n <div className={'cpm-surface'}>\n <div className={'cpm-method'}>\n <MInline align={'center'} className={'cpm-method-row'}>\n <span className={cn('cpm-brand', !brandIcon && brand)}>{brandIcon ?? brandLabel}</span>\n <span className={'cpm-last4'}>{`\\u2022\\u2022\\u2022\\u2022 ${last4}`}</span>\n {resolvedBadgeLabel && <MBadge color={'info'}>{resolvedBadgeLabel}</MBadge>}\n </MInline>\n {resolvedSummary && (\n <MText tone={'muted'} className={'cpm-summary'}>\n {resolvedSummary}\n </MText>\n )}\n </div>\n\n {helperText && (\n <MText tone={'muted'} size={'sm'} className={'cpm-helper'}>\n {helperText}\n </MText>\n )}\n\n <div className={'cpm-fields'}>\n <MInputExpDate label={expiryLabel} placeholder={'MM/YYYY'} fullWidth {...resolvedExpiryProps} />\n <MInputCVC label={cvcLabel} placeholder={'123'} fullWidth {...cvcProps} />\n </div>\n </div>\n </div>\n )\n}\n","import {useEffect, useState} from 'react'\nimport type {SharedServiceCardProps} from './ServiceCardsShared.types'\nimport {cn} from '../../../utils/cn'\nimport {MClockIcon, MEllipsisVerticalIcon, MHeartFillIcon, MHeartIcon, MMinusIcon, MPlusIcon} from '../../../icons'\nimport {MButton} from '../../controls'\nimport {MBadge} from '../../feedback'\nimport {MAvatar} from '../../media'\nimport {MRating} from '../../display'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport './ServiceCardsShared.css'\n\nexport function SharedServiceCard({\n variant,\n title,\n description,\n price,\n currency = 'PLN',\n duration,\n available,\n image,\n gallery,\n galleryAutoPlay = false,\n rating,\n reviewCount,\n favorite,\n onFavorite,\n menuItems,\n onAddToCart,\n actionLabel,\n icon,\n color = 'primary',\n leader,\n participants,\n maxParticipants,\n quantity: controlledQty,\n onQuantityChange,\n showQuantity = true,\n date,\n location,\n status,\n className,\n ...rest\n}: SharedServiceCardProps) {\n const [galleryIdx, setGalleryIdx] = useState(0)\n const [isGalleryTransitioning, setIsGalleryTransitioning] = useState(false)\n const [internalQty, setInternalQty] = useState(1)\n\n const qty = controlledQty ?? internalQty\n const images = gallery && gallery.length > 0 ? gallery : image ? [image] : []\n\n useEffect(() => {\n if (galleryIdx >= images.length) {\n setGalleryIdx(0)\n }\n }, [galleryIdx, images.length])\n\n useEffect(() => {\n if (!isGalleryTransitioning) {\n return\n }\n\n const transitionId = window.setTimeout(() => {\n setIsGalleryTransitioning(false)\n }, 220)\n\n return () => window.clearTimeout(transitionId)\n }, [galleryIdx, isGalleryTransitioning])\n\n function changeGallery(nextIdx: number) {\n if (nextIdx === galleryIdx || nextIdx < 0 || nextIdx >= images.length) {\n return\n }\n\n if (images.length > 1) {\n setIsGalleryTransitioning(true)\n }\n\n setGalleryIdx(nextIdx)\n }\n\n useEffect(() => {\n if (!galleryAutoPlay || images.length <= 1) {\n return\n }\n\n const intervalId = window.setInterval(() => {\n setIsGalleryTransitioning(true)\n setGalleryIdx((current) => (current + 1) % images.length)\n }, 3500)\n\n return () => window.clearInterval(intervalId)\n }, [galleryAutoPlay, images.length])\n\n function changeQty(next: number) {\n const val = Math.max(1, next)\n if (onQuantityChange) onQuantityChange(val)\n else setInternalQty(val)\n }\n\n const availLabel =\n available === true\n ? 'Available'\n : available === false\n ? 'Unavailable'\n : typeof available === 'number'\n ? `${available} spots`\n : null\n\n const parsedDate = date ? (date instanceof Date ? date : new Date(date)) : null\n const dateDay = parsedDate ? parsedDate.getDate() : null\n const dateMonth = parsedDate ? parsedDate.toLocaleString('en', {month: 'short'}).toUpperCase() : null\n\n return (\n <div className={cn('card-service', variant, `color-${color}`, className)} {...rest}>\n {images.length > 0 && (\n <div className=\"cs-gallery\">\n <img\n src={images[galleryIdx]}\n alt={title}\n className={cn('cs-image', isGalleryTransitioning && 'is-transitioning')}\n />\n {images.length > 1 && (\n <div className=\"cs-gallery-dots\">\n {images.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n className={cn('cs-dot', i === galleryIdx && 'active')}\n onClick={() => changeGallery(i)}\n aria-label={`Image ${i + 1}`}\n />\n ))}\n </div>\n )}\n\n {(onFavorite || (menuItems && menuItems.length > 0)) && (\n <div className=\"cs-gallery-actions\">\n {menuItems && menuItems.length > 0 && (\n <MDropdownMenu\n className=\"cs-menu-wrap\"\n trigger={\n <MButton\n variant=\"ghost\"\n iconOnly\n shape=\"circle\"\n aria-label=\"More options\"\n className=\"cs-overlay-btn\"\n >\n <MEllipsisVerticalIcon />\n </MButton>\n }\n placement=\"bottom-end\"\n >\n {menuItems.map((item, i) => (\n <MDropdownItem\n key={i}\n icon={item.icon}\n color={item.danger ? 'error' : undefined}\n label={item.label}\n onClick={item.onClick}\n />\n ))}\n </MDropdownMenu>\n )}\n {onFavorite && (\n <MButton\n variant=\"ghost\"\n iconOnly\n shape=\"circle\"\n onClick={onFavorite}\n aria-label={favorite ? 'Remove from favorites' : 'Add to favorites'}\n className={cn('cs-overlay-btn', favorite && 'cs-fav-active')}\n >\n {favorite ? <MHeartFillIcon /> : <MHeartIcon />}\n </MButton>\n )}\n </div>\n )}\n </div>\n )}\n\n <div className=\"cs-body\">\n {variant === 'event' && parsedDate && (\n <div className=\"cs-event-header\">\n <div className=\"cs-date-block\">\n <span className=\"cs-date-day\">{dateDay}</span>\n <span className=\"cs-date-month\">{dateMonth}</span>\n </div>\n <div className=\"cs-event-info\">\n <h3 className=\"cs-title\">{title}</h3>\n {description && <p className=\"cs-desc\">{description}</p>}\n </div>\n </div>\n )}\n\n {variant !== 'event' && (\n <>\n <div className=\"cs-top\">\n {icon && <span className=\"cs-icon\">{icon}</span>}\n <h3 className=\"cs-title\">{title}</h3>\n </div>\n {description && <p className=\"cs-desc\">{description}</p>}\n </>\n )}\n\n {variant === 'event' && !parsedDate && (\n <>\n <div className=\"cs-top\">\n {icon && <span className=\"cs-icon\">{icon}</span>}\n <h3 className=\"cs-title\">{title}</h3>\n </div>\n {description && <p className=\"cs-desc\">{description}</p>}\n </>\n )}\n\n {rating !== undefined && (\n <div className=\"cs-rating\">\n <MRating value={Math.round(rating)} size=\"sm\" color=\"warning\" readOnly className=\"cs-stars\" />\n <span className=\"cs-rating-value\">{rating.toFixed(1)}</span>\n {reviewCount !== undefined && <span className=\"cs-review-count\">({reviewCount})</span>}\n </div>\n )}\n\n {leader && (\n <div className=\"cs-leader\">\n <MAvatar src={leader.avatar} name={leader.name} size={28} color={color} />\n <span className=\"cs-leader-name\">{leader.name}</span>\n </div>\n )}\n\n {variant === 'course' && participants && (\n <div className=\"cs-participants\">\n <div className=\"cs-participants-avatars\">\n {participants.slice(0, 4).map((participant, index) => (\n <MAvatar\n key={`${participant.name}-${index}`}\n src={participant.avatar}\n name={participant.name}\n size={28}\n color={color}\n className=\"cs-participant-avatar\"\n />\n ))}\n </div>\n {maxParticipants && (\n <span className=\"cs-spots\">\n {participants.length}/{maxParticipants}\n </span>\n )}\n </div>\n )}\n\n <div className=\"cs-meta\">\n {variant === 'event' && location && (\n <MBadge size=\"xs\" color={color}>\n {location}\n </MBadge>\n )}\n {duration && (\n <MBadge size=\"xs\" color={color} icon={<MClockIcon />}>\n {duration}\n </MBadge>\n )}\n {variant === 'event' && status && (\n <MBadge size=\"xs\" color={status.toLowerCase() === 'sold out' ? 'error' : color}>\n {status}\n </MBadge>\n )}\n {availLabel && variant !== 'event' && (\n <MBadge size=\"xs\" color={available === false ? 'error' : color}>\n {availLabel}\n </MBadge>\n )}\n </div>\n </div>\n\n <div className=\"cs-footer\">\n {price !== undefined && (\n <span className=\"cs-price\">\n {typeof price === 'number' ? price.toFixed(2) : price}{' '}\n <span className=\"cs-currency\">{currency}</span>\n </span>\n )}\n\n <div className=\"cs-actions\">\n {variant === 'product' && onAddToCart && showQuantity && (\n <div className=\"cs-qty\">\n <MButton\n variant=\"ghost\"\n iconOnly\n size=\"sm\"\n onClick={() => changeQty(qty - 1)}\n aria-label=\"Decrease\"\n className=\"cs-qty-btn\"\n >\n <MMinusIcon />\n </MButton>\n <span className=\"cs-qty-value\">{qty}</span>\n <MButton\n variant=\"ghost\"\n iconOnly\n size=\"sm\"\n onClick={() => changeQty(qty + 1)}\n aria-label=\"Increase\"\n className=\"cs-qty-btn\"\n >\n <MPlusIcon />\n </MButton>\n </div>\n )}\n {onAddToCart && (\n <MButton\n variant=\"filled\"\n size=\"sm\"\n color={color}\n onClick={() => onAddToCart(qty)}\n disabled={available === false}\n className=\"cs-cart-btn\"\n >\n {actionLabel ?? (variant === 'event' ? 'Register' : 'Add to cart')}\n </MButton>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import type {MCardOfferProps} from './MCardOffer.types'\nimport {SharedServiceCard} from '../ServiceCardsShared/ServiceCardsShared'\n\nexport function MCardOffer(props: MCardOfferProps) {\n const {onAction, actionLabel = 'Book now', ...rest} = props\n\n return (\n <SharedServiceCard\n variant=\"service\"\n onAddToCart={onAction ? () => onAction() : undefined}\n actionLabel={actionLabel}\n {...rest}\n />\n )\n}\n","import type {MCardCourseProps} from './MCardCourse.types'\nimport {SharedServiceCard} from '../ServiceCardsShared/ServiceCardsShared'\n\nexport function MCardCourse(props: MCardCourseProps) {\n const {onAction, actionLabel = 'Join course', ...rest} = props\n\n return (\n <SharedServiceCard\n variant=\"course\"\n onAddToCart={onAction ? () => onAction() : undefined}\n actionLabel={actionLabel}\n {...rest}\n />\n )\n}\n","import {useEffect, useRef} from 'react'\nimport type {MouseEvent} from 'react'\nimport type {MCardTileProps} from './MCardTile.types'\nimport {cn} from '../../../utils/cn'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {MEllipsisVerticalIcon, MHeartFillIcon, MHeartIcon} from '../../../icons'\nimport {MButton} from '../../controls'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport {resolveMCardAction} from '../shared'\nimport './MCardTile.css'\n\n// Tile card: whole surface acts as a link/button, media can fill the card with text overlay.\n// Media can be an image URL, a video URL, an MIllustration element, or a live camera stream.\nexport function MCardTile({\n component,\n title,\n description,\n icon,\n color = 'primary',\n to,\n href,\n target,\n rel,\n onClick,\n interactive = false,\n clickEffect,\n rippleColor,\n image,\n video,\n illustration,\n camera,\n mediaFill = false,\n overlayPosition = 'bottom',\n favorite,\n onFavorite,\n menuItems,\n className,\n ...rest\n}: MCardTileProps) {\n const videoRef = useRef<HTMLVideoElement>(null)\n\n useEffect(() => {\n if (!camera) {\n return\n }\n\n const node = videoRef.current\n if (!node || typeof navigator === 'undefined' || !navigator.mediaDevices?.getUserMedia) {\n return\n }\n\n let activeStream: MediaStream | null = null\n let cancelled = false\n const constraints: MediaStreamConstraints = camera === true ? {video: true} : camera\n\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop())\n return\n }\n activeStream = stream\n node.srcObject = stream\n void node.play().catch(() => undefined)\n })\n .catch(() => undefined)\n\n return () => {\n cancelled = true\n if (activeStream) {\n activeStream.getTracks().forEach((track) => track.stop())\n }\n node.srcObject = null\n }\n }, [camera])\n\n const hasMedia = Boolean(image || video || illustration || camera)\n const {\n component: OverlayComponent,\n href: resolvedHref,\n to: resolvedTo,\n isInteractive,\n isLink,\n } = resolveMCardAction({\n component,\n href,\n to,\n interactive,\n hasClickHandler: Boolean(onClick),\n fallbackComponent: 'button',\n })\n const fillMedia = mediaFill && hasMedia\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect ?? (isInteractive ? 'ripple' : 'none'),\n disabled: !isInteractive,\n color: rippleColor,\n })\n\n function stopBubble(event: MouseEvent) {\n event.stopPropagation()\n }\n\n function handleOverlayClick(event: MouseEvent<HTMLElement>) {\n if (onClick) {\n event.preventDefault()\n onClick()\n }\n }\n\n function renderMedia() {\n if (!hasMedia) {\n return null\n }\n\n return (\n <div className={cn('tile-media', fillMedia && 'fill')}>\n {image && <img src={image} alt={title} className=\"tile-image\" />}\n {video && (\n <video src={video} className=\"tile-video\" autoPlay muted loop playsInline aria-label={title} />\n )}\n {camera && (\n <video ref={videoRef} className=\"tile-video\" autoPlay muted playsInline aria-label={title} />\n )}\n {illustration && <div className=\"tile-illustration\">{illustration}</div>}\n {fillMedia && <div className={cn('tile-scrim', `scrim-${overlayPosition}`)} />}\n </div>\n )\n }\n\n function renderBody() {\n return (\n <div className={cn('tile-body', fillMedia && 'overlay', fillMedia && `pos-${overlayPosition}`)}>\n <div className=\"tile-top\">\n {icon && <span className=\"tile-icon\">{icon}</span>}\n <h3 className=\"tile-title\">{title}</h3>\n </div>\n {description && <p className=\"tile-desc\">{description}</p>}\n </div>\n )\n }\n\n const hasActions = onFavorite || (menuItems && menuItems.length > 0)\n\n return (\n <div\n className={cn(\n 'card-tile',\n `color-${color}`,\n fillMedia && 'media-fill',\n isInteractive && 'interactive',\n effectClassName,\n className\n )}\n onPointerDown={handlePointerDown}\n {...rest}\n >\n {effectLayer}\n {isLink && (\n <OverlayComponent\n href={OverlayComponent === 'a' || component ? resolvedHref : undefined}\n to={resolvedTo}\n target={target}\n rel={rel}\n className=\"tile-link\"\n aria-label={title}\n onClick={onClick ? handleOverlayClick : undefined}\n />\n )}\n {!isLink && onClick && (\n <OverlayComponent type=\"button\" className=\"tile-link\" aria-label={title} onClick={onClick} />\n )}\n\n {renderMedia()}\n {renderBody()}\n\n {hasActions && (\n <div className=\"tile-actions\" onClick={stopBubble} onPointerDown={stopBubble}>\n {menuItems && menuItems.length > 0 && (\n <MDropdownMenu\n className=\"tile-menu-wrap\"\n trigger={\n <MButton\n variant=\"ghost\"\n iconOnly\n shape=\"circle\"\n aria-label=\"More options\"\n className=\"tile-overlay-btn\"\n >\n <MEllipsisVerticalIcon />\n </MButton>\n }\n placement=\"bottom-end\"\n >\n {menuItems.map((item, i) => (\n <MDropdownItem\n key={i}\n icon={item.icon}\n color={item.danger ? 'error' : undefined}\n label={item.label}\n onClick={item.onClick}\n />\n ))}\n </MDropdownMenu>\n )}\n {onFavorite && (\n <MButton\n variant=\"ghost\"\n iconOnly\n shape=\"circle\"\n onClick={onFavorite}\n aria-label={favorite ? 'Remove from favorites' : 'Add to favorites'}\n className={cn('tile-overlay-btn', favorite && 'tile-fav-active')}\n >\n {favorite ? <MHeartFillIcon /> : <MHeartIcon />}\n </MButton>\n )}\n </div>\n )}\n </div>\n )\n}\n","import type {MCardProductProps} from './MCardProduct.types'\nimport {SharedServiceCard} from '../ServiceCardsShared/ServiceCardsShared'\n\nexport function MCardProduct(props: MCardProductProps) {\n const {addToCartLabel = 'Add to cart', ...rest} = props\n\n return <SharedServiceCard variant=\"product\" actionLabel={addToCartLabel} {...rest} />\n}\n","import type {MCardEventProps} from './MCardEvent.types'\nimport {SharedServiceCard} from '../ServiceCardsShared/ServiceCardsShared'\n\nexport function MCardEvent(props: MCardEventProps) {\n const {onRegister, registerLabel = 'Register', ...rest} = props\n\n return (\n <SharedServiceCard\n variant=\"event\"\n onAddToCart={onRegister ? () => onRegister() : undefined}\n actionLabel={registerLabel}\n {...rest}\n />\n )\n}\n","import type {PointerEvent} from 'react'\nimport type {MCardWidgetProps} from './MCardWidget.types'\nimport {cn} from '../../../utils/cn'\nimport {MArrowDownIcon, MArrowUpIcon} from '../../../icons'\nimport {useInteractionEffect} from '../../../utils/useInteractionEffect'\nimport {resolveMCardAction} from '../shared'\nimport './MCardWidget.css'\n\nfunction resolveTrendType(trend: MCardWidgetProps['trend'], explicit?: MCardWidgetProps['trendType']) {\n if (explicit) return explicit\n if (typeof trend !== 'number' || trend === 0) return 'neutral'\n return trend > 0 ? 'up' : 'down'\n}\n\nfunction formatTrend(trend: MCardWidgetProps['trend']) {\n if (typeof trend === 'number' && trend > 0) {\n return `+${trend}`\n }\n\n return trend\n}\n\nexport function MCardWidget({\n component,\n to,\n href,\n target,\n rel,\n title,\n value,\n trend,\n trendType,\n icon,\n color = 'primary',\n helperText,\n interactive = false,\n clickEffect,\n rippleColor,\n className,\n onPointerDown,\n ...rest\n}: MCardWidgetProps) {\n const hasTrend = trend !== undefined && trend !== null\n const resolvedTrendType = resolveTrendType(trend, trendType)\n const formattedTrend = formatTrend(trend)\n const {\n component: Component,\n href: resolvedHref,\n to: resolvedTo,\n isInteractive,\n } = resolveMCardAction({\n component,\n href,\n to,\n interactive,\n hasClickHandler: Boolean(rest.onClick),\n hasPointerHandler: Boolean(onPointerDown),\n })\n const {effectClassName, effectLayer, handlePointerDown} = useInteractionEffect<HTMLDivElement>({\n effect: clickEffect ?? (isInteractive ? 'ripple' : 'none'),\n disabled: !isInteractive,\n color: rippleColor,\n })\n\n return (\n <Component\n href={Component === 'a' || component ? resolvedHref : undefined}\n to={resolvedTo}\n target={target}\n rel={rel}\n className={cn('card-widget', `color-${color}`, isInteractive && 'interactive', effectClassName, className)}\n onPointerDown={(event: PointerEvent<HTMLDivElement>) => {\n handlePointerDown(event)\n onPointerDown?.(event)\n }}\n {...rest}\n >\n {effectLayer}\n <div className=\"cw-top\">\n <div className=\"cw-meta\">\n <span className=\"cw-title\">{title}</span>\n <span className=\"cw-value\">{value}</span>\n </div>\n {icon && <span className=\"cw-icon\">{icon}</span>}\n </div>\n\n {hasTrend && (\n <div className=\"cw-bottom\">\n <span className={cn('cw-trend', resolvedTrendType)}>\n {resolvedTrendType === 'up' && <MArrowUpIcon size={14} />}\n {resolvedTrendType === 'down' && <MArrowDownIcon size={14} />}\n <span>{formattedTrend}</span>\n </span>\n </div>\n )}\n\n {helperText && <div className=\"cw-helper\">{helperText}</div>}\n </Component>\n )\n}\n","import type {MCardStatProps} from './MStatCard.types'\nimport {MCard} from '../MCard'\nimport {MText} from '../../typography'\nimport {MInline, MStack} from '../../layout'\nimport {MArrowDownIcon, MArrowUpIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MStatCard.css'\n\nfunction resolveTrendType(trend: MCardStatProps['trend'], explicit?: MCardStatProps['trendType']) {\n if (explicit) {\n return explicit\n }\n\n if (typeof trend !== 'number' || trend === 0) {\n return 'neutral'\n }\n\n return trend > 0 ? 'up' : 'down'\n}\n\nfunction formatTrend(trend: MCardStatProps['trend']) {\n if (typeof trend === 'number' && trend > 0) {\n return `+${trend}`\n }\n\n return trend\n}\n\nexport function MCardStat({\n label,\n value,\n icon,\n badge,\n helperText,\n trend,\n trendType,\n color = 'primary',\n className,\n ...rest\n}: MCardStatProps) {\n const hasTrend = trend !== undefined && trend !== null\n const resolvedTrendType = resolveTrendType(trend, trendType)\n\n return (\n <MCard className={cn('stat-card', `color-${color}`, className)} {...rest}>\n <MStack spacing={'md'}>\n <MInline justify={'between'} align={'start'}>\n <MStack spacing={'xs'}>\n <span className=\"stat-card-label\">{label}</span>\n <span className=\"stat-card-value\">{value}</span>\n </MStack>\n <MInline align={'center'}>\n {badge}\n {icon && <span className=\"stat-card-icon\">{icon}</span>}\n </MInline>\n </MInline>\n\n {(hasTrend || helperText) && (\n <MInline justify={'between'} align={'center'}>\n {hasTrend ? (\n <span className={cn('stat-card-trend', resolvedTrendType)}>\n {resolvedTrendType === 'up' && <MArrowUpIcon size={14} />}\n {resolvedTrendType === 'down' && <MArrowDownIcon size={14} />}\n <span>{formatTrend(trend)}</span>\n </span>\n ) : (\n <span />\n )}\n {helperText && (\n <MText size={'sm'} tone={'muted'}>\n {helperText}\n </MText>\n )}\n </MInline>\n )}\n </MStack>\n </MCard>\n )\n}\n","import {Fragment, useState, useMemo, useRef, useCallback, type CSSProperties} from 'react'\nimport type {MCardGridProps, MCardGridResponsiveColumns, MCardGridSort} from './MCardGrid.types'\nimport {cn} from '../../../utils/cn'\nimport {MButton, MCheckbox} from '../../controls'\nimport {MInputSearch} from '../../inputs'\nimport {MPagination} from '../../layout'\nimport {MPopover} from '../../primitives'\nimport {MArrowDownIcon, MArrowUpIcon, MFilterIcon, MSortIcon} from '../../../icons'\nimport './MCardGrid.css'\n\n/**\n * Builds inline style for `.card-grid-items`:\n * - `number` → hard `grid-template-columns: repeat(N, 1fr)` (overrides every breakpoint).\n * - responsive object → CSS custom properties (`--cols-base`, `--cols-sm`, ...) consumed\n * by `min-width` media queries in `MCardGrid.css`. Missing breakpoints cascade through\n * the `var()` fallback chain (xxl → xl → lg → md → sm → base → 1).\n */\nfunction buildColumnsStyle(columns: number | MCardGridResponsiveColumns): CSSProperties {\n if (typeof columns === 'number') return {gridTemplateColumns: `repeat(${columns}, 1fr)`}\n\n const style: Record<string, string | number> = {}\n if (columns.base !== undefined) style['--cols-base'] = columns.base\n if (columns.sm !== undefined) style['--cols-sm'] = columns.sm\n if (columns.md !== undefined) style['--cols-md'] = columns.md\n if (columns.lg !== undefined) style['--cols-lg'] = columns.lg\n if (columns.xl !== undefined) style['--cols-xl'] = columns.xl\n if (columns.xxl !== undefined) style['--cols-xxl'] = columns.xxl\n return style as CSSProperties\n}\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function MCardGrid<T extends Record<string, unknown>>({\n items,\n renderCard,\n color = 'primary',\n searchable = false,\n searchKeys,\n searchPlaceholder = 'Search...',\n search: controlledSearch,\n onSearchChange,\n filterable = false,\n filterKeys = [],\n filters: controlledFilters,\n onFiltersChange,\n sortable = false,\n sortKeys = [],\n defaultSort,\n sort: controlledSort,\n onSortChange,\n pagination = false,\n pageSize = 12,\n page: controlledPage,\n onPageChange,\n total,\n manualSearch = false,\n manualFilters = false,\n manualSort = false,\n manualPagination = false,\n columns = 3,\n emptyMessage = 'No results found.',\n className,\n style,\n ...rest\n}: MCardGridProps<T>) {\n const [internalSearch, setInternalSearch] = useState('')\n const [internalFilters, setInternalFilters] = useState<Record<string, string[]>>({})\n const [internalSort, setInternalSort] = useState<MCardGridSort<T> | null>(defaultSort ?? null)\n const [internalPage, setInternalPage] = useState(1)\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterBtnRef = useRef<HTMLElement>(null)\n const sortBtnRef = useRef<HTMLElement>(null)\n\n const search = controlledSearch !== undefined ? controlledSearch : internalSearch\n const filters = controlledFilters !== undefined ? controlledFilters : internalFilters\n const sort = controlledSort !== undefined ? controlledSort : internalSort\n const page = controlledPage !== undefined ? controlledPage : internalPage\n\n const setSearch = useCallback(\n (next: string) => {\n if (controlledSearch === undefined) setInternalSearch(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSearchChange?.(next)\n },\n [controlledSearch, controlledPage, manualPagination, onSearchChange]\n )\n\n const setFilters = useCallback(\n (next: Record<string, string[]>) => {\n if (controlledFilters === undefined) setInternalFilters(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onFiltersChange?.(next)\n },\n [controlledFilters, controlledPage, manualPagination, onFiltersChange]\n )\n\n const setSort = useCallback(\n (next: MCardGridSort<T> | null) => {\n if (controlledSort === undefined) setInternalSort(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSortChange?.(next)\n },\n [controlledSort, controlledPage, manualPagination, onSortChange]\n )\n\n const rootRef = useRef<HTMLDivElement>(null)\n\n const setPage = useCallback(\n (next: number) => {\n if (controlledPage === undefined) setInternalPage(next)\n onPageChange?.(next)\n // After page change, bring the top of the grid back into view so\n // the user does not stay scrolled deep into the previous page's cards.\n rootRef.current?.scrollIntoView({block: 'start', behavior: 'smooth'})\n },\n [controlledPage, onPageChange]\n )\n\n const openFilter = useCallback(() => {\n setFilterOpen((v) => !v)\n setSortOpen(false)\n }, [])\n\n const openSort = useCallback(() => {\n setSortOpen((v) => !v)\n setFilterOpen(false)\n }, [])\n\n const processed = useMemo(() => {\n let result = items\n\n if (!manualSearch && search && searchKeys && searchKeys.length > 0) {\n const query = search.toLowerCase()\n result = result.filter((item) =>\n searchKeys.some((key) => {\n const value = getNestedValue(item, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n\n if (!manualFilters) {\n for (const [key, selected] of Object.entries(filters)) {\n if (!selected || selected.length === 0) continue\n\n result = result.filter((item) => {\n const value = getNestedValue(item, key)\n return value != null && selected.includes(String(value))\n })\n }\n }\n\n if (!manualSort && sort) {\n result = [...result].sort((a, b) => {\n const av = getNestedValue(a, sort.key)\n const bv = getNestedValue(b, sort.key)\n\n if (av == null && bv == null) return 0\n if (av == null) return 1\n if (bv == null) return -1\n\n const compare = String(av).localeCompare(String(bv), undefined, {numeric: true})\n return sort.direction === 'asc' ? compare : -compare\n })\n }\n\n return result === items ? [...result] : result\n }, [items, search, searchKeys, filters, sort, manualSearch, manualFilters, manualSort])\n\n const totalItems = manualPagination ? (total ?? processed.length) : processed.length\n const paginatedItems = useMemo(() => {\n if (!pagination || manualPagination) return processed\n const start = (page - 1) * pageSize\n return processed.slice(start, start + pageSize)\n }, [processed, pagination, manualPagination, page, pageSize])\n\n function toggleFilter(key: string, value: string) {\n const current = filters[key] ?? []\n const next = current.includes(value) ? current.filter((item) => item !== value) : [...current, value]\n setFilters({...filters, [key]: next})\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const item of items) {\n const value = getNestedValue(item, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [items, filterKeys])\n\n const activeSort = sortKeys.find((item) => item.key === sort?.key)\n\n return (\n <div ref={rootRef} className={cn('card-grid', `color-${color}`, className)} style={style} {...rest}>\n {(searchable || filterable || sortable) && (\n <div className=\"card-grid-toolbar\">\n {searchable && (\n <MInputSearch\n className=\"card-grid-search\"\n size=\"sm\"\n fullWidth\n placeholder={searchPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n <div className=\"card-grid-actions\">\n {filterable && filterKeys.length > 0 && (\n <>\n <MButton\n ref={filterBtnRef}\n variant=\"outlined\"\n color={color}\n size=\"sm\"\n startIcon={<MFilterIcon />}\n aria-expanded={filterOpen}\n onClick={openFilter}\n >\n Filter\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n className=\"card-grid-dropdown\"\n >\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"card-grid-filter-group\">\n <span className=\"card-grid-filter-label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"card-grid-filter-option\">\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.includes(option) ?? false}\n onChange={() => toggleFilter(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </MPopover>\n </>\n )}\n\n {sortable && sortKeys.length > 0 && (\n <>\n <MButton\n ref={sortBtnRef}\n variant=\"outlined\"\n color={color}\n size=\"sm\"\n startIcon={\n sort ? (\n sort.direction === 'asc' ? (\n <MArrowUpIcon />\n ) : (\n <MArrowDownIcon />\n )\n ) : (\n <MSortIcon />\n )\n }\n aria-expanded={sortOpen}\n onClick={openSort}\n >\n {activeSort ? `Sort: ${activeSort.label}` : 'Sort'}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\n className=\"card-grid-dropdown\"\n >\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn(\n 'card-grid-sort-item',\n sort?.key === sortItem.key && 'active'\n )}\n onClick={() => {\n if (sort?.key === sortItem.key) {\n setSort({\n key: sortItem.key,\n direction: sort.direction === 'asc' ? 'desc' : 'asc',\n })\n } else {\n setSort({key: sortItem.key, direction: 'asc'})\n }\n }}\n >\n {sortItem.label}\n {sort?.key === sortItem.key && (\n <span className=\"card-grid-sort-dir\">\n {sort.direction === 'asc' ? (\n <MArrowUpIcon className=\"card-grid-sort-icon\" />\n ) : (\n <MArrowDownIcon className=\"card-grid-sort-icon\" />\n )}\n </span>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n </div>\n )}\n\n {paginatedItems.length > 0 ? (\n <div className=\"card-grid-items\" style={buildColumnsStyle(columns)}>\n {paginatedItems.map((item, index) => {\n // Wrap each card so consumers don't have to remember `key={item.id}` in renderCard.\n // Prefer the item's id when present (stable across reorders), fall back to index.\n const id = (item as {id?: string | number} | null | undefined)?.id\n return <Fragment key={id ?? index}>{renderCard(item, index)}</Fragment>\n })}\n </div>\n ) : (\n <div className=\"card-grid-empty\">{emptyMessage}</div>\n )}\n\n {pagination && totalItems > pageSize && (\n <div className=\"card-grid-pagination\">\n <MPagination total={totalItems} page={page} pageSize={pageSize} onChange={setPage} />\n </div>\n )}\n </div>\n )\n}\n","import type {MCardDayScheduleProps} from './MCardDaySchedule.types'\nimport {MCard, MCardBody, MCardFooter, MCardHeader} from '../MCard'\nimport {MDetailList} from '../../display'\nimport {MGrid, MInline, MStack, MTabs} from '../../layout'\nimport {MHeading, MText} from '../../typography'\nimport {tintCardChildren} from '../shared'\nimport './MCardDaySchedule.css'\n\nexport function MCardDaySchedule({\n title = 'Today',\n description,\n color = 'primary',\n workdayStart,\n workdayEnd,\n timeline,\n summary,\n tabs = [],\n footer,\n emptyTimeline = <MText tone={'muted'}>No events scheduled for this day.</MText>,\n ...rest\n}: MCardDayScheduleProps) {\n const workdayLabel =\n workdayStart && workdayEnd ? `${workdayStart}-${workdayEnd}` : (workdayStart ?? workdayEnd ?? undefined)\n\n const populatedTabs = tabs.filter((tab) => tab.items.length > 0)\n\n return (\n <MCard color={color} {...rest}>\n <MCardHeader>\n <MStack>\n <MHeading level={4}>{title}</MHeading>\n {(description || workdayLabel) && (\n <MText size={'sm'} tone={'muted'}>\n {description}\n {description && workdayLabel ? ' ' : null}\n {workdayLabel}\n </MText>\n )}\n </MStack>\n </MCardHeader>\n <MCardBody>\n <MGrid type={'row'} align={'start'}>\n <MGrid type={'col'} xl={7} sm={12}>\n {timeline.length ? (\n <MStack className=\"day-schedule-card-timeline\">\n {timeline.map((item) => (\n <MInline key={item.id} align={'start'} className=\"day-schedule-card-entry\">\n <span className=\"day-schedule-card-time\">{item.time}</span>\n <div className=\"day-schedule-card-dot\" data-color={item.color ?? color}>\n {tintCardChildren(item.icon, item.color ?? color)}\n </div>\n <div className=\"day-schedule-card-copy\">\n <MText as={'strong'}>{item.title}</MText>\n {item.description && (\n <MText size={'sm'} tone={'muted'}>\n {item.description}\n </MText>\n )}\n </div>\n </MInline>\n ))}\n </MStack>\n ) : (\n emptyTimeline\n )}\n </MGrid>\n\n <MGrid type={'col'} xl={5} sm={12}>\n <MStack className=\"day-schedule-card-side\">\n {summary}\n\n {populatedTabs.length > 0 && (\n <MTabs\n variant={'underline'}\n size={'sm'}\n fullWidth\n defaultValue={populatedTabs[0].type}\n items={populatedTabs.map((tab) => ({\n value: tab.type,\n label: (\n <span className=\"day-schedule-card-tab-label\">\n <span>{tab.title}</span>\n <span className=\"day-schedule-card-tab-count\">{tab.items.length}</span>\n </span>\n ),\n content: <MDetailList items={tab.items} />,\n }))}\n />\n )}\n </MStack>\n </MGrid>\n </MGrid>\n </MCardBody>\n {footer && <MCardFooter>{tintCardChildren(footer, color)}</MCardFooter>}\n </MCard>\n )\n}\n","import type {MCardDocumentTreeProps} from './MCardDocumentTree.types'\nimport {MCard, MCardBody, MCardHeader} from '../MCard'\nimport {MButton} from '../../controls'\nimport {MTreeView} from '../../data'\nimport {MDetailList} from '../../display'\nimport {MGrid, MInline, MStack} from '../../layout'\nimport {MDropdownItem, MDropdownMenu} from '../../overlays'\nimport {MHeading, MText} from '../../typography'\nimport {MEllipsisVerticalIcon} from '../../../icons'\nimport {tintCardChildren} from '../shared'\nimport type {MTreeNode} from '../../data/MTreeView'\n\nexport function MCardDocumentTree({\n title = 'Documents',\n description,\n color = 'primary',\n items,\n selected,\n onSelect,\n defaultExpanded,\n expanded,\n onExpandChange,\n detailsTitle,\n detailsMeta,\n detailsItems = [],\n detailsActions = [],\n renderDetails,\n emptyDetails = <MText tone={'muted'}>Select a document to inspect its details.</MText>,\n primaryAction,\n ...rest\n}: MCardDocumentTreeProps) {\n const mapNode = (node: MTreeNode): MTreeNode => {\n return {\n ...node,\n icon: tintCardChildren(node.icon, color),\n children: node.children?.map(mapNode),\n }\n }\n const itemsWithTint = items.map(mapNode)\n\n return (\n <MCard stretch={false} color={color} {...rest}>\n <MCardHeader>\n <MInline justify={'between'} align={'center'}>\n <MStack>\n <MHeading level={4}>{title}</MHeading>\n {description && (\n <MText size={'sm'} tone={'muted'}>\n {description}\n </MText>\n )}\n </MStack>\n {tintCardChildren(primaryAction, color)}\n </MInline>\n </MCardHeader>\n <MCardBody>\n <MGrid type={'row'} align={'start'}>\n <MGrid type={'col'} xl={7} sm={12}>\n <MTreeView\n items={itemsWithTint}\n color={color}\n defaultExpanded={defaultExpanded}\n expanded={expanded}\n onExpandChange={onExpandChange}\n selected={selected}\n onSelect={onSelect}\n expandable\n selectable\n showLines\n fileIcons\n />\n </MGrid>\n <MGrid type={'col'} xl={5} sm={12}>\n <MStack padding={'sm'}>\n {(detailsTitle || detailsMeta || detailsActions.length > 0) && (\n <MInline justify={'between'} align={'start'}>\n <MStack>\n {detailsTitle && <MHeading level={5}>{detailsTitle}</MHeading>}\n {detailsMeta && (\n <MText size={'sm'} tone={'muted'}>\n {detailsMeta}\n </MText>\n )}\n </MStack>\n\n {detailsActions.length > 0 && (\n <MDropdownMenu\n placement={'bottom-end'}\n trigger={\n <MButton\n variant={'ghost'}\n color={color}\n iconOnly\n shape={'circle'}\n aria-label={'Open document actions'}\n >\n <MEllipsisVerticalIcon />\n </MButton>\n }\n >\n {detailsActions.map((action) => (\n <MDropdownItem\n key={action.id}\n icon={tintCardChildren(action.icon, action.color ?? color)}\n label={action.label}\n color={action.color ?? color}\n disabled={action.disabled}\n component={action.component}\n href={action.href}\n to={action.to}\n onClick={action.onClick}\n />\n ))}\n </MDropdownMenu>\n )}\n </MInline>\n )}\n\n {renderDetails ? (\n renderDetails\n ) : detailsItems.length ? (\n <MDetailList items={detailsItems} />\n ) : (\n emptyDetails\n )}\n </MStack>\n </MGrid>\n </MGrid>\n </MCardBody>\n </MCard>\n )\n}\n"],"mappings":"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"}
package/dist/cards.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  const {ensureStyles}=require('./style-runtime.cjs')
2
2
  ensureStyles()
3
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./MCard-Bg_R86Gr.cjs`),t=require(`./cards-DWNtiO72.cjs`);exports.MCard=e.t,exports.MCardActionArea=t.p,exports.MCardBody=e.n,exports.MCardCourse=t.l,exports.MCardDaySchedule=t.n,exports.MCardDocumentTree=t.t,exports.MCardEvent=t.o,exports.MCardFooter=e.r,exports.MCardGrid=t.r,exports.MCardHeader=e.i,exports.MCardOffer=t.u,exports.MCardPayment=t.f,exports.MCardPaymentMethod=t.d,exports.MCardProduct=t.s,exports.MCardStat=t.i,exports.MCardTile=t.c,exports.MCardWidget=t.a,exports.resolveMCardAction=e.a;
3
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./MCard-Bg_R86Gr.cjs`),t=require(`./cards-D7_hH3Q8.cjs`);exports.MCard=e.t,exports.MCardActionArea=t.p,exports.MCardBody=e.n,exports.MCardCourse=t.l,exports.MCardDaySchedule=t.n,exports.MCardDocumentTree=t.t,exports.MCardEvent=t.o,exports.MCardFooter=e.r,exports.MCardGrid=t.r,exports.MCardHeader=e.i,exports.MCardOffer=t.u,exports.MCardPayment=t.f,exports.MCardPaymentMethod=t.d,exports.MCardProduct=t.s,exports.MCardStat=t.i,exports.MCardTile=t.c,exports.MCardWidget=t.a,exports.resolveMCardAction=e.a;
package/dist/cards.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import {ensureStyles} from './style-runtime.js'
2
2
  ensureStyles()
3
3
  import { a as e, i as t, n, r, t as i } from "./MCard-9ucghJJs.js";
4
- import { a, c as o, d as s, f as c, i as l, l as u, n as d, o as f, p, r as m, s as h, t as g, u as _ } from "./cards-EAgezJB6.js";
4
+ import { a, c as o, d as s, f as c, i as l, l as u, n as d, o as f, p, r as m, s as h, t as g, u as _ } from "./cards-C2t-pM0r.js";
5
5
  export { i as MCard, p as MCardActionArea, n as MCardBody, u as MCardCourse, d as MCardDaySchedule, g as MCardDocumentTree, f as MCardEvent, r as MCardFooter, m as MCardGrid, t as MCardHeader, _ as MCardOffer, c as MCardPayment, s as MCardPaymentMethod, h as MCardProduct, l as MCardStat, o as MCardTile, a as MCardWidget, e as resolveMCardAction };
@@ -1,2 +1,2 @@
1
1
  import { MTaskListProps } from './MTaskList.types';
2
- export declare function MTaskList({ items, color, strikethrough, onChange, className, ...rest }: MTaskListProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function MTaskList({ items, color, size, strikethrough, onChange, className, ...rest }: MTaskListProps): import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes, ReactNode } from 'react';
2
- import { MColor } from '../../../theme';
2
+ import { MColor, MSize } from '../../../theme';
3
3
  export interface MTaskItem {
4
4
  id: string;
5
5
  label: ReactNode;
@@ -9,6 +9,8 @@ export interface MTaskItem {
9
9
  export interface MTaskListProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
10
10
  items: MTaskItem[];
11
11
  color?: MColor;
12
+ /** Visual scale (font size, padding, checkbox size). Default `'md'`. */
13
+ size?: MSize;
12
14
  strikethrough?: boolean;
13
15
  onChange?: (id: string, checked: boolean) => void;
14
16
  }
@@ -0,0 +1,3 @@
1
+ import { MInputUrlProps } from './MInputUrl.types';
2
+ import type * as React from 'react';
3
+ export declare const MInputUrl: React.ForwardRefExoticComponent<MInputUrlProps & React.RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,27 @@
1
+ import { MInputProps } from '../MInput';
2
+ import { ValidationResult } from '../../../utils/validators';
3
+ export interface MInputUrlProps extends Omit<MInputProps, 'type'> {
4
+ /**
5
+ * Allowed URL protocols (without trailing colon). Defaults to
6
+ * `['http', 'https']`. Pass `[]` to accept any scheme; this also stops
7
+ * `formatOnBlur` from prepending a default protocol.
8
+ */
9
+ protocols?: string[];
10
+ /**
11
+ * Whether the value must include a protocol to be considered valid.
12
+ * Defaults to `true`. Set to `false` to accept bare host/path strings
13
+ * like `example.com/path`.
14
+ */
15
+ requireProtocol?: boolean;
16
+ /**
17
+ * When `true`, on blur prepend `${protocols[0]}://` to the value if it
18
+ * has no scheme yet. Quality-of-life shortcut so users can type
19
+ * `example.com` and end up with `https://example.com` after focus leaves
20
+ * the field. Skipped when `protocols` is empty. Defaults to `false`.
21
+ */
22
+ formatOnBlur?: boolean;
23
+ validateOnBlur?: boolean;
24
+ validateOnChange?: boolean;
25
+ showValidIcon?: boolean;
26
+ onValidationChange?: (result: ValidationResult) => void;
27
+ }
@@ -0,0 +1,2 @@
1
+ export { MInputUrl } from './MInputUrl';
2
+ export type { MInputUrlProps } from './MInputUrl.types';
@@ -10,6 +10,8 @@ export { MInputSearch } from './MInputSearch';
10
10
  export type { MInputSearchProps } from './MInputSearch';
11
11
  export { MInputEmail } from './MInputEmail';
12
12
  export type { MInputEmailProps } from './MInputEmail';
13
+ export { MInputUrl } from './MInputUrl';
14
+ export type { MInputUrlProps } from './MInputUrl';
13
15
  export { MInputPhone } from './MInputPhone';
14
16
  export type { MInputPhoneProps } from './MInputPhone';
15
17
  export { MInputName } from './MInputName';
@@ -1,2 +1,2 @@
1
- const e=require(`./icons-BHFwX7ri.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPopover-BbgAAM5Z.cjs`),r=require(`./MButton-ouB6903s.cjs`),i=require(`./MCheckbox-Cbk5hwzJ.cjs`),a=require(`./MInputSearch-D2Fr_34s.cjs`),o=require(`./MPagination-CAzIIP2o.cjs`);require(`./core-B2klLGki.cjs`);let s=require(`react`),c=require(`react/jsx-runtime`);function l(e,t,n){return typeof n==`function`?n(e,t):String(typeof n==`string`?e[n]:e.id??t)}function u(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function d({columns:d,data:f,rowKey:p,sortable:m=!1,filterable:h=!1,selectable:g=!1,pagination:_=!1,pageSize:v=10,striped:y=!1,compact:b=!1,stickyHeader:x=!1,sort:S,onSortChange:C,search:w,onSearchChange:T,searchKeys:E,filterKeys:D=[],filters:O,onFiltersChange:k,sortKeys:A=[],page:j,onPageChange:M,total:N,manualSearch:P=!1,manualFilters:F=!1,manualSort:I=!1,manualPagination:L=!1,selectedKeys:ee,onSelectionChange:te,emptyText:ne=`No data`,filterPlaceholder:re=`Search...`,className:ie,...ae}){let[oe,se]=(0,s.useState)(null),[ce,le]=(0,s.useState)([]),[ue,de]=(0,s.useState)(``),[fe,pe]=(0,s.useState)({}),[me,R]=(0,s.useState)(1),[z,B]=(0,s.useState)(!1),[he,V]=(0,s.useState)(!1),ge=(0,s.useRef)(null),H=(0,s.useRef)(null),U=S===void 0?oe:S,W=w===void 0?ue:w,G=O===void 0?fe:O,K=j===void 0?me:j,q=ee??ce,J=te??le,_e=(0,s.useCallback)(e=>{w===void 0&&de(e),!L&&j===void 0&&R(1),T?.(e)},[w,j,L,T]),ve=(0,s.useCallback)(e=>{O===void 0&&pe(e),!L&&j===void 0&&R(1),k?.(e)},[O,j,L,k]),Y=(0,s.useCallback)(e=>{S===void 0&&se(e),!L&&j===void 0&&R(1),C?.(e)},[S,j,L,C]),ye=(0,s.useRef)(null),be=(0,s.useCallback)(e=>{j===void 0&&R(e),M?.(e),ye.current?.scrollIntoView({block:`start`,behavior:`smooth`})},[j,M]);function xe(e){let t;t=U?.key===e?U.dir===`asc`?{key:e,dir:`desc`}:null:{key:e,dir:`asc`},Y(t)}function Se(e,t){let n=G[e]??[],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];ve({...G,[e]:r})}let Ce=(0,s.useMemo)(()=>{let e={};for(let t of D){if(t.options){e[t.key]=t.options;continue}let n=new Set;for(let e of f){let r=u(e,t.key);r!=null&&n.add(String(r))}e[t.key]=Array.from(n).sort()}return e},[f,D]),X=(0,s.useMemo)(()=>{let e=f;if(!P&&h&&W.trim()){let t=W.toLowerCase();e=E&&E.length>0?e.filter(e=>E.some(n=>{let r=u(e,n);return r!=null&&String(r).toLowerCase().includes(t)})):e.filter(e=>d.some(n=>{if(n.filterable===!1)return!1;let r=e[n.key];return r!=null&&String(r).toLowerCase().includes(t)}))}if(!F)for(let[t,n]of Object.entries(G))!n||n.length===0||(e=e.filter(e=>{let r=u(e,t);return r!=null&&n.includes(String(r))}));return e},[f,P,F,h,W,E,d,G]),Z=(0,s.useMemo)(()=>{if(I||!U)return X;let e=d.find(e=>e.key===U.key),t=A.some(e=>e.key===U.key);if(!e?.sortable&&!m&&!t)return X;let n=U.dir===`asc`?1:-1;return[...X].sort((e,t)=>{let r=e[U.key],i=t[U.key];return r==null&&i==null?0:r==null?1:i==null?-1:typeof r==`number`&&typeof i==`number`?(r-i)*n:String(r).localeCompare(String(i))*n})},[X,U,d,m,A,I]),we=L?N??Z.length:Z.length,Te=_?Math.max(1,Math.ceil(we/v)):1,Q=(0,s.useMemo)(()=>{if(!_||L)return Z;let e=(K-1)*v;return Z.slice(e,e+v)},[Z,_,L,K,v]),$=Q.map((e,t)=>l(e,(K-1)*v+t,p)),Ee=$.length>0&&$.every(e=>q.includes(e));function De(){J(Ee?q.filter(e=>!$.includes(e)):[...new Set([...q,...$])])}function Oe(e){J(q.includes(e)?q.filter(t=>t!==e):[...q,e])}function ke(e,t){t.target.closest(`button, a, [data-no-row-select]`)||Oe(e)}let Ae=(0,s.useCallback)(()=>{B(e=>!e),V(!1)},[]),je=(0,s.useCallback)(()=>{V(e=>!e),B(!1)},[]),Me=A.find(e=>e.key===U?.key),Ne=h||D.length>0||A.length>0;return(0,c.jsxs)(`div`,{ref:ye,className:t.t(`data-table`,ie),...ae,children:[Ne&&(0,c.jsxs)(`div`,{className:`toolbar`,children:[h&&(0,c.jsx)(a.t,{className:`filter-search`,size:`sm`,fullWidth:!0,placeholder:re,value:W,onChange:e=>_e(e.target.value),onClear:()=>_e(``)}),(D.length>0||A.length>0)&&(0,c.jsxs)(`div`,{className:`toolbar-actions`,children:[D.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(r.t,{ref:ge,variant:`outlined`,size:`sm`,startIcon:(0,c.jsx)(e.Jn,{}),"aria-expanded":z,onClick:Ae,children:`Filter`}),(0,c.jsx)(n.t,{open:z,anchorRef:ge,onClose:()=>B(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:D.map(e=>(0,c.jsxs)(`div`,{className:`data-table-filter-group`,children:[(0,c.jsx)(`span`,{className:`data-table-filter-label`,children:e.label}),(Ce[e.key]??[]).map(t=>(0,c.jsx)(`div`,{className:`data-table-filter-option`,children:(0,c.jsx)(i.t,{size:`sm`,clickEffect:`none`,checked:G[e.key]?.includes(t)??!1,onChange:()=>Se(e.key,t),label:t})},t))]},e.key))})]}),A.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(r.t,{ref:H,variant:`outlined`,size:`sm`,startIcon:U?U.dir===`asc`?(0,c.jsx)(e.Ri,{}):(0,c.jsx)(e.Li,{}):(0,c.jsx)(e.qn,{}),"aria-expanded":he,onClick:je,children:Me?`Sort: ${Me.label}`:`Sort`}),(0,c.jsx)(n.t,{open:he,anchorRef:H,onClose:()=>V(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:A.map(n=>(0,c.jsxs)(`button`,{type:`button`,className:t.t(`data-table-sort-item`,U?.key===n.key&&`active`),onClick:()=>{U?.key===n.key?Y({key:n.key,dir:U.dir===`asc`?`desc`:`asc`}):Y({key:n.key,dir:`asc`})},children:[n.label,U?.key===n.key&&(0,c.jsx)(`span`,{className:`data-table-sort-dir`,children:U.dir===`asc`?(0,c.jsx)(e.Ri,{className:`data-table-sort-icon`}):(0,c.jsx)(e.Li,{className:`data-table-sort-icon`})})]},n.key))})]})]})]}),(0,c.jsx)(`div`,{className:`scroll`,children:(0,c.jsxs)(`table`,{className:t.t(`root`,y&&`striped`,b&&`compact`),children:[(0,c.jsx)(`thead`,{className:t.t(`head`,x&&`sticky`),children:(0,c.jsxs)(`tr`,{children:[g&&(0,c.jsx)(`th`,{className:`th check-col`,children:(0,c.jsx)(i.t,{checked:Ee,onChange:De,size:`sm`,clickEffect:`none`})}),d.map(n=>{let r=n.sortable??m,i=U?.key===n.key;return(0,c.jsx)(`th`,{className:t.t(`th`,r&&`sortable`,i&&`sorted-${U.dir}`),style:{width:n.width,textAlign:n.align},onClick:r?()=>xe(n.key):void 0,children:(0,c.jsxs)(`span`,{className:`th-content`,children:[n.label,r&&(0,c.jsx)(`span`,{className:`sort-icon`,children:i?U.dir===`asc`?(0,c.jsx)(e.Ri,{"aria-hidden":`true`}):(0,c.jsx)(e.Li,{"aria-hidden":`true`}):(0,c.jsx)(e.Ii,{"aria-hidden":`true`})})]})},n.key)})]})}),(0,c.jsxs)(`tbody`,{children:[Q.length===0&&(0,c.jsx)(`tr`,{children:(0,c.jsx)(`td`,{className:`empty`,colSpan:d.length+ +!!g,children:ne})}),Q.map((e,n)=>{let r=l(e,(K-1)*v+n,p),a=q.includes(r);return(0,c.jsxs)(`tr`,{className:t.t(`row`,a&&`selected`,g&&`selectable`),onClick:g?e=>ke(r,e):void 0,children:[g&&(0,c.jsx)(`td`,{className:`td check-col`,children:(0,c.jsx)(i.t,{checked:a,onChange:()=>{},size:`sm`,clickEffect:`none`})}),d.map(t=>(0,c.jsx)(`td`,{className:`td`,style:{textAlign:t.align},children:t.render?t.render(e[t.key],e,(K-1)*v+n):e[t.key]},t.key))]},r)})]})]})}),_&&Te>1&&(0,c.jsx)(o.t,{total:we,page:K,pageSize:v,onChange:be})]})}function f({items:e,color:n=`primary`,strikethrough:r=!0,onChange:a,className:o,...s}){return(0,c.jsx)(`div`,{className:t.t(`task list`,`color-${n}`,o),role:`list`,...s,children:e.map(e=>(0,c.jsxs)(`div`,{className:t.t(`task item`,e.checked&&`checked`,e.disabled&&`disabled`),role:`listitem`,onClick:t=>{e.disabled||t.target.closest(`.checkbox`)||a?.(e.id,!(e.checked??!1))},children:[(0,c.jsx)(i.t,{className:`task control`,checked:e.checked??!1,color:n,size:`sm`,disabled:e.disabled,onChange:t=>a?.(e.id,t.target.checked),clickEffect:`ripple`}),(0,c.jsx)(`span`,{className:t.t(`task label`,e.checked&&r&&`done`),children:e.label})]},e.id))})}function p(e,t={}){let{perPage:n=20,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:c}=t,[l,u]=(0,s.useState)([]),[d,f]=(0,s.useState)(0),[p,m]=(0,s.useState)(r),[h,g]=(0,s.useState)(i),[_,v]=(0,s.useState)(a??{}),[y,b]=(0,s.useState)(o),[x,S]=(0,s.useState)(!1),[C,w]=(0,s.useState)(null),[T,E]=(0,s.useState)(0),D=(0,s.useRef)(e);D.current=e;let O=(0,s.useMemo)(()=>({page:p,perPage:n,search:h,filters:_,sort:y}),[p,n,h,_,y]);(0,s.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return S(!0),w(null),D.current(O,e?.signal).then(e=>{t||(u(e.data),f(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||w(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||S(!1)}),()=>{t=!0,e?.abort()}},[O,c,T]);let k=(0,s.useCallback)(e=>{g(e),m(1)},[]),A=(0,s.useCallback)(e=>{v(e),m(1)},[]),j=(0,s.useCallback)(e=>{b(e),m(1)},[]),M=(0,s.useCallback)(()=>E(e=>e+1),[]);return{tableProps:{data:l,total:d,page:p,onPageChange:m,sort:y,onSortChange:j,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n},isLoading:x,error:C,refetch:M}}function m(e){return e?{key:e.key,dir:e.direction}:null}function h(e,t={}){let{perPage:n=12,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:c}=t,[l,u]=(0,s.useState)([]),[d,f]=(0,s.useState)(0),[p,h]=(0,s.useState)(r),[g,_]=(0,s.useState)(i),[v,y]=(0,s.useState)(a??{}),[b,x]=(0,s.useState)(o??null),[S,C]=(0,s.useState)(!1),[w,T]=(0,s.useState)(null),[E,D]=(0,s.useState)(0),O=(0,s.useRef)(e);O.current=e;let k=(0,s.useMemo)(()=>({page:p,perPage:n,search:g,filters:v,sort:m(b)}),[p,n,g,v,b]);(0,s.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return C(!0),T(null),O.current(k,e?.signal).then(e=>{t||(u(e.data),f(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||T(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||C(!1)}),()=>{t=!0,e?.abort()}},[k,c,E]);let A=(0,s.useCallback)(e=>{_(e),h(1)},[]),j=(0,s.useCallback)(e=>{y(e),h(1)},[]),M=(0,s.useCallback)(e=>{x(e),h(1)},[]),N=(0,s.useCallback)(()=>D(e=>e+1),[]);return{gridProps:{items:l,total:d,page:p,onPageChange:h,sort:b,onSortChange:M,search:g,onSearchChange:A,filters:v,onFiltersChange:j,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n},isLoading:S,error:w,refetch:N}}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return h}});
2
- //# sourceMappingURL=data-CDZvakQ8.cjs.map
1
+ const e=require(`./icons-BHFwX7ri.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPopover-BbgAAM5Z.cjs`),r=require(`./MButton-ouB6903s.cjs`),i=require(`./MCheckbox-Cbk5hwzJ.cjs`),a=require(`./MInputSearch-D2Fr_34s.cjs`),o=require(`./MPagination-CAzIIP2o.cjs`);require(`./core-B2klLGki.cjs`);let s=require(`react`),c=require(`react/jsx-runtime`);function l(e,t,n){return typeof n==`function`?n(e,t):String(typeof n==`string`?e[n]:e.id??t)}function u(e,t){let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function d({columns:d,data:f,rowKey:p,sortable:m=!1,filterable:h=!1,selectable:g=!1,pagination:_=!1,pageSize:v=10,striped:y=!1,compact:b=!1,stickyHeader:x=!1,sort:S,onSortChange:C,search:w,onSearchChange:T,searchKeys:E,filterKeys:D=[],filters:O,onFiltersChange:k,sortKeys:A=[],page:j,onPageChange:M,total:N,manualSearch:P=!1,manualFilters:F=!1,manualSort:I=!1,manualPagination:L=!1,selectedKeys:ee,onSelectionChange:te,emptyText:ne=`No data`,filterPlaceholder:re=`Search...`,className:ie,...ae}){let[oe,se]=(0,s.useState)(null),[ce,le]=(0,s.useState)([]),[ue,de]=(0,s.useState)(``),[fe,pe]=(0,s.useState)({}),[me,R]=(0,s.useState)(1),[z,B]=(0,s.useState)(!1),[he,V]=(0,s.useState)(!1),ge=(0,s.useRef)(null),H=(0,s.useRef)(null),U=S===void 0?oe:S,W=w===void 0?ue:w,G=O===void 0?fe:O,K=j===void 0?me:j,q=ee??ce,J=te??le,_e=(0,s.useCallback)(e=>{w===void 0&&de(e),!L&&j===void 0&&R(1),T?.(e)},[w,j,L,T]),ve=(0,s.useCallback)(e=>{O===void 0&&pe(e),!L&&j===void 0&&R(1),k?.(e)},[O,j,L,k]),Y=(0,s.useCallback)(e=>{S===void 0&&se(e),!L&&j===void 0&&R(1),C?.(e)},[S,j,L,C]),ye=(0,s.useRef)(null),be=(0,s.useCallback)(e=>{j===void 0&&R(e),M?.(e),ye.current?.scrollIntoView({block:`start`,behavior:`smooth`})},[j,M]);function xe(e){let t;t=U?.key===e?U.dir===`asc`?{key:e,dir:`desc`}:null:{key:e,dir:`asc`},Y(t)}function Se(e,t){let n=G[e]??[],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];ve({...G,[e]:r})}let Ce=(0,s.useMemo)(()=>{let e={};for(let t of D){if(t.options){e[t.key]=t.options;continue}let n=new Set;for(let e of f){let r=u(e,t.key);r!=null&&n.add(String(r))}e[t.key]=Array.from(n).sort()}return e},[f,D]),X=(0,s.useMemo)(()=>{let e=f;if(!P&&h&&W.trim()){let t=W.toLowerCase();e=E&&E.length>0?e.filter(e=>E.some(n=>{let r=u(e,n);return r!=null&&String(r).toLowerCase().includes(t)})):e.filter(e=>d.some(n=>{if(n.filterable===!1)return!1;let r=e[n.key];return r!=null&&String(r).toLowerCase().includes(t)}))}if(!F)for(let[t,n]of Object.entries(G))!n||n.length===0||(e=e.filter(e=>{let r=u(e,t);return r!=null&&n.includes(String(r))}));return e},[f,P,F,h,W,E,d,G]),Z=(0,s.useMemo)(()=>{if(I||!U)return X;let e=d.find(e=>e.key===U.key),t=A.some(e=>e.key===U.key);if(!e?.sortable&&!m&&!t)return X;let n=U.dir===`asc`?1:-1;return[...X].sort((e,t)=>{let r=e[U.key],i=t[U.key];return r==null&&i==null?0:r==null?1:i==null?-1:typeof r==`number`&&typeof i==`number`?(r-i)*n:String(r).localeCompare(String(i))*n})},[X,U,d,m,A,I]),we=L?N??Z.length:Z.length,Te=_?Math.max(1,Math.ceil(we/v)):1,Q=(0,s.useMemo)(()=>{if(!_||L)return Z;let e=(K-1)*v;return Z.slice(e,e+v)},[Z,_,L,K,v]),$=Q.map((e,t)=>l(e,(K-1)*v+t,p)),Ee=$.length>0&&$.every(e=>q.includes(e));function De(){J(Ee?q.filter(e=>!$.includes(e)):[...new Set([...q,...$])])}function Oe(e){J(q.includes(e)?q.filter(t=>t!==e):[...q,e])}function ke(e,t){t.target.closest(`button, a, [data-no-row-select]`)||Oe(e)}let Ae=(0,s.useCallback)(()=>{B(e=>!e),V(!1)},[]),je=(0,s.useCallback)(()=>{V(e=>!e),B(!1)},[]),Me=A.find(e=>e.key===U?.key),Ne=h||D.length>0||A.length>0;return(0,c.jsxs)(`div`,{ref:ye,className:t.t(`data-table`,ie),...ae,children:[Ne&&(0,c.jsxs)(`div`,{className:`toolbar`,children:[h&&(0,c.jsx)(a.t,{className:`filter-search`,size:`sm`,fullWidth:!0,placeholder:re,value:W,onChange:e=>_e(e.target.value),onClear:()=>_e(``)}),(D.length>0||A.length>0)&&(0,c.jsxs)(`div`,{className:`toolbar-actions`,children:[D.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(r.t,{ref:ge,variant:`outlined`,size:`sm`,startIcon:(0,c.jsx)(e.Jn,{}),"aria-expanded":z,onClick:Ae,children:`Filter`}),(0,c.jsx)(n.t,{open:z,anchorRef:ge,onClose:()=>B(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:D.map(e=>(0,c.jsxs)(`div`,{className:`data-table-filter-group`,children:[(0,c.jsx)(`span`,{className:`data-table-filter-label`,children:e.label}),(Ce[e.key]??[]).map(t=>(0,c.jsx)(`div`,{className:`data-table-filter-option`,children:(0,c.jsx)(i.t,{size:`sm`,clickEffect:`none`,checked:G[e.key]?.includes(t)??!1,onChange:()=>Se(e.key,t),label:t})},t))]},e.key))})]}),A.length>0&&(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(r.t,{ref:H,variant:`outlined`,size:`sm`,startIcon:U?U.dir===`asc`?(0,c.jsx)(e.Ri,{}):(0,c.jsx)(e.Li,{}):(0,c.jsx)(e.qn,{}),"aria-expanded":he,onClick:je,children:Me?`Sort: ${Me.label}`:`Sort`}),(0,c.jsx)(n.t,{open:he,anchorRef:H,onClose:()=>V(!1),placement:`bottom-end`,className:`data-table-dropdown`,children:A.map(n=>(0,c.jsxs)(`button`,{type:`button`,className:t.t(`data-table-sort-item`,U?.key===n.key&&`active`),onClick:()=>{U?.key===n.key?Y({key:n.key,dir:U.dir===`asc`?`desc`:`asc`}):Y({key:n.key,dir:`asc`})},children:[n.label,U?.key===n.key&&(0,c.jsx)(`span`,{className:`data-table-sort-dir`,children:U.dir===`asc`?(0,c.jsx)(e.Ri,{className:`data-table-sort-icon`}):(0,c.jsx)(e.Li,{className:`data-table-sort-icon`})})]},n.key))})]})]})]}),(0,c.jsx)(`div`,{className:`scroll`,children:(0,c.jsxs)(`table`,{className:t.t(`root`,y&&`striped`,b&&`compact`),children:[(0,c.jsx)(`thead`,{className:t.t(`head`,x&&`sticky`),children:(0,c.jsxs)(`tr`,{children:[g&&(0,c.jsx)(`th`,{className:`th check-col`,children:(0,c.jsx)(i.t,{checked:Ee,onChange:De,size:`sm`,clickEffect:`none`})}),d.map(n=>{let r=n.sortable??m,i=U?.key===n.key;return(0,c.jsx)(`th`,{className:t.t(`th`,r&&`sortable`,i&&`sorted-${U.dir}`),style:{width:n.width,textAlign:n.align},onClick:r?()=>xe(n.key):void 0,children:(0,c.jsxs)(`span`,{className:`th-content`,children:[n.label,r&&(0,c.jsx)(`span`,{className:`sort-icon`,children:i?U.dir===`asc`?(0,c.jsx)(e.Ri,{"aria-hidden":`true`}):(0,c.jsx)(e.Li,{"aria-hidden":`true`}):(0,c.jsx)(e.Ii,{"aria-hidden":`true`})})]})},n.key)})]})}),(0,c.jsxs)(`tbody`,{children:[Q.length===0&&(0,c.jsx)(`tr`,{children:(0,c.jsx)(`td`,{className:`empty`,colSpan:d.length+ +!!g,children:ne})}),Q.map((e,n)=>{let r=l(e,(K-1)*v+n,p),a=q.includes(r);return(0,c.jsxs)(`tr`,{className:t.t(`row`,a&&`selected`,g&&`selectable`),onClick:g?e=>ke(r,e):void 0,children:[g&&(0,c.jsx)(`td`,{className:`td check-col`,children:(0,c.jsx)(i.t,{checked:a,onChange:()=>{},size:`sm`,clickEffect:`none`})}),d.map(t=>(0,c.jsx)(`td`,{className:`td`,style:{textAlign:t.align},children:t.render?t.render(e[t.key],e,(K-1)*v+n):e[t.key]},t.key))]},r)})]})]})}),_&&Te>1&&(0,c.jsx)(o.t,{total:we,page:K,pageSize:v,onChange:be})]})}function f({items:e,color:n=`primary`,size:r=`md`,strikethrough:a=!0,onChange:o,className:s,...l}){return(0,c.jsx)(`div`,{className:t.t(`task list`,`color-${n}`,`size-${r}`,s),role:`list`,...l,children:e.map(e=>(0,c.jsxs)(`div`,{className:t.t(`task item`,e.checked&&`checked`,e.disabled&&`disabled`),role:`listitem`,onClick:t=>{e.disabled||t.target.closest(`.checkbox`)||o?.(e.id,!(e.checked??!1))},children:[(0,c.jsx)(i.t,{className:`task control`,checked:e.checked??!1,color:n,size:r,disabled:e.disabled,onChange:t=>o?.(e.id,t.target.checked),clickEffect:`ripple`}),(0,c.jsx)(`span`,{className:t.t(`task label`,e.checked&&a&&`done`),children:e.label})]},e.id))})}function p(e,t={}){let{perPage:n=20,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:c}=t,[l,u]=(0,s.useState)([]),[d,f]=(0,s.useState)(0),[p,m]=(0,s.useState)(r),[h,g]=(0,s.useState)(i),[_,v]=(0,s.useState)(a??{}),[y,b]=(0,s.useState)(o),[x,S]=(0,s.useState)(!1),[C,w]=(0,s.useState)(null),[T,E]=(0,s.useState)(0),D=(0,s.useRef)(e);D.current=e;let O=(0,s.useMemo)(()=>({page:p,perPage:n,search:h,filters:_,sort:y}),[p,n,h,_,y]);(0,s.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return S(!0),w(null),D.current(O,e?.signal).then(e=>{t||(u(e.data),f(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||w(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||S(!1)}),()=>{t=!0,e?.abort()}},[O,c,T]);let k=(0,s.useCallback)(e=>{g(e),m(1)},[]),A=(0,s.useCallback)(e=>{v(e),m(1)},[]),j=(0,s.useCallback)(e=>{b(e),m(1)},[]),M=(0,s.useCallback)(()=>E(e=>e+1),[]);return{tableProps:{data:l,total:d,page:p,onPageChange:m,sort:y,onSortChange:j,search:h,onSearchChange:k,filters:_,onFiltersChange:A,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n},isLoading:x,error:C,refetch:M}}function m(e){return e?{key:e.key,dir:e.direction}:null}function h(e,t={}){let{perPage:n=12,initialPage:r=1,initialSearch:i=``,initialFilters:a,initialSort:o=null,invalidationKey:c}=t,[l,u]=(0,s.useState)([]),[d,f]=(0,s.useState)(0),[p,h]=(0,s.useState)(r),[g,_]=(0,s.useState)(i),[v,y]=(0,s.useState)(a??{}),[b,x]=(0,s.useState)(o??null),[S,C]=(0,s.useState)(!1),[w,T]=(0,s.useState)(null),[E,D]=(0,s.useState)(0),O=(0,s.useRef)(e);O.current=e;let k=(0,s.useMemo)(()=>({page:p,perPage:n,search:g,filters:v,sort:m(b)}),[p,n,g,v,b]);(0,s.useEffect)(()=>{let e=typeof AbortController<`u`?new AbortController:void 0,t=!1;return C(!0),T(null),O.current(k,e?.signal).then(e=>{t||(u(e.data),f(e.meta.total))}).catch(e=>{t||e instanceof Error&&e.name===`AbortError`||T(e instanceof Error?e:Error(String(e)))}).finally(()=>{t||C(!1)}),()=>{t=!0,e?.abort()}},[k,c,E]);let A=(0,s.useCallback)(e=>{_(e),h(1)},[]),j=(0,s.useCallback)(e=>{y(e),h(1)},[]),M=(0,s.useCallback)(e=>{x(e),h(1)},[]),N=(0,s.useCallback)(()=>D(e=>e+1),[]);return{gridProps:{items:l,total:d,page:p,onPageChange:h,sort:b,onSortChange:M,search:g,onSearchChange:A,filters:v,onFiltersChange:j,manualSearch:!0,manualFilters:!0,manualSort:!0,manualPagination:!0,pageSize:n},isLoading:S,error:w,refetch:N}}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return h}});
2
+ //# sourceMappingURL=data-0_KXny56.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-0_KXny56.cjs","names":[],"sources":["../src/components/data/MDataTable/MDataTable.tsx","../src/components/data/MTaskList/MTaskList.tsx","../src/components/data/useMTable.ts","../src/components/data/useMCardGrid.ts"],"sourcesContent":["import {useCallback, useMemo, useRef, useState} from 'react'\nimport type * as React from 'react'\nimport type {MDataTableProps, MDataTableSort} from './MDataTable.types'\nimport {MButton, MCheckbox} from '../../controls'\nimport {MInputSearch} from '../../inputs'\nimport {MPagination} from '../../layout'\nimport {MPopover} from '../../primitives'\nimport {MArrowDownIcon, MArrowUpDownIcon, MArrowUpIcon, MFilterIcon, MSortIcon} from '../../../icons'\nimport {cn} from '../../../utils/cn'\nimport './MDataTable.css'\n\nfunction getRowKey<T>(row: T, index: number, rowKey?: string | ((row: T, index: number) => string)): string {\n if (typeof rowKey === 'function') return rowKey(row, index)\n if (typeof rowKey === 'string') return String((row as any)[rowKey])\n return String((row as any).id ?? index)\n}\n\nfunction getNestedValue(obj: unknown, key: string): unknown {\n const parts = key.split('.')\n let val: unknown = obj\n\n for (const p of parts) {\n if (val == null || typeof val !== 'object') return undefined\n val = (val as Record<string, unknown>)[p]\n }\n\n return val\n}\n\nexport function MDataTable<T = any>({\n columns,\n data,\n rowKey,\n sortable = false,\n filterable = false,\n selectable = false,\n pagination = false,\n pageSize = 10,\n striped = false,\n compact = false,\n stickyHeader = false,\n sort: controlledSort,\n onSortChange,\n search: controlledSearch,\n onSearchChange,\n searchKeys,\n filterKeys = [],\n filters: controlledFilters,\n onFiltersChange,\n sortKeys = [],\n page: controlledPage,\n onPageChange,\n total,\n manualSearch = false,\n manualFilters = false,\n manualSort = false,\n manualPagination = false,\n selectedKeys: controlledSelected,\n onSelectionChange,\n emptyText = 'No data',\n filterPlaceholder = 'Search...',\n className,\n ...rest\n}: MDataTableProps<T>) {\n const [internalSort, setInternalSort] = useState<MDataTableSort | null>(null)\n const [internalSelected, setInternalSelected] = useState<string[]>([])\n const [internalSearch, setInternalSearch] = useState('')\n const [internalFilters, setInternalFilters] = useState<Record<string, string[]>>({})\n const [internalPage, setInternalPage] = useState(1)\n const [filterOpen, setFilterOpen] = useState(false)\n const [sortOpen, setSortOpen] = useState(false)\n const filterBtnRef = useRef<HTMLElement>(null)\n const sortBtnRef = useRef<HTMLElement>(null)\n\n const activeSort = controlledSort !== undefined ? controlledSort : internalSort\n const search = controlledSearch !== undefined ? controlledSearch : internalSearch\n const filters = controlledFilters !== undefined ? controlledFilters : internalFilters\n const page = controlledPage !== undefined ? controlledPage : internalPage\n const selected = controlledSelected ?? internalSelected\n const setSelected = onSelectionChange ?? setInternalSelected\n\n const setSearch = useCallback(\n (next: string) => {\n if (controlledSearch === undefined) setInternalSearch(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSearchChange?.(next)\n },\n [controlledSearch, controlledPage, manualPagination, onSearchChange]\n )\n\n const setFilters = useCallback(\n (next: Record<string, string[]>) => {\n if (controlledFilters === undefined) setInternalFilters(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onFiltersChange?.(next)\n },\n [controlledFilters, controlledPage, manualPagination, onFiltersChange]\n )\n\n const setSort = useCallback(\n (next: MDataTableSort | null) => {\n if (controlledSort === undefined) setInternalSort(next)\n if (!manualPagination && controlledPage === undefined) setInternalPage(1)\n onSortChange?.(next)\n },\n [controlledSort, controlledPage, manualPagination, onSortChange]\n )\n\n const rootRef = useRef<HTMLDivElement>(null)\n\n const setPage = useCallback(\n (next: number) => {\n if (controlledPage === undefined) setInternalPage(next)\n onPageChange?.(next)\n // After page change, bring the top of the table back into view so\n // the user does not stay scrolled deep into the previous page's rows.\n rootRef.current?.scrollIntoView({block: 'start', behavior: 'smooth'})\n },\n [controlledPage, onPageChange]\n )\n\n function handleSort(key: string) {\n let next: MDataTableSort | null\n\n if (activeSort?.key === key) {\n next = activeSort.dir === 'asc' ? {key, dir: 'desc'} : null\n } else {\n next = {key, dir: 'asc'}\n }\n\n setSort(next)\n }\n\n function toggleFilterValue(key: string, value: string) {\n const current = filters[key] ?? []\n const next = current.includes(value) ? current.filter((item) => item !== value) : [...current, value]\n setFilters({...filters, [key]: next})\n }\n\n const filterOptions = useMemo(() => {\n const map: Record<string, string[]> = {}\n\n for (const filterKey of filterKeys) {\n if (filterKey.options) {\n map[filterKey.key] = filterKey.options\n continue\n }\n\n const values = new Set<string>()\n\n for (const row of data) {\n const value = getNestedValue(row, filterKey.key)\n if (value != null) values.add(String(value))\n }\n\n map[filterKey.key] = Array.from(values).sort()\n }\n\n return map\n }, [data, filterKeys])\n\n const filtered = useMemo(() => {\n let result: T[] = data\n\n if (!manualSearch && filterable && search.trim()) {\n const query = search.toLowerCase()\n\n if (searchKeys && searchKeys.length > 0) {\n result = result.filter((row) =>\n searchKeys.some((key) => {\n const value = getNestedValue(row, key)\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n } else {\n result = result.filter((row) =>\n columns.some((col) => {\n if (col.filterable === false) return false\n const value = (row as any)[col.key]\n return value != null && String(value).toLowerCase().includes(query)\n })\n )\n }\n }\n\n if (!manualFilters) {\n for (const [key, selectedValues] of Object.entries(filters)) {\n if (!selectedValues || selectedValues.length === 0) continue\n\n result = result.filter((row) => {\n const value = getNestedValue(row, key)\n return value != null && selectedValues.includes(String(value))\n })\n }\n }\n\n return result\n }, [data, manualSearch, manualFilters, filterable, search, searchKeys, columns, filters])\n\n const sorted = useMemo(() => {\n if (manualSort || !activeSort) return filtered\n\n const col = columns.find((item) => item.key === activeSort.key)\n const sortKeyAllowed = sortKeys.some((item) => item.key === activeSort.key)\n if (!col?.sortable && !sortable && !sortKeyAllowed) return filtered\n\n const dir = activeSort.dir === 'asc' ? 1 : -1\n\n return [...filtered].sort((a, b) => {\n const va = (a as any)[activeSort.key]\n const vb = (b as any)[activeSort.key]\n\n if (va == null && vb == null) return 0\n if (va == null) return 1\n if (vb == null) return -1\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [filtered, activeSort, columns, sortable, sortKeys, manualSort])\n\n const totalItems = manualPagination ? (total ?? sorted.length) : sorted.length\n const totalPages = pagination ? Math.max(1, Math.ceil(totalItems / pageSize)) : 1\n const pageData = useMemo(() => {\n if (!pagination || manualPagination) return sorted\n const start = (page - 1) * pageSize\n return sorted.slice(start, start + pageSize)\n }, [sorted, pagination, manualPagination, page, pageSize])\n\n const allKeys = pageData.map((row, index) => getRowKey(row, (page - 1) * pageSize + index, rowKey))\n const allSelected = allKeys.length > 0 && allKeys.every((key) => selected.includes(key))\n\n function toggleAll() {\n if (allSelected) {\n setSelected(selected.filter((key) => !allKeys.includes(key)))\n } else {\n setSelected([...new Set([...selected, ...allKeys])])\n }\n }\n\n function toggleRow(key: string) {\n setSelected(selected.includes(key) ? selected.filter((item) => item !== key) : [...selected, key])\n }\n\n function handleRowClick(key: string, event: React.MouseEvent) {\n const target = event.target as HTMLElement\n if (target.closest('button, a, [data-no-row-select]')) return\n toggleRow(key)\n }\n\n const openFilter = useCallback(() => {\n setFilterOpen((v) => !v)\n setSortOpen(false)\n }, [])\n\n const openSort = useCallback(() => {\n setSortOpen((v) => !v)\n setFilterOpen(false)\n }, [])\n\n const activeSortMenuItem = sortKeys.find((item) => item.key === activeSort?.key)\n const showToolbar = filterable || filterKeys.length > 0 || sortKeys.length > 0\n\n return (\n <div ref={rootRef} className={cn('data-table', className)} {...rest}>\n {showToolbar && (\n <div className=\"toolbar\">\n {filterable && (\n <MInputSearch\n className=\"filter-search\"\n size=\"sm\"\n fullWidth\n placeholder={filterPlaceholder}\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onClear={() => setSearch('')}\n />\n )}\n\n {(filterKeys.length > 0 || sortKeys.length > 0) && (\n <div className=\"toolbar-actions\">\n {filterKeys.length > 0 && (\n <>\n <MButton\n ref={filterBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={<MFilterIcon />}\n aria-expanded={filterOpen}\n onClick={openFilter}\n >\n Filter\n </MButton>\n <MPopover\n open={filterOpen}\n anchorRef={filterBtnRef}\n onClose={() => setFilterOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {filterKeys.map((filterKey) => (\n <div key={filterKey.key} className=\"data-table-filter-group\">\n <span className=\"data-table-filter-label\">{filterKey.label}</span>\n {(filterOptions[filterKey.key] ?? []).map((option) => (\n <div key={option} className=\"data-table-filter-option\">\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n checked={filters[filterKey.key]?.includes(option) ?? false}\n onChange={() => toggleFilterValue(filterKey.key, option)}\n label={option}\n />\n </div>\n ))}\n </div>\n ))}\n </MPopover>\n </>\n )}\n\n {sortKeys.length > 0 && (\n <>\n <MButton\n ref={sortBtnRef}\n variant=\"outlined\"\n size=\"sm\"\n startIcon={\n activeSort ? (\n activeSort.dir === 'asc' ? (\n <MArrowUpIcon />\n ) : (\n <MArrowDownIcon />\n )\n ) : (\n <MSortIcon />\n )\n }\n aria-expanded={sortOpen}\n onClick={openSort}\n >\n {activeSortMenuItem ? `Sort: ${activeSortMenuItem.label}` : 'Sort'}\n </MButton>\n <MPopover\n open={sortOpen}\n anchorRef={sortBtnRef}\n onClose={() => setSortOpen(false)}\n placement=\"bottom-end\"\n className=\"data-table-dropdown\"\n >\n {sortKeys.map((sortItem) => (\n <button\n key={sortItem.key}\n type=\"button\"\n className={cn(\n 'data-table-sort-item',\n activeSort?.key === sortItem.key && 'active'\n )}\n onClick={() => {\n if (activeSort?.key === sortItem.key) {\n setSort({\n key: sortItem.key,\n dir: activeSort.dir === 'asc' ? 'desc' : 'asc',\n })\n } else {\n setSort({key: sortItem.key, dir: 'asc'})\n }\n }}\n >\n {sortItem.label}\n {activeSort?.key === sortItem.key && (\n <span className=\"data-table-sort-dir\">\n {activeSort.dir === 'asc' ? (\n <MArrowUpIcon className=\"data-table-sort-icon\" />\n ) : (\n <MArrowDownIcon className=\"data-table-sort-icon\" />\n )}\n </span>\n )}\n </button>\n ))}\n </MPopover>\n </>\n )}\n </div>\n )}\n </div>\n )}\n <div className=\"scroll\">\n <table className={cn('root', striped && 'striped', compact && 'compact')}>\n <thead className={cn('head', stickyHeader && 'sticky')}>\n <tr>\n {selectable && (\n <th className=\"th check-col\">\n <MCheckbox\n checked={allSelected}\n onChange={toggleAll}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable ?? sortable\n const isSorted = activeSort?.key === col.key\n\n return (\n <th\n key={col.key}\n className={cn(\n 'th',\n isSortable && 'sortable',\n isSorted && `sorted-${activeSort!.dir}`\n )}\n style={{\n width: col.width,\n textAlign: col.align,\n }}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"th-content\">\n {col.label}\n {isSortable && (\n <span className=\"sort-icon\">\n {isSorted ? (\n activeSort!.dir === 'asc' ? (\n <MArrowUpIcon aria-hidden=\"true\" />\n ) : (\n <MArrowDownIcon aria-hidden=\"true\" />\n )\n ) : (\n <MArrowUpDownIcon aria-hidden=\"true\" />\n )}\n </span>\n )}\n </span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {pageData.length === 0 && (\n <tr>\n <td className=\"empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyText}\n </td>\n </tr>\n )}\n {pageData.map((row, index) => {\n const key = getRowKey(row, (page - 1) * pageSize + index, rowKey)\n const isSelected = selected.includes(key)\n\n return (\n <tr\n key={key}\n className={cn('row', isSelected && 'selected', selectable && 'selectable')}\n onClick={selectable ? (event) => handleRowClick(key, event) : undefined}\n >\n {selectable && (\n <td className=\"td check-col\">\n <MCheckbox\n checked={isSelected}\n onChange={() => {}}\n size=\"sm\"\n clickEffect=\"none\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className=\"td\" style={{textAlign: col.align}}>\n {col.render\n ? col.render((row as any)[col.key], row, (page - 1) * pageSize + index)\n : (row as any)[col.key]}\n </td>\n ))}\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n {pagination && totalPages > 1 && (\n <MPagination total={totalItems} page={page} pageSize={pageSize} onChange={setPage} />\n )}\n </div>\n )\n}\n","import type {MTaskListProps} from './MTaskList.types'\nimport {MCheckbox} from '../../controls'\nimport {cn} from '../../../utils/cn'\nimport './MTaskList.css'\n\n// Render an interactive checklist with toggleable task items.\nexport function MTaskList({\n items,\n color = 'primary',\n size = 'md',\n strikethrough = true,\n onChange,\n className,\n ...rest\n}: MTaskListProps) {\n return (\n <div className={cn('task list', `color-${color}`, `size-${size}`, className)} role=\"list\" {...rest}>\n {items.map((item) => (\n <div\n key={item.id}\n className={cn('task item', item.checked && 'checked', item.disabled && 'disabled')}\n role=\"listitem\"\n onClick={(event) => {\n if (item.disabled) return\n if ((event.target as HTMLElement).closest('.checkbox')) return\n onChange?.(item.id, !(item.checked ?? false))\n }}\n >\n <MCheckbox\n className=\"task control\"\n checked={item.checked ?? false}\n color={color}\n size={size}\n disabled={item.disabled}\n onChange={(e) => onChange?.(item.id, e.target.checked)}\n clickEffect=\"ripple\"\n />\n <span className={cn('task label', item.checked && strikethrough && 'done')}>{item.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MDataTableSort} from './MDataTable'\n\n/**\n * Generic query shape that backend lists can satisfy. Drop-in adapter between\n * `useMTable` and the API call. The framework does not assume axios/fetch/swr —\n * the consumer plugs whatever fetcher they want.\n */\nexport interface MTableQuery {\n page?: number\n perPage?: number\n search?: string\n filters?: Record<string, string[]>\n sort?: MDataTableSort | null\n}\n\n/**\n * Standard list response. Mirrors the most common server convention\n * (data + meta with pagination total). Adapt your fetcher to this shape if your\n * backend uses different envelope keys.\n */\nexport interface MTableResponse<T> {\n data: T[]\n meta: {\n total: number\n page: number\n perPage: number\n totalPages: number\n }\n}\n\nexport type MTableFetcher<T> = (query: MTableQuery, signal?: AbortSignal) => Promise<MTableResponse<T>>\n\nexport interface MTableOptions {\n perPage?: number\n initialPage?: number\n initialSearch?: string\n initialFilters?: Record<string, string[]>\n initialSort?: MDataTableSort | null\n /** Bump to force a refetch (e.g. after a mutation invalidates the list). */\n invalidationKey?: number | string\n}\n\nexport interface MTableProps<T> {\n data: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MDataTableSort | null\n onSortChange: (sort: MDataTableSort | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n}\n\nexport interface MTableHandle<T> {\n /** Spread directly onto `<MDataTable>` — wires up all manual* + state props. */\n tableProps: MTableProps<T>\n isLoading: boolean\n error: Error | null\n /** Trigger a fresh fetch with current query. */\n refetch: () => void\n}\n\n/**\n * Adapter hook that bridges a fetcher returning `MTableResponse<T>` with\n * `MDataTable` in manual mode. Owns the search / filters / sort / page state,\n * debounces nothing on its own (fetcher decides), and aborts in-flight\n * requests when the query changes. Spread `tableProps` onto your table.\n */\nexport function useMTable<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MTableHandle<T> {\n const {perPage = 20, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = options\n\n const [data, setData] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MDataTableSort | null>(initialSort)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort}),\n [page, perPage, search, filters, sort],\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response) => {\n if (cancelled) return\n setData(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n // Reset to page 1 when search/filters/sort change.\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MDataTableSort | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const tableProps: MTableProps<T> = {\n data,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n }\n\n return {tableProps, isLoading, error, refetch}\n}\n","import {useCallback, useEffect, useMemo, useRef, useState} from 'react'\n\nimport type {MCardGridSort} from '../cards/MCardGrid'\nimport type {MTableQuery, MTableResponse, MTableFetcher, MTableOptions} from './useMTable'\n\n/**\n * Card-grid analog of `useMTable`. Same fetcher-agnostic pattern; returns props\n * spreadable onto `<MCardGrid>` in manual mode. Note that `MCardGridSort` uses\n * `direction` (vs `MDataTableSort.dir`) — convert if you reuse a fetcher.\n */\nexport interface MCardGridProps<T> {\n items: T[]\n total: number\n page: number\n onPageChange: (page: number) => void\n sort: MCardGridSort<T> | null\n onSortChange: (sort: MCardGridSort<T> | null) => void\n search: string\n onSearchChange: (search: string) => void\n filters: Record<string, string[]>\n onFiltersChange: (filters: Record<string, string[]>) => void\n manualSearch: true\n manualFilters: true\n manualSort: true\n manualPagination: true\n pageSize: number\n}\n\nexport interface MCardGridHandle<T> {\n /** Spread directly onto `<MCardGrid>`. */\n gridProps: MCardGridProps<T>\n isLoading: boolean\n error: Error | null\n refetch: () => void\n}\n\nfunction toTableSort<T>(sort: MCardGridSort<T> | null): MTableQuery['sort'] {\n if (!sort) return null\n return {key: sort.key, dir: sort.direction}\n}\n\n/**\n * Adapter hook for `MCardGrid` in manual mode. Owns search / filters / sort /\n * page state, calls a generic `MTableFetcher`, returns `gridProps` to spread.\n */\nexport function useMCardGrid<T>(fetcher: MTableFetcher<T>, options: MTableOptions = {}): MCardGridHandle<T> {\n const {perPage = 12, initialPage = 1, initialSearch = '', initialFilters, initialSort = null, invalidationKey} = options\n\n const [items, setItems] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [page, setPage] = useState(initialPage)\n const [search, setSearch] = useState(initialSearch)\n const [filters, setFilters] = useState<Record<string, string[]>>(initialFilters ?? {})\n const [sort, setSort] = useState<MCardGridSort<T> | null>(\n (initialSort as MCardGridSort<T> | null | undefined) ?? null,\n )\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [bump, setBump] = useState(0)\n\n const fetcherRef = useRef(fetcher)\n fetcherRef.current = fetcher\n\n const query = useMemo<MTableQuery>(\n () => ({page, perPage, search, filters, sort: toTableSort(sort)}),\n [page, perPage, search, filters, sort],\n )\n\n useEffect(() => {\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : undefined\n let cancelled = false\n setIsLoading(true)\n setError(null)\n fetcherRef\n .current(query, controller?.signal)\n .then((response: MTableResponse<T>) => {\n if (cancelled) return\n setItems(response.data)\n setTotal(response.meta.total)\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (err instanceof Error && err.name === 'AbortError') return\n setError(err instanceof Error ? err : new Error(String(err)))\n })\n .finally(() => {\n if (!cancelled) setIsLoading(false)\n })\n return () => {\n cancelled = true\n controller?.abort()\n }\n }, [query, invalidationKey, bump])\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next)\n setPage(1)\n }, [])\n const handleFiltersChange = useCallback((next: Record<string, string[]>) => {\n setFilters(next)\n setPage(1)\n }, [])\n const handleSortChange = useCallback((next: MCardGridSort<T> | null) => {\n setSort(next)\n setPage(1)\n }, [])\n\n const refetch = useCallback(() => setBump((value) => value + 1), [])\n\n const gridProps: MCardGridProps<T> = {\n items,\n total,\n page,\n onPageChange: setPage,\n sort,\n onSortChange: handleSortChange,\n search,\n onSearchChange: handleSearchChange,\n filters,\n onFiltersChange: handleFiltersChange,\n manualSearch: true,\n manualFilters: true,\n manualSort: true,\n manualPagination: true,\n pageSize: perPage,\n }\n\n return {gridProps, isLoading, error, refetch}\n}\n"],"mappings":"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"}
@@ -297,27 +297,27 @@ function x({ columns: f, data: x, rowKey: S, sortable: C = !1, filterable: w = !
297
297
  }
298
298
  //#endregion
299
299
  //#region src/components/data/MTaskList/MTaskList.tsx
300
- function S({ items: e, color: t = "primary", strikethrough: n = !0, onChange: r, className: i, ...o }) {
300
+ function S({ items: e, color: t = "primary", size: n = "md", strikethrough: r = !0, onChange: i, className: o, ...s }) {
301
301
  return /* @__PURE__ */ _("div", {
302
- className: a("task list", `color-${t}`, i),
302
+ className: a("task list", `color-${t}`, `size-${n}`, o),
303
303
  role: "list",
304
- ...o,
304
+ ...s,
305
305
  children: e.map((e) => /* @__PURE__ */ v("div", {
306
306
  className: a("task item", e.checked && "checked", e.disabled && "disabled"),
307
307
  role: "listitem",
308
308
  onClick: (t) => {
309
- e.disabled || t.target.closest(".checkbox") || r?.(e.id, !(e.checked ?? !1));
309
+ e.disabled || t.target.closest(".checkbox") || i?.(e.id, !(e.checked ?? !1));
310
310
  },
311
311
  children: [/* @__PURE__ */ _(c, {
312
312
  className: "task control",
313
313
  checked: e.checked ?? !1,
314
314
  color: t,
315
- size: "sm",
315
+ size: n,
316
316
  disabled: e.disabled,
317
- onChange: (t) => r?.(e.id, t.target.checked),
317
+ onChange: (t) => i?.(e.id, t.target.checked),
318
318
  clickEffect: "ripple"
319
319
  }), /* @__PURE__ */ _("span", {
320
- className: a("task label", e.checked && n && "done"),
320
+ className: a("task label", e.checked && r && "done"),
321
321
  children: e.label
322
322
  })]
323
323
  }, e.id))
@@ -460,4 +460,4 @@ function T(e, t = {}) {
460
460
  //#endregion
461
461
  export { x as i, C as n, S as r, T as t };
462
462
 
463
- //# sourceMappingURL=data-B5KYb0SW.js.map
463
+ //# sourceMappingURL=data-9Ej9tlwW.js.map