@banzamel/mineralui 2.1.2 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{MDetailList-BhKBJwpd.cjs → MDetailList-DTLU7HQZ.cjs} +2 -2
- package/dist/{MDetailList-BhKBJwpd.cjs.map → MDetailList-DTLU7HQZ.cjs.map} +1 -1
- package/dist/{MDetailList-BjvZUyNj.js → MDetailList-fDhVyhm7.js} +3 -3
- package/dist/{MDetailList-BjvZUyNj.js.map → MDetailList-fDhVyhm7.js.map} +1 -1
- package/dist/{MDropdownMenu-hXaIMkAj.cjs → MDropdownMenu-BvN5grK5.cjs} +2 -2
- package/dist/{MDropdownMenu-hXaIMkAj.cjs.map → MDropdownMenu-BvN5grK5.cjs.map} +1 -1
- package/dist/{MDropdownMenu-CZmU3uku.js → MDropdownMenu-CFoKJ7V6.js} +2 -2
- package/dist/{MDropdownMenu-CZmU3uku.js.map → MDropdownMenu-CFoKJ7V6.js.map} +1 -1
- package/dist/{MInput-BhTAfpYS.cjs → MInput-BpTlP8GE.cjs} +2 -2
- package/dist/{MInput-BhTAfpYS.cjs.map → MInput-BpTlP8GE.cjs.map} +1 -1
- package/dist/{MInput-CgtX0fUN.js → MInput-C8ObGzQk.js} +2 -2
- package/dist/{MInput-CgtX0fUN.js.map → MInput-C8ObGzQk.js.map} +1 -1
- package/dist/{MInputCVC-BGYhUGDE.js → MInputCVC-B4V0QI5h.js} +24 -24
- package/dist/{MInputCVC-BGYhUGDE.js.map → MInputCVC-B4V0QI5h.js.map} +1 -1
- package/dist/{MInputCVC-E2Z2hYfy.cjs → MInputCVC-BlY5OrVn.cjs} +2 -2
- package/dist/{MInputCVC-E2Z2hYfy.cjs.map → MInputCVC-BlY5OrVn.cjs.map} +1 -1
- package/dist/{MInputSearch-DE9Jqp0i.cjs → MInputSearch-9wcXlY8-.cjs} +2 -2
- package/dist/{MInputSearch-DE9Jqp0i.cjs.map → MInputSearch-9wcXlY8-.cjs.map} +1 -1
- package/dist/{MInputSearch-DEr5HBgw.js → MInputSearch-BM8gLlJ1.js} +3 -3
- package/dist/{MInputSearch-DEr5HBgw.js.map → MInputSearch-BM8gLlJ1.js.map} +1 -1
- package/dist/{MPagination-DTqT33Mx.cjs → MPagination-C6QQdEj_.cjs} +2 -2
- package/dist/{MPagination-DTqT33Mx.cjs.map → MPagination-C6QQdEj_.cjs.map} +1 -1
- package/dist/{MPagination-7yTbB8dZ.js → MPagination-CgmNEAZX.js} +6 -6
- package/dist/{MPagination-7yTbB8dZ.js.map → MPagination-CgmNEAZX.js.map} +1 -1
- package/dist/MPopover-C5aaGhma.js +150 -0
- package/dist/MPopover-C5aaGhma.js.map +1 -0
- package/dist/MPopover-CV-9MArH.cjs +2 -0
- package/dist/MPopover-CV-9MArH.cjs.map +1 -0
- package/dist/{MTag-BtlOVMRl.cjs → MTag-BzTp1crT.cjs} +2 -2
- package/dist/{MTag-BtlOVMRl.cjs.map → MTag-BzTp1crT.cjs.map} +1 -1
- package/dist/{MTag-BF6htPr-.js → MTag-D9q6faIk.js} +2 -2
- package/dist/{MTag-BF6htPr-.js.map → MTag-D9q6faIk.js.map} +1 -1
- package/dist/{MTreeView-DQaRF0ty.js → MTreeView-B1J7uqd1.js} +63 -63
- package/dist/{MTreeView-DQaRF0ty.js.map → MTreeView-B1J7uqd1.js.map} +1 -1
- package/dist/{MTreeView-1IqmVPMv.cjs → MTreeView-DuQkm0ZV.cjs} +2 -2
- package/dist/{MTreeView-1IqmVPMv.cjs.map → MTreeView-DuQkm0ZV.cjs.map} +1 -1
- package/dist/{cards-BBYh24NQ.cjs → cards-CQSYgH9U.cjs} +2 -2
- package/dist/{cards-BBYh24NQ.cjs.map → cards-CQSYgH9U.cjs.map} +1 -1
- package/dist/{cards-Du2kX3Br.js → cards-Cpr9B8Mu.js} +73 -73
- package/dist/{cards-Du2kX3Br.js.map → cards-Cpr9B8Mu.js.map} +1 -1
- package/dist/cards.cjs +1 -1
- package/dist/cards.js +1 -1
- package/dist/components/primitives/MPopover/popoverStack.d.ts +32 -0
- package/dist/{controls-Cbv4FmNq.js → controls-BKAhqjNM.js} +2 -2
- package/dist/{controls-Cbv4FmNq.js.map → controls-BKAhqjNM.js.map} +1 -1
- package/dist/{controls-DrdHBBtm.cjs → controls-CT_0lIPr.cjs} +2 -2
- package/dist/{controls-DrdHBBtm.cjs.map → controls-CT_0lIPr.cjs.map} +1 -1
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +1 -1
- package/dist/{data-Csb03WFo.cjs → data-BZ92hzXx.cjs} +2 -2
- package/dist/{data-Csb03WFo.cjs.map → data-BZ92hzXx.cjs.map} +1 -1
- package/dist/{data-BgTkBMkP.js → data-C-6DP7iY.js} +16 -16
- package/dist/{data-BgTkBMkP.js.map → data-C-6DP7iY.js.map} +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.js +2 -2
- package/dist/{display-D9H8MP8D.js → display-BF4jASt9.js} +16 -16
- package/dist/{display-D9H8MP8D.js.map → display-BF4jASt9.js.map} +1 -1
- package/dist/{display-IMWtdmxS.cjs → display-DMix8BmD.cjs} +3 -3
- package/dist/{display-IMWtdmxS.cjs.map → display-DMix8BmD.cjs.map} +1 -1
- package/dist/display.cjs +1 -1
- package/dist/display.js +2 -2
- package/dist/{dropdowns-oj4--GbK.js → dropdowns-DiThUF7D.js} +91 -91
- package/dist/{dropdowns-oj4--GbK.js.map → dropdowns-DiThUF7D.js.map} +1 -1
- package/dist/{dropdowns-D_nUdflh.cjs → dropdowns-bQ0cEKNN.cjs} +2 -2
- package/dist/{dropdowns-D_nUdflh.cjs.map → dropdowns-bQ0cEKNN.cjs.map} +1 -1
- package/dist/dropdowns.cjs +1 -1
- package/dist/dropdowns.js +1 -1
- package/dist/{feedback-u1ssUT7e.cjs → feedback-4TjD57rX.cjs} +2 -2
- package/dist/{feedback-u1ssUT7e.cjs.map → feedback-4TjD57rX.cjs.map} +1 -1
- package/dist/{feedback-D7BTlioj.js → feedback-DW-cehnb.js} +35 -35
- package/dist/{feedback-D7BTlioj.js.map → feedback-DW-cehnb.js.map} +1 -1
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +2 -2
- package/dist/icons/glyphs/MCoinIcon.d.ts +2 -0
- package/dist/icons/glyphs/MMoneyIcon.d.ts +2 -0
- package/dist/icons/glyphs/MReceiptIcon.d.ts +2 -0
- package/dist/icons/glyphs/MWalletIcon.d.ts +2 -0
- package/dist/icons/index.d.ts +4 -0
- package/dist/{icons-DLP-Rs6z.js → icons-CBMl-kOM.js} +221 -166
- package/dist/icons-CBMl-kOM.js.map +1 -0
- package/dist/icons-D675Im0B.cjs +2 -0
- package/dist/icons-D675Im0B.cjs.map +1 -0
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +53 -53
- package/dist/{inputs-DQrjGfwd.js → inputs-CQoi402V.js} +180 -180
- package/dist/{inputs-DQrjGfwd.js.map → inputs-CQoi402V.js.map} +1 -1
- package/dist/{inputs-DsFdc0Io.cjs → inputs-yaaTPTsY.cjs} +2 -2
- package/dist/{inputs-DsFdc0Io.cjs.map → inputs-yaaTPTsY.cjs.map} +1 -1
- package/dist/inputs.cjs +1 -1
- package/dist/inputs.js +4 -4
- package/dist/{layout-BuvV-N9H.js → layout-CdSpVJuK.js} +32 -32
- package/dist/{layout-BuvV-N9H.js.map → layout-CdSpVJuK.js.map} +1 -1
- package/dist/{layout-B_2yBP1M.cjs → layout-Ddo7HUPu.cjs} +2 -2
- package/dist/{layout-B_2yBP1M.cjs.map → layout-Ddo7HUPu.cjs.map} +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +2 -2
- package/dist/{media-Xt6MkVhb.cjs → media-DRz3JZfr.cjs} +2 -2
- package/dist/{media-Xt6MkVhb.cjs.map → media-DRz3JZfr.cjs.map} +1 -1
- package/dist/{media-5IsYrhIQ.js → media-vOQOIYFD.js} +11 -11
- package/dist/{media-5IsYrhIQ.js.map → media-vOQOIYFD.js.map} +1 -1
- package/dist/media.cjs +1 -1
- package/dist/media.js +1 -1
- package/dist/{overlays-BAJDNT1m.cjs → overlays-BUZEaZaJ.cjs} +2 -2
- package/dist/{overlays-BAJDNT1m.cjs.map → overlays-BUZEaZaJ.cjs.map} +1 -1
- package/dist/{overlays-WA3jnWTG.js → overlays-C1vO_A2I.js} +50 -50
- package/dist/{overlays-WA3jnWTG.js.map → overlays-C1vO_A2I.js.map} +1 -1
- package/dist/overlays.cjs +1 -1
- package/dist/overlays.js +2 -2
- package/dist/primitives.cjs +1 -1
- package/dist/primitives.js +1 -1
- package/package.json +1 -1
- package/dist/MPopover-BRuwva-c.js +0 -95
- package/dist/MPopover-BRuwva-c.js.map +0 -1
- package/dist/MPopover-hDqrn317.cjs +0 -2
- package/dist/MPopover-hDqrn317.cjs.map +0 -1
- package/dist/icons-BfdQ45F2.cjs +0 -2
- package/dist/icons-BfdQ45F2.cjs.map +0 -1
- package/dist/icons-DLP-Rs6z.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTreeView-DQaRF0ty.js","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MTreeView-B1J7uqd1.js","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./icons-
|
|
2
|
-
//# sourceMappingURL=MTreeView-
|
|
1
|
+
const e=require(`./icons-D675Im0B.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./MPortal-BciZHNDC.cjs`),r=require(`./MCheckbox-CM5HJQWW.cjs`);require(`./core-DBpQf3uY.cjs`);let i=require(`react`),a=require(`react/jsx-runtime`);var o={pdf:(0,a.jsx)(e.pi,{}),ts:(0,a.jsx)(e.ni,{}),tsx:(0,a.jsx)(e.ri,{}),js:(0,a.jsx)(e.Wr,{}),jsx:(0,a.jsx)(e.di,{}),css:(0,a.jsx)(e.Lr,{}),scss:(0,a.jsx)(e.Lr,{}),html:(0,a.jsx)(e.Hr,{}),json:(0,a.jsx)(e.Gr,{}),md:(0,a.jsx)(e.qr,{}),txt:(0,a.jsx)(e.ii,{}),csv:(0,a.jsx)(e.Rr,{}),zip:(0,a.jsx)(e.ci,{}),rar:(0,a.jsx)(e.ei,{}),svg:(0,a.jsx)(e.ti,{}),png:(0,a.jsx)(e.Qr,{}),jpg:(0,a.jsx)(e.Ur,{}),jpeg:(0,a.jsx)(e.fi,{}),gif:(0,a.jsx)(e.Vr,{}),webp:(0,a.jsx)(e.ai,{}),php:(0,a.jsx)(e.Zr,{}),xml:(0,a.jsx)(e.si,{}),xls:(0,a.jsx)(e.oi,{}),ppt:(0,a.jsx)(e.$r,{}),odt:(0,a.jsx)(e.Xr,{}),exe:(0,a.jsx)(e.Br,{}),mp3:(0,a.jsx)(e.Jr,{}),mp4:(0,a.jsx)(e.Yr,{})};function s(e){let t=e.lastIndexOf(`.`);return t<1?null:e.slice(t+1).toLowerCase()}function c(e){return e.kind===`folder`||!!e.children?.length}function l(t){let n=s(t);return n?o[n]??(0,a.jsx)(e.mi,{}):(0,a.jsx)(e._i,{})}function ee(t,n,r){return t.icon?t.icon:r?c(t)?n?(0,a.jsx)(e.Fr,{}):(0,a.jsx)(e.Ir,{}):l(t.label):null}function u(e){let t=new Map,n=new Map,r=new Map;function i(e){t.set(e.id,e);let a=new Set;for(let t of e.children??[])r.set(t.id,e.id),a.add(t.id),i(t).forEach(e=>a.add(e));return n.set(e.id,a),a}return e.forEach(i),{nodeMap:t,descendants:n,parentMap:r}}function d(e,t){let n=new Set;function r(e){if(!e.children?.length)return t.has(e.id)?{checked:1,total:1}:{checked:0,total:1};let i=0,a=0;for(let t of e.children){let e=r(t);i+=e.checked,a+=e.total}return i>0&&i<a&&n.add(e.id),{checked:i,total:a}}return e.forEach(r),n}function f(e,t){return typeof window>`u`?{x:e,y:t}:{x:Math.max(8,Math.min(e,window.innerWidth-220)),y:Math.max(8,Math.min(t,window.innerHeight-16))}}function p({node:n,color:i,level:o,expandable:s,selectable:l,expandedIds:u,selectedId:d,draggedId:f,dropTargetId:m,onToggle:h,onSelect:g,checkable:_,checkedIds:v,indeterminateIds:y,onCheck:b,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:T,onContextMenu:E,onDragStart:D,onDragOver:O,onDrop:k,onDragEnd:A}){let j=c(n),M=u.has(n.id),N=d===n.id,P=f===n.id,te=m===n.id,F=T?.(n),I=ee(n,M,!!C),L=v?.has(n.id)??!1,R=y?.has(n.id)??!1;return(0,a.jsxs)(`li`,{role:`treeitem`,"aria-expanded":j?M:void 0,children:[(0,a.jsxs)(`div`,{className:t.t(`item`,N&&`selected`,n.disabled&&`disabled`,l&&!n.disabled&&`selectable`,w&&!n.disabled&&`draggable`,P&&`dragging`,F&&`can-drop`,te&&`drop-target`),"data-color":i,style:{paddingLeft:o*x},draggable:w&&!n.disabled,onClick:()=>{n.disabled||(j&&s&&h(n.id),l&&g?.(n.id,n))},onContextMenu:e=>E?.(e,n),onDragStart:e=>D?.(e,n),onDragOver:e=>O?.(e,n),onDrop:e=>k?.(e,n),onDragEnd:A,children:[(0,a.jsx)(`span`,{className:`toggle`,children:j&&s?(0,a.jsx)(`span`,{className:t.t(`arrow`,M&&`expanded`),children:(0,a.jsx)(e.qi,{})}):(0,a.jsx)(`span`,{className:`spacer`})}),_&&(0,a.jsx)(`span`,{className:`check`,onClick:e=>e.stopPropagation(),children:(0,a.jsx)(r.t,{size:`sm`,clickEffect:`none`,disabled:n.disabled,checked:L,indeterminate:R,onChange:()=>b?.(n.id)})}),I&&(0,a.jsx)(`span`,{className:`icon`,children:I}),(0,a.jsx)(`span`,{className:`label`,children:n.label})]}),j&&M&&(0,a.jsx)(`ul`,{className:`list`,role:`group`,style:S?{"--line-left":`${o*x+17}px`}:void 0,children:(n.children??[]).map(e=>(0,a.jsx)(p,{node:e,color:i,level:o+1,expandable:s,selectable:l,expandedIds:u,selectedId:d,draggedId:f,dropTargetId:m,onToggle:h,onSelect:g,checkable:_,checkedIds:v,indeterminateIds:y,onCheck:b,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:T,onContextMenu:E,onDragStart:D,onDragOver:O,onDrop:k,onDragEnd:A},e.id))})]})}function m({items:e,color:r=`primary`,expandable:o=!0,selectable:s=!1,defaultExpanded:l=[],expanded:ee,onExpandChange:m,selected:h,onSelect:g,checkable:_=!1,defaultChecked:v=[],checked:y,onCheckedChange:b,indent:x=20,showLines:S=!0,fileIcons:C=!0,draggable:w=!1,canDrop:T,onMove:E,contextMenuItems:D,onContextMenuAction:O,className:k,...A}){let[j,M]=(0,i.useState)(l),[N,P]=(0,i.useState)(null),[te,F]=(0,i.useState)(v),[I,L]=(0,i.useState)(null),[R,z]=(0,i.useState)(null),[B,V]=(0,i.useState)(null),H=(0,i.useRef)(null),U=ee??j,W=new Set(U),ne=h===void 0?N:h,G=new Set(y??te),re=_?d(e,G):new Set,{nodeMap:K,descendants:q,parentMap:J}=u(e),Y=I?K.get(I)??null:null;(0,i.useEffect)(()=>{if(!B)return;function e(e){e&&H.current&&H.current.contains(e.target)||V(null)}function t(e){e.key===`Escape`&&V(null)}return document.addEventListener(`mousedown`,e),document.addEventListener(`scroll`,e,!0),window.addEventListener(`resize`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`scroll`,e,!0),window.removeEventListener(`resize`,e),document.removeEventListener(`keydown`,t)}},[B]);function X(e){let t=W.has(e)?U.filter(t=>t!==e):[...U,e];m?m(t):M(t)}function Z(e,t){g?g(e,t):P(e)}function ie(e){let t=K.get(e);if(!t||t.disabled)return;let n=new Set(G),r=n.has(e),i=[e,...Array.from(q.get(e)??[])];if(r)for(let e of i)n.delete(e);else for(let e of i){let t=K.get(e);t&&!t.disabled&&n.add(e)}let a=J.get(e);for(;a;){let e=K.get(a);if(!e)break;let t=(e.children??[]).every(e=>e.disabled||n.has(e.id)),r=(e.children??[]).some(e=>!e.disabled);t&&r?n.add(a):n.delete(a),a=J.get(a)}let o=Array.from(n);y===void 0&&F(o),b?.(o)}function Q(){L(null),z(null)}function $(e){return!Y||!w||!E||e.disabled||!c(e)||e.id===Y.id||q.get(Y.id)?.has(e.id)?!1:T?T(Y,e):!0}function ae(e,t){if(!D||t.disabled)return;let n=D(t).filter(Boolean);if(!n.length)return;e.preventDefault(),Z(t.id,t);let r=f(e.clientX,e.clientY);V({node:t,items:n,x:r.x,y:r.y})}function oe(e,t){!w||t.disabled||(e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,t.id),V(null),L(t.id))}function se(e,t){$(t)&&(e.preventDefault(),e.dataTransfer.dropEffect=`move`,z(t.id))}function ce(e,t){if(e.preventDefault(),!Y||!$(t)){Q();return}E?.({draggedId:Y.id,draggedNode:Y,targetId:t.id,targetNode:t}),o&&!W.has(t.id)&&X(t.id),Q()}return(0,a.jsxs)(`div`,{className:t.t(`tree`,`color-${r}`,S&&`lines`,k),...A,children:[(0,a.jsx)(`ul`,{className:`list`,role:`tree`,children:e.map(e=>(0,a.jsx)(p,{node:e,color:r,level:0,expandable:o,selectable:s,expandedIds:W,selectedId:ne,draggedId:I,dropTargetId:R,onToggle:X,onSelect:Z,checkable:_,checkedIds:G,indeterminateIds:re,onCheck:ie,indent:x,showLines:S,fileIcons:C,draggable:w,canDropOnNode:$,onContextMenu:ae,onDragStart:oe,onDragOver:se,onDrop:ce,onDragEnd:Q},e.id))}),B&&(0,a.jsx)(n.t,{children:(0,a.jsx)(`div`,{ref:H,className:`tree menu`,style:{top:B.y,left:B.x},role:`menu`,children:B.items.map(e=>(0,a.jsxs)(`button`,{type:`button`,className:t.t(`action`,e.color,e.disabled&&`disabled`),role:`menuitem`,disabled:e.disabled,onClick:()=>{e.disabled||(O?.(e.id,B.node),V(null))},children:[e.icon&&(0,a.jsx)(`span`,{className:`icon`,children:e.icon}),(0,a.jsx)(`span`,{children:e.label})]},e.id))})})]})}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}});
|
|
2
|
+
//# sourceMappingURL=MTreeView-DuQkm0ZV.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MTreeView-1IqmVPMv.cjs","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MTreeView-DuQkm0ZV.cjs","names":[],"sources":["../src/components/data/MTreeView/MTreeView.tsx"],"sourcesContent":["import {useEffect, useRef, useState} from 'react'\nimport type {CSSProperties, DragEvent, MouseEvent, ReactNode} from 'react'\nimport type {\n MTreeViewProps,\n MTreeItemProps,\n MTreeNode,\n MTreeViewContextMenuItem,\n MTreeViewMoveEvent,\n} from './MTreeView.types'\nimport {cn} from '../../../utils/cn'\nimport {MCheckbox} from '../../controls'\nimport {MPortal} from '../../primitives'\nimport {\n MChevronRightIcon,\n MFileCodeIcon,\n MFileCsvIcon,\n MFileCssIcon,\n MFileExeIcon,\n MFileGifIcon,\n MFileHtmlIcon,\n MFileIcon,\n MFileImageIcon,\n MFileJpgIcon,\n MFileJsIcon,\n MFileJsonIcon,\n MFileMdIcon,\n MFileMp3Icon,\n MFileMp4Icon,\n MFileOdtIcon,\n MFilePdfIcon,\n MFilePhpIcon,\n MFilePngIcon,\n MFilePptIcon,\n MFileRarIcon,\n MFileSvgIcon,\n MFileTextIcon,\n MFileTsIcon,\n MFileTsxIcon,\n MFileTxtIcon,\n MFileWebpIcon,\n MFileXlsIcon,\n MFileXmlIcon,\n MFileZipIcon,\n MFolderIcon,\n MFolderOpenIcon,\n} from '../../../icons'\nimport './MTreeView.css'\nconst fileTypeMap: Record<string, ReactNode> = {\n pdf: <MFilePdfIcon />,\n ts: <MFileTsIcon />,\n tsx: <MFileTsxIcon />,\n js: <MFileJsIcon />,\n jsx: <MFileCodeIcon />,\n css: <MFileCssIcon />,\n scss: <MFileCssIcon />,\n html: <MFileHtmlIcon />,\n json: <MFileJsonIcon />,\n md: <MFileMdIcon />,\n txt: <MFileTxtIcon />,\n csv: <MFileCsvIcon />,\n zip: <MFileZipIcon />,\n rar: <MFileRarIcon />,\n svg: <MFileSvgIcon />,\n png: <MFilePngIcon />,\n jpg: <MFileJpgIcon />,\n jpeg: <MFileImageIcon />,\n gif: <MFileGifIcon />,\n webp: <MFileWebpIcon />,\n php: <MFilePhpIcon />,\n xml: <MFileXmlIcon />,\n xls: <MFileXlsIcon />,\n ppt: <MFilePptIcon />,\n odt: <MFileOdtIcon />,\n exe: <MFileExeIcon />,\n mp3: <MFileMp3Icon />,\n mp4: <MFileMp4Icon />,\n}\n\n// Read the file extension once so icon logic stays predictable.\nfunction getFileExtension(label: string): string | null {\n const dot = label.lastIndexOf('.')\n if (dot < 1) return null\n return label.slice(dot + 1).toLowerCase()\n}\n\n// Treat explicit folders and nodes with children as directory-like.\nfunction isFolderNode(node: MTreeNode) {\n return node.kind === 'folder' || Boolean(node.children?.length)\n}\n\n// Resolve the proper file icon by extension.\nfunction getFileIcon(label: string): ReactNode {\n const ext = getFileExtension(label)\n if (!ext) return <MFileIcon />\n\n return fileTypeMap[ext] ?? <MFileTextIcon />\n}\n\n// Prefer custom icons first, then fall back to folder or file visuals.\nfunction getDefaultIcon(node: MTreeNode, isExpanded: boolean, fileIcons: boolean) {\n if (node.icon) return node.icon\n if (!fileIcons) return null\n\n if (isFolderNode(node)) return isExpanded ? <MFolderOpenIcon /> : <MFolderIcon />\n\n return getFileIcon(node.label)\n}\n\n// Cache nodes and descendants so drag-drop validation stays fast.\nfunction buildTreeLookup(items: MTreeNode[]) {\n const nodeMap = new Map<string, MTreeNode>()\n const descendants = new Map<string, Set<string>>()\n const parentMap = new Map<string, string>()\n\n function walk(node: MTreeNode) {\n nodeMap.set(node.id, node)\n\n const childIds = new Set<string>()\n\n for (const child of node.children ?? []) {\n parentMap.set(child.id, node.id)\n childIds.add(child.id)\n\n const nestedIds = walk(child)\n nestedIds.forEach((id) => childIds.add(id))\n }\n\n descendants.set(node.id, childIds)\n return childIds\n }\n\n items.forEach(walk)\n\n return {nodeMap, descendants, parentMap}\n}\n\n// Compute indeterminate ids: a node where some but not all leaf descendants are checked.\nfunction computeIndeterminate(items: MTreeNode[], checked: Set<string>): Set<string> {\n const indeterminate = new Set<string>()\n\n function walk(node: MTreeNode): {checked: number; total: number} {\n if (!node.children?.length) {\n return checked.has(node.id) ? {checked: 1, total: 1} : {checked: 0, total: 1}\n }\n\n let c = 0\n let t = 0\n\n for (const child of node.children) {\n const r = walk(child)\n c += r.checked\n t += r.total\n }\n\n if (c > 0 && c < t) indeterminate.add(node.id)\n return {checked: c, total: t}\n }\n\n items.forEach(walk)\n return indeterminate\n}\n\n// Keep the context menu inside the viewport.\nfunction clampMenuPosition(x: number, y: number) {\n if (typeof window === 'undefined') {\n return {x, y}\n }\n\n return {\n x: Math.max(8, Math.min(x, window.innerWidth - 220)),\n y: Math.max(8, Math.min(y, window.innerHeight - 16)),\n }\n}\n\n// Render one visible row and recurse into children when expanded.\nfunction TreeItem({\n node,\n color,\n level,\n expandable,\n selectable,\n expandedIds,\n selectedId,\n draggedId,\n dropTargetId,\n onToggle,\n onSelect,\n checkable,\n checkedIds,\n indeterminateIds,\n onCheck,\n indent,\n showLines,\n fileIcons,\n draggable,\n canDropOnNode,\n onContextMenu,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n}: MTreeItemProps) {\n const hasChildren = isFolderNode(node)\n const isExpanded = expandedIds.has(node.id)\n const isSelected = selectedId === node.id\n const isDragging = draggedId === node.id\n const isDropTarget = dropTargetId === node.id\n const canDrop = canDropOnNode?.(node)\n const icon = getDefaultIcon(node, isExpanded, !!fileIcons)\n const isChecked = checkedIds?.has(node.id) ?? false\n const isIndeterminate = indeterminateIds?.has(node.id) ?? false\n\n return (\n <li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n <div\n className={cn(\n 'item',\n isSelected && 'selected',\n node.disabled && 'disabled',\n selectable && !node.disabled && 'selectable',\n draggable && !node.disabled && 'draggable',\n isDragging && 'dragging',\n canDrop && 'can-drop',\n isDropTarget && 'drop-target'\n )}\n data-color={color}\n style={{paddingLeft: level * indent}}\n draggable={draggable && !node.disabled}\n onClick={() => {\n if (node.disabled) return\n if (hasChildren && expandable) onToggle(node.id)\n if (selectable) onSelect?.(node.id, node)\n }}\n onContextMenu={(event) => onContextMenu?.(event, node)}\n onDragStart={(event) => onDragStart?.(event, node)}\n onDragOver={(event) => onDragOver?.(event, node)}\n onDrop={(event) => onDrop?.(event, node)}\n onDragEnd={onDragEnd}\n >\n <span className=\"toggle\">\n {hasChildren && expandable ? (\n <span className={cn('arrow', isExpanded && 'expanded')}>\n <MChevronRightIcon />\n </span>\n ) : (\n <span className=\"spacer\" />\n )}\n </span>\n {checkable && (\n <span className=\"check\" onClick={(event) => event.stopPropagation()}>\n <MCheckbox\n size=\"sm\"\n clickEffect=\"none\"\n disabled={node.disabled}\n checked={isChecked}\n indeterminate={isIndeterminate}\n onChange={() => onCheck?.(node.id)}\n />\n </span>\n )}\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{node.label}</span>\n </div>\n {hasChildren && isExpanded && (\n <ul\n className=\"list\"\n role=\"group\"\n style={showLines ? ({'--line-left': `${level * indent + 17}px`} as CSSProperties) : undefined}\n >\n {(node.children ?? []).map((child) => (\n <TreeItem\n key={child.id}\n node={child}\n color={color}\n level={level + 1}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={onToggle}\n onSelect={onSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={onCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={canDropOnNode}\n onContextMenu={onContextMenu}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\n// Render a file tree with selection, context actions and folder moves.\nexport function MTreeView({\n items,\n color = 'primary',\n expandable = true,\n selectable = false,\n defaultExpanded = [],\n expanded: controlledExpanded,\n onExpandChange,\n selected: controlledSelected,\n onSelect,\n checkable = false,\n defaultChecked = [],\n checked: controlledChecked,\n onCheckedChange,\n indent = 20,\n showLines = true,\n fileIcons = true,\n draggable = false,\n canDrop,\n onMove,\n contextMenuItems,\n onContextMenuAction,\n className,\n ...rest\n}: MTreeViewProps) {\n const [internalExpanded, setInternalExpanded] = useState<string[]>(defaultExpanded)\n const [internalSelected, setInternalSelected] = useState<string | null>(null)\n const [internalChecked, setInternalChecked] = useState<string[]>(defaultChecked)\n const [draggedId, setDraggedId] = useState<string | null>(null)\n const [dropTargetId, setDropTargetId] = useState<string | null>(null)\n const [menu, setMenu] = useState<{\n node: MTreeNode\n items: MTreeViewContextMenuItem[]\n x: number\n y: number\n } | null>(null)\n const menuRef = useRef<HTMLDivElement>(null)\n\n const expandedArr = controlledExpanded ?? internalExpanded\n const expandedIds = new Set(expandedArr)\n const selectedId = controlledSelected !== undefined ? controlledSelected : internalSelected\n const checkedArr = controlledChecked ?? internalChecked\n const checkedIds = new Set(checkedArr)\n const indeterminateIds = checkable ? computeIndeterminate(items, checkedIds) : new Set<string>()\n const {nodeMap, descendants, parentMap} = buildTreeLookup(items)\n const draggedNode = draggedId ? (nodeMap.get(draggedId) ?? null) : null\n\n useEffect(() => {\n if (!menu) return\n\n function closeMenu(event?: Event) {\n if (event && menuRef.current && menuRef.current.contains(event.target as Node)) {\n return\n }\n\n setMenu(null)\n }\n\n function handleKey(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setMenu(null)\n }\n }\n\n document.addEventListener('mousedown', closeMenu)\n document.addEventListener('scroll', closeMenu, true)\n window.addEventListener('resize', closeMenu)\n document.addEventListener('keydown', handleKey)\n\n return () => {\n document.removeEventListener('mousedown', closeMenu)\n document.removeEventListener('scroll', closeMenu, true)\n window.removeEventListener('resize', closeMenu)\n document.removeEventListener('keydown', handleKey)\n }\n }, [menu])\n\n function handleToggle(id: string) {\n const next = expandedIds.has(id) ? expandedArr.filter((e) => e !== id) : [...expandedArr, id]\n if (onExpandChange) onExpandChange(next)\n else setInternalExpanded(next)\n }\n\n function handleSelect(id: string, node: MTreeNode) {\n if (onSelect) onSelect(id, node)\n else setInternalSelected(id)\n }\n\n function handleCheck(id: string) {\n const node = nodeMap.get(id)\n if (!node || node.disabled) return\n\n const next = new Set(checkedIds)\n const isCurrentlyChecked = next.has(id)\n const subtree = [id, ...Array.from(descendants.get(id) ?? [])]\n\n if (isCurrentlyChecked) {\n for (const sid of subtree) next.delete(sid)\n } else {\n for (const sid of subtree) {\n const sNode = nodeMap.get(sid)\n if (sNode && !sNode.disabled) next.add(sid)\n }\n }\n\n let parentId = parentMap.get(id)\n\n while (parentId) {\n const parent = nodeMap.get(parentId)\n if (!parent) break\n\n const allChildrenChecked = (parent.children ?? []).every((child) => child.disabled || next.has(child.id))\n const hasEnabledChild = (parent.children ?? []).some((child) => !child.disabled)\n\n if (allChildrenChecked && hasEnabledChild) next.add(parentId)\n else next.delete(parentId)\n\n parentId = parentMap.get(parentId)\n }\n\n const nextArr = Array.from(next)\n\n if (controlledChecked === undefined) setInternalChecked(nextArr)\n onCheckedChange?.(nextArr)\n }\n\n function closeDrag() {\n setDraggedId(null)\n setDropTargetId(null)\n }\n\n function isValidDropTarget(targetNode: MTreeNode) {\n if (!draggedNode || !draggable || !onMove) return false\n if (targetNode.disabled || !isFolderNode(targetNode)) return false\n if (targetNode.id === draggedNode.id) return false\n if (descendants.get(draggedNode.id)?.has(targetNode.id)) return false\n\n return canDrop ? canDrop(draggedNode, targetNode) : true\n }\n\n function handleContextMenu(event: MouseEvent<HTMLDivElement>, node: MTreeNode) {\n if (!contextMenuItems || node.disabled) return\n\n const items = contextMenuItems(node).filter(Boolean)\n if (!items.length) return\n\n event.preventDefault()\n handleSelect(node.id, node)\n\n const pos = clampMenuPosition(event.clientX, event.clientY)\n setMenu({\n node,\n items,\n x: pos.x,\n y: pos.y,\n })\n }\n\n function handleDragStart(event: DragEvent<HTMLDivElement>, node: MTreeNode) {\n if (!draggable || node.disabled) return\n\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', node.id)\n setMenu(null)\n setDraggedId(node.id)\n }\n\n function handleDragOver(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n if (!isValidDropTarget(targetNode)) return\n\n event.preventDefault()\n event.dataTransfer.dropEffect = 'move'\n setDropTargetId(targetNode.id)\n }\n\n function handleDrop(event: DragEvent<HTMLDivElement>, targetNode: MTreeNode) {\n event.preventDefault()\n\n if (!draggedNode || !isValidDropTarget(targetNode)) {\n closeDrag()\n return\n }\n\n onMove?.({\n draggedId: draggedNode.id,\n draggedNode,\n targetId: targetNode.id,\n targetNode,\n } satisfies MTreeViewMoveEvent)\n\n if (expandable && !expandedIds.has(targetNode.id)) {\n handleToggle(targetNode.id)\n }\n\n closeDrag()\n }\n\n return (\n <div className={cn('tree', `color-${color}`, showLines && 'lines', className)} {...rest}>\n <ul className=\"list\" role=\"tree\">\n {items.map((item) => (\n <TreeItem\n key={item.id}\n node={item}\n color={color}\n level={0}\n expandable={expandable}\n selectable={selectable}\n expandedIds={expandedIds}\n selectedId={selectedId}\n draggedId={draggedId}\n dropTargetId={dropTargetId}\n onToggle={handleToggle}\n onSelect={handleSelect}\n checkable={checkable}\n checkedIds={checkedIds}\n indeterminateIds={indeterminateIds}\n onCheck={handleCheck}\n indent={indent}\n showLines={showLines}\n fileIcons={fileIcons}\n draggable={draggable}\n canDropOnNode={isValidDropTarget}\n onContextMenu={handleContextMenu}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={closeDrag}\n />\n ))}\n </ul>\n {menu && (\n <MPortal>\n <div ref={menuRef} className=\"tree menu\" style={{top: menu.y, left: menu.x}} role=\"menu\">\n {menu.items.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className={cn('action', item.color, item.disabled && 'disabled')}\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n if (item.disabled) return\n onContextMenuAction?.(item.id, menu.node)\n setMenu(null)\n }}\n >\n {item.icon && <span className=\"icon\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n ))}\n </div>\n </MPortal>\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./icons-BfdQ45F2.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./creditCards-D_HwRUBz.cjs`),r=require(`./useInteractionEffect-DFTdcWHl.cjs`),i=require(`./MPopover-hDqrn317.cjs`),a=require(`./MSurface-CYeVFOw_.cjs`),o=require(`./MText-j6Zbbj5Y.cjs`),s=require(`./MHeading-BLnb3dNv.cjs`),c=require(`./MLink-Biipj7xz.cjs`),l=require(`./MButton-R08y1HCT.cjs`),u=require(`./MCheckbox-CM5HJQWW.cjs`),d=require(`./MSkeleton-CLSU5pL6.cjs`),f=require(`./MLoader-XcpKlLrd.cjs`),p=require(`./MGrid-B_0kFUws.cjs`),m=require(`./MStack-BP_BUeCc.cjs`),h=require(`./MCard-1OVOl4Ql.cjs`),g=require(`./MInputCVC-E2Z2hYfy.cjs`),_=require(`./MAvatar-bUWENcq-.cjs`),v=require(`./MDetailList-BhKBJwpd.cjs`),y=require(`./MInputSearch-DE9Jqp0i.cjs`),b=require(`./MTreeView-1IqmVPMv.cjs`),x=require(`./MDropdownMenu-hXaIMkAj.cjs`),S=require(`./MPagination-DTqT33Mx.cjs`);require(`./core-DBpQf3uY.cjs`);let C=require(`react`),w=require(`react/jsx-runtime`);function T(e){if(typeof e==`string`)return e;if(typeof e==`function`){let t=e;return t.displayName??t.name??``}if(typeof e==`object`&&e){let t=e;return t.displayName??t.render?.displayName??t.render?.name??``}return``}function E(e){if(e.props.color!==void 0)return!1;if(e.type===l.t)return!0;let t=T(e.type);return t.startsWith(`M`)&&t.endsWith(`Icon`)}function D(e,t){return t?C.Children.map(e,e=>{if(!(0,C.isValidElement)(e))return e;let n=e,r=n.props,i=r.children?D(r.children,t):r.children,a={};return i!==r.children&&(a.children=i),E(n)&&(a.color=t),Object.keys(a).length?(0,C.cloneElement)(n,a):n}):e}function O({component:e,to:n,href:i,target:a,rel:o,color:s,interactive:c=!0,clickEffect:l,rippleColor:u,className:d,children:f,onPointerDown:p,type:m,...g}){let{component:_,href:v,to:y,isInteractive:b}=h.a({component:e,href:i,to:n,interactive:c,hasClickHandler:!!g.onClick,hasPointerHandler:!!p,fallbackComponent:`button`}),{effectClassName:x,effectLayer:S,handlePointerDown:C}=r.t({effect:l??(b?`ripple`:`none`),disabled:!b,color:u});return(0,w.jsxs)(_,{href:_===`a`||e?v:void 0,to:y,target:a,rel:o,type:_===`button`?m??`button`:void 0,className:t.t(`card-action-area`,s&&`color-${s}`,b&&`interactive`,x,d),onPointerDown:e=>{C(e),p?.(e)},...g,children:[S,(0,w.jsx)(`span`,{className:`card-action-area-content`,children:D(f,s)})]})}function k(e){let t=e.replace(/\D/g,``);return t.length<=4?t:`\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 ${t.slice(-4)}`}function A({component:e,to:i,href:a,target:o,rel:s,holder:c,number:l,expiry:u,brand:d,brandIcon:f,balance:p,balanceLabel:m=`Current balance`,color:g,interactive:_=!1,clickEffect:v,rippleColor:y,className:b,onPointerDown:x,...S}){let C=n.n(l),T=d??C.brand,E=n.t.find(e=>e.brand===T)??C,D=k(l),O=E.iconLabel,{component:A,href:j,to:M,isInteractive:N}=h.a({component:e,href:a,to:i,interactive:_,hasClickHandler:!!S.onClick,hasPointerHandler:!!x}),{effectClassName:P,effectLayer:F,handlePointerDown:I}=r.t({effect:v??(N?`ripple`:`none`),disabled:!N,color:y});return(0,w.jsxs)(A,{href:A===`a`||e?j:void 0,to:M,target:o,rel:s,className:t.t(`card-payment`,g||`primary`,N&&`interactive`,P,b),onPointerDown:e=>{I(e),x?.(e)},...S,children:[F,p!==void 0&&(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`cp-balance-label`,children:m}),(0,w.jsx)(`p`,{className:`cp-balance`,children:p})]}),(0,w.jsxs)(`div`,{className:`cp-row`,children:[(0,w.jsx)(`span`,{className:t.t(`cp-brand`,!f&&T),children:f??O}),(0,w.jsx)(`span`,{className:`cp-number`,children:D})]}),(0,w.jsxs)(`div`,{className:`cp-details`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`cp-field-label`,children:`MCard holder`}),(0,w.jsx)(`p`,{className:`cp-field-value`,children:c})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`cp-field-label`,children:`Expiration date`}),(0,w.jsx)(`p`,{className:`cp-field-value`,children:u})]})]})]})}function j(e){return n.t.find(t=>t.brand===e)?.iconLabel??`CARD`}function M({title:n=`Your payment methods`,actionLabel:r=`Change`,actionHref:i=`#`,onAction:s,brand:l=`visa`,brandIcon:u,last4:f,badgeLabel:p,summary:m,helperText:h=`All fields are required, unless stated otherwise.`,expiryLabel:_=`Expiration date`,cvcLabel:v=`Security code`,expiryProps:y,cvcProps:b,color:x,className:S,...C}){let T=y?.value??y?.defaultValue,E=p===void 0?`Default`:p,D=T?`Credit card - Expiration date ${String(T).replace(`/`,`.`)}`:`Credit card`,O=m===void 0?D:m,k=j(l),A={clearable:!0,...y};return(0,w.jsxs)(`div`,{className:t.t(`card-payment-method`,x||`primary`,S),...C,children:[(0,w.jsxs)(`div`,{className:`cpm-header`,children:[(0,w.jsx)(`h3`,{className:`cpm-title`,children:n}),(0,w.jsxs)(c.t,{href:i,tone:`accent`,underline:`none`,className:`cpm-action`,onClick:e=>{s&&(e.preventDefault(),s())},children:[r,(0,w.jsx)(e.zi,{})]})]}),(0,w.jsxs)(`div`,{className:`cpm-surface`,children:[(0,w.jsxs)(`div`,{className:`cpm-method`,children:[(0,w.jsxs)(a.n,{align:`center`,className:`cpm-method-row`,children:[(0,w.jsx)(`span`,{className:t.t(`cpm-brand`,!u&&l),children:u??k}),(0,w.jsx)(`span`,{className:`cpm-last4`,children:`\u2022\u2022\u2022\u2022 ${f}`}),E&&(0,w.jsx)(d.n,{color:`info`,children:E})]}),O&&(0,w.jsx)(o.t,{tone:`muted`,className:`cpm-summary`,children:O})]}),h&&(0,w.jsx)(o.t,{tone:`muted`,size:`sm`,className:`cpm-helper`,children:h}),(0,w.jsxs)(`div`,{className:`cpm-fields`,children:[(0,w.jsx)(g.n,{label:_,placeholder:`MM/YYYY`,fullWidth:!0,...A}),(0,w.jsx)(g.t,{label:v,placeholder:`123`,fullWidth:!0,...b})]})]})]})}function N({variant:n,title:r,description:i,price:a,currency:o=`PLN`,duration:s,available:c,image:u,gallery:f,galleryAutoPlay:p=!1,rating:m,reviewCount:h,favorite:g,onFavorite:y,menuItems:b,onAddToCart:S,actionLabel:T,icon:E,color:D=`primary`,leader:O,participants:k,maxParticipants:A,quantity:j,onQuantityChange:M,showQuantity:N=!0,date:P,location:F,status:I,className:L,...R}){let[z,B]=(0,C.useState)(0),[V,H]=(0,C.useState)(!1),[U,W]=(0,C.useState)(1),G=j??U,K=f&&f.length>0?f:u?[u]:[];(0,C.useEffect)(()=>{z>=K.length&&B(0)},[z,K.length]),(0,C.useEffect)(()=>{if(!V)return;let e=window.setTimeout(()=>{H(!1)},220);return()=>window.clearTimeout(e)},[z,V]);function q(e){e===z||e<0||e>=K.length||(K.length>1&&H(!0),B(e))}(0,C.useEffect)(()=>{if(!p||K.length<=1)return;let e=window.setInterval(()=>{H(!0),B(e=>(e+1)%K.length)},3500);return()=>window.clearInterval(e)},[p,K.length]);function ee(e){let t=Math.max(1,e);M?M(t):W(t)}let J=c===!0?`Available`:c===!1?`Unavailable`:typeof c==`number`?`${c} spots`:null,Y=P?P instanceof Date?P:new Date(P):null,te=Y?Y.getDate():null,ne=Y?Y.toLocaleString(`en`,{month:`short`}).toUpperCase():null;return(0,w.jsxs)(`div`,{className:t.t(`card-service`,n,`color-${D}`,L),...R,children:[K.length>0&&(0,w.jsxs)(`div`,{className:`cs-gallery`,children:[(0,w.jsx)(`img`,{src:K[z],alt:r,className:t.t(`cs-image`,V&&`is-transitioning`)}),K.length>1&&(0,w.jsx)(`div`,{className:`cs-gallery-dots`,children:K.map((e,n)=>(0,w.jsx)(`button`,{type:`button`,className:t.t(`cs-dot`,n===z&&`active`),onClick:()=>q(n),"aria-label":`Image ${n+1}`},n))}),(y||b&&b.length>0)&&(0,w.jsxs)(`div`,{className:`cs-gallery-actions`,children:[b&&b.length>0&&(0,w.jsx)(x.i,{className:`cs-menu-wrap`,trigger:(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,"aria-label":`More options`,className:`cs-overlay-btn`,children:(0,w.jsx)(e.Xn,{})}),placement:`bottom-end`,children:b.map((e,t)=>(0,w.jsx)(x.r,{icon:e.icon,color:e.danger?`error`:void 0,label:e.label,onClick:e.onClick},t))}),y&&(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,onClick:y,"aria-label":g?`Remove from favorites`:`Add to favorites`,className:t.t(`cs-overlay-btn`,g&&`cs-fav-active`),children:g?(0,w.jsx)(e.nr,{}):(0,w.jsx)(e.rr,{})})]})]}),(0,w.jsxs)(`div`,{className:`cs-body`,children:[n===`event`&&Y&&(0,w.jsxs)(`div`,{className:`cs-event-header`,children:[(0,w.jsxs)(`div`,{className:`cs-date-block`,children:[(0,w.jsx)(`span`,{className:`cs-date-day`,children:te}),(0,w.jsx)(`span`,{className:`cs-date-month`,children:ne})]}),(0,w.jsxs)(`div`,{className:`cs-event-info`,children:[(0,w.jsx)(`h3`,{className:`cs-title`,children:r}),i&&(0,w.jsx)(`p`,{className:`cs-desc`,children:i})]})]}),n!==`event`&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`cs-top`,children:[E&&(0,w.jsx)(`span`,{className:`cs-icon`,children:E}),(0,w.jsx)(`h3`,{className:`cs-title`,children:r})]}),i&&(0,w.jsx)(`p`,{className:`cs-desc`,children:i})]}),n===`event`&&!Y&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`cs-top`,children:[E&&(0,w.jsx)(`span`,{className:`cs-icon`,children:E}),(0,w.jsx)(`h3`,{className:`cs-title`,children:r})]}),i&&(0,w.jsx)(`p`,{className:`cs-desc`,children:i})]}),m!==void 0&&(0,w.jsxs)(`div`,{className:`cs-rating`,children:[(0,w.jsx)(v.n,{value:Math.round(m),size:`sm`,color:`warning`,readOnly:!0,className:`cs-stars`}),(0,w.jsx)(`span`,{className:`cs-rating-value`,children:m.toFixed(1)}),h!==void 0&&(0,w.jsxs)(`span`,{className:`cs-review-count`,children:[`(`,h,`)`]})]}),O&&(0,w.jsxs)(`div`,{className:`cs-leader`,children:[(0,w.jsx)(_.t,{src:O.avatar,name:O.name,size:28,color:D}),(0,w.jsx)(`span`,{className:`cs-leader-name`,children:O.name})]}),n===`course`&&k&&(0,w.jsxs)(`div`,{className:`cs-participants`,children:[(0,w.jsx)(`div`,{className:`cs-participants-avatars`,children:k.slice(0,4).map((e,t)=>(0,w.jsx)(_.t,{src:e.avatar,name:e.name,size:28,color:D,className:`cs-participant-avatar`},`${e.name}-${t}`))}),A&&(0,w.jsxs)(`span`,{className:`cs-spots`,children:[k.length,`/`,A]})]}),(0,w.jsxs)(`div`,{className:`cs-meta`,children:[n===`event`&&F&&(0,w.jsx)(d.n,{size:`xs`,color:D,children:F}),s&&(0,w.jsx)(d.n,{size:`xs`,color:D,icon:(0,w.jsx)(e.Ni,{}),children:s}),n===`event`&&I&&(0,w.jsx)(d.n,{size:`xs`,color:I.toLowerCase()===`sold out`?`error`:D,children:I}),J&&n!==`event`&&(0,w.jsx)(d.n,{size:`xs`,color:c===!1?`error`:D,children:J})]})]}),(0,w.jsxs)(`div`,{className:`cs-footer`,children:[a!==void 0&&(0,w.jsxs)(`span`,{className:`cs-price`,children:[typeof a==`number`?a.toFixed(2):a,` `,(0,w.jsx)(`span`,{className:`cs-currency`,children:o})]}),(0,w.jsxs)(`div`,{className:`cs-actions`,children:[n===`product`&&S&&N&&(0,w.jsxs)(`div`,{className:`cs-qty`,children:[(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,size:`sm`,onClick:()=>ee(G-1),"aria-label":`Decrease`,className:`cs-qty-btn`,children:(0,w.jsx)(e.Or,{})}),(0,w.jsx)(`span`,{className:`cs-qty-value`,children:G}),(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,size:`sm`,onClick:()=>ee(G+1),"aria-label":`Increase`,className:`cs-qty-btn`,children:(0,w.jsx)(e.kr,{})})]}),S&&(0,w.jsx)(l.t,{variant:`filled`,size:`sm`,color:D,onClick:()=>S(G),disabled:c===!1,className:`cs-cart-btn`,children:T??(n===`event`?`Register`:`Add to cart`)})]})]})]})}function P(e){let{onAction:t,actionLabel:n=`Book now`,...r}=e;return(0,w.jsx)(N,{variant:`service`,onAddToCart:t?()=>t():void 0,actionLabel:n,...r})}function F(e){let{onAction:t,actionLabel:n=`Join course`,...r}=e;return(0,w.jsx)(N,{variant:`course`,onAddToCart:t?()=>t():void 0,actionLabel:n,...r})}function I({component:n,title:i,description:a,icon:o,color:s=`primary`,to:c,href:u,target:d,rel:f,onClick:p,interactive:m=!1,clickEffect:g,rippleColor:_,image:v,video:y,illustration:b,camera:S,mediaFill:T=!1,overlayPosition:E=`bottom`,favorite:D,onFavorite:O,menuItems:k,className:A,...j}){let M=(0,C.useRef)(null);(0,C.useEffect)(()=>{if(!S)return;let e=M.current;if(!e||typeof navigator>`u`||!navigator.mediaDevices?.getUserMedia)return;let t=null,n=!1,r=S===!0?{video:!0}:S;return navigator.mediaDevices.getUserMedia(r).then(r=>{if(n){r.getTracks().forEach(e=>e.stop());return}t=r,e.srcObject=r,e.play().catch(()=>void 0)}).catch(()=>void 0),()=>{n=!0,t&&t.getTracks().forEach(e=>e.stop()),e.srcObject=null}},[S]);let N=!!(v||y||b||S),{component:P,href:F,to:I,isInteractive:L,isLink:R}=h.a({component:n,href:u,to:c,interactive:m,hasClickHandler:!!p,fallbackComponent:`button`}),z=T&&N,{effectClassName:B,effectLayer:V,handlePointerDown:H}=r.t({effect:g??(L?`ripple`:`none`),disabled:!L,color:_});function U(e){e.stopPropagation()}function W(e){p&&(e.preventDefault(),p())}function G(){return N?(0,w.jsxs)(`div`,{className:t.t(`tile-media`,z&&`fill`),children:[v&&(0,w.jsx)(`img`,{src:v,alt:i,className:`tile-image`}),y&&(0,w.jsx)(`video`,{src:y,className:`tile-video`,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,"aria-label":i}),S&&(0,w.jsx)(`video`,{ref:M,className:`tile-video`,autoPlay:!0,muted:!0,playsInline:!0,"aria-label":i}),b&&(0,w.jsx)(`div`,{className:`tile-illustration`,children:b}),z&&(0,w.jsx)(`div`,{className:t.t(`tile-scrim`,`scrim-${E}`)})]}):null}function K(){return(0,w.jsxs)(`div`,{className:t.t(`tile-body`,z&&`overlay`,z&&`pos-${E}`),children:[(0,w.jsxs)(`div`,{className:`tile-top`,children:[o&&(0,w.jsx)(`span`,{className:`tile-icon`,children:o}),(0,w.jsx)(`h3`,{className:`tile-title`,children:i})]}),a&&(0,w.jsx)(`p`,{className:`tile-desc`,children:a})]})}let q=O||k&&k.length>0;return(0,w.jsxs)(`div`,{className:t.t(`card-tile`,`color-${s}`,z&&`media-fill`,L&&`interactive`,B,A),onPointerDown:H,...j,children:[V,R&&(0,w.jsx)(P,{href:P===`a`||n?F:void 0,to:I,target:d,rel:f,className:`tile-link`,"aria-label":i,onClick:p?W:void 0}),!R&&p&&(0,w.jsx)(P,{type:`button`,className:`tile-link`,"aria-label":i,onClick:p}),G(),K(),q&&(0,w.jsxs)(`div`,{className:`tile-actions`,onClick:U,onPointerDown:U,children:[k&&k.length>0&&(0,w.jsx)(x.i,{className:`tile-menu-wrap`,trigger:(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,"aria-label":`More options`,className:`tile-overlay-btn`,children:(0,w.jsx)(e.Xn,{})}),placement:`bottom-end`,children:k.map((e,t)=>(0,w.jsx)(x.r,{icon:e.icon,color:e.danger?`error`:void 0,label:e.label,onClick:e.onClick},t))}),O&&(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,onClick:O,"aria-label":D?`Remove from favorites`:`Add to favorites`,className:t.t(`tile-overlay-btn`,D&&`tile-fav-active`),children:D?(0,w.jsx)(e.nr,{}):(0,w.jsx)(e.rr,{})})]})]})}function L(e){let{addToCartLabel:t=`Add to cart`,...n}=e;return(0,w.jsx)(N,{variant:`product`,actionLabel:t,...n})}function R(e){let{onRegister:t,registerLabel:n=`Register`,...r}=e;return(0,w.jsx)(N,{variant:`event`,onAddToCart:t?()=>t():void 0,actionLabel:n,...r})}function z(e,t){return t||(typeof e!=`number`||e===0?`neutral`:e>0?`up`:`down`)}function B(e){return typeof e==`number`&&e>0?`+${e}`:e}function V({component:n,to:i,href:a,target:o,rel:s,title:c,value:l,trend:u,trendType:d,icon:f,color:p=`primary`,helperText:m,interactive:g=!1,clickEffect:_,rippleColor:v,className:y,onPointerDown:b,...x}){let S=u!=null,C=z(u,d),T=B(u),{component:E,href:D,to:O,isInteractive:k}=h.a({component:n,href:a,to:i,interactive:g,hasClickHandler:!!x.onClick,hasPointerHandler:!!b}),{effectClassName:A,effectLayer:j,handlePointerDown:M}=r.t({effect:_??(k?`ripple`:`none`),disabled:!k,color:v});return(0,w.jsxs)(E,{href:E===`a`||n?D:void 0,to:O,target:o,rel:s,className:t.t(`card-widget`,`color-${p}`,k&&`interactive`,A,y),onPointerDown:e=>{M(e),b?.(e)},...x,children:[j,(0,w.jsxs)(`div`,{className:`cw-top`,children:[(0,w.jsxs)(`div`,{className:`cw-meta`,children:[(0,w.jsx)(`span`,{className:`cw-title`,children:c}),(0,w.jsx)(`span`,{className:`cw-value`,children:l})]}),f&&(0,w.jsx)(`span`,{className:`cw-icon`,children:f})]}),S&&(0,w.jsx)(`div`,{className:`cw-bottom`,children:(0,w.jsxs)(`span`,{className:t.t(`cw-trend`,C),children:[C===`up`&&(0,w.jsx)(e.Ri,{size:14}),C===`down`&&(0,w.jsx)(e.Li,{size:14}),(0,w.jsx)(`span`,{children:T})]})}),m&&(0,w.jsx)(`div`,{className:`cw-helper`,children:m})]})}function H(e,t){return t||(typeof e!=`number`||e===0?`neutral`:e>0?`up`:`down`)}function U(e){return typeof e==`number`&&e>0?`+${e}`:e}function W({label:n,value:r,icon:i,badge:s,helperText:c,trend:l,trendType:u,color:d=`primary`,className:f,...p}){let g=l!=null,_=H(l,u);return(0,w.jsx)(h.t,{className:t.t(`stat-card`,`color-${d}`,f),...p,children:(0,w.jsxs)(m.t,{spacing:`md`,children:[(0,w.jsxs)(a.n,{justify:`between`,align:`start`,children:[(0,w.jsxs)(m.t,{spacing:`xs`,children:[(0,w.jsx)(`span`,{className:`stat-card-label`,children:n}),(0,w.jsx)(`span`,{className:`stat-card-value`,children:r})]}),(0,w.jsxs)(a.n,{align:`center`,children:[s,i&&(0,w.jsx)(`span`,{className:`stat-card-icon`,children:i})]})]}),(g||c)&&(0,w.jsxs)(a.n,{justify:`between`,align:`center`,children:[g?(0,w.jsxs)(`span`,{className:t.t(`stat-card-trend`,_),children:[_===`up`&&(0,w.jsx)(e.Ri,{size:14}),_===`down`&&(0,w.jsx)(e.Li,{size:14}),(0,w.jsx)(`span`,{children:U(l)})]}):(0,w.jsx)(`span`,{}),c&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:c})]})]})})}function G(e){if(typeof e==`number`)return{gridTemplateColumns:`repeat(${e}, 1fr)`};let t={};return e.base!==void 0&&(t[`--cols-base`]=e.base),e.sm!==void 0&&(t[`--cols-sm`]=e.sm),e.md!==void 0&&(t[`--cols-md`]=e.md),e.lg!==void 0&&(t[`--cols-lg`]=e.lg),e.xl!==void 0&&(t[`--cols-xl`]=e.xl),e.xxl!==void 0&&(t[`--cols-xxl`]=e.xxl),t}function K(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 q({items:n,renderCard:r,color:a=`primary`,searchable:o=!1,searchKeys:s,searchPlaceholder:c=`Search...`,search:d,onSearchChange:p,filterable:m=!1,filterKeys:h=[],filters:g,onFiltersChange:_,sortable:v=!1,sortKeys:b=[],defaultSort:x,sort:T,onSortChange:E,pagination:D=!1,pageSize:O=12,page:k,onPageChange:A,total:j,manualSearch:M=!1,manualFilters:N=!1,manualSort:P=!1,manualPagination:F=!1,loading:I=!1,loadingLabel:L=`Loading`,scrollOffset:R,columns:z=3,emptyMessage:B=`No results found.`,className:V,style:H,...U}){let[W,q]=(0,C.useState)(``),[ee,J]=(0,C.useState)({}),[Y,te]=(0,C.useState)(x??null),[ne,X]=(0,C.useState)(1),[re,ie]=(0,C.useState)(!1),[ae,oe]=(0,C.useState)(!1),se=(0,C.useRef)(null),ce=(0,C.useRef)(null),le=d===void 0?W:d,Z=g===void 0?ee:g,Q=T===void 0?Y:T,ue=k===void 0?ne:k,de=(0,C.useCallback)(e=>{d===void 0&&q(e),!F&&k===void 0&&X(1),p?.(e)},[d,k,F,p]),fe=(0,C.useCallback)(e=>{g===void 0&&J(e),!F&&k===void 0&&X(1),_?.(e)},[g,k,F,_]),pe=(0,C.useCallback)(e=>{T===void 0&&te(e),!F&&k===void 0&&X(1),E?.(e)},[T,k,F,E]),me=(0,C.useRef)(null),he=(0,C.useCallback)(e=>{k===void 0&&X(e),A?.(e),me.current?.scrollIntoView({block:`start`,behavior:`smooth`})},[k,A]),ge=(0,C.useCallback)(()=>{ie(e=>!e),oe(!1)},[]),_e=(0,C.useCallback)(()=>{oe(e=>!e),ie(!1)},[]),$=(0,C.useMemo)(()=>{let e=n;if(!M&&le&&s&&s.length>0){let t=le.toLowerCase();e=e.filter(e=>s.some(n=>{let r=K(e,n);return r!=null&&String(r).toLowerCase().includes(t)}))}if(!N)for(let[t,n]of Object.entries(Z))!n||n.length===0||(e=e.filter(e=>{let r=K(e,t);return r!=null&&n.includes(String(r))}));return!P&&Q&&(e=[...e].sort((e,t)=>{let n=K(e,Q.key),r=K(t,Q.key);if(n==null&&r==null)return 0;if(n==null)return 1;if(r==null)return-1;let i=String(n).localeCompare(String(r),void 0,{numeric:!0});return Q.direction===`asc`?i:-i})),e===n?[...e]:e},[n,le,s,Z,Q,M,N,P]),ve=F?j??$.length:$.length,ye=(0,C.useMemo)(()=>{if(!D||F)return $;let e=(ue-1)*O;return $.slice(e,e+O)},[$,D,F,ue,O]);function be(e,t){let n=Z[e]??[],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];fe({...Z,[e]:r})}let xe=(0,C.useMemo)(()=>{let e={};for(let t of h){if(t.options){e[t.key]=t.options;continue}let r=new Set;for(let e of n){let n=K(e,t.key);n!=null&&r.add(String(n))}e[t.key]=Array.from(r).sort()}return e},[n,h]),Se=b.find(e=>e.key===Q?.key);return(0,w.jsxs)(`div`,{ref:me,className:t.t(`card-grid`,`color-${a}`,V),style:R===void 0?H:{scrollMarginTop:R,...H},...U,children:[(o||m||v)&&(0,w.jsxs)(`div`,{className:`card-grid-toolbar`,children:[o&&(0,w.jsx)(y.t,{className:`card-grid-search`,size:`sm`,fullWidth:!0,placeholder:c,value:le,onChange:e=>de(e.target.value),onClear:()=>de(``)}),(0,w.jsxs)(`div`,{className:`card-grid-actions`,children:[m&&h.length>0&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(l.t,{ref:se,variant:`outlined`,color:a,size:`sm`,startIcon:(0,w.jsx)(e.Jn,{}),"aria-expanded":re,onClick:ge,children:`Filter`}),(0,w.jsx)(i.t,{open:re,anchorRef:se,onClose:()=>ie(!1),placement:`bottom-end`,className:`card-grid-dropdown`,children:h.map(e=>(0,w.jsxs)(`div`,{className:`card-grid-filter-group`,children:[(0,w.jsx)(`span`,{className:`card-grid-filter-label`,children:e.label}),(xe[e.key]??[]).map(t=>(0,w.jsx)(`div`,{className:`card-grid-filter-option`,children:(0,w.jsx)(u.t,{size:`sm`,clickEffect:`none`,checked:Z[e.key]?.includes(t)??!1,onChange:()=>be(e.key,t),label:t})},t))]},e.key))})]}),v&&b.length>0&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(l.t,{ref:ce,variant:`outlined`,color:a,size:`sm`,startIcon:Q?Q.direction===`asc`?(0,w.jsx)(e.Ri,{}):(0,w.jsx)(e.Li,{}):(0,w.jsx)(e.qn,{}),"aria-expanded":ae,onClick:_e,children:Se?`Sort: ${Se.label}`:`Sort`}),(0,w.jsx)(i.t,{open:ae,anchorRef:ce,onClose:()=>oe(!1),placement:`bottom-end`,className:`card-grid-dropdown`,children:b.map(n=>(0,w.jsxs)(`button`,{type:`button`,className:t.t(`card-grid-sort-item`,Q?.key===n.key&&`active`),onClick:()=>{Q?.key===n.key?pe({key:n.key,direction:Q.direction===`asc`?`desc`:`asc`}):pe({key:n.key,direction:`asc`})},children:[n.label,Q?.key===n.key&&(0,w.jsx)(`span`,{className:`card-grid-sort-dir`,children:Q.direction===`asc`?(0,w.jsx)(e.Ri,{className:`card-grid-sort-icon`}):(0,w.jsx)(e.Li,{className:`card-grid-sort-icon`})})]},n.key))})]})]})]}),(0,w.jsxs)(`div`,{className:t.t(`card-grid-body`,I&&`loading`),"aria-busy":I||void 0,children:[ye.length>0?(0,w.jsx)(`div`,{className:`card-grid-items`,style:G(z),children:ye.map((e,t)=>{let n=e?.id;return(0,w.jsx)(C.Fragment,{children:r(e,t)},n??t)})}):(0,w.jsx)(`div`,{className:`card-grid-empty`,children:B}),I&&(0,w.jsx)(`div`,{className:`card-grid-loading`,role:`status`,"aria-live":`polite`,children:(0,w.jsx)(f.t,{center:!1,minHeight:`auto`,color:a,label:L})})]}),D&&ve>O&&(0,w.jsx)(`div`,{className:`card-grid-pagination`,children:(0,w.jsx)(S.t,{total:ve,page:ue,pageSize:O,onChange:he})})]})}function ee({title:e=`Today`,description:t,color:n=`primary`,workdayStart:r,workdayEnd:i,timeline:c,summary:l,tabs:u=[],footer:d,emptyTimeline:f=(0,w.jsx)(o.t,{tone:`muted`,children:`No events scheduled for this day.`}),...g}){let _=r&&i?`${r}-${i}`:r??i??void 0,y=u.filter(e=>e.items.length>0);return(0,w.jsxs)(h.t,{color:n,...g,children:[(0,w.jsx)(h.i,{children:(0,w.jsxs)(m.t,{children:[(0,w.jsx)(s.t,{level:4,children:e}),(t||_)&&(0,w.jsxs)(o.t,{size:`sm`,tone:`muted`,children:[t,t&&_?` `:null,_]})]})}),(0,w.jsx)(h.n,{children:(0,w.jsxs)(p.t,{type:`row`,align:`start`,children:[(0,w.jsx)(p.t,{type:`col`,xl:7,sm:12,children:c.length?(0,w.jsx)(m.t,{className:`day-schedule-card-timeline`,children:c.map(e=>(0,w.jsxs)(a.n,{align:`start`,className:`day-schedule-card-entry`,children:[(0,w.jsx)(`span`,{className:`day-schedule-card-time`,children:e.time}),(0,w.jsx)(`div`,{className:`day-schedule-card-dot`,"data-color":e.color??n,children:D(e.icon,e.color??n)}),(0,w.jsxs)(`div`,{className:`day-schedule-card-copy`,children:[(0,w.jsx)(o.t,{as:`strong`,children:e.title}),e.description&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:e.description})]})]},e.id))}):f}),(0,w.jsx)(p.t,{type:`col`,xl:5,sm:12,children:(0,w.jsxs)(m.t,{className:`day-schedule-card-side`,children:[l,y.length>0&&(0,w.jsx)(p.r,{variant:`underline`,size:`sm`,fullWidth:!0,defaultValue:y[0].type,items:y.map(e=>({value:e.type,label:(0,w.jsxs)(`span`,{className:`day-schedule-card-tab-label`,children:[(0,w.jsx)(`span`,{children:e.title}),(0,w.jsx)(`span`,{className:`day-schedule-card-tab-count`,children:e.items.length})]}),content:(0,w.jsx)(v.t,{items:e.items})}))})]})})]})}),d&&(0,w.jsx)(h.r,{children:D(d,n)})]})}function J({title:t=`Documents`,description:n,color:r=`primary`,items:i,selected:c,onSelect:u,defaultExpanded:d,expanded:f,onExpandChange:g,detailsTitle:_,detailsMeta:y,detailsItems:S=[],detailsActions:C=[],renderDetails:T,emptyDetails:E=(0,w.jsx)(o.t,{tone:`muted`,children:`Select a document to inspect its details.`}),primaryAction:O,...k}){let A=e=>({...e,icon:D(e.icon,r),children:e.children?.map(A)}),j=i.map(A);return(0,w.jsxs)(h.t,{stretch:!1,color:r,...k,children:[(0,w.jsx)(h.i,{children:(0,w.jsxs)(a.n,{justify:`between`,align:`center`,children:[(0,w.jsxs)(m.t,{children:[(0,w.jsx)(s.t,{level:4,children:t}),n&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:n})]}),D(O,r)]})}),(0,w.jsx)(h.n,{children:(0,w.jsxs)(p.t,{type:`row`,align:`start`,children:[(0,w.jsx)(p.t,{type:`col`,xl:7,sm:12,children:(0,w.jsx)(b.t,{items:j,color:r,defaultExpanded:d,expanded:f,onExpandChange:g,selected:c,onSelect:u,expandable:!0,selectable:!0,showLines:!0,fileIcons:!0})}),(0,w.jsx)(p.t,{type:`col`,xl:5,sm:12,children:(0,w.jsxs)(m.t,{padding:`sm`,children:[(_||y||C.length>0)&&(0,w.jsxs)(a.n,{justify:`between`,align:`start`,children:[(0,w.jsxs)(m.t,{children:[_&&(0,w.jsx)(s.t,{level:5,children:_}),y&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:y})]}),C.length>0&&(0,w.jsx)(x.i,{placement:`bottom-end`,trigger:(0,w.jsx)(l.t,{variant:`ghost`,color:r,iconOnly:!0,shape:`circle`,"aria-label":`Open document actions`,children:(0,w.jsx)(e.Xn,{})}),children:C.map(e=>(0,w.jsx)(x.r,{icon:D(e.icon,e.color??r),label:e.label,color:e.color??r,disabled:e.disabled,component:e.component,href:e.href,to:e.to,onClick:e.onClick},e.id))})]}),T||(S.length?(0,w.jsx)(v.t,{items:S}):E)]})})]})})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return P}});
|
|
2
|
-
//# sourceMappingURL=cards-
|
|
1
|
+
const e=require(`./icons-D675Im0B.cjs`),t=require(`./cn-CU5TNITO.cjs`),n=require(`./creditCards-D_HwRUBz.cjs`),r=require(`./useInteractionEffect-DFTdcWHl.cjs`),i=require(`./MPopover-CV-9MArH.cjs`),a=require(`./MSurface-CYeVFOw_.cjs`),o=require(`./MText-j6Zbbj5Y.cjs`),s=require(`./MHeading-BLnb3dNv.cjs`),c=require(`./MLink-Biipj7xz.cjs`),l=require(`./MButton-R08y1HCT.cjs`),u=require(`./MCheckbox-CM5HJQWW.cjs`),d=require(`./MSkeleton-CLSU5pL6.cjs`),f=require(`./MLoader-XcpKlLrd.cjs`),p=require(`./MGrid-B_0kFUws.cjs`),m=require(`./MStack-BP_BUeCc.cjs`),h=require(`./MCard-1OVOl4Ql.cjs`),g=require(`./MInputCVC-BlY5OrVn.cjs`),_=require(`./MAvatar-bUWENcq-.cjs`),v=require(`./MDetailList-DTLU7HQZ.cjs`),y=require(`./MInputSearch-9wcXlY8-.cjs`),b=require(`./MTreeView-DuQkm0ZV.cjs`),x=require(`./MDropdownMenu-BvN5grK5.cjs`),S=require(`./MPagination-C6QQdEj_.cjs`);require(`./core-DBpQf3uY.cjs`);let C=require(`react`),w=require(`react/jsx-runtime`);function T(e){if(typeof e==`string`)return e;if(typeof e==`function`){let t=e;return t.displayName??t.name??``}if(typeof e==`object`&&e){let t=e;return t.displayName??t.render?.displayName??t.render?.name??``}return``}function E(e){if(e.props.color!==void 0)return!1;if(e.type===l.t)return!0;let t=T(e.type);return t.startsWith(`M`)&&t.endsWith(`Icon`)}function D(e,t){return t?C.Children.map(e,e=>{if(!(0,C.isValidElement)(e))return e;let n=e,r=n.props,i=r.children?D(r.children,t):r.children,a={};return i!==r.children&&(a.children=i),E(n)&&(a.color=t),Object.keys(a).length?(0,C.cloneElement)(n,a):n}):e}function O({component:e,to:n,href:i,target:a,rel:o,color:s,interactive:c=!0,clickEffect:l,rippleColor:u,className:d,children:f,onPointerDown:p,type:m,...g}){let{component:_,href:v,to:y,isInteractive:b}=h.a({component:e,href:i,to:n,interactive:c,hasClickHandler:!!g.onClick,hasPointerHandler:!!p,fallbackComponent:`button`}),{effectClassName:x,effectLayer:S,handlePointerDown:C}=r.t({effect:l??(b?`ripple`:`none`),disabled:!b,color:u});return(0,w.jsxs)(_,{href:_===`a`||e?v:void 0,to:y,target:a,rel:o,type:_===`button`?m??`button`:void 0,className:t.t(`card-action-area`,s&&`color-${s}`,b&&`interactive`,x,d),onPointerDown:e=>{C(e),p?.(e)},...g,children:[S,(0,w.jsx)(`span`,{className:`card-action-area-content`,children:D(f,s)})]})}function k(e){let t=e.replace(/\D/g,``);return t.length<=4?t:`\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 ${t.slice(-4)}`}function A({component:e,to:i,href:a,target:o,rel:s,holder:c,number:l,expiry:u,brand:d,brandIcon:f,balance:p,balanceLabel:m=`Current balance`,color:g,interactive:_=!1,clickEffect:v,rippleColor:y,className:b,onPointerDown:x,...S}){let C=n.n(l),T=d??C.brand,E=n.t.find(e=>e.brand===T)??C,D=k(l),O=E.iconLabel,{component:A,href:j,to:M,isInteractive:N}=h.a({component:e,href:a,to:i,interactive:_,hasClickHandler:!!S.onClick,hasPointerHandler:!!x}),{effectClassName:P,effectLayer:F,handlePointerDown:I}=r.t({effect:v??(N?`ripple`:`none`),disabled:!N,color:y});return(0,w.jsxs)(A,{href:A===`a`||e?j:void 0,to:M,target:o,rel:s,className:t.t(`card-payment`,g||`primary`,N&&`interactive`,P,b),onPointerDown:e=>{I(e),x?.(e)},...S,children:[F,p!==void 0&&(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`cp-balance-label`,children:m}),(0,w.jsx)(`p`,{className:`cp-balance`,children:p})]}),(0,w.jsxs)(`div`,{className:`cp-row`,children:[(0,w.jsx)(`span`,{className:t.t(`cp-brand`,!f&&T),children:f??O}),(0,w.jsx)(`span`,{className:`cp-number`,children:D})]}),(0,w.jsxs)(`div`,{className:`cp-details`,children:[(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`cp-field-label`,children:`MCard holder`}),(0,w.jsx)(`p`,{className:`cp-field-value`,children:c})]}),(0,w.jsxs)(`div`,{children:[(0,w.jsx)(`p`,{className:`cp-field-label`,children:`Expiration date`}),(0,w.jsx)(`p`,{className:`cp-field-value`,children:u})]})]})]})}function j(e){return n.t.find(t=>t.brand===e)?.iconLabel??`CARD`}function M({title:n=`Your payment methods`,actionLabel:r=`Change`,actionHref:i=`#`,onAction:s,brand:l=`visa`,brandIcon:u,last4:f,badgeLabel:p,summary:m,helperText:h=`All fields are required, unless stated otherwise.`,expiryLabel:_=`Expiration date`,cvcLabel:v=`Security code`,expiryProps:y,cvcProps:b,color:x,className:S,...C}){let T=y?.value??y?.defaultValue,E=p===void 0?`Default`:p,D=T?`Credit card - Expiration date ${String(T).replace(`/`,`.`)}`:`Credit card`,O=m===void 0?D:m,k=j(l),A={clearable:!0,...y};return(0,w.jsxs)(`div`,{className:t.t(`card-payment-method`,x||`primary`,S),...C,children:[(0,w.jsxs)(`div`,{className:`cpm-header`,children:[(0,w.jsx)(`h3`,{className:`cpm-title`,children:n}),(0,w.jsxs)(c.t,{href:i,tone:`accent`,underline:`none`,className:`cpm-action`,onClick:e=>{s&&(e.preventDefault(),s())},children:[r,(0,w.jsx)(e.Ui,{})]})]}),(0,w.jsxs)(`div`,{className:`cpm-surface`,children:[(0,w.jsxs)(`div`,{className:`cpm-method`,children:[(0,w.jsxs)(a.n,{align:`center`,className:`cpm-method-row`,children:[(0,w.jsx)(`span`,{className:t.t(`cpm-brand`,!u&&l),children:u??k}),(0,w.jsx)(`span`,{className:`cpm-last4`,children:`\u2022\u2022\u2022\u2022 ${f}`}),E&&(0,w.jsx)(d.n,{color:`info`,children:E})]}),O&&(0,w.jsx)(o.t,{tone:`muted`,className:`cpm-summary`,children:O})]}),h&&(0,w.jsx)(o.t,{tone:`muted`,size:`sm`,className:`cpm-helper`,children:h}),(0,w.jsxs)(`div`,{className:`cpm-fields`,children:[(0,w.jsx)(g.n,{label:_,placeholder:`MM/YYYY`,fullWidth:!0,...A}),(0,w.jsx)(g.t,{label:v,placeholder:`123`,fullWidth:!0,...b})]})]})]})}function N({variant:n,title:r,description:i,price:a,currency:o=`PLN`,duration:s,available:c,image:u,gallery:f,galleryAutoPlay:p=!1,rating:m,reviewCount:h,favorite:g,onFavorite:y,menuItems:b,onAddToCart:S,actionLabel:T,icon:E,color:D=`primary`,leader:O,participants:k,maxParticipants:A,quantity:j,onQuantityChange:M,showQuantity:N=!0,date:P,location:F,status:I,className:L,...R}){let[z,B]=(0,C.useState)(0),[V,H]=(0,C.useState)(!1),[U,W]=(0,C.useState)(1),G=j??U,K=f&&f.length>0?f:u?[u]:[];(0,C.useEffect)(()=>{z>=K.length&&B(0)},[z,K.length]),(0,C.useEffect)(()=>{if(!V)return;let e=window.setTimeout(()=>{H(!1)},220);return()=>window.clearTimeout(e)},[z,V]);function q(e){e===z||e<0||e>=K.length||(K.length>1&&H(!0),B(e))}(0,C.useEffect)(()=>{if(!p||K.length<=1)return;let e=window.setInterval(()=>{H(!0),B(e=>(e+1)%K.length)},3500);return()=>window.clearInterval(e)},[p,K.length]);function ee(e){let t=Math.max(1,e);M?M(t):W(t)}let J=c===!0?`Available`:c===!1?`Unavailable`:typeof c==`number`?`${c} spots`:null,Y=P?P instanceof Date?P:new Date(P):null,te=Y?Y.getDate():null,ne=Y?Y.toLocaleString(`en`,{month:`short`}).toUpperCase():null;return(0,w.jsxs)(`div`,{className:t.t(`card-service`,n,`color-${D}`,L),...R,children:[K.length>0&&(0,w.jsxs)(`div`,{className:`cs-gallery`,children:[(0,w.jsx)(`img`,{src:K[z],alt:r,className:t.t(`cs-image`,V&&`is-transitioning`)}),K.length>1&&(0,w.jsx)(`div`,{className:`cs-gallery-dots`,children:K.map((e,n)=>(0,w.jsx)(`button`,{type:`button`,className:t.t(`cs-dot`,n===z&&`active`),onClick:()=>q(n),"aria-label":`Image ${n+1}`},n))}),(y||b&&b.length>0)&&(0,w.jsxs)(`div`,{className:`cs-gallery-actions`,children:[b&&b.length>0&&(0,w.jsx)(x.i,{className:`cs-menu-wrap`,trigger:(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,"aria-label":`More options`,className:`cs-overlay-btn`,children:(0,w.jsx)(e.Xn,{})}),placement:`bottom-end`,children:b.map((e,t)=>(0,w.jsx)(x.r,{icon:e.icon,color:e.danger?`error`:void 0,label:e.label,onClick:e.onClick},t))}),y&&(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,onClick:y,"aria-label":g?`Remove from favorites`:`Add to favorites`,className:t.t(`cs-overlay-btn`,g&&`cs-fav-active`),children:g?(0,w.jsx)(e.nr,{}):(0,w.jsx)(e.rr,{})})]})]}),(0,w.jsxs)(`div`,{className:`cs-body`,children:[n===`event`&&Y&&(0,w.jsxs)(`div`,{className:`cs-event-header`,children:[(0,w.jsxs)(`div`,{className:`cs-date-block`,children:[(0,w.jsx)(`span`,{className:`cs-date-day`,children:te}),(0,w.jsx)(`span`,{className:`cs-date-month`,children:ne})]}),(0,w.jsxs)(`div`,{className:`cs-event-info`,children:[(0,w.jsx)(`h3`,{className:`cs-title`,children:r}),i&&(0,w.jsx)(`p`,{className:`cs-desc`,children:i})]})]}),n!==`event`&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`cs-top`,children:[E&&(0,w.jsx)(`span`,{className:`cs-icon`,children:E}),(0,w.jsx)(`h3`,{className:`cs-title`,children:r})]}),i&&(0,w.jsx)(`p`,{className:`cs-desc`,children:i})]}),n===`event`&&!Y&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)(`div`,{className:`cs-top`,children:[E&&(0,w.jsx)(`span`,{className:`cs-icon`,children:E}),(0,w.jsx)(`h3`,{className:`cs-title`,children:r})]}),i&&(0,w.jsx)(`p`,{className:`cs-desc`,children:i})]}),m!==void 0&&(0,w.jsxs)(`div`,{className:`cs-rating`,children:[(0,w.jsx)(v.n,{value:Math.round(m),size:`sm`,color:`warning`,readOnly:!0,className:`cs-stars`}),(0,w.jsx)(`span`,{className:`cs-rating-value`,children:m.toFixed(1)}),h!==void 0&&(0,w.jsxs)(`span`,{className:`cs-review-count`,children:[`(`,h,`)`]})]}),O&&(0,w.jsxs)(`div`,{className:`cs-leader`,children:[(0,w.jsx)(_.t,{src:O.avatar,name:O.name,size:28,color:D}),(0,w.jsx)(`span`,{className:`cs-leader-name`,children:O.name})]}),n===`course`&&k&&(0,w.jsxs)(`div`,{className:`cs-participants`,children:[(0,w.jsx)(`div`,{className:`cs-participants-avatars`,children:k.slice(0,4).map((e,t)=>(0,w.jsx)(_.t,{src:e.avatar,name:e.name,size:28,color:D,className:`cs-participant-avatar`},`${e.name}-${t}`))}),A&&(0,w.jsxs)(`span`,{className:`cs-spots`,children:[k.length,`/`,A]})]}),(0,w.jsxs)(`div`,{className:`cs-meta`,children:[n===`event`&&F&&(0,w.jsx)(d.n,{size:`xs`,color:D,children:F}),s&&(0,w.jsx)(d.n,{size:`xs`,color:D,icon:(0,w.jsx)(e.Li,{}),children:s}),n===`event`&&I&&(0,w.jsx)(d.n,{size:`xs`,color:I.toLowerCase()===`sold out`?`error`:D,children:I}),J&&n!==`event`&&(0,w.jsx)(d.n,{size:`xs`,color:c===!1?`error`:D,children:J})]})]}),(0,w.jsxs)(`div`,{className:`cs-footer`,children:[a!==void 0&&(0,w.jsxs)(`span`,{className:`cs-price`,children:[typeof a==`number`?a.toFixed(2):a,` `,(0,w.jsx)(`span`,{className:`cs-currency`,children:o})]}),(0,w.jsxs)(`div`,{className:`cs-actions`,children:[n===`product`&&S&&N&&(0,w.jsxs)(`div`,{className:`cs-qty`,children:[(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,size:`sm`,onClick:()=>ee(G-1),"aria-label":`Decrease`,className:`cs-qty-btn`,children:(0,w.jsx)(e.Mr,{})}),(0,w.jsx)(`span`,{className:`cs-qty-value`,children:G}),(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,size:`sm`,onClick:()=>ee(G+1),"aria-label":`Increase`,className:`cs-qty-btn`,children:(0,w.jsx)(e.Nr,{})})]}),S&&(0,w.jsx)(l.t,{variant:`filled`,size:`sm`,color:D,onClick:()=>S(G),disabled:c===!1,className:`cs-cart-btn`,children:T??(n===`event`?`Register`:`Add to cart`)})]})]})]})}function P(e){let{onAction:t,actionLabel:n=`Book now`,...r}=e;return(0,w.jsx)(N,{variant:`service`,onAddToCart:t?()=>t():void 0,actionLabel:n,...r})}function F(e){let{onAction:t,actionLabel:n=`Join course`,...r}=e;return(0,w.jsx)(N,{variant:`course`,onAddToCart:t?()=>t():void 0,actionLabel:n,...r})}function I({component:n,title:i,description:a,icon:o,color:s=`primary`,to:c,href:u,target:d,rel:f,onClick:p,interactive:m=!1,clickEffect:g,rippleColor:_,image:v,video:y,illustration:b,camera:S,mediaFill:T=!1,overlayPosition:E=`bottom`,favorite:D,onFavorite:O,menuItems:k,className:A,...j}){let M=(0,C.useRef)(null);(0,C.useEffect)(()=>{if(!S)return;let e=M.current;if(!e||typeof navigator>`u`||!navigator.mediaDevices?.getUserMedia)return;let t=null,n=!1,r=S===!0?{video:!0}:S;return navigator.mediaDevices.getUserMedia(r).then(r=>{if(n){r.getTracks().forEach(e=>e.stop());return}t=r,e.srcObject=r,e.play().catch(()=>void 0)}).catch(()=>void 0),()=>{n=!0,t&&t.getTracks().forEach(e=>e.stop()),e.srcObject=null}},[S]);let N=!!(v||y||b||S),{component:P,href:F,to:I,isInteractive:L,isLink:R}=h.a({component:n,href:u,to:c,interactive:m,hasClickHandler:!!p,fallbackComponent:`button`}),z=T&&N,{effectClassName:B,effectLayer:V,handlePointerDown:H}=r.t({effect:g??(L?`ripple`:`none`),disabled:!L,color:_});function U(e){e.stopPropagation()}function W(e){p&&(e.preventDefault(),p())}function G(){return N?(0,w.jsxs)(`div`,{className:t.t(`tile-media`,z&&`fill`),children:[v&&(0,w.jsx)(`img`,{src:v,alt:i,className:`tile-image`}),y&&(0,w.jsx)(`video`,{src:y,className:`tile-video`,autoPlay:!0,muted:!0,loop:!0,playsInline:!0,"aria-label":i}),S&&(0,w.jsx)(`video`,{ref:M,className:`tile-video`,autoPlay:!0,muted:!0,playsInline:!0,"aria-label":i}),b&&(0,w.jsx)(`div`,{className:`tile-illustration`,children:b}),z&&(0,w.jsx)(`div`,{className:t.t(`tile-scrim`,`scrim-${E}`)})]}):null}function K(){return(0,w.jsxs)(`div`,{className:t.t(`tile-body`,z&&`overlay`,z&&`pos-${E}`),children:[(0,w.jsxs)(`div`,{className:`tile-top`,children:[o&&(0,w.jsx)(`span`,{className:`tile-icon`,children:o}),(0,w.jsx)(`h3`,{className:`tile-title`,children:i})]}),a&&(0,w.jsx)(`p`,{className:`tile-desc`,children:a})]})}let q=O||k&&k.length>0;return(0,w.jsxs)(`div`,{className:t.t(`card-tile`,`color-${s}`,z&&`media-fill`,L&&`interactive`,B,A),onPointerDown:H,...j,children:[V,R&&(0,w.jsx)(P,{href:P===`a`||n?F:void 0,to:I,target:d,rel:f,className:`tile-link`,"aria-label":i,onClick:p?W:void 0}),!R&&p&&(0,w.jsx)(P,{type:`button`,className:`tile-link`,"aria-label":i,onClick:p}),G(),K(),q&&(0,w.jsxs)(`div`,{className:`tile-actions`,onClick:U,onPointerDown:U,children:[k&&k.length>0&&(0,w.jsx)(x.i,{className:`tile-menu-wrap`,trigger:(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,"aria-label":`More options`,className:`tile-overlay-btn`,children:(0,w.jsx)(e.Xn,{})}),placement:`bottom-end`,children:k.map((e,t)=>(0,w.jsx)(x.r,{icon:e.icon,color:e.danger?`error`:void 0,label:e.label,onClick:e.onClick},t))}),O&&(0,w.jsx)(l.t,{variant:`ghost`,iconOnly:!0,shape:`circle`,onClick:O,"aria-label":D?`Remove from favorites`:`Add to favorites`,className:t.t(`tile-overlay-btn`,D&&`tile-fav-active`),children:D?(0,w.jsx)(e.nr,{}):(0,w.jsx)(e.rr,{})})]})]})}function L(e){let{addToCartLabel:t=`Add to cart`,...n}=e;return(0,w.jsx)(N,{variant:`product`,actionLabel:t,...n})}function R(e){let{onRegister:t,registerLabel:n=`Register`,...r}=e;return(0,w.jsx)(N,{variant:`event`,onAddToCart:t?()=>t():void 0,actionLabel:n,...r})}function z(e,t){return t||(typeof e!=`number`||e===0?`neutral`:e>0?`up`:`down`)}function B(e){return typeof e==`number`&&e>0?`+${e}`:e}function V({component:n,to:i,href:a,target:o,rel:s,title:c,value:l,trend:u,trendType:d,icon:f,color:p=`primary`,helperText:m,interactive:g=!1,clickEffect:_,rippleColor:v,className:y,onPointerDown:b,...x}){let S=u!=null,C=z(u,d),T=B(u),{component:E,href:D,to:O,isInteractive:k}=h.a({component:n,href:a,to:i,interactive:g,hasClickHandler:!!x.onClick,hasPointerHandler:!!b}),{effectClassName:A,effectLayer:j,handlePointerDown:M}=r.t({effect:_??(k?`ripple`:`none`),disabled:!k,color:v});return(0,w.jsxs)(E,{href:E===`a`||n?D:void 0,to:O,target:o,rel:s,className:t.t(`card-widget`,`color-${p}`,k&&`interactive`,A,y),onPointerDown:e=>{M(e),b?.(e)},...x,children:[j,(0,w.jsxs)(`div`,{className:`cw-top`,children:[(0,w.jsxs)(`div`,{className:`cw-meta`,children:[(0,w.jsx)(`span`,{className:`cw-title`,children:c}),(0,w.jsx)(`span`,{className:`cw-value`,children:l})]}),f&&(0,w.jsx)(`span`,{className:`cw-icon`,children:f})]}),S&&(0,w.jsx)(`div`,{className:`cw-bottom`,children:(0,w.jsxs)(`span`,{className:t.t(`cw-trend`,C),children:[C===`up`&&(0,w.jsx)(e.Hi,{size:14}),C===`down`&&(0,w.jsx)(e.Vi,{size:14}),(0,w.jsx)(`span`,{children:T})]})}),m&&(0,w.jsx)(`div`,{className:`cw-helper`,children:m})]})}function H(e,t){return t||(typeof e!=`number`||e===0?`neutral`:e>0?`up`:`down`)}function U(e){return typeof e==`number`&&e>0?`+${e}`:e}function W({label:n,value:r,icon:i,badge:s,helperText:c,trend:l,trendType:u,color:d=`primary`,className:f,...p}){let g=l!=null,_=H(l,u);return(0,w.jsx)(h.t,{className:t.t(`stat-card`,`color-${d}`,f),...p,children:(0,w.jsxs)(m.t,{spacing:`md`,children:[(0,w.jsxs)(a.n,{justify:`between`,align:`start`,children:[(0,w.jsxs)(m.t,{spacing:`xs`,children:[(0,w.jsx)(`span`,{className:`stat-card-label`,children:n}),(0,w.jsx)(`span`,{className:`stat-card-value`,children:r})]}),(0,w.jsxs)(a.n,{align:`center`,children:[s,i&&(0,w.jsx)(`span`,{className:`stat-card-icon`,children:i})]})]}),(g||c)&&(0,w.jsxs)(a.n,{justify:`between`,align:`center`,children:[g?(0,w.jsxs)(`span`,{className:t.t(`stat-card-trend`,_),children:[_===`up`&&(0,w.jsx)(e.Hi,{size:14}),_===`down`&&(0,w.jsx)(e.Vi,{size:14}),(0,w.jsx)(`span`,{children:U(l)})]}):(0,w.jsx)(`span`,{}),c&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:c})]})]})})}function G(e){if(typeof e==`number`)return{gridTemplateColumns:`repeat(${e}, 1fr)`};let t={};return e.base!==void 0&&(t[`--cols-base`]=e.base),e.sm!==void 0&&(t[`--cols-sm`]=e.sm),e.md!==void 0&&(t[`--cols-md`]=e.md),e.lg!==void 0&&(t[`--cols-lg`]=e.lg),e.xl!==void 0&&(t[`--cols-xl`]=e.xl),e.xxl!==void 0&&(t[`--cols-xxl`]=e.xxl),t}function K(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 q({items:n,renderCard:r,color:a=`primary`,searchable:o=!1,searchKeys:s,searchPlaceholder:c=`Search...`,search:d,onSearchChange:p,filterable:m=!1,filterKeys:h=[],filters:g,onFiltersChange:_,sortable:v=!1,sortKeys:b=[],defaultSort:x,sort:T,onSortChange:E,pagination:D=!1,pageSize:O=12,page:k,onPageChange:A,total:j,manualSearch:M=!1,manualFilters:N=!1,manualSort:P=!1,manualPagination:F=!1,loading:I=!1,loadingLabel:L=`Loading`,scrollOffset:R,columns:z=3,emptyMessage:B=`No results found.`,className:V,style:H,...U}){let[W,q]=(0,C.useState)(``),[ee,J]=(0,C.useState)({}),[Y,te]=(0,C.useState)(x??null),[ne,X]=(0,C.useState)(1),[re,ie]=(0,C.useState)(!1),[ae,oe]=(0,C.useState)(!1),se=(0,C.useRef)(null),ce=(0,C.useRef)(null),le=d===void 0?W:d,Z=g===void 0?ee:g,Q=T===void 0?Y:T,ue=k===void 0?ne:k,de=(0,C.useCallback)(e=>{d===void 0&&q(e),!F&&k===void 0&&X(1),p?.(e)},[d,k,F,p]),fe=(0,C.useCallback)(e=>{g===void 0&&J(e),!F&&k===void 0&&X(1),_?.(e)},[g,k,F,_]),pe=(0,C.useCallback)(e=>{T===void 0&&te(e),!F&&k===void 0&&X(1),E?.(e)},[T,k,F,E]),me=(0,C.useRef)(null),he=(0,C.useCallback)(e=>{k===void 0&&X(e),A?.(e),me.current?.scrollIntoView({block:`start`,behavior:`smooth`})},[k,A]),ge=(0,C.useCallback)(()=>{ie(e=>!e),oe(!1)},[]),_e=(0,C.useCallback)(()=>{oe(e=>!e),ie(!1)},[]),$=(0,C.useMemo)(()=>{let e=n;if(!M&&le&&s&&s.length>0){let t=le.toLowerCase();e=e.filter(e=>s.some(n=>{let r=K(e,n);return r!=null&&String(r).toLowerCase().includes(t)}))}if(!N)for(let[t,n]of Object.entries(Z))!n||n.length===0||(e=e.filter(e=>{let r=K(e,t);return r!=null&&n.includes(String(r))}));return!P&&Q&&(e=[...e].sort((e,t)=>{let n=K(e,Q.key),r=K(t,Q.key);if(n==null&&r==null)return 0;if(n==null)return 1;if(r==null)return-1;let i=String(n).localeCompare(String(r),void 0,{numeric:!0});return Q.direction===`asc`?i:-i})),e===n?[...e]:e},[n,le,s,Z,Q,M,N,P]),ve=F?j??$.length:$.length,ye=(0,C.useMemo)(()=>{if(!D||F)return $;let e=(ue-1)*O;return $.slice(e,e+O)},[$,D,F,ue,O]);function be(e,t){let n=Z[e]??[],r=n.includes(t)?n.filter(e=>e!==t):[...n,t];fe({...Z,[e]:r})}let xe=(0,C.useMemo)(()=>{let e={};for(let t of h){if(t.options){e[t.key]=t.options;continue}let r=new Set;for(let e of n){let n=K(e,t.key);n!=null&&r.add(String(n))}e[t.key]=Array.from(r).sort()}return e},[n,h]),Se=b.find(e=>e.key===Q?.key);return(0,w.jsxs)(`div`,{ref:me,className:t.t(`card-grid`,`color-${a}`,V),style:R===void 0?H:{scrollMarginTop:R,...H},...U,children:[(o||m||v)&&(0,w.jsxs)(`div`,{className:`card-grid-toolbar`,children:[o&&(0,w.jsx)(y.t,{className:`card-grid-search`,size:`sm`,fullWidth:!0,placeholder:c,value:le,onChange:e=>de(e.target.value),onClear:()=>de(``)}),(0,w.jsxs)(`div`,{className:`card-grid-actions`,children:[m&&h.length>0&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(l.t,{ref:se,variant:`outlined`,color:a,size:`sm`,startIcon:(0,w.jsx)(e.Jn,{}),"aria-expanded":re,onClick:ge,children:`Filter`}),(0,w.jsx)(i.t,{open:re,anchorRef:se,onClose:()=>ie(!1),placement:`bottom-end`,className:`card-grid-dropdown`,children:h.map(e=>(0,w.jsxs)(`div`,{className:`card-grid-filter-group`,children:[(0,w.jsx)(`span`,{className:`card-grid-filter-label`,children:e.label}),(xe[e.key]??[]).map(t=>(0,w.jsx)(`div`,{className:`card-grid-filter-option`,children:(0,w.jsx)(u.t,{size:`sm`,clickEffect:`none`,checked:Z[e.key]?.includes(t)??!1,onChange:()=>be(e.key,t),label:t})},t))]},e.key))})]}),v&&b.length>0&&(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(l.t,{ref:ce,variant:`outlined`,color:a,size:`sm`,startIcon:Q?Q.direction===`asc`?(0,w.jsx)(e.Hi,{}):(0,w.jsx)(e.Vi,{}):(0,w.jsx)(e.qn,{}),"aria-expanded":ae,onClick:_e,children:Se?`Sort: ${Se.label}`:`Sort`}),(0,w.jsx)(i.t,{open:ae,anchorRef:ce,onClose:()=>oe(!1),placement:`bottom-end`,className:`card-grid-dropdown`,children:b.map(n=>(0,w.jsxs)(`button`,{type:`button`,className:t.t(`card-grid-sort-item`,Q?.key===n.key&&`active`),onClick:()=>{Q?.key===n.key?pe({key:n.key,direction:Q.direction===`asc`?`desc`:`asc`}):pe({key:n.key,direction:`asc`})},children:[n.label,Q?.key===n.key&&(0,w.jsx)(`span`,{className:`card-grid-sort-dir`,children:Q.direction===`asc`?(0,w.jsx)(e.Hi,{className:`card-grid-sort-icon`}):(0,w.jsx)(e.Vi,{className:`card-grid-sort-icon`})})]},n.key))})]})]})]}),(0,w.jsxs)(`div`,{className:t.t(`card-grid-body`,I&&`loading`),"aria-busy":I||void 0,children:[ye.length>0?(0,w.jsx)(`div`,{className:`card-grid-items`,style:G(z),children:ye.map((e,t)=>{let n=e?.id;return(0,w.jsx)(C.Fragment,{children:r(e,t)},n??t)})}):(0,w.jsx)(`div`,{className:`card-grid-empty`,children:B}),I&&(0,w.jsx)(`div`,{className:`card-grid-loading`,role:`status`,"aria-live":`polite`,children:(0,w.jsx)(f.t,{center:!1,minHeight:`auto`,color:a,label:L})})]}),D&&ve>O&&(0,w.jsx)(`div`,{className:`card-grid-pagination`,children:(0,w.jsx)(S.t,{total:ve,page:ue,pageSize:O,onChange:he})})]})}function ee({title:e=`Today`,description:t,color:n=`primary`,workdayStart:r,workdayEnd:i,timeline:c,summary:l,tabs:u=[],footer:d,emptyTimeline:f=(0,w.jsx)(o.t,{tone:`muted`,children:`No events scheduled for this day.`}),...g}){let _=r&&i?`${r}-${i}`:r??i??void 0,y=u.filter(e=>e.items.length>0);return(0,w.jsxs)(h.t,{color:n,...g,children:[(0,w.jsx)(h.i,{children:(0,w.jsxs)(m.t,{children:[(0,w.jsx)(s.t,{level:4,children:e}),(t||_)&&(0,w.jsxs)(o.t,{size:`sm`,tone:`muted`,children:[t,t&&_?` `:null,_]})]})}),(0,w.jsx)(h.n,{children:(0,w.jsxs)(p.t,{type:`row`,align:`start`,children:[(0,w.jsx)(p.t,{type:`col`,xl:7,sm:12,children:c.length?(0,w.jsx)(m.t,{className:`day-schedule-card-timeline`,children:c.map(e=>(0,w.jsxs)(a.n,{align:`start`,className:`day-schedule-card-entry`,children:[(0,w.jsx)(`span`,{className:`day-schedule-card-time`,children:e.time}),(0,w.jsx)(`div`,{className:`day-schedule-card-dot`,"data-color":e.color??n,children:D(e.icon,e.color??n)}),(0,w.jsxs)(`div`,{className:`day-schedule-card-copy`,children:[(0,w.jsx)(o.t,{as:`strong`,children:e.title}),e.description&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:e.description})]})]},e.id))}):f}),(0,w.jsx)(p.t,{type:`col`,xl:5,sm:12,children:(0,w.jsxs)(m.t,{className:`day-schedule-card-side`,children:[l,y.length>0&&(0,w.jsx)(p.r,{variant:`underline`,size:`sm`,fullWidth:!0,defaultValue:y[0].type,items:y.map(e=>({value:e.type,label:(0,w.jsxs)(`span`,{className:`day-schedule-card-tab-label`,children:[(0,w.jsx)(`span`,{children:e.title}),(0,w.jsx)(`span`,{className:`day-schedule-card-tab-count`,children:e.items.length})]}),content:(0,w.jsx)(v.t,{items:e.items})}))})]})})]})}),d&&(0,w.jsx)(h.r,{children:D(d,n)})]})}function J({title:t=`Documents`,description:n,color:r=`primary`,items:i,selected:c,onSelect:u,defaultExpanded:d,expanded:f,onExpandChange:g,detailsTitle:_,detailsMeta:y,detailsItems:S=[],detailsActions:C=[],renderDetails:T,emptyDetails:E=(0,w.jsx)(o.t,{tone:`muted`,children:`Select a document to inspect its details.`}),primaryAction:O,...k}){let A=e=>({...e,icon:D(e.icon,r),children:e.children?.map(A)}),j=i.map(A);return(0,w.jsxs)(h.t,{stretch:!1,color:r,...k,children:[(0,w.jsx)(h.i,{children:(0,w.jsxs)(a.n,{justify:`between`,align:`center`,children:[(0,w.jsxs)(m.t,{children:[(0,w.jsx)(s.t,{level:4,children:t}),n&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:n})]}),D(O,r)]})}),(0,w.jsx)(h.n,{children:(0,w.jsxs)(p.t,{type:`row`,align:`start`,children:[(0,w.jsx)(p.t,{type:`col`,xl:7,sm:12,children:(0,w.jsx)(b.t,{items:j,color:r,defaultExpanded:d,expanded:f,onExpandChange:g,selected:c,onSelect:u,expandable:!0,selectable:!0,showLines:!0,fileIcons:!0})}),(0,w.jsx)(p.t,{type:`col`,xl:5,sm:12,children:(0,w.jsxs)(m.t,{padding:`sm`,children:[(_||y||C.length>0)&&(0,w.jsxs)(a.n,{justify:`between`,align:`start`,children:[(0,w.jsxs)(m.t,{children:[_&&(0,w.jsx)(s.t,{level:5,children:_}),y&&(0,w.jsx)(o.t,{size:`sm`,tone:`muted`,children:y})]}),C.length>0&&(0,w.jsx)(x.i,{placement:`bottom-end`,trigger:(0,w.jsx)(l.t,{variant:`ghost`,color:r,iconOnly:!0,shape:`circle`,"aria-label":`Open document actions`,children:(0,w.jsx)(e.Xn,{})}),children:C.map(e=>(0,w.jsx)(x.r,{icon:D(e.icon,e.color??r),label:e.label,color:e.color??r,disabled:e.disabled,component:e.component,href:e.href,to:e.to,onClick:e.onClick},e.id))})]}),T||(S.length?(0,w.jsx)(v.t,{items:S}):E)]})})]})})]})}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return P}});
|
|
2
|
+
//# sourceMappingURL=cards-CQSYgH9U.cjs.map
|