@tomaszjarosz/react-visualizers 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/check.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/code-xml.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/copy.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/history.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/keyboard.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/lock.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/pause.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/pen.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/play.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/share-2.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/shield.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/shuffle.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/skip-back.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/skip-forward.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/x.js","../src/shared/CodePanel.tsx","../src/shared/HelpPanel.tsx","../src/shared/ControlPanel.tsx","../src/shared/Legend.tsx","../src/shared/StatusPanel.tsx","../src/shared/ArrayInput.tsx","../src/shared/StepHistory.tsx","../src/shared/ShareButton.tsx","../src/shared/VisualizationArea.tsx","../src/shared/useVisualizerPlayback.ts","../src/shared/useUrlState.ts","../src/shared/constants.ts","../src/visualizers/BinarySearchVisualizer.tsx","../src/visualizers/SortingVisualizer.tsx","../src/visualizers/SortingComparisonVisualizer.tsx","../src/visualizers/DijkstraVisualizer.tsx","../src/visualizers/DPVisualizer.tsx","../src/visualizers/GraphVisualizer.tsx","../src/visualizers/HashMapVisualizer.tsx","../src/visualizers/HashTableVisualizer.tsx","../src/visualizers/LinkedListVisualizer.tsx","../src/visualizers/LinkedHashMapVisualizer.tsx","../src/visualizers/ArrayListVisualizer.tsx","../src/visualizers/ArrayDequeVisualizer.tsx","../src/visualizers/TreeSetVisualizer.tsx","../src/visualizers/EnumSetVisualizer.tsx","../src/visualizers/PriorityQueueVisualizer.tsx","../src/visualizers/ConcurrentHashMapVisualizer.tsx","../src/visualizers/BlockingQueueVisualizer.tsx","../src/visualizers/CopyOnWriteVisualizer.tsx","../src/visualizers/ImmutableCollectionsVisualizer.tsx","../src/visualizers/GCVisualizer.tsx","../src/visualizers/SQLJoinVisualizer.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Check = createLucideIcon(\"Check\", [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]);\n\nexport { Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronDown = createLucideIcon(\"ChevronDown\", [\n [\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]\n]);\n\nexport { ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CodeXml = createLucideIcon(\"CodeXml\", [\n [\"path\", { d: \"m18 16 4-4-4-4\", key: \"1inbqp\" }],\n [\"path\", { d: \"m6 8-4 4 4 4\", key: \"15zrgr\" }],\n [\"path\", { d: \"m14.5 4-5 16\", key: \"e7oirm\" }]\n]);\n\nexport { CodeXml as default };\n//# sourceMappingURL=code-xml.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Copy = createLucideIcon(\"Copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst History = createLucideIcon(\"History\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }],\n [\"path\", { d: \"M12 7v5l4 2\", key: \"1fdv2h\" }]\n]);\n\nexport { History as default };\n//# sourceMappingURL=history.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Keyboard = createLucideIcon(\"Keyboard\", [\n [\"path\", { d: \"M10 8h.01\", key: \"1r9ogq\" }],\n [\"path\", { d: \"M12 12h.01\", key: \"1mp3jc\" }],\n [\"path\", { d: \"M14 8h.01\", key: \"1primd\" }],\n [\"path\", { d: \"M16 12h.01\", key: \"1l6xoz\" }],\n [\"path\", { d: \"M18 8h.01\", key: \"emo2bl\" }],\n [\"path\", { d: \"M6 8h.01\", key: \"x9i8wu\" }],\n [\"path\", { d: \"M7 16h10\", key: \"wp8him\" }],\n [\"path\", { d: \"M8 12h.01\", key: \"czm47f\" }],\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }]\n]);\n\nexport { Keyboard as default };\n//# sourceMappingURL=keyboard.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Lock = createLucideIcon(\"Lock\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n]);\n\nexport { Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pause = createLucideIcon(\"Pause\", [\n [\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"zuxfzm\" }],\n [\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"1okwgv\" }]\n]);\n\nexport { Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pen = createLucideIcon(\"Pen\", [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ]\n]);\n\nexport { Pen as default };\n//# sourceMappingURL=pen.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Play = createLucideIcon(\"Play\", [\n [\"polygon\", { points: \"6 3 20 12 6 21 6 3\", key: \"1oa8hb\" }]\n]);\n\nexport { Play as default };\n//# sourceMappingURL=play.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Search = createLucideIcon(\"Search\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n]);\n\nexport { Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Share2 = createLucideIcon(\"Share2\", [\n [\"circle\", { cx: \"18\", cy: \"5\", r: \"3\", key: \"gq8acd\" }],\n [\"circle\", { cx: \"6\", cy: \"12\", r: \"3\", key: \"w7nqdw\" }],\n [\"circle\", { cx: \"18\", cy: \"19\", r: \"3\", key: \"1xt0gg\" }],\n [\"line\", { x1: \"8.59\", x2: \"15.42\", y1: \"13.51\", y2: \"17.49\", key: \"47mynk\" }],\n [\"line\", { x1: \"15.41\", x2: \"8.59\", y1: \"6.51\", y2: \"10.49\", key: \"1n3mei\" }]\n]);\n\nexport { Share2 as default };\n//# sourceMappingURL=share-2.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"Shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shuffle = createLucideIcon(\"Shuffle\", [\n [\"path\", { d: \"m18 14 4 4-4 4\", key: \"10pe0f\" }],\n [\"path\", { d: \"m18 2 4 4-4 4\", key: \"pucp1d\" }],\n [\"path\", { d: \"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22\", key: \"1ailkh\" }],\n [\"path\", { d: \"M2 6h1.972a4 4 0 0 1 3.6 2.2\", key: \"km57vx\" }],\n [\"path\", { d: \"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45\", key: \"os18l9\" }]\n]);\n\nexport { Shuffle as default };\n//# sourceMappingURL=shuffle.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SkipBack = createLucideIcon(\"SkipBack\", [\n [\"polygon\", { points: \"19 20 9 12 19 4 19 20\", key: \"o2sva\" }],\n [\"line\", { x1: \"5\", x2: \"5\", y1: \"19\", y2: \"5\", key: \"1ocqjk\" }]\n]);\n\nexport { SkipBack as default };\n//# sourceMappingURL=skip-back.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SkipForward = createLucideIcon(\"SkipForward\", [\n [\"polygon\", { points: \"5 4 15 12 5 20 5 4\", key: \"16p6eg\" }],\n [\"line\", { x1: \"19\", x2: \"19\", y1: \"5\", y2: \"19\", key: \"futhcm\" }]\n]);\n\nexport { SkipForward as default };\n//# sourceMappingURL=skip-forward.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","import React from 'react';\nimport { Code2 } from 'lucide-react';\n\ninterface CodePanelProps {\n code: string[];\n activeLine: number;\n variables?: Record<string, string | number>;\n}\n\nexport const CodePanel: React.FC<CodePanelProps> = ({\n code,\n activeLine,\n variables,\n}) => (\n <div className=\"bg-gray-900 rounded-lg p-1.5 text-[11px] font-mono overflow-hidden leading-tight\">\n <div className=\"flex items-center gap-1 mb-1 pb-1 border-b border-gray-700\">\n <Code2 className=\"w-2.5 h-2.5 text-gray-400\" />\n <span className=\"text-gray-400 text-[8px] uppercase tracking-wide\">\n Pseudocode\n </span>\n </div>\n <div>\n {code.map((line, idx) => (\n <div\n key={idx}\n className={`px-0.5 rounded transition-all whitespace-pre ${\n idx === activeLine\n ? 'bg-yellow-500/30 text-yellow-200 border-l border-yellow-400'\n : 'text-gray-400 border-l border-transparent'\n }`}\n >\n <span className=\"text-gray-600 mr-1 select-none text-[9px]\">\n {idx + 1}\n </span>\n {line || ' '}\n </div>\n ))}\n </div>\n {variables && Object.keys(variables).length > 0 && (\n <div className=\"mt-1 pt-1 border-t border-gray-700\">\n <div className=\"text-[8px] text-gray-500 uppercase tracking-wide mb-0.5\">\n Vars\n </div>\n <div className=\"flex flex-wrap gap-0.5\">\n {Object.entries(variables).map(([key, value]) => (\n <span\n key={key}\n className=\"px-0.5 bg-gray-800 rounded text-[9px] text-gray-300\"\n >\n <span className=\"text-blue-400\">{key}</span>\n <span className=\"text-gray-500\">=</span>\n <span className=\"text-green-400\">{value}</span>\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\nexport default CodePanel;\n","import React from 'react';\n\nexport const HelpPanel: React.FC = () => (\n <div className=\"bg-gray-100 rounded-lg p-2 text-[10px]\">\n <div className=\"font-medium text-gray-700 mb-1\">Keyboard Shortcuts</div>\n <div className=\"space-y-0.5 text-gray-600\">\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n P\n </kbd>{' '}\n Play / Pause\n </div>\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n [\n </kbd>{' '}\n Step back\n </div>\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n ]\n </kbd>{' '}\n Step forward\n </div>\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n R\n </kbd>{' '}\n Reset\n </div>\n </div>\n </div>\n);\n\nexport default HelpPanel;\n","import React from 'react';\nimport {\n Play,\n Pause,\n SkipForward,\n SkipBack,\n RotateCcw,\n Shuffle,\n} from 'lucide-react';\n\nexport interface ControlPanelProps {\n isPlaying: boolean;\n currentStep: number;\n totalSteps: number;\n speed: number;\n onPlayPause: () => void;\n onStep: () => void;\n onStepBack: () => void;\n onReset: () => void;\n onSpeedChange: (speed: number) => void;\n onShuffle?: () => void;\n accentColor?:\n | 'indigo'\n | 'orange'\n | 'green'\n | 'purple'\n | 'blue'\n | 'cyan'\n | 'red'\n | 'lime'\n | 'teal'\n | 'violet';\n showShuffle?: boolean;\n shuffleLabel?: string;\n extraControls?: React.ReactNode;\n}\n\nconst ACCENT_COLORS = {\n indigo: {\n playing: 'text-indigo-600',\n playingDot: 'bg-indigo-500',\n button: 'bg-indigo-600 hover:bg-indigo-700',\n buttonActive: 'bg-indigo-500 hover:bg-indigo-600',\n },\n orange: {\n playing: 'text-orange-600',\n playingDot: 'bg-orange-500',\n button: 'bg-orange-600 hover:bg-orange-700',\n buttonActive: 'bg-orange-500 hover:bg-orange-600',\n },\n green: {\n playing: 'text-green-600',\n playingDot: 'bg-green-500',\n button: 'bg-green-600 hover:bg-green-700',\n buttonActive: 'bg-green-500 hover:bg-green-600',\n },\n purple: {\n playing: 'text-purple-600',\n playingDot: 'bg-purple-500',\n button: 'bg-purple-600 hover:bg-purple-700',\n buttonActive: 'bg-purple-500 hover:bg-purple-600',\n },\n blue: {\n playing: 'text-blue-600',\n playingDot: 'bg-blue-500',\n button: 'bg-blue-600 hover:bg-blue-700',\n buttonActive: 'bg-blue-500 hover:bg-blue-600',\n },\n cyan: {\n playing: 'text-cyan-600',\n playingDot: 'bg-cyan-500',\n button: 'bg-cyan-600 hover:bg-cyan-700',\n buttonActive: 'bg-cyan-500 hover:bg-cyan-600',\n },\n red: {\n playing: 'text-red-600',\n playingDot: 'bg-red-500',\n button: 'bg-red-600 hover:bg-red-700',\n buttonActive: 'bg-red-500 hover:bg-red-600',\n },\n lime: {\n playing: 'text-lime-600',\n playingDot: 'bg-lime-500',\n button: 'bg-lime-600 hover:bg-lime-700',\n buttonActive: 'bg-lime-500 hover:bg-lime-600',\n },\n teal: {\n playing: 'text-teal-600',\n playingDot: 'bg-teal-500',\n button: 'bg-teal-600 hover:bg-teal-700',\n buttonActive: 'bg-teal-500 hover:bg-teal-600',\n },\n violet: {\n playing: 'text-violet-600',\n playingDot: 'bg-violet-500',\n button: 'bg-violet-600 hover:bg-violet-700',\n buttonActive: 'bg-violet-500 hover:bg-violet-600',\n },\n};\n\nexport const ControlPanel: React.FC<ControlPanelProps> = ({\n isPlaying,\n currentStep,\n totalSteps,\n speed,\n onPlayPause,\n onStep,\n onStepBack,\n onReset,\n onSpeedChange,\n onShuffle,\n accentColor = 'indigo',\n showShuffle = false,\n shuffleLabel,\n extraControls,\n}) => {\n const colors = ACCENT_COLORS[accentColor];\n\n return (\n <div className=\"flex items-center justify-between flex-wrap gap-3\">\n {/* Playback Controls */}\n <div className=\"flex items-center gap-2\">\n {isPlaying && (\n <span\n className={`flex items-center gap-1 text-xs ${colors.playing} font-medium`}\n >\n <span\n className={`w-2 h-2 ${colors.playingDot} rounded-full animate-pulse`}\n />\n Playing\n </span>\n )}\n <button\n onClick={onPlayPause}\n className={`p-2 text-white rounded-lg transition-colors ${\n isPlaying ? colors.buttonActive : colors.button\n }`}\n title=\"Play/Pause (P)\"\n >\n {isPlaying ? (\n <Pause className=\"w-4 h-4\" />\n ) : (\n <Play className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={onStepBack}\n disabled={isPlaying || currentStep <= 0}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50\"\n title=\"Step Back ([)\"\n >\n <SkipBack className=\"w-4 h-4\" />\n </button>\n <button\n onClick={onStep}\n disabled={isPlaying || currentStep >= totalSteps - 1}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50\"\n title=\"Step Forward (])\"\n >\n <SkipForward className=\"w-4 h-4\" />\n </button>\n <button\n onClick={onReset}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors\"\n title=\"Reset (R)\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </button>\n {showShuffle && onShuffle && (\n <button\n onClick={onShuffle}\n disabled={isPlaying}\n className={`bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50 ${shuffleLabel ? 'px-3 py-2 text-sm' : 'p-2'}`}\n title={shuffleLabel || 'Shuffle'}\n >\n {shuffleLabel || <Shuffle className=\"w-4 h-4\" />}\n </button>\n )}\n </div>\n\n {/* Speed & Extra Controls */}\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Speed</label>\n <input\n type=\"range\"\n min=\"1\"\n max=\"100\"\n value={speed}\n onChange={(e) => onSpeedChange(Number(e.target.value))}\n className=\"w-24 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n {extraControls}\n </div>\n </div>\n );\n};\n\nexport default ControlPanel;\n","import React from 'react';\nimport { Keyboard } from 'lucide-react';\n\nexport interface LegendItem {\n color: string;\n label: string;\n border?: string;\n}\n\nexport interface LegendProps {\n items: LegendItem[];\n showKeyboardHints?: boolean;\n}\n\nexport const Legend: React.FC<LegendProps> = ({\n items,\n showKeyboardHints = true,\n}) => {\n return (\n <div className=\"flex items-center justify-between mt-3 text-xs\">\n <div className=\"flex items-center gap-4 flex-wrap\">\n {items.map((item, index) => (\n <div key={index} className=\"flex items-center gap-1\">\n <div\n className={`w-3 h-3 rounded ${item.color}`}\n style={item.border ? { border: `2px solid ${item.border}` } : {}}\n />\n <span className=\"text-gray-500\">{item.label}</span>\n </div>\n ))}\n </div>\n {showKeyboardHints && (\n <div className=\"flex items-center gap-1 text-gray-400\">\n <Keyboard className=\"w-3 h-3\" />\n <span>P · [ ] · R</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default Legend;\n","import React from 'react';\n\nexport interface StatusPanelProps {\n description: string;\n currentStep: number;\n totalSteps: number;\n variant?: 'default' | 'success' | 'error' | 'warning';\n}\n\nconst VARIANT_STYLES = {\n default: 'text-gray-700',\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-orange-700',\n};\n\nexport const StatusPanel: React.FC<StatusPanelProps> = ({\n description,\n currentStep,\n totalSteps,\n variant = 'default',\n}) => {\n return (\n <div className=\"p-3 bg-gray-50 rounded-lg\">\n <div className={`text-sm font-medium ${VARIANT_STYLES[variant]}`}>\n {description}\n </div>\n <div className=\"mt-1 text-xs text-gray-400\">\n Step {currentStep + 1} / {totalSteps}\n </div>\n </div>\n );\n};\n\nexport default StatusPanel;\n","import React, { useState, useCallback } from 'react';\nimport { Edit2, Check, X } from 'lucide-react';\n\nexport interface ArrayInputProps {\n array: number[];\n onArrayChange: (newArray: number[]) => void;\n disabled?: boolean;\n maxSize?: number;\n minSize?: number;\n maxValue?: number;\n minValue?: number;\n accentColor?: 'indigo' | 'orange' | 'green' | 'purple' | 'blue' | 'cyan' | 'red' | 'lime' | 'teal' | 'violet';\n}\n\nconst ACCENT_COLORS = {\n indigo: 'focus:ring-indigo-500 focus:border-indigo-500',\n orange: 'focus:ring-orange-500 focus:border-orange-500',\n green: 'focus:ring-green-500 focus:border-green-500',\n purple: 'focus:ring-purple-500 focus:border-purple-500',\n blue: 'focus:ring-blue-500 focus:border-blue-500',\n cyan: 'focus:ring-cyan-500 focus:border-cyan-500',\n red: 'focus:ring-red-500 focus:border-red-500',\n lime: 'focus:ring-lime-500 focus:border-lime-500',\n teal: 'focus:ring-teal-500 focus:border-teal-500',\n violet: 'focus:ring-violet-500 focus:border-violet-500',\n};\n\nconst ACCENT_BUTTON_COLORS = {\n indigo: 'bg-indigo-600 hover:bg-indigo-700',\n orange: 'bg-orange-600 hover:bg-orange-700',\n green: 'bg-green-600 hover:bg-green-700',\n purple: 'bg-purple-600 hover:bg-purple-700',\n blue: 'bg-blue-600 hover:bg-blue-700',\n cyan: 'bg-cyan-600 hover:bg-cyan-700',\n red: 'bg-red-600 hover:bg-red-700',\n lime: 'bg-lime-600 hover:bg-lime-700',\n teal: 'bg-teal-600 hover:bg-teal-700',\n violet: 'bg-violet-600 hover:bg-violet-700',\n};\n\nexport const ArrayInput: React.FC<ArrayInputProps> = ({\n array,\n onArrayChange,\n disabled = false,\n maxSize = 20,\n minSize = 3,\n maxValue = 100,\n minValue = 1,\n accentColor = 'indigo',\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleStartEdit = useCallback(() => {\n setInputValue(array.join(', '));\n setIsEditing(true);\n setError(null);\n }, [array]);\n\n const handleCancel = useCallback(() => {\n setIsEditing(false);\n setInputValue('');\n setError(null);\n }, []);\n\n const handleConfirm = useCallback(() => {\n const parts = inputValue\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n const numbers: number[] = [];\n for (const part of parts) {\n const num = parseInt(part, 10);\n if (isNaN(num)) {\n setError(`Invalid number: \"${part}\"`);\n return;\n }\n if (num < minValue || num > maxValue) {\n setError(`Numbers must be between ${minValue} and ${maxValue}`);\n return;\n }\n numbers.push(num);\n }\n\n if (numbers.length < minSize) {\n setError(`At least ${minSize} numbers required`);\n return;\n }\n\n if (numbers.length > maxSize) {\n setError(`Maximum ${maxSize} numbers allowed`);\n return;\n }\n\n onArrayChange(numbers);\n setIsEditing(false);\n setInputValue('');\n setError(null);\n }, [inputValue, onArrayChange, minSize, maxSize, minValue, maxValue]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleConfirm();\n } else if (e.key === 'Escape') {\n handleCancel();\n }\n },\n [handleConfirm, handleCancel]\n );\n\n if (disabled) {\n return null;\n }\n\n if (isEditing) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-1\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"e.g., 5, 3, 8, 1, 9\"\n className={`px-2 py-1 text-xs border border-gray-300 rounded w-40 ${ACCENT_COLORS[accentColor]}`}\n autoFocus\n />\n <button\n onClick={handleConfirm}\n className={`p-1 text-white rounded transition-colors ${ACCENT_BUTTON_COLORS[accentColor]}`}\n title=\"Apply (Enter)\"\n >\n <Check className=\"w-3 h-3\" />\n </button>\n <button\n onClick={handleCancel}\n className=\"p-1 bg-gray-200 text-gray-700 rounded hover:bg-gray-300 transition-colors\"\n title=\"Cancel (Esc)\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n {error && (\n <span className=\"text-[10px] text-red-500 mt-0.5\">{error}</span>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <button\n onClick={handleStartEdit}\n className=\"flex items-center gap-1 px-2 py-1 text-xs text-gray-600 bg-gray-100 rounded hover:bg-gray-200 transition-colors\"\n title=\"Edit array values\"\n >\n <Edit2 className=\"w-3 h-3\" />\n <span>Custom</span>\n </button>\n );\n};\n\nexport default ArrayInput;\n","import React, { useRef, useEffect } from 'react';\nimport { History, ChevronRight, ChevronDown } from 'lucide-react';\n\nexport interface Step {\n description: string;\n comparisons?: number;\n swaps?: number;\n}\n\nexport interface StepHistoryProps {\n steps: Step[];\n currentStep: number;\n onStepClick: (stepIndex: number) => void;\n maxHeight?: string;\n showStats?: boolean;\n accentColor?: 'indigo' | 'orange' | 'green' | 'purple' | 'blue' | 'cyan' | 'red' | 'lime' | 'teal' | 'violet';\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n}\n\nconst ACCENT_COLORS = {\n indigo: {\n active: 'bg-indigo-100 border-indigo-500 text-indigo-900',\n hover: 'hover:bg-indigo-50',\n dot: 'bg-indigo-500',\n },\n orange: {\n active: 'bg-orange-100 border-orange-500 text-orange-900',\n hover: 'hover:bg-orange-50',\n dot: 'bg-orange-500',\n },\n green: {\n active: 'bg-green-100 border-green-500 text-green-900',\n hover: 'hover:bg-green-50',\n dot: 'bg-green-500',\n },\n purple: {\n active: 'bg-purple-100 border-purple-500 text-purple-900',\n hover: 'hover:bg-purple-50',\n dot: 'bg-purple-500',\n },\n blue: {\n active: 'bg-blue-100 border-blue-500 text-blue-900',\n hover: 'hover:bg-blue-50',\n dot: 'bg-blue-500',\n },\n cyan: {\n active: 'bg-cyan-100 border-cyan-500 text-cyan-900',\n hover: 'hover:bg-cyan-50',\n dot: 'bg-cyan-500',\n },\n red: {\n active: 'bg-red-100 border-red-500 text-red-900',\n hover: 'hover:bg-red-50',\n dot: 'bg-red-500',\n },\n lime: {\n active: 'bg-lime-100 border-lime-500 text-lime-900',\n hover: 'hover:bg-lime-50',\n dot: 'bg-lime-500',\n },\n teal: {\n active: 'bg-teal-100 border-teal-500 text-teal-900',\n hover: 'hover:bg-teal-50',\n dot: 'bg-teal-500',\n },\n violet: {\n active: 'bg-violet-100 border-violet-500 text-violet-900',\n hover: 'hover:bg-violet-50',\n dot: 'bg-violet-500',\n },\n};\n\nexport const StepHistory: React.FC<StepHistoryProps> = ({\n steps,\n currentStep,\n onStepClick,\n maxHeight = '300px',\n showStats = false,\n accentColor = 'indigo',\n collapsed = false,\n onToggleCollapse,\n}) => {\n const colors = ACCENT_COLORS[accentColor];\n const listRef = useRef<HTMLDivElement>(null);\n const activeItemRef = useRef<HTMLButtonElement>(null);\n\n // Auto-scroll to current step\n useEffect(() => {\n if (activeItemRef.current && listRef.current) {\n const container = listRef.current;\n const item = activeItemRef.current;\n const containerRect = container.getBoundingClientRect();\n const itemRect = item.getBoundingClientRect();\n\n if (itemRect.top < containerRect.top || itemRect.bottom > containerRect.bottom) {\n item.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [currentStep]);\n\n if (collapsed) {\n return (\n <button\n onClick={onToggleCollapse}\n className=\"flex items-center gap-2 px-3 py-2 text-xs text-gray-600 bg-gray-100 rounded-lg hover:bg-gray-200 transition-colors\"\n title=\"Show step history\"\n >\n <History className=\"w-4 h-4\" />\n <span>History ({steps.length})</span>\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n );\n }\n\n return (\n <div className=\"bg-white border border-gray-200 rounded-lg overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-3 py-2 bg-gray-50 border-b border-gray-200\">\n <div className=\"flex items-center gap-2\">\n <History className=\"w-4 h-4 text-gray-500\" />\n <span className=\"text-xs font-medium text-gray-700\">\n Step History\n </span>\n <span className=\"px-1.5 py-0.5 text-[10px] bg-gray-200 text-gray-600 rounded\">\n {currentStep + 1}/{steps.length}\n </span>\n </div>\n {onToggleCollapse && (\n <button\n onClick={onToggleCollapse}\n className=\"p-1 text-gray-400 hover:text-gray-600 transition-colors\"\n title=\"Collapse history\"\n >\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n {/* Step List */}\n <div\n ref={listRef}\n className=\"overflow-y-auto\"\n style={{ maxHeight }}\n >\n <div className=\"divide-y divide-gray-100\">\n {steps.map((step, index) => {\n const isActive = index === currentStep;\n const isPast = index < currentStep;\n\n return (\n <button\n key={index}\n ref={isActive ? activeItemRef : null}\n onClick={() => onStepClick(index)}\n className={`w-full flex items-start gap-2 px-3 py-2 text-left transition-colors border-l-2 ${\n isActive\n ? `${colors.active} border-l-2`\n : isPast\n ? `text-gray-500 border-transparent ${colors.hover}`\n : `text-gray-700 border-transparent ${colors.hover}`\n }`}\n >\n {/* Step Number */}\n <div className=\"flex-shrink-0 mt-0.5\">\n <span\n className={`inline-flex items-center justify-center w-5 h-5 text-[10px] font-medium rounded-full ${\n isActive\n ? `${colors.dot} text-white`\n : isPast\n ? 'bg-gray-300 text-gray-600'\n : 'bg-gray-200 text-gray-600'\n }`}\n >\n {index + 1}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <p\n className={`text-[11px] leading-tight truncate ${\n isActive ? 'font-medium' : ''\n }`}\n title={step.description}\n >\n {step.description}\n </p>\n {showStats && step.comparisons !== undefined && (\n <div className=\"flex gap-2 mt-0.5 text-[9px] text-gray-400\">\n <span>C: {step.comparisons}</span>\n <span>S: {step.swaps ?? 0}</span>\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n\nexport default StepHistory;\n","import React, { useState, useCallback } from 'react';\nimport { Share2, Check, Copy, X } from 'lucide-react';\n\nexport interface ShareButtonProps {\n onShare: () => Promise<boolean>;\n className?: string;\n accentColor?: 'indigo' | 'orange' | 'green' | 'purple' | 'blue' | 'cyan' | 'red' | 'lime' | 'teal' | 'violet';\n}\n\nconst ACCENT_COLORS = {\n indigo: 'hover:bg-indigo-100 text-indigo-600',\n orange: 'hover:bg-orange-100 text-orange-600',\n green: 'hover:bg-green-100 text-green-600',\n purple: 'hover:bg-purple-100 text-purple-600',\n blue: 'hover:bg-blue-100 text-blue-600',\n cyan: 'hover:bg-cyan-100 text-cyan-600',\n red: 'hover:bg-red-100 text-red-600',\n lime: 'hover:bg-lime-100 text-lime-600',\n teal: 'hover:bg-teal-100 text-teal-600',\n violet: 'hover:bg-violet-100 text-violet-600',\n};\n\ntype ShareState = 'idle' | 'copying' | 'success' | 'error';\n\nexport const ShareButton: React.FC<ShareButtonProps> = ({\n onShare,\n className = '',\n accentColor = 'indigo',\n}) => {\n const [state, setState] = useState<ShareState>('idle');\n\n const handleClick = useCallback(async () => {\n if (state !== 'idle') return;\n\n setState('copying');\n try {\n const success = await onShare();\n setState(success ? 'success' : 'error');\n } catch {\n setState('error');\n }\n\n setTimeout(() => setState('idle'), 2000);\n }, [onShare, state]);\n\n const getIcon = () => {\n switch (state) {\n case 'copying':\n return <Copy className=\"w-4 h-4 animate-pulse\" />;\n case 'success':\n return <Check className=\"w-4 h-4 text-green-500\" />;\n case 'error':\n return <X className=\"w-4 h-4 text-red-500\" />;\n default:\n return <Share2 className=\"w-4 h-4\" />;\n }\n };\n\n const getTitle = () => {\n switch (state) {\n case 'copying':\n return 'Copying...';\n case 'success':\n return 'URL copied!';\n case 'error':\n return 'Copy failed';\n default:\n return 'Share URL';\n }\n };\n\n return (\n <button\n onClick={handleClick}\n disabled={state !== 'idle'}\n className={`p-1.5 rounded transition-colors ${ACCENT_COLORS[accentColor]} disabled:opacity-50 ${className}`}\n title={getTitle()}\n >\n {getIcon()}\n </button>\n );\n};\n\nexport default ShareButton;\n","import React from 'react';\n\nexport interface VisualizationAreaProps {\n children: React.ReactNode;\n minHeight?: number;\n className?: string;\n}\n\n/**\n * Container for visualization content with fixed minimum height\n * to prevent layout shifts during animation steps.\n */\nexport const VisualizationArea: React.FC<VisualizationAreaProps> = ({\n children,\n minHeight = 300,\n className = '',\n}) => {\n return (\n <div\n className={`relative ${className}`}\n style={{ minHeight: `${minHeight}px` }}\n >\n {children}\n </div>\n );\n};\n\nexport default VisualizationArea;\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\nexport interface UseVisualizerPlaybackOptions<T> {\n generateSteps: () => T[];\n onReset?: () => void;\n}\n\nexport interface UseVisualizerPlaybackReturn<T> {\n steps: T[];\n currentStep: number;\n currentStepData: T | undefined;\n isPlaying: boolean;\n speed: number;\n setSpeed: (speed: number) => void;\n handlePlayPause: () => void;\n handleStep: () => void;\n handleStepBack: () => void;\n handleReset: () => void;\n reinitialize: () => void;\n}\n\nexport function useVisualizerPlayback<T>({\n generateSteps,\n onReset,\n}: UseVisualizerPlaybackOptions<T>): UseVisualizerPlaybackReturn<T> {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<T[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [generateSteps]);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n // Animation loop\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying((prev) => !prev);\n playingRef.current = !playingRef.current;\n }, [currentStep, steps.length]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n onReset?.();\n }, [onReset]);\n\n const reinitialize = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n initialize();\n }, [initialize]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't intercept when typing in inputs\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, handleReset, isPlaying]);\n\n return {\n steps,\n currentStep,\n currentStepData: steps[currentStep],\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n reinitialize,\n };\n}\n\nexport default useVisualizerPlayback;\n","import { useState, useEffect, useCallback } from 'react';\n\nexport interface VisualizerState {\n array?: number[];\n algorithm?: string;\n step?: number;\n speed?: number;\n}\n\nexport interface UseUrlStateOptions {\n prefix?: string;\n enabled?: boolean;\n scrollToId?: string;\n}\n\nexport interface UseUrlStateReturn {\n state: VisualizerState | null;\n updateUrl: (state: VisualizerState) => void;\n getShareableUrl: (state: VisualizerState) => string;\n copyUrlToClipboard: (state: VisualizerState) => Promise<boolean>;\n clearUrlState: () => void;\n}\n\nfunction encodeState(state: VisualizerState): string {\n const parts: string[] = [];\n\n if (state.array && state.array.length > 0) {\n parts.push(`a=${state.array.join(',')}`);\n }\n if (state.algorithm) {\n parts.push(`alg=${state.algorithm}`);\n }\n if (state.step !== undefined) {\n parts.push(`s=${state.step}`);\n }\n if (state.speed !== undefined) {\n parts.push(`sp=${state.speed}`);\n }\n\n return parts.join('&');\n}\n\nfunction decodeState(hash: string): VisualizerState | null {\n if (!hash || hash === '#') return null;\n\n const params = new URLSearchParams(hash.startsWith('#') ? hash.slice(1) : hash);\n const state: VisualizerState = {};\n\n const arrayStr = params.get('a');\n if (arrayStr) {\n const numbers = arrayStr.split(',').map((n) => parseInt(n, 10)).filter((n) => !isNaN(n));\n if (numbers.length > 0) {\n state.array = numbers;\n }\n }\n\n const algorithm = params.get('alg');\n if (algorithm) {\n state.algorithm = algorithm;\n }\n\n const step = params.get('s');\n if (step) {\n const stepNum = parseInt(step, 10);\n if (!isNaN(stepNum)) {\n state.step = stepNum;\n }\n }\n\n const speed = params.get('sp');\n if (speed) {\n const speedNum = parseInt(speed, 10);\n if (!isNaN(speedNum)) {\n state.speed = speedNum;\n }\n }\n\n return Object.keys(state).length > 0 ? state : null;\n}\n\nexport function useUrlState(options: UseUrlStateOptions = {}): UseUrlStateReturn {\n const { prefix = '', enabled = true, scrollToId } = options;\n const [state, setState] = useState<VisualizerState | null>(null);\n\n // Read initial state from URL on mount and scroll to visualizer if needed\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n\n const hash = window.location.hash;\n const decoded = decodeState(hash);\n if (decoded) {\n setState(decoded);\n // Scroll to visualizer after a short delay to ensure component is rendered\n if (scrollToId) {\n setTimeout(() => {\n const element = document.getElementById(scrollToId);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, 100);\n }\n }\n }, [enabled, scrollToId]);\n\n // Update URL with current state\n const updateUrl = useCallback(\n (newState: VisualizerState) => {\n if (!enabled || typeof window === 'undefined') return;\n\n const encoded = encodeState(newState);\n const newHash = prefix ? `${prefix}-${encoded}` : encoded;\n\n // Use replaceState to avoid polluting history\n window.history.replaceState(null, '', `#${newHash}`);\n },\n [enabled, prefix]\n );\n\n // Get shareable URL without modifying current URL\n const getShareableUrl = useCallback(\n (shareState: VisualizerState): string => {\n if (typeof window === 'undefined') return '';\n\n const encoded = encodeState(shareState);\n const hash = prefix ? `${prefix}-${encoded}` : encoded;\n const url = new URL(window.location.href);\n url.hash = hash;\n return url.toString();\n },\n [prefix]\n );\n\n // Copy shareable URL to clipboard\n const copyUrlToClipboard = useCallback(\n async (shareState: VisualizerState): Promise<boolean> => {\n const url = getShareableUrl(shareState);\n\n if (navigator.clipboard && navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(url);\n return true;\n } catch {\n return false;\n }\n }\n\n // Fallback for older browsers\n try {\n const textArea = document.createElement('textarea');\n textArea.value = url;\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n const success = document.execCommand('copy');\n document.body.removeChild(textArea);\n return success;\n } catch {\n return false;\n }\n },\n [getShareableUrl]\n );\n\n // Clear URL state\n const clearUrlState = useCallback(() => {\n if (typeof window === 'undefined') return;\n\n window.history.replaceState(null, '', window.location.pathname + window.location.search);\n setState(null);\n }, []);\n\n return {\n state,\n updateUrl,\n getShareableUrl,\n copyUrlToClipboard,\n clearUrlState,\n };\n}\n\nexport default useUrlState;\n","/**\n * Shared constants for sorting algorithm visualizers.\n * Centralizes algorithm metadata to avoid duplication.\n */\n\nexport type SortingAlgorithm =\n | 'bubble'\n | 'selection'\n | 'insertion'\n | 'quick'\n | 'merge';\n\nexport const ALGORITHM_NAMES: Record<SortingAlgorithm, string> = {\n bubble: 'Bubble Sort',\n selection: 'Selection Sort',\n insertion: 'Insertion Sort',\n quick: 'QuickSort',\n merge: 'MergeSort',\n};\n\nexport const ALGORITHM_COMPLEXITIES: Record<\n SortingAlgorithm,\n { time: string; space: string }\n> = {\n bubble: { time: 'O(n²)', space: 'O(1)' },\n selection: { time: 'O(n²)', space: 'O(1)' },\n insertion: { time: 'O(n²)', space: 'O(1)' },\n quick: { time: 'O(n log n)', space: 'O(log n)' },\n merge: { time: 'O(n log n)', space: 'O(n)' },\n};\n\nexport const ALGORITHM_CODE: Record<SortingAlgorithm, string[]> = {\n bubble: [\n 'for (i = 0; i < n-1; i++)',\n ' for (j = 0; j < n-i-1; j++)',\n ' if (arr[j] > arr[j+1])',\n ' swap(arr[j], arr[j+1])',\n ],\n selection: [\n 'for (i = 0; i < n-1; i++)',\n ' minIdx = i',\n ' for (j = i+1; j < n; j++)',\n ' if (arr[j] < arr[minIdx])',\n ' minIdx = j',\n ' swap(arr[i], arr[minIdx])',\n ],\n insertion: [\n 'for (i = 1; i < n; i++)',\n ' key = arr[i]',\n ' j = i - 1',\n ' while (j >= 0 && arr[j] > key)',\n ' arr[j+1] = arr[j]',\n ' j--',\n ' arr[j+1] = key',\n ],\n quick: [\n 'quickSort(arr, low, high)',\n ' if (low < high)',\n ' pi = partition(arr, low, high)',\n ' quickSort(arr, low, pi-1)',\n ' quickSort(arr, pi+1, high)',\n ],\n merge: [\n 'mergeSort(arr, l, r)',\n ' if (l < r)',\n ' m = (l + r) / 2',\n ' mergeSort(arr, l, m)',\n ' mergeSort(arr, m+1, r)',\n ' merge(arr, l, m, r)',\n ],\n};\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Search } from 'lucide-react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface SearchStep {\n left: number;\n right: number;\n mid: number;\n comparison: 'less' | 'greater' | 'equal' | null;\n description: string;\n found?: boolean;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface BinarySearchVisualizerProps {\n initialSize?: number;\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\n// Algorithm code snippets\nconst BINARY_SEARCH_CODE = [\n 'binarySearch(arr, target):',\n ' left = 0, right = n - 1',\n ' while left <= right:',\n ' mid = (left + right) / 2',\n ' if arr[mid] == target:',\n ' return mid // Found!',\n ' elif arr[mid] < target:',\n ' left = mid + 1',\n ' else:',\n ' right = mid - 1',\n ' return -1 // Not found',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-100', label: 'Search Space' },\n { color: 'bg-gray-200', label: 'Eliminated' },\n { color: 'bg-purple-500', label: 'Mid' },\n { color: 'bg-green-500', label: 'Found' },\n];\n\nfunction generateSortedArray(size: number): number[] {\n const arr: number[] = [];\n let current = Math.floor(Math.random() * 5) + 1;\n for (let i = 0; i < size; i++) {\n arr.push(current);\n current += Math.floor(Math.random() * 5) + 1;\n }\n return arr;\n}\n\nfunction generateSearchSteps(arr: number[], target: number): SearchStep[] {\n const steps: SearchStep[] = [];\n let left = 0;\n let right = arr.length - 1;\n\n steps.push({\n left,\n right,\n mid: -1,\n comparison: null,\n description: `Initialize: searching for ${target} in sorted array [${arr[0]}...${arr[arr.length - 1]}]`,\n codeLine: 1,\n variables: { target, left, right, n: arr.length },\n });\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n\n steps.push({\n left,\n right,\n mid,\n comparison: null,\n description: `Calculate mid = (${left} + ${right}) / 2 = ${mid}. Check arr[${mid}] = ${arr[mid]}`,\n codeLine: 3,\n variables: { left, right, mid, 'arr[mid]': arr[mid], target },\n });\n\n if (arr[mid] === target) {\n steps.push({\n left,\n right,\n mid,\n comparison: 'equal',\n description: `✓ Found! arr[${mid}] = ${arr[mid]} equals target ${target}`,\n found: true,\n codeLine: 5,\n variables: { mid, 'arr[mid]': arr[mid], target },\n });\n return steps;\n } else if (arr[mid] < target) {\n steps.push({\n left,\n right,\n mid,\n comparison: 'less',\n description: `arr[${mid}] = ${arr[mid]} < ${target} → search right half, set left = ${mid + 1}`,\n codeLine: 7,\n variables: { 'arr[mid]': arr[mid], target, 'new left': mid + 1 },\n });\n left = mid + 1;\n } else {\n steps.push({\n left,\n right,\n mid,\n comparison: 'greater',\n description: `arr[${mid}] = ${arr[mid]} > ${target} → search left half, set right = ${mid - 1}`,\n codeLine: 9,\n variables: { 'arr[mid]': arr[mid], target, 'new right': mid - 1 },\n });\n right = mid - 1;\n }\n }\n\n steps.push({\n left,\n right,\n mid: -1,\n comparison: null,\n description: `✗ Not found! ${target} is not in the array (left > right)`,\n found: false,\n codeLine: 10,\n variables: { left, right, target },\n });\n\n return steps;\n}\n\nconst BinarySearchVisualizerComponent: React.FC<\n BinarySearchVisualizerProps\n> = ({\n initialSize = 12,\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [arraySize] = useState(initialSize);\n const [array, setArray] = useState<number[]>([]);\n const [, setTarget] = useState<number>(0);\n const [targetInput, setTargetInput] = useState<string>('');\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<SearchStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Initialize array\n const initializeArray = useCallback(() => {\n const newArray = generateSortedArray(arraySize);\n setArray(newArray);\n // Pick a random target - 70% chance it exists in array\n const existsInArray = Math.random() < 0.7;\n const newTarget = existsInArray\n ? newArray[Math.floor(Math.random() * newArray.length)]\n : newArray[Math.floor(newArray.length / 2)] + 1;\n setTarget(newTarget);\n setTargetInput(String(newTarget));\n const newSteps = generateSearchSteps(newArray, newTarget);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [arraySize]);\n\n useEffect(() => {\n initializeArray();\n }, [initializeArray]);\n\n // Animation loop\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const handleNewSearch = () => {\n const newTarget = parseInt(targetInput, 10);\n if (!isNaN(newTarget)) {\n setTarget(newTarget);\n const newSteps = generateSearchSteps(array, newTarget);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }\n };\n\n const handleShuffle = () => {\n initializeArray();\n };\n\n const currentStepData = steps[currentStep] || {\n left: 0,\n right: array.length - 1,\n mid: -1,\n };\n const { left, right, mid, found } = currentStepData;\n\n const getElementStyle = (index: number): string => {\n if (found === true && index === mid) {\n return 'bg-green-500 text-white scale-110';\n }\n if (index === mid) {\n return 'bg-purple-500 text-white';\n }\n if (index < left || index > right) {\n return 'bg-gray-200 text-gray-400';\n }\n if (index === left || index === right) {\n return 'bg-blue-400 text-white';\n }\n return 'bg-blue-100 text-blue-800';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n const getStatusVariant = () => {\n if (found === true) return 'success' as const;\n if (found === false) return 'error' as const;\n return 'default' as const;\n };\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-green-50 to-emerald-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">Binary Search</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\">\n Time: O(log n)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-700 rounded\">\n Space: O(1)\n </span>\n </div>\n </div>\n\n {/* Target Input */}\n <div className=\"flex items-center gap-2\">\n <label className=\"text-sm font-medium text-gray-700\">Target:</label>\n <input\n type=\"number\"\n value={targetInput}\n onChange={(e) => setTargetInput(e.target.value)}\n className=\"w-20 px-2 py-1 text-sm font-semibold text-gray-900 border border-gray-300 rounded-md focus:ring-2 focus:ring-green-500 focus:border-green-500\"\n disabled={isPlaying}\n />\n <button\n onClick={handleNewSearch}\n disabled={isPlaying}\n className=\"p-1.5 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors disabled:opacity-50\"\n title=\"Search\"\n >\n <Search className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Array Display */}\n <div className=\"flex items-center justify-center gap-1 flex-wrap mb-4\">\n {array.map((value, index) => (\n <div key={index} className=\"flex flex-col items-center\">\n <div\n className={`w-10 h-10 flex items-center justify-center rounded-lg font-medium text-sm transition-all duration-300 ${getElementStyle(index)}`}\n >\n {value}\n </div>\n <span className=\"text-[10px] text-gray-400 mt-1\">\n {index}\n </span>\n </div>\n ))}\n </div>\n\n {/* Pointers Legend */}\n <div className=\"flex items-center justify-center gap-6 mb-4 text-sm\">\n {left <= right && (\n <>\n <div className=\"flex items-center gap-1\">\n <div className=\"w-3 h-3 bg-blue-400 rounded\" />\n <span className=\"text-gray-600\">L={left}</span>\n </div>\n {mid >= 0 && (\n <div className=\"flex items-center gap-1\">\n <div className=\"w-3 h-3 bg-purple-500 rounded\" />\n <span className=\"text-gray-600\">M={mid}</span>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <div className=\"w-3 h-3 bg-blue-400 rounded\" />\n <span className=\"text-gray-600\">R={right}</span>\n </div>\n </>\n )}\n </div>\n\n {/* Status */}\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={BINARY_SEARCH_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n onShuffle={handleShuffle}\n showShuffle={true}\n shuffleLabel=\"New Array\"\n accentColor=\"green\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const BinarySearchVisualizer = React.memo(\n BinarySearchVisualizerComponent\n);\nexport default BinarySearchVisualizer;\n","import React, { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ArrayInput,\n StepHistory,\n ShareButton,\n useUrlState,\n VisualizationArea,\n ALGORITHM_NAMES,\n ALGORITHM_COMPLEXITIES,\n} from '../shared';\nimport type { SortingAlgorithm } from '../shared';\n\ninterface ArrayBar {\n value: number;\n state: 'default' | 'comparing' | 'swapping' | 'sorted' | 'pivot';\n}\n\ninterface SortingStep {\n array: number[];\n comparing?: [number, number];\n swapping?: [number, number];\n sorted?: number[];\n pivot?: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n comparisons: number;\n swaps: number;\n}\n\ninterface SortingVisualizerProps {\n algorithm?: SortingAlgorithm;\n initialSize?: number;\n showControls?: boolean;\n showAlgorithmSelector?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\n// Extended code with detailed comments - kept local as it differs from shared version\nconst ALGORITHM_CODE: Record<SortingAlgorithm, string[]> = {\n bubble: [\n 'for (i = 0; i < n-1; i++)',\n ' for (j = 0; j < n-i-1; j++)',\n ' if (arr[j] > arr[j+1])',\n ' swap(arr[j], arr[j+1])',\n ],\n selection: [\n 'for (i = 0; i < n-1; i++)',\n ' minIdx = i',\n ' for (j = i+1; j < n; j++)',\n ' if (arr[j] < arr[minIdx])',\n ' minIdx = j',\n ' swap(arr[i], arr[minIdx])',\n ],\n insertion: [\n 'for (i = 1; i < n; i++)',\n ' key = arr[i]',\n ' j = i - 1',\n ' while (j >= 0 && arr[j] > key)',\n ' arr[j+1] = arr[j]',\n ' j--',\n ' arr[j+1] = key',\n ],\n quick: [\n 'quickSort(arr, low, high):',\n ' if (low < high)',\n ' pivot = partition(arr, low, high)',\n ' quickSort(arr, low, pivot-1)',\n ' quickSort(arr, pivot+1, high)',\n '',\n 'partition(arr, low, high):',\n ' pivot = arr[high]',\n ' i = low - 1',\n ' for (j = low; j < high; j++)',\n ' if (arr[j] <= pivot)',\n ' i++; swap(arr[i], arr[j])',\n ' swap(arr[i+1], arr[high])',\n ' return i + 1',\n ],\n merge: [\n 'mergeSort(arr, l, r):',\n ' if (l < r)',\n ' mid = (l + r) / 2',\n ' mergeSort(arr, l, mid)',\n ' mergeSort(arr, mid+1, r)',\n ' merge(arr, l, mid, r)',\n '',\n 'merge(arr, l, mid, r):',\n ' // merge left and right subarrays',\n ' while (i < left.len && j < right.len)',\n ' if (left[i] <= right[j])',\n ' arr[k++] = left[i++]',\n ' else arr[k++] = right[j++]',\n ],\n};\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'Default' },\n { color: 'bg-yellow-400', label: 'Comparing' },\n { color: 'bg-red-500', label: 'Swapping' },\n { color: 'bg-purple-500', label: 'Pivot' },\n { color: 'bg-green-500', label: 'Sorted' },\n];\n\n// Generate sorting steps for each algorithm\nfunction generateBubbleSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({\n array: [...array],\n description:\n 'Starting Bubble Sort - will compare adjacent elements and swap if needed',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n for (let i = 0; i < n - 1; i++) {\n steps.push({\n array: [...array],\n sorted: [...sorted],\n description: `Pass ${i + 1}: Bubbling largest unsorted element to position ${n - 1 - i}`,\n codeLine: 0,\n variables: { i, n: n - 1 },\n comparisons,\n swaps,\n });\n\n for (let j = 0; j < n - i - 1; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, j + 1],\n sorted: [...sorted],\n description: `Comparing arr[${j}]=${array[j]} with arr[${j + 1}]=${array[j + 1]}`,\n codeLine: 2,\n variables: { i, j, 'arr[j]': array[j], 'arr[j+1]': array[j + 1] },\n comparisons,\n swaps,\n });\n\n if (array[j] > array[j + 1]) {\n swaps++;\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: [...sorted],\n description: `${array[j]} > ${array[j + 1]} → Swapping!`,\n codeLine: 3,\n variables: { i, j, 'arr[j]': array[j], 'arr[j+1]': array[j + 1] },\n comparisons,\n swaps,\n });\n [array[j], array[j + 1]] = [array[j + 1], array[j]];\n } else {\n steps.push({\n array: [...array],\n comparing: [j, j + 1],\n sorted: [...sorted],\n description: `${array[j]} ≤ ${array[j + 1]} → No swap needed`,\n codeLine: 2,\n variables: { i, j, 'arr[j]': array[j], 'arr[j+1]': array[j + 1] },\n comparisons,\n swaps,\n });\n }\n }\n sorted.unshift(n - 1 - i);\n }\n sorted.unshift(0);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateSelectionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({\n array: [...array],\n description:\n 'Starting Selection Sort - will find minimum and place it at the beginning',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n for (let i = 0; i < n - 1; i++) {\n let minIdx = i;\n\n steps.push({\n array: [...array],\n sorted: [...sorted],\n description: `Finding minimum in unsorted portion [${i}..${n - 1}]`,\n codeLine: 0,\n variables: { i, minIdx },\n comparisons,\n swaps,\n });\n\n for (let j = i + 1; j < n; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [minIdx, j],\n sorted: [...sorted],\n description: `Comparing current min arr[${minIdx}]=${array[minIdx]} with arr[${j}]=${array[j]}`,\n codeLine: 3,\n variables: {\n i,\n j,\n minIdx,\n 'arr[minIdx]': array[minIdx],\n 'arr[j]': array[j],\n },\n comparisons,\n swaps,\n });\n\n if (array[j] < array[minIdx]) {\n minIdx = j;\n steps.push({\n array: [...array],\n comparing: [minIdx, j],\n sorted: [...sorted],\n description: `Found new minimum: ${array[minIdx]} at index ${minIdx}`,\n codeLine: 4,\n variables: { i, j, minIdx, 'new min': array[minIdx] },\n comparisons,\n swaps,\n });\n }\n }\n\n if (minIdx !== i) {\n swaps++;\n steps.push({\n array: [...array],\n swapping: [i, minIdx],\n sorted: [...sorted],\n description: `Placing minimum ${array[minIdx]} at position ${i} (swapping with ${array[i]})`,\n codeLine: 5,\n variables: {\n i,\n minIdx,\n 'arr[i]': array[i],\n 'arr[minIdx]': array[minIdx],\n },\n comparisons,\n swaps,\n });\n [array[i], array[minIdx]] = [array[minIdx], array[i]];\n }\n\n sorted.push(i);\n }\n sorted.push(n - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateInsertionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({\n array: [...array],\n sorted: [0],\n description: 'Starting Insertion Sort - first element is already \"sorted\"',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n for (let i = 1; i < n; i++) {\n const key = array[i];\n let j = i - 1;\n\n steps.push({\n array: [...array],\n comparing: [i, j],\n sorted: Array.from({ length: i }, (_, idx) => idx),\n description: `Taking key=${key} from index ${i}, will insert into sorted portion [0..${i - 1}]`,\n codeLine: 1,\n variables: { i, key, j },\n comparisons,\n swaps,\n });\n\n while (j >= 0 && array[j] > key) {\n comparisons++;\n swaps++;\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: Array.from({ length: i }, (_, idx) => idx),\n description: `arr[${j}]=${array[j]} > key=${key} → Shifting ${array[j]} right`,\n codeLine: 4,\n variables: { i, key, j, 'arr[j]': array[j] },\n comparisons,\n swaps,\n });\n array[j + 1] = array[j];\n j--;\n }\n if (j >= 0) comparisons++; // Final comparison that exits the while\n\n array[j + 1] = key;\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: i + 1 }, (_, idx) => idx),\n description: `Inserted key=${key} at position ${j + 1}`,\n codeLine: 6,\n variables: { i, key, position: j + 1 },\n comparisons,\n swaps,\n });\n }\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateQuickSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const sorted: Set<number> = new Set();\n const stats = { comparisons: 0, swaps: 0 };\n\n steps.push({\n array: [...array],\n description: 'Starting QuickSort - will pick pivot and partition array',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n function quickSort(low: number, high: number) {\n if (low < high) {\n const pivotIdx = partition(low, high);\n sorted.add(pivotIdx);\n quickSort(low, pivotIdx - 1);\n quickSort(pivotIdx + 1, high);\n } else if (low === high) {\n sorted.add(low);\n }\n }\n\n function partition(low: number, high: number): number {\n const pivot = array[high];\n\n steps.push({\n array: [...array],\n pivot: high,\n sorted: [...sorted],\n description: `Partitioning [${low}..${high}]: pivot=${pivot} (rightmost element)`,\n codeLine: 7,\n variables: { low, high, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n let i = low - 1;\n\n for (let j = low; j < high; j++) {\n stats.comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, high],\n pivot: high,\n sorted: [...sorted],\n description: `Comparing arr[${j}]=${array[j]} with pivot=${pivot}`,\n codeLine: 10,\n variables: { i, j, pivot, 'arr[j]': array[j] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n if (array[j] <= pivot) {\n i++;\n if (i !== j) {\n stats.swaps++;\n steps.push({\n array: [...array],\n swapping: [i, j],\n pivot: high,\n sorted: [...sorted],\n description: `${array[j]} ≤ ${pivot} → Swapping arr[${i}]=${array[i]} with arr[${j}]=${array[j]}`,\n codeLine: 11,\n variables: { i, j, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n [array[i], array[j]] = [array[j], array[i]];\n } else {\n steps.push({\n array: [...array],\n comparing: [j, high],\n pivot: high,\n sorted: [...sorted],\n description: `${array[j]} ≤ ${pivot} → Element already in correct position`,\n codeLine: 11,\n variables: { i, j, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n }\n }\n\n if (i + 1 !== high) {\n stats.swaps++;\n steps.push({\n array: [...array],\n swapping: [i + 1, high],\n sorted: [...sorted],\n description: `Placing pivot ${pivot} at its final position ${i + 1}`,\n codeLine: 12,\n variables: { 'pivot position': i + 1, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n [array[i + 1], array[high]] = [array[high], array[i + 1]];\n }\n\n return i + 1;\n }\n\n quickSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nfunction generateMergeSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const stats = { comparisons: 0, swaps: 0 }; // swaps = array writes for merge sort\n\n steps.push({\n array: [...array],\n description:\n 'Starting MergeSort - will divide array and merge sorted halves',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n function mergeSort(start: number, end: number) {\n if (start >= end) return;\n\n const mid = Math.floor((start + end) / 2);\n\n steps.push({\n array: [...array],\n comparing: [start, end],\n description: `Dividing [${start}..${end}] into [${start}..${mid}] and [${mid + 1}..${end}]`,\n codeLine: 2,\n variables: { l: start, r: end, mid },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n mergeSort(start, mid);\n mergeSort(mid + 1, end);\n merge(start, mid, end);\n }\n\n function merge(start: number, mid: number, end: number) {\n const left = array.slice(start, mid + 1);\n const right = array.slice(mid + 1, end + 1);\n\n steps.push({\n array: [...array],\n description: `Merging [${start}..${mid}]=[${left.join(',')}] and [${mid + 1}..${end}]=[${right.join(',')}]`,\n codeLine: 5,\n variables: { l: start, mid, r: end },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n let i = 0,\n j = 0,\n k = start;\n\n while (i < left.length && j < right.length) {\n stats.comparisons++;\n steps.push({\n array: [...array],\n comparing: [start + i, mid + 1 + j],\n description: `Comparing left[${i}]=${left[i]} with right[${j}]=${right[j]}`,\n codeLine: 10,\n variables: { i, j, 'left[i]': left[i], 'right[j]': right[j] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n if (left[i] <= right[j]) {\n array[k] = left[i];\n stats.swaps++;\n steps.push({\n array: [...array],\n description: `${left[i]} ≤ ${right[j]} → Taking ${left[i]} from left`,\n codeLine: 11,\n variables: { k, value: left[i] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n i++;\n } else {\n array[k] = right[j];\n stats.swaps++;\n steps.push({\n array: [...array],\n description: `${left[i]} > ${right[j]} → Taking ${right[j]} from right`,\n codeLine: 12,\n variables: { k, value: right[j] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n j++;\n }\n k++;\n }\n\n while (i < left.length) {\n array[k] = left[i];\n stats.swaps++;\n i++;\n k++;\n }\n\n while (j < right.length) {\n array[k] = right[j];\n stats.swaps++;\n j++;\n k++;\n }\n\n steps.push({\n array: [...array],\n description: `Merged result: [${array.slice(start, end + 1).join(', ')}]`,\n codeLine: -1,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n\n mergeSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nconst STEP_GENERATORS: Record<\n SortingAlgorithm,\n (arr: number[]) => SortingStep[]\n> = {\n bubble: generateBubbleSortSteps,\n selection: generateSelectionSortSteps,\n insertion: generateInsertionSortSteps,\n quick: generateQuickSortSteps,\n merge: generateMergeSortSteps,\n};\n\nfunction generateRandomArray(size: number): number[] {\n return Array.from(\n { length: size },\n () => Math.floor(Math.random() * 100) + 5\n );\n}\n\nconst SortingVisualizerComponent: React.FC<SortingVisualizerProps> = ({\n algorithm: initialAlgorithm = 'bubble',\n initialSize = 10,\n showControls = true,\n showAlgorithmSelector = true,\n showCode = true,\n className = '',\n}) => {\n const [algorithm, setAlgorithm] =\n useState<SortingAlgorithm>(initialAlgorithm);\n const [arraySize, setArraySize] = useState(initialSize);\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<SortingStep[]>([]);\n const [bars, setBars] = useState<ArrayBar[]>([]);\n const [customArray, setCustomArray] = useState<number[] | null>(null);\n const [historyCollapsed, setHistoryCollapsed] = useState(true);\n const [urlStateLoaded, setUrlStateLoaded] = useState(false);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const VISUALIZER_ID = 'sorting-visualizer';\n\n // URL state management\n const { state: urlState, copyUrlToClipboard } = useUrlState({ prefix: 'sort', scrollToId: VISUALIZER_ID });\n\n const initializeArray = useCallback((useCustom?: number[]) => {\n const arrayToUse = useCustom ?? customArray ?? generateRandomArray(arraySize);\n const newSteps = STEP_GENERATORS[algorithm](arrayToUse);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [algorithm, arraySize, customArray]);\n\n const handleCustomArrayChange = useCallback((newArray: number[]) => {\n setCustomArray(newArray);\n setArraySize(newArray.length);\n initializeArray(newArray);\n }, [initializeArray]);\n\n // Load from URL state on mount\n useEffect(() => {\n if (urlState && !urlStateLoaded) {\n setUrlStateLoaded(true);\n if (urlState.algorithm && Object.keys(ALGORITHM_NAMES).includes(urlState.algorithm)) {\n setAlgorithm(urlState.algorithm as SortingAlgorithm);\n }\n if (urlState.array && urlState.array.length > 0) {\n setCustomArray(urlState.array);\n setArraySize(urlState.array.length);\n }\n if (urlState.speed !== undefined) {\n setSpeed(urlState.speed);\n }\n }\n }, [urlState, urlStateLoaded]);\n\n useEffect(() => {\n initializeArray();\n }, [initializeArray]);\n\n useEffect(() => {\n if (steps.length === 0) return;\n\n const step = steps[currentStep];\n const newBars: ArrayBar[] = step.array.map((value, index) => {\n let state: ArrayBar['state'] = 'default';\n\n if (step.sorted?.includes(index)) {\n state = 'sorted';\n } else if (step.pivot === index) {\n state = 'pivot';\n } else if (step.swapping?.includes(index)) {\n state = 'swapping';\n } else if (step.comparing?.includes(index)) {\n state = 'comparing';\n }\n\n return { value, state };\n });\n\n setBars(newBars);\n }, [currentStep, steps]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n }, []);\n\n const handleShuffle = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setCustomArray(null); // Reset custom array on shuffle\n const newArray = generateRandomArray(arraySize);\n const newSteps = STEP_GENERATORS[algorithm](newArray);\n setSteps(newSteps);\n setCurrentStep(0);\n }, [algorithm, arraySize]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't intercept when typing in inputs\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, handleReset, isPlaying]);\n\n const getBarColor = (state: ArrayBar['state']): string => {\n switch (state) {\n case 'comparing':\n return 'bg-yellow-400';\n case 'swapping':\n return 'bg-red-500';\n case 'sorted':\n return 'bg-green-500';\n case 'pivot':\n return 'bg-purple-500';\n default:\n return 'bg-blue-500';\n }\n };\n\n const maxValue = Math.max(...bars.map((b) => b.value), 1);\n const currentStepData = steps[currentStep];\n const currentDescription = currentStepData?.description || '';\n const complexity = ALGORITHM_COMPLEXITIES[algorithm];\n\n const currentArray = useMemo(() => {\n if (steps.length === 0) return [];\n return steps[0].array;\n }, [steps]);\n\n const historySteps = useMemo(() => {\n return steps.map((step) => ({\n description: step.description,\n comparisons: step.comparisons,\n swaps: step.swaps,\n }));\n }, [steps]);\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({\n array: currentArray,\n algorithm,\n speed,\n });\n }, [copyUrlToClipboard, currentArray, algorithm, speed]);\n\n const sizeControl = useMemo(\n () => (\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Size</label>\n <input\n type=\"range\"\n min=\"5\"\n max=\"20\"\n value={arraySize}\n onChange={(e) => {\n setCustomArray(null);\n setArraySize(Number(e.target.value));\n }}\n disabled={isPlaying}\n className=\"w-20 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer disabled:opacity-50\"\n />\n <span className=\"text-xs text-gray-500 w-6\">{arraySize}</span>\n </div>\n <ArrayInput\n array={currentArray}\n onArrayChange={handleCustomArrayChange}\n disabled={isPlaying}\n accentColor=\"indigo\"\n />\n </div>\n ),\n [arraySize, isPlaying, currentArray, handleCustomArrayChange]\n );\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-indigo-50 to-blue-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n {ALGORITHM_NAMES[algorithm]}\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Time: {complexity.time}\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Space: {complexity.space}\n </span>\n </div>\n {/* Live operation counters */}\n <div className=\"flex gap-2 ml-2 border-l border-gray-300 pl-3\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-yellow-100 text-yellow-700 rounded\">\n Comparisons: {currentStepData?.comparisons ?? 0}\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-red-100 text-red-700 rounded\">\n {algorithm === 'merge' ? 'Writes' : 'Swaps'}: {currentStepData?.swaps ?? 0}\n </span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {showAlgorithmSelector && (\n <select\n value={algorithm}\n onChange={(e) => setAlgorithm(e.target.value as SortingAlgorithm)}\n className=\"px-3 py-1.5 text-sm font-medium text-gray-900 bg-white border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500\"\n disabled={isPlaying}\n >\n {Object.entries(ALGORITHM_NAMES).map(([key, name]) => (\n <option key={key} value={key}>\n {name}\n </option>\n ))}\n </select>\n )}\n <ShareButton onShare={handleShare} accentColor=\"indigo\" />\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Visualization Area */}\n <VisualizationArea minHeight={300} className={showCode ? 'flex-1' : 'w-full'}>\n <div className=\"flex items-end justify-center gap-1 h-48 bg-gray-50 rounded-lg p-4\">\n {bars.map((bar, index) => (\n <div\n key={index}\n className={`${getBarColor(bar.state)} rounded-t transition-all duration-200 flex items-end justify-center relative group`}\n style={{\n height: `${(bar.value / maxValue) * 100}%`,\n width: `${Math.max(100 / bars.length - 1, 8)}%`,\n minWidth: '12px',\n maxWidth: '50px',\n }}\n >\n {bars.length <= 15 && (\n <span className=\"text-[10px] text-white font-bold mb-1\">\n {bar.value}\n </span>\n )}\n <span className=\"absolute -bottom-5 text-[9px] text-gray-400\">\n {index}\n </span>\n </div>\n ))}\n </div>\n\n {/* Status */}\n <div className=\"mt-6\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={currentDescription.startsWith('✓') ? 'success' : 'default'}\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel & History */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ALGORITHM_CODE[algorithm]}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <StepHistory\n steps={historySteps}\n currentStep={currentStep}\n onStepClick={setCurrentStep}\n maxHeight=\"180px\"\n showStats={true}\n accentColor=\"indigo\"\n collapsed={historyCollapsed}\n onToggleCollapse={() => setHistoryCollapsed(!historyCollapsed)}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n onShuffle={handleShuffle}\n accentColor=\"indigo\"\n showShuffle={true}\n extraControls={sizeControl}\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const SortingVisualizer = React.memo(SortingVisualizerComponent);\nexport default SortingVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Play, Pause, RotateCcw, Shuffle } from 'lucide-react';\nimport {\n VisualizationArea,\n ALGORITHM_NAMES,\n ALGORITHM_COMPLEXITIES,\n} from '../shared';\nimport type { SortingAlgorithm } from '../shared';\n\ninterface SortingStep {\n array: number[];\n comparing?: [number, number];\n swapping?: [number, number];\n sorted?: number[];\n pivot?: number;\n description: string;\n comparisons: number;\n swaps: number;\n}\n\ninterface AlgorithmState {\n steps: SortingStep[];\n currentStep: number;\n isFinished: boolean;\n}\n\ninterface SortingComparisonVisualizerProps {\n className?: string;\n}\n\n// Step generators (simplified from main visualizer)\nfunction generateBubbleSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n for (let i = 0; i < n - 1; i++) {\n for (let j = 0; j < n - i - 1; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, j + 1],\n sorted: [...sorted],\n description: `Compare ${array[j]} vs ${array[j + 1]}`,\n comparisons,\n swaps,\n });\n\n if (array[j] > array[j + 1]) {\n swaps++;\n [array[j], array[j + 1]] = [array[j + 1], array[j]];\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: [...sorted],\n description: `Swap`,\n comparisons,\n swaps,\n });\n }\n }\n sorted.unshift(n - 1 - i);\n }\n sorted.unshift(0);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: 'Done!',\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateSelectionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n for (let i = 0; i < n - 1; i++) {\n let minIdx = i;\n\n for (let j = i + 1; j < n; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [minIdx, j],\n sorted: [...sorted],\n description: `Find min`,\n comparisons,\n swaps,\n });\n\n if (array[j] < array[minIdx]) {\n minIdx = j;\n }\n }\n\n if (minIdx !== i) {\n swaps++;\n [array[i], array[minIdx]] = [array[minIdx], array[i]];\n steps.push({\n array: [...array],\n swapping: [i, minIdx],\n sorted: [...sorted],\n description: `Swap min`,\n comparisons,\n swaps,\n });\n }\n\n sorted.push(i);\n }\n sorted.push(n - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: 'Done!',\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateInsertionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({ array: [...array], sorted: [0], description: 'Start', comparisons: 0, swaps: 0 });\n\n for (let i = 1; i < n; i++) {\n const key = array[i];\n let j = i - 1;\n\n while (j >= 0 && array[j] > key) {\n comparisons++;\n swaps++;\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: Array.from({ length: i }, (_, idx) => idx),\n description: `Shift ${array[j]}`,\n comparisons,\n swaps,\n });\n array[j + 1] = array[j];\n j--;\n }\n if (j >= 0) comparisons++;\n\n array[j + 1] = key;\n steps.push({\n array: [...array],\n sorted: Array.from({ length: i + 1 }, (_, idx) => idx),\n description: `Insert ${key}`,\n comparisons,\n swaps,\n });\n }\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: 'Done!',\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateQuickSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const sorted: Set<number> = new Set();\n const stats = { comparisons: 0, swaps: 0 };\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n function quickSort(low: number, high: number) {\n if (low < high) {\n const pivotIdx = partition(low, high);\n sorted.add(pivotIdx);\n quickSort(low, pivotIdx - 1);\n quickSort(pivotIdx + 1, high);\n } else if (low === high) {\n sorted.add(low);\n }\n }\n\n function partition(low: number, high: number): number {\n const pivot = array[high];\n let i = low - 1;\n\n for (let j = low; j < high; j++) {\n stats.comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, high],\n pivot: high,\n sorted: [...sorted],\n description: `Compare with pivot`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n if (array[j] <= pivot) {\n i++;\n if (i !== j) {\n stats.swaps++;\n [array[i], array[j]] = [array[j], array[i]];\n steps.push({\n array: [...array],\n swapping: [i, j],\n pivot: high,\n sorted: [...sorted],\n description: `Swap`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n }\n }\n\n if (i + 1 !== high) {\n stats.swaps++;\n [array[i + 1], array[high]] = [array[high], array[i + 1]];\n steps.push({\n array: [...array],\n swapping: [i + 1, high],\n sorted: [...sorted],\n description: `Place pivot`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n\n return i + 1;\n }\n\n quickSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: 'Done!',\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nfunction generateMergeSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const stats = { comparisons: 0, swaps: 0 };\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n function mergeSort(start: number, end: number) {\n if (start >= end) return;\n\n const mid = Math.floor((start + end) / 2);\n mergeSort(start, mid);\n mergeSort(mid + 1, end);\n merge(start, mid, end);\n }\n\n function merge(start: number, mid: number, end: number) {\n const left = array.slice(start, mid + 1);\n const right = array.slice(mid + 1, end + 1);\n let i = 0, j = 0, k = start;\n\n while (i < left.length && j < right.length) {\n stats.comparisons++;\n if (left[i] <= right[j]) {\n array[k] = left[i];\n stats.swaps++;\n i++;\n } else {\n array[k] = right[j];\n stats.swaps++;\n j++;\n }\n k++;\n }\n\n while (i < left.length) {\n array[k] = left[i];\n stats.swaps++;\n i++;\n k++;\n }\n\n while (j < right.length) {\n array[k] = right[j];\n stats.swaps++;\n j++;\n k++;\n }\n\n steps.push({\n array: [...array],\n description: `Merge [${start}..${end}]`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n\n mergeSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: 'Done!',\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nconst STEP_GENERATORS: Record<SortingAlgorithm, (arr: number[]) => SortingStep[]> = {\n bubble: generateBubbleSortSteps,\n selection: generateSelectionSortSteps,\n insertion: generateInsertionSortSteps,\n quick: generateQuickSortSteps,\n merge: generateMergeSortSteps,\n};\n\nfunction generateRandomArray(size: number): number[] {\n return Array.from({ length: size }, () => Math.floor(Math.random() * 100) + 5);\n}\n\nconst SortingComparisonVisualizerComponent: React.FC<SortingComparisonVisualizerProps> = ({\n className = '',\n}) => {\n const [algorithm1, setAlgorithm1] = useState<SortingAlgorithm>('bubble');\n const [algorithm2, setAlgorithm2] = useState<SortingAlgorithm>('quick');\n const [arraySize, setArraySize] = useState(8);\n const [speed, setSpeed] = useState(50);\n const [isPlaying, setIsPlaying] = useState(false);\n const [baseArray, setBaseArray] = useState<number[]>([]);\n\n const [state1, setState1] = useState<AlgorithmState>({ steps: [], currentStep: 0, isFinished: false });\n const [state2, setState2] = useState<AlgorithmState>({ steps: [], currentStep: 0, isFinished: false });\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newArray = generateRandomArray(arraySize);\n setBaseArray(newArray);\n\n const steps1 = STEP_GENERATORS[algorithm1]([...newArray]);\n const steps2 = STEP_GENERATORS[algorithm2]([...newArray]);\n\n setState1({ steps: steps1, currentStep: 0, isFinished: false });\n setState2({ steps: steps2, currentStep: 0, isFinished: false });\n setIsPlaying(false);\n playingRef.current = false;\n }, [algorithm1, algorithm2, arraySize]);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n const bothFinished = state1.isFinished && state2.isFinished;\n\n if (isPlaying && !bothFinished) {\n playingRef.current = true;\n const delay = Math.max(50, 1000 - speed * 9.5);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setState1(prev => {\n if (prev.currentStep < prev.steps.length - 1) {\n return { ...prev, currentStep: prev.currentStep + 1 };\n }\n return { ...prev, isFinished: true };\n });\n\n setState2(prev => {\n if (prev.currentStep < prev.steps.length - 1) {\n return { ...prev, currentStep: prev.currentStep + 1 };\n }\n return { ...prev, isFinished: true };\n });\n }\n }, delay);\n } else if (bothFinished) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, state1.currentStep, state2.currentStep, state1.isFinished, state2.isFinished, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (state1.isFinished && state2.isFinished) {\n setState1(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n setState2(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [state1.isFinished, state2.isFinished, isPlaying]);\n\n const handleReset = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setState1(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n setState2(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n }, []);\n\n const handleShuffle = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n initialize();\n }, [initialize]);\n\n const getBarColor = (step: SortingStep, index: number): string => {\n if (step.sorted?.includes(index)) return 'bg-green-500';\n if (step.pivot === index) return 'bg-purple-500';\n if (step.swapping?.includes(index)) return 'bg-red-500';\n if (step.comparing?.includes(index)) return 'bg-yellow-400';\n return 'bg-blue-500';\n };\n\n const renderAlgorithmPanel = (\n algorithm: SortingAlgorithm,\n state: AlgorithmState,\n setAlgorithm: (alg: SortingAlgorithm) => void,\n otherAlgorithm: SortingAlgorithm,\n panelColor: string\n ) => {\n const step = state.steps[state.currentStep];\n if (!step) return null;\n\n const maxValue = Math.max(...step.array, 1);\n const complexity = ALGORITHM_COMPLEXITIES[algorithm];\n const finalStep = state.steps[state.steps.length - 1];\n const winner = state.isFinished && state1.isFinished && state2.isFinished;\n\n return (\n <div className={`flex-1 border-2 rounded-lg overflow-hidden ${panelColor}`}>\n {/* Header */}\n <div className=\"px-3 py-2 bg-gray-50 border-b flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <select\n value={algorithm}\n onChange={(e) => setAlgorithm(e.target.value as SortingAlgorithm)}\n className=\"px-2 py-1 text-sm font-medium bg-white border border-gray-300 rounded shadow-sm\"\n disabled={isPlaying}\n >\n {Object.entries(ALGORITHM_NAMES)\n .filter(([key]) => key !== otherAlgorithm)\n .map(([key, name]) => (\n <option key={key} value={key}>{name}</option>\n ))}\n </select>\n <span className=\"text-xs text-gray-500\">{complexity.time}</span>\n </div>\n {state.isFinished && winner && (\n <span className=\"px-2 py-0.5 text-xs font-bold bg-green-100 text-green-700 rounded\">\n Finished!\n </span>\n )}\n </div>\n\n {/* Bars */}\n <div className=\"p-3\">\n <div className=\"flex items-end justify-center gap-0.5 h-32 bg-gray-50 rounded p-2\">\n {step.array.map((value, index) => (\n <div\n key={index}\n className={`${getBarColor(step, index)} rounded-t transition-all duration-150`}\n style={{\n height: `${(value / maxValue) * 100}%`,\n width: `${Math.max(100 / step.array.length - 1, 6)}%`,\n minWidth: '8px',\n }}\n />\n ))}\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"px-3 py-2 bg-gray-50 border-t\">\n <div className=\"flex justify-between text-xs\">\n <div>\n <span className=\"text-gray-500\">Steps: </span>\n <span className=\"font-medium\">{state.currentStep + 1}/{state.steps.length}</span>\n </div>\n <div>\n <span className=\"text-yellow-600 font-medium\">C: {step.comparisons}</span>\n <span className=\"text-gray-400 mx-1\">|</span>\n <span className=\"text-red-600 font-medium\">\n {algorithm === 'merge' ? 'W' : 'S'}: {step.swaps}\n </span>\n </div>\n </div>\n {state.isFinished && finalStep && (\n <div className=\"mt-1 text-xs text-gray-600 text-center\">\n Total: {finalStep.comparisons} comparisons, {finalStep.swaps} {algorithm === 'merge' ? 'writes' : 'swaps'}\n </div>\n )}\n </div>\n </div>\n );\n };\n\n return (\n <div className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}>\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-indigo-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold text-gray-900\">Algorithm Comparison</h3>\n <div className=\"flex items-center gap-2 text-xs text-gray-500\">\n <span>Array: [{baseArray.slice(0, 5).join(', ')}{baseArray.length > 5 ? '...' : ''}]</span>\n </div>\n </div>\n </div>\n\n {/* Comparison Area */}\n <div className=\"p-4\">\n <VisualizationArea minHeight={350}>\n <div className=\"flex gap-4\">\n {renderAlgorithmPanel(algorithm1, state1, setAlgorithm1, algorithm2, 'border-indigo-200')}\n <div className=\"flex items-center text-2xl font-bold text-gray-300\">VS</div>\n {renderAlgorithmPanel(algorithm2, state2, setAlgorithm2, algorithm1, 'border-purple-200')}\n </div>\n </VisualizationArea>\n </div>\n\n {/* Controls */}\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-2\">\n {isPlaying && (\n <span className=\"flex items-center gap-1 text-xs text-indigo-600 font-medium\">\n <span className=\"w-2 h-2 bg-indigo-500 rounded-full animate-pulse\" />\n Racing\n </span>\n )}\n <button\n onClick={handlePlayPause}\n className={`p-2 text-white rounded-lg transition-colors ${\n isPlaying ? 'bg-indigo-500 hover:bg-indigo-600' : 'bg-indigo-600 hover:bg-indigo-700'\n }`}\n title=\"Play/Pause\"\n >\n {isPlaying ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\n </button>\n <button\n onClick={handleReset}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors\"\n title=\"Reset\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleShuffle}\n disabled={isPlaying}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50\"\n title=\"New Array\"\n >\n <Shuffle className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Size</label>\n <input\n type=\"range\"\n min=\"5\"\n max=\"15\"\n value={arraySize}\n onChange={(e) => setArraySize(Number(e.target.value))}\n disabled={isPlaying}\n className=\"w-20 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer disabled:opacity-50\"\n />\n <span className=\"text-xs text-gray-500 w-4\">{arraySize}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Speed</label>\n <input\n type=\"range\"\n min=\"1\"\n max=\"100\"\n value={speed}\n onChange={(e) => setSpeed(Number(e.target.value))}\n className=\"w-20 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const SortingComparisonVisualizer = React.memo(SortingComparisonVisualizerComponent);\nexport default SortingComparisonVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface Node {\n id: number;\n x: number;\n y: number;\n}\n\ninterface Edge {\n from: number;\n to: number;\n weight: number;\n}\n\ninterface DijkstraStep {\n current: number;\n distances: number[];\n visited: number[];\n previous: (number | null)[];\n priorityQueue: { node: number; dist: number }[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface DijkstraVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\n// Algorithm code snippets\nconst DIJKSTRA_CODE = [\n 'dijkstra(graph, start):',\n ' dist[start]=0, dist[*]=∞',\n ' pq.add((0, start))',\n ' while pq not empty:',\n ' (d,u) = pq.extractMin()',\n ' if visited[u]: continue',\n ' visited[u] = true',\n ' for neighbor v of u:',\n ' if dist[u]+w < dist[v]:',\n ' dist[v] = dist[u]+w',\n ' pq.add((dist[v], v))',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-100', label: 'Unvisited', border: '#60a5fa' },\n { color: 'bg-yellow-400', label: 'Current', border: '#ca8a04' },\n { color: 'bg-green-400', label: 'Visited', border: '#16a34a' },\n];\n\n// Generate a weighted graph\nfunction generateGraph(): {\n nodes: Node[];\n edges: Edge[];\n adjacencyList: Map<number, { to: number; weight: number }[]>;\n} {\n const nodes: Node[] = [\n { id: 0, x: 60, y: 150 }, // Start\n { id: 1, x: 150, y: 60 },\n { id: 2, x: 150, y: 240 },\n { id: 3, x: 260, y: 100 },\n { id: 4, x: 260, y: 200 },\n { id: 5, x: 360, y: 150 }, // End\n ];\n\n const edges: Edge[] = [\n { from: 0, to: 1, weight: 4 },\n { from: 0, to: 2, weight: 2 },\n { from: 1, to: 3, weight: 5 },\n { from: 2, to: 1, weight: 1 },\n { from: 2, to: 4, weight: 4 },\n { from: 3, to: 5, weight: 2 },\n { from: 4, to: 3, weight: 1 },\n { from: 4, to: 5, weight: 3 },\n ];\n\n const adjacencyList = new Map<number, { to: number; weight: number }[]>();\n nodes.forEach((node) => adjacencyList.set(node.id, []));\n edges.forEach(({ from, to, weight }) => {\n adjacencyList.get(from)?.push({ to, weight });\n });\n\n return { nodes, edges, adjacencyList };\n}\n\nfunction generateDijkstraSteps(\n nodes: Node[],\n adjacencyList: Map<number, { to: number; weight: number }[]>,\n startNode: number\n): DijkstraStep[] {\n const steps: DijkstraStep[] = [];\n const n = nodes.length;\n const distances = Array(n).fill(Infinity);\n const visited: number[] = [];\n const previous: (number | null)[] = Array(n).fill(null);\n const pq: { node: number; dist: number }[] = [];\n\n distances[startNode] = 0;\n pq.push({ node: startNode, dist: 0 });\n\n steps.push({\n current: -1,\n distances: [...distances],\n visited: [],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Initialize: dist[${startNode}] = 0, all others = ∞. Add source to priority queue.`,\n codeLine: 1,\n variables: { start: startNode, 'dist[start]': 0 },\n });\n\n while (pq.length > 0) {\n // Sort by distance and get minimum\n pq.sort((a, b) => a.dist - b.dist);\n const shifted = pq.shift();\n if (!shifted) break;\n const { node: current, dist: currentDist } = shifted;\n\n if (visited.includes(current)) {\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Node ${current} already visited, skip it`,\n codeLine: 5,\n variables: { u: current },\n });\n continue;\n }\n\n visited.push(current);\n\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Extract min from PQ: node ${current} with dist = ${currentDist}. Mark as visited.`,\n codeLine: 6,\n variables: { u: current, d: currentDist },\n });\n\n const neighbors = adjacencyList.get(current) || [];\n for (const { to, weight } of neighbors) {\n if (visited.includes(to)) continue;\n\n const newDist = distances[current] + weight;\n\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Check edge ${current}→${to} (weight=${weight}): dist[${current}] + ${weight} = ${newDist}, current dist[${to}] = ${distances[to] === Infinity ? '∞' : distances[to]}`,\n codeLine: 8,\n variables: {\n u: current,\n v: to,\n w: weight,\n 'new dist': newDist,\n 'old dist': distances[to] === Infinity ? '∞' : distances[to],\n },\n });\n\n if (newDist < distances[to]) {\n const oldDist = distances[to];\n distances[to] = newDist;\n previous[to] = current;\n pq.push({ node: to, dist: newDist });\n\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Relax! ${newDist} < ${oldDist === Infinity ? '∞' : oldDist} → Update dist[${to}] = ${newDist}, add to PQ`,\n codeLine: 10,\n variables: { v: to, 'dist[v]': newDist, via: current },\n });\n }\n }\n }\n\n steps.push({\n current: -1,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [],\n description: `✓ Done! Shortest paths from node ${startNode}: [${distances.map((d, i) => `${i}:${d}`).join(', ')}]`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nconst DijkstraVisualizerComponent: React.FC<DijkstraVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<DijkstraStep[]>([]);\n const [graph, setGraph] = useState<ReturnType<typeof generateGraph> | null>(\n null\n );\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initializeGraph = useCallback(() => {\n const newGraph = generateGraph();\n setGraph(newGraph);\n const newSteps = generateDijkstraSteps(\n newGraph.nodes,\n newGraph.adjacencyList,\n 0\n );\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initializeGraph();\n }, [initializeGraph]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n if (!graph) return null;\n\n const currentStepData = steps[currentStep] || {\n current: -1,\n visited: [],\n distances: [],\n priorityQueue: [],\n };\n const { current, visited, distances, priorityQueue } = currentStepData;\n\n const getNodeColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-400 stroke-yellow-600';\n if (visited.includes(nodeId)) return 'fill-green-400 stroke-green-600';\n return 'fill-blue-100 stroke-blue-400';\n };\n\n const getNodeTextColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-900';\n if (visited.includes(nodeId)) return 'fill-green-900';\n return 'fill-blue-700';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-orange-50 to-amber-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n Dijkstra's Algorithm\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n Time: O((V+E) log V)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-700 rounded\">\n Space: O(V)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4 overflow-x-auto\">\n <div className=\"flex flex-col lg:flex-row gap-4 min-w-0\">\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n {/* Graph SVG - larger */}\n <div className=\"bg-gray-50 rounded-lg\">\n <svg viewBox=\"0 0 420 300\" className=\"w-full h-64 md:h-72\">\n {/* Edges with weights */}\n {graph.edges.map((edge, index) => {\n const fromNode = graph.nodes[edge.from];\n const toNode = graph.nodes[edge.to];\n const midX = (fromNode.x + toNode.x) / 2;\n const midY = (fromNode.y + toNode.y) / 2;\n\n // Offset for weight label\n const dx = toNode.x - fromNode.x;\n const dy = toNode.y - fromNode.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n const offsetX = (-dy / len) * 12;\n const offsetY = (dx / len) * 12;\n\n return (\n <g key={index}>\n {/* Arrow line */}\n <line\n x1={fromNode.x}\n y1={fromNode.y}\n x2={toNode.x}\n y2={toNode.y}\n className=\"stroke-gray-400 stroke-2\"\n markerEnd=\"url(#arrowhead)\"\n />\n {/* Weight label */}\n <circle\n cx={midX + offsetX}\n cy={midY + offsetY}\n r={10}\n className=\"fill-white stroke-gray-300\"\n />\n <text\n x={midX + offsetX}\n y={midY + offsetY + 4}\n textAnchor=\"middle\"\n className=\"text-xs font-bold fill-gray-600\"\n >\n {edge.weight}\n </text>\n </g>\n );\n })}\n\n {/* Arrow marker definition */}\n <defs>\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"28\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon\n points=\"0 0, 10 3.5, 0 7\"\n className=\"fill-gray-400\"\n />\n </marker>\n </defs>\n\n {/* Nodes */}\n {graph.nodes.map((node) => (\n <g key={node.id}>\n <circle\n cx={node.x}\n cy={node.y}\n r={22}\n className={`${getNodeColor(node.id)} stroke-2 transition-all duration-300`}\n />\n <text\n x={node.x}\n y={node.y + 5}\n textAnchor=\"middle\"\n className={`text-sm font-bold ${getNodeTextColor(node.id)}`}\n >\n {node.id}\n </text>\n </g>\n ))}\n </svg>\n </div>\n\n {/* Distances & Priority Queue - compact horizontal layout */}\n <div className=\"mt-3 flex flex-wrap gap-3\">\n {/* Distance badges */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-xs font-medium text-gray-600\">Dist:</span>\n {distances.map((dist, idx) => (\n <span\n key={idx}\n className={`px-2 py-0.5 text-xs font-mono rounded ${\n idx === current\n ? 'bg-yellow-200 text-yellow-900'\n : visited.includes(idx)\n ? 'bg-green-100 text-green-800'\n : 'bg-gray-100 text-gray-600'\n }`}\n >\n {idx}:{dist === Infinity ? '∞' : dist}\n </span>\n ))}\n </div>\n\n {/* Priority Queue badges */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-xs font-medium text-gray-600\">PQ:</span>\n {priorityQueue.length > 0 ? (\n priorityQueue\n .sort((a, b) => a.dist - b.dist)\n .map((item, index) => (\n <span\n key={index}\n className=\"px-2 py-0.5 bg-orange-100 text-orange-800 text-xs rounded font-mono\"\n >\n {item.node}:{item.dist}\n </span>\n ))\n ) : (\n <span className=\"text-xs text-gray-400\">empty</span>\n )}\n </div>\n </div>\n\n {/* Status */}\n <div className=\"mt-3\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel - on right */}\n {showCode && (\n <div className=\"w-full lg:w-60 flex-shrink-0 space-y-2\">\n <CodePanel\n code={DIJKSTRA_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const DijkstraVisualizer = React.memo(DijkstraVisualizerComponent);\nexport default DijkstraVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface Item {\n weight: number;\n value: number;\n}\n\ninterface DPStep {\n i: number; // current item index\n w: number; // current capacity\n table: number[][];\n decision: 'skip' | 'take' | null;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface DPVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst DEFAULT_ITEMS: Item[] = [\n { weight: 2, value: 3 },\n { weight: 3, value: 4 },\n { weight: 4, value: 5 },\n { weight: 5, value: 6 },\n];\n\nconst DEFAULT_CAPACITY = 8;\n\n// Algorithm code snippets\nconst KNAPSACK_CODE = [\n 'for i = 1 to n:',\n ' for w = 1 to capacity:',\n ' if item[i].weight > w:',\n ' dp[i][w] = dp[i-1][w]',\n ' else:',\n ' skip = dp[i-1][w]',\n ' take = dp[i-1][w-weight] + value',\n ' dp[i][w] = max(skip, take)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-50', label: 'Not computed', border: '#d1d5db' },\n { color: 'bg-blue-100', label: 'Computed' },\n { color: 'bg-green-400', label: 'Take item' },\n { color: 'bg-yellow-300', label: 'Skip item' },\n];\n\nfunction generateKnapsackSteps(items: Item[], capacity: number): DPStep[] {\n const steps: DPStep[] = [];\n const n = items.length;\n const dp: number[][] = Array(n + 1)\n .fill(null)\n .map(() => Array(capacity + 1).fill(0));\n\n steps.push({\n i: -1,\n w: -1,\n table: dp.map((row) => [...row]),\n decision: null,\n description: `Initialize DP table: ${n + 1} rows (items) × ${capacity + 1} cols (capacity). Base case: dp[0][*] = 0`,\n codeLine: -1,\n });\n\n for (let i = 1; i <= n; i++) {\n const item = items[i - 1];\n\n for (let w = 1; w <= capacity; w++) {\n if (item.weight > w) {\n // Can't take this item\n dp[i][w] = dp[i - 1][w];\n steps.push({\n i,\n w,\n table: dp.map((row) => [...row]),\n decision: 'skip',\n description: `Item ${i} (w=${item.weight}, v=${item.value}): weight ${item.weight} > capacity ${w}, must skip → dp[${i}][${w}] = dp[${i - 1}][${w}] = ${dp[i][w]}`,\n codeLine: 3,\n variables: {\n i,\n w,\n 'item.weight': item.weight,\n 'dp[i-1][w]': dp[i - 1][w],\n },\n });\n } else {\n // Choose max of skip or take\n const skipValue = dp[i - 1][w];\n const takeValue = dp[i - 1][w - item.weight] + item.value;\n\n if (takeValue > skipValue) {\n dp[i][w] = takeValue;\n steps.push({\n i,\n w,\n table: dp.map((row) => [...row]),\n decision: 'take',\n description: `Item ${i}: take (${takeValue} = dp[${i - 1}][${w - item.weight}] + ${item.value}) > skip (${skipValue}) → Take it! dp[${i}][${w}] = ${takeValue}`,\n codeLine: 7,\n variables: {\n i,\n w,\n skip: skipValue,\n take: takeValue,\n max: takeValue,\n },\n });\n } else {\n dp[i][w] = skipValue;\n steps.push({\n i,\n w,\n table: dp.map((row) => [...row]),\n decision: 'skip',\n description: `Item ${i}: skip (${skipValue}) ≥ take (${takeValue} = dp[${i - 1}][${w - item.weight}] + ${item.value}) → Skip it! dp[${i}][${w}] = ${skipValue}`,\n codeLine: 7,\n variables: {\n i,\n w,\n skip: skipValue,\n take: takeValue,\n max: skipValue,\n },\n });\n }\n }\n }\n }\n\n steps.push({\n i: n,\n w: capacity,\n table: dp.map((row) => [...row]),\n decision: null,\n description: `✓ Done! Maximum value = ${dp[n][capacity]} (optimal solution in dp[${n}][${capacity}])`,\n codeLine: -1,\n variables: { 'max value': dp[n][capacity] },\n });\n\n return steps;\n}\n\nconst DPVisualizerComponent: React.FC<DPVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [items] = useState<Item[]>(DEFAULT_ITEMS);\n const [capacity] = useState(DEFAULT_CAPACITY);\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<DPStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initializeDP = useCallback(() => {\n const newSteps = generateKnapsackSteps(items, capacity);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [items, capacity]);\n\n useEffect(() => {\n initializeDP();\n }, [initializeDP]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const currentStepData = steps[currentStep] || {\n i: -1,\n w: -1,\n table: [],\n decision: null,\n };\n const { i: currentI, w: currentW, table, decision } = currentStepData;\n\n const getCellStyle = (i: number, w: number): string => {\n if (i === currentI && w === currentW) {\n if (decision === 'take') return 'bg-green-400 text-green-900 font-bold';\n if (decision === 'skip') return 'bg-yellow-300 text-yellow-900 font-bold';\n return 'bg-purple-400 text-purple-900 font-bold';\n }\n if (i < currentI || (i === currentI && w < currentW)) {\n return 'bg-blue-100 text-blue-800';\n }\n return 'bg-gray-50 text-gray-400';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-teal-50 to-cyan-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n 0/1 Knapsack (Dynamic Programming)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-teal-100 text-teal-700 rounded\">\n Time: O(nW)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-cyan-100 text-cyan-700 rounded\">\n Space: O(nW)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n <div className=\"flex gap-6\">\n {/* Items List */}\n <div className=\"w-36\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Items:\n </div>\n <div className=\"space-y-1\">\n {items.map((item, idx) => (\n <div\n key={idx}\n className={`px-2 py-1 rounded text-xs ${\n idx + 1 === currentI\n ? 'bg-purple-100 text-purple-800 font-medium'\n : idx + 1 < currentI\n ? 'bg-blue-50 text-blue-600'\n : 'bg-gray-100 text-gray-500'\n }`}\n >\n Item {idx + 1}: w={item.weight}, v={item.value}\n </div>\n ))}\n </div>\n <div className=\"mt-3 text-sm\">\n <span className=\"font-medium text-gray-700\">Capacity:</span>{' '}\n <span className=\"text-gray-900\">{capacity}</span>\n </div>\n </div>\n\n {/* DP Table */}\n <div className=\"flex-1 overflow-x-auto\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n DP Table:\n </div>\n <table className=\"text-xs border-collapse\">\n <thead>\n <tr>\n <th className=\"w-8 p-1 text-gray-500 font-normal\">i\\w</th>\n {Array.from({ length: capacity + 1 }, (_, w) => (\n <th\n key={w}\n className={`w-8 p-1 ${w === currentW ? 'text-purple-700 font-bold' : 'text-gray-500 font-normal'}`}\n >\n {w}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {table.map((row, i) => (\n <tr key={i}>\n <td\n className={`p-1 text-center ${i === currentI ? 'text-purple-700 font-bold' : 'text-gray-500'}`}\n >\n {i}\n </td>\n {row.map((cell, w) => (\n <td\n key={w}\n className={`p-1 text-center rounded ${getCellStyle(i, w)}`}\n >\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Status */}\n <div className=\"mt-4\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n decision === 'take'\n ? 'success'\n : decision === 'skip'\n ? 'warning'\n : 'default'\n }\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={KNAPSACK_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"teal\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const DPVisualizer = React.memo(DPVisualizerComponent);\nexport default DPVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ntype TraversalAlgorithm = 'dfs' | 'bfs';\n\ninterface Node {\n id: number;\n x: number;\n y: number;\n}\n\ninterface Edge {\n from: number;\n to: number;\n}\n\ninterface TraversalStep {\n current: number;\n visited: number[];\n queue?: number[]; // For BFS\n stack?: number[]; // For DFS\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface GraphVisualizerProps {\n algorithm?: TraversalAlgorithm;\n showControls?: boolean;\n showAlgorithmSelector?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst ALGORITHM_NAMES: Record<TraversalAlgorithm, string> = {\n dfs: 'Depth-First Search',\n bfs: 'Breadth-First Search',\n};\n\nconst ALGORITHM_COMPLEXITIES: Record<\n TraversalAlgorithm,\n { time: string; space: string }\n> = {\n dfs: { time: 'O(V + E)', space: 'O(V)' },\n bfs: { time: 'O(V + E)', space: 'O(V)' },\n};\n\n// Algorithm code snippets\nconst DFS_CODE = [\n 'dfs(graph, start):',\n ' stack.push(start)',\n ' while stack not empty:',\n ' node = stack.pop()',\n ' if visited[node]: continue',\n ' visited[node] = true',\n ' process(node)',\n ' for neighbor in adj[node]:',\n ' if not visited[neighbor]:',\n ' stack.push(neighbor)',\n];\n\nconst BFS_CODE = [\n 'bfs(graph, start):',\n ' queue.enqueue(start)',\n ' visited[start] = true',\n ' while queue not empty:',\n ' node = queue.dequeue()',\n ' process(node)',\n ' for neighbor in adj[node]:',\n ' if not visited[neighbor]:',\n ' visited[neighbor] = true',\n ' queue.enqueue(neighbor)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-100', label: 'Unvisited', border: '#60a5fa' },\n { color: 'bg-yellow-400', label: 'Current', border: '#ca8a04' },\n { color: 'bg-green-400', label: 'Visited', border: '#16a34a' },\n];\n\n// Generate a sample graph with positions\nfunction generateGraph(): {\n nodes: Node[];\n edges: Edge[];\n adjacencyList: number[][];\n} {\n // Create a connected graph with 8 nodes\n const nodes: Node[] = [\n { id: 0, x: 200, y: 40 }, // Root\n { id: 1, x: 100, y: 100 },\n { id: 2, x: 300, y: 100 },\n { id: 3, x: 50, y: 180 },\n { id: 4, x: 150, y: 180 },\n { id: 5, x: 250, y: 180 },\n { id: 6, x: 350, y: 180 },\n { id: 7, x: 100, y: 260 },\n ];\n\n const edges: Edge[] = [\n { from: 0, to: 1 },\n { from: 0, to: 2 },\n { from: 1, to: 3 },\n { from: 1, to: 4 },\n { from: 2, to: 5 },\n { from: 2, to: 6 },\n { from: 3, to: 7 },\n { from: 4, to: 7 },\n ];\n\n // Build adjacency list\n const adjacencyList: number[][] = Array.from(\n { length: nodes.length },\n () => []\n );\n edges.forEach(({ from, to }) => {\n adjacencyList[from].push(to);\n adjacencyList[to].push(from); // Undirected graph\n });\n\n return { nodes, edges, adjacencyList };\n}\n\nfunction generateDFSSteps(\n adjacencyList: number[][],\n startNode: number\n): TraversalStep[] {\n const steps: TraversalStep[] = [];\n const visited = new Set<number>();\n const stack: number[] = [startNode];\n\n steps.push({\n current: -1,\n visited: [],\n stack: [...stack],\n description: `Initialize: push start node ${startNode} onto stack`,\n codeLine: 1,\n variables: { start: startNode },\n });\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === undefined) break;\n\n if (visited.has(current)) {\n steps.push({\n current,\n visited: [...visited],\n stack: [...stack],\n description: `Node ${current} already visited, skip it`,\n codeLine: 4,\n variables: { node: current },\n });\n continue;\n }\n\n visited.add(current);\n\n steps.push({\n current,\n visited: [...visited],\n stack: [...stack],\n description: `Pop ${current} from stack, mark as visited. Process node ${current}`,\n codeLine: 6,\n variables: { node: current, 'visited count': visited.size },\n });\n\n // Add neighbors in reverse order so we visit them in order\n const neighbors = adjacencyList[current]\n .filter((n) => !visited.has(n))\n .reverse();\n\n if (neighbors.length > 0) {\n stack.push(...neighbors);\n steps.push({\n current,\n visited: [...visited],\n stack: [...stack],\n description: `Push unvisited neighbors [${neighbors.reverse().join(', ')}] onto stack`,\n codeLine: 9,\n variables: { node: current, neighbors: neighbors.length },\n });\n }\n }\n\n steps.push({\n current: -1,\n visited: [...visited],\n stack: [],\n description: `✓ DFS complete! Visit order: [${[...visited].join(' → ')}]`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nfunction generateBFSSteps(\n adjacencyList: number[][],\n startNode: number\n): TraversalStep[] {\n const steps: TraversalStep[] = [];\n const visited = new Set<number>();\n const queue: number[] = [startNode];\n visited.add(startNode);\n\n steps.push({\n current: -1,\n visited: [],\n queue: [...queue],\n description: `Initialize: enqueue start node ${startNode}, mark as visited`,\n codeLine: 1,\n variables: { start: startNode },\n });\n\n const visitOrder: number[] = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n visitOrder.push(current);\n\n steps.push({\n current,\n visited: [...visitOrder],\n queue: [...queue],\n description: `Dequeue ${current}, process it`,\n codeLine: 5,\n variables: { node: current },\n });\n\n const neighbors = adjacencyList[current].filter((n) => !visited.has(n));\n\n if (neighbors.length > 0) {\n neighbors.forEach((n) => {\n visited.add(n);\n queue.push(n);\n });\n\n steps.push({\n current,\n visited: [...visitOrder],\n queue: [...queue],\n description: `Enqueue unvisited neighbors [${neighbors.join(', ')}], mark as visited`,\n codeLine: 9,\n variables: { node: current, neighbors: neighbors.length },\n });\n }\n }\n\n steps.push({\n current: -1,\n visited: [...visitOrder],\n queue: [],\n description: `✓ BFS complete! Visit order: [${visitOrder.join(' → ')}]`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nconst GraphVisualizerComponent: React.FC<GraphVisualizerProps> = ({\n algorithm: initialAlgorithm = 'dfs',\n showControls = true,\n showAlgorithmSelector = true,\n showCode = true,\n className = '',\n}) => {\n const [algorithm, setAlgorithm] =\n useState<TraversalAlgorithm>(initialAlgorithm);\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<TraversalStep[]>([]);\n const [graph, setGraph] = useState<ReturnType<typeof generateGraph> | null>(\n null\n );\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Initialize graph and generate steps\n const initializeGraph = useCallback(() => {\n const newGraph = generateGraph();\n setGraph(newGraph);\n const newSteps =\n algorithm === 'dfs'\n ? generateDFSSteps(newGraph.adjacencyList, 0)\n : generateBFSSteps(newGraph.adjacencyList, 0);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [algorithm]);\n\n useEffect(() => {\n initializeGraph();\n }, [initializeGraph]);\n\n // Animation loop\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const handleShuffle = () => {\n initializeGraph();\n };\n\n if (!graph) return null;\n\n const currentStepData = steps[currentStep] || { current: -1, visited: [] };\n const { current, visited } = currentStepData;\n const dataStructure =\n algorithm === 'dfs' ? currentStepData.stack : currentStepData.queue;\n const dataStructureName = algorithm === 'dfs' ? 'Stack' : 'Queue';\n const algorithmCode = algorithm === 'dfs' ? DFS_CODE : BFS_CODE;\n\n const getNodeColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-400 stroke-yellow-600';\n if (visited.includes(nodeId)) return 'fill-green-400 stroke-green-600';\n return 'fill-blue-100 stroke-blue-400';\n };\n\n const getNodeTextColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-900';\n if (visited.includes(nodeId)) return 'fill-green-900';\n return 'fill-blue-700';\n };\n\n const complexity = ALGORITHM_COMPLEXITIES[algorithm];\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-purple-50 to-indigo-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n {ALGORITHM_NAMES[algorithm]}\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Time: {complexity.time}\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Space: {complexity.space}\n </span>\n </div>\n </div>\n\n {showAlgorithmSelector && (\n <select\n value={algorithm}\n onChange={(e) =>\n setAlgorithm(e.target.value as TraversalAlgorithm)\n }\n className=\"px-3 py-1.5 text-sm font-medium text-gray-900 bg-white border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500\"\n disabled={isPlaying}\n >\n {Object.entries(ALGORITHM_NAMES).map(([key, name]) => (\n <option key={key} value={key}>\n {name}\n </option>\n ))}\n </select>\n )}\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n <div className=\"flex gap-4\">\n {/* Graph SVG */}\n <div className=\"flex-1 bg-gray-50 rounded-lg\">\n <svg viewBox=\"0 0 400 300\" className=\"w-full h-64\">\n {/* Edges */}\n {graph.edges.map((edge, index) => {\n const fromNode = graph.nodes[edge.from];\n const toNode = graph.nodes[edge.to];\n return (\n <line\n key={index}\n x1={fromNode.x}\n y1={fromNode.y}\n x2={toNode.x}\n y2={toNode.y}\n className=\"stroke-gray-300 stroke-2\"\n />\n );\n })}\n\n {/* Nodes */}\n {graph.nodes.map((node) => (\n <g key={node.id}>\n <circle\n cx={node.x}\n cy={node.y}\n r={20}\n className={`${getNodeColor(node.id)} stroke-2 transition-all duration-300`}\n />\n <text\n x={node.x}\n y={node.y + 5}\n textAnchor=\"middle\"\n className={`text-sm font-bold ${getNodeTextColor(node.id)}`}\n >\n {node.id}\n </text>\n </g>\n ))}\n </svg>\n </div>\n\n {/* Data Structure Display */}\n <div className=\"w-32 flex flex-col\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n {dataStructureName}:\n </div>\n <div className=\"flex-1 bg-gray-100 rounded-lg p-2 min-h-[100px]\">\n {dataStructure && dataStructure.length > 0 ? (\n <div\n className={`flex ${algorithm === 'dfs' ? 'flex-col-reverse' : 'flex-col'} gap-1`}\n >\n {dataStructure.map((nodeId, index) => (\n <div\n key={index}\n className=\"px-2 py-1 bg-blue-100 text-blue-800 text-center rounded text-sm font-medium\"\n >\n {nodeId}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-gray-400 text-xs text-center\">\n Empty\n </div>\n )}\n </div>\n\n {/* Visit Order */}\n <div className=\"mt-3\">\n <div className=\"text-sm font-medium text-gray-700 mb-1\">\n Visited:\n </div>\n <div className=\"text-sm text-green-700 font-mono\">\n [{visited.join(', ')}]\n </div>\n </div>\n </div>\n </div>\n\n {/* Status */}\n <div className=\"mt-3\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={algorithmCode}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n onShuffle={handleShuffle}\n showShuffle={true}\n accentColor=\"purple\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const GraphVisualizer = React.memo(GraphVisualizerComponent);\nexport default GraphVisualizer;\n","import React, { useMemo, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface Entry {\n key: string;\n value: number;\n hash: number;\n}\n\ninterface Bucket {\n entries: Entry[];\n}\n\ninterface HashMapStep {\n operation: 'put' | 'get' | 'hash' | 'init' | 'done';\n key: string;\n value?: number;\n hash?: number;\n bucketIndex?: number;\n buckets: Bucket[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightBucket?: number;\n highlightEntry?: { bucket: number; index: number };\n found?: boolean;\n}\n\ninterface HashMapVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst BUCKET_COUNT = 8;\n\nconst OPERATIONS: Array<{ op: 'put' | 'get'; key: string; value?: number }> = [\n { op: 'put', key: 'Alice', value: 25 },\n { op: 'put', key: 'Bob', value: 30 },\n { op: 'put', key: 'Charlie', value: 35 },\n { op: 'put', key: 'Diana', value: 28 },\n { op: 'put', key: 'Eve', value: 22 },\n { op: 'get', key: 'Bob' },\n { op: 'put', key: 'Alice', value: 26 }, // Update existing\n { op: 'get', key: 'Frank' }, // Not found\n];\n\nconst HASHMAP_CODE = [\n 'function put(key, value):',\n ' hash = hashCode(key)',\n ' index = hash % capacity',\n ' bucket = buckets[index]',\n ' for entry in bucket:',\n ' if entry.key == key:',\n ' entry.value = value',\n ' return',\n ' bucket.add(Entry(key, value))',\n '',\n 'function get(key):',\n ' hash = hashCode(key)',\n ' index = hash % capacity',\n ' bucket = buckets[index]',\n ' for entry in bucket:',\n ' if entry.key == key:',\n ' return entry.value',\n ' return null',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-50', label: 'Current bucket', border: '#60a5fa' },\n { color: 'bg-blue-500', label: 'Insert/Update' },\n { color: 'bg-green-400', label: 'Found' },\n { color: 'bg-red-400', label: 'Not found' },\n];\n\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) & 0x7fffffff;\n }\n return hash;\n}\n\nfunction generateHashMapSteps(): HashMapStep[] {\n const steps: HashMapStep[] = [];\n const buckets: Bucket[] = Array.from({ length: BUCKET_COUNT }, () => ({\n entries: [],\n }));\n\n // Initial state\n steps.push({\n operation: 'init',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Initialize HashMap with ${BUCKET_COUNT} buckets. Each bucket is a linked list for collision handling.`,\n codeLine: -1,\n });\n\n for (const { op, key, value } of OPERATIONS) {\n const hash = simpleHash(key);\n const index = hash % BUCKET_COUNT;\n\n if (op === 'put') {\n // Step 1: Calculate hash\n steps.push({\n operation: 'hash',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `put(\"${key}\", ${value}): Calculate hash = ${hash}, index = ${hash} % ${BUCKET_COUNT} = ${index}`,\n codeLine: 1,\n variables: { key: `\"${key}\"`, value: value ?? 0, hash, index },\n highlightBucket: index,\n });\n\n // Check for existing key\n const existingIndex = buckets[index].entries.findIndex(\n (e) => e.key === key\n );\n\n if (existingIndex >= 0) {\n // Update existing\n const oldValue = buckets[index].entries[existingIndex].value;\n buckets[index].entries[existingIndex].value = value ?? 0;\n\n steps.push({\n operation: 'put',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Found \"${key}\" in bucket ${index}. Update value: ${oldValue} → ${value}`,\n codeLine: 6,\n variables: { key: `\"${key}\"`, old: oldValue, new: value ?? 0 },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: existingIndex },\n });\n } else {\n // Add new entry\n buckets[index].entries.push({ key, value: value ?? 0, hash });\n\n const collisionMsg =\n buckets[index].entries.length > 1\n ? ` (Collision! Chaining with ${buckets[index].entries.length - 1} existing entry)`\n : '';\n\n steps.push({\n operation: 'put',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Add Entry(\"${key}\", ${value}) to bucket ${index}${collisionMsg}`,\n codeLine: 8,\n variables: { key: `\"${key}\"`, value: value ?? 0, bucket: index },\n highlightBucket: index,\n highlightEntry: {\n bucket: index,\n index: buckets[index].entries.length - 1,\n },\n });\n }\n } else {\n // GET operation\n // Step 1: Calculate hash\n steps.push({\n operation: 'hash',\n key,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `get(\"${key}\"): Calculate hash = ${hash}, index = ${hash} % ${BUCKET_COUNT} = ${index}`,\n codeLine: 11,\n variables: { key: `\"${key}\"`, hash, index },\n highlightBucket: index,\n });\n\n // Search in bucket\n const foundIndex = buckets[index].entries.findIndex((e) => e.key === key);\n\n if (foundIndex >= 0) {\n const foundValue = buckets[index].entries[foundIndex].value;\n steps.push({\n operation: 'get',\n key,\n value: foundValue,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Found \"${key}\" in bucket ${index} → return ${foundValue}`,\n codeLine: 16,\n variables: { key: `\"${key}\"`, result: foundValue },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: foundIndex },\n found: true,\n });\n } else {\n steps.push({\n operation: 'get',\n key,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Key \"${key}\" not found in bucket ${index} → return null`,\n codeLine: 17,\n variables: { key: `\"${key}\"`, result: 'null' },\n highlightBucket: index,\n found: false,\n });\n }\n }\n }\n\n // Final state\n const totalEntries = buckets.reduce((sum, b) => sum + b.entries.length, 0);\n steps.push({\n operation: 'done',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `✓ Done! HashMap contains ${totalEntries} entries across ${BUCKET_COUNT} buckets.`,\n codeLine: -1,\n variables: { size: totalEntries, capacity: BUCKET_COUNT },\n });\n\n return steps;\n}\n\nconst HashMapVisualizerComponent: React.FC<HashMapVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'hashmap-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'hashmap', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateHashMapSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<HashMapStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n key: '',\n buckets: [],\n description: '',\n };\n\n const { buckets, highlightBucket, highlightEntry, description, found } =\n stepData;\n\n const getBucketStyle = (index: number): string => {\n if (index === highlightBucket) {\n if (stepData.operation === 'get') {\n return found\n ? 'border-green-400 bg-green-50'\n : 'border-red-400 bg-red-50';\n }\n return 'border-blue-400 bg-blue-50';\n }\n return 'border-gray-200 bg-gray-50';\n };\n\n const getEntryStyle = (bucketIdx: number, entryIdx: number): string => {\n if (\n highlightEntry &&\n highlightEntry.bucket === bucketIdx &&\n highlightEntry.index === entryIdx\n ) {\n if (stepData.operation === 'get') {\n return found ? 'bg-green-400 text-white' : 'bg-red-400 text-white';\n }\n return 'bg-blue-500 text-white';\n }\n return 'bg-white border border-gray-300 text-gray-700';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'get' && found === false) return 'error' as const;\n if (stepData.operation === 'get' && found === true) return 'success' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-indigo-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">HashMap Operations</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Avg: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Worst: O(n)\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Bucket Array */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Bucket Array (capacity: {BUCKET_COUNT})\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {buckets.map((bucket, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-8 h-8 flex items-center justify-center text-xs font-medium rounded border-2 transition-colors ${getBucketStyle(idx)}`}\n >\n {idx}\n </div>\n {/* Entries chain */}\n <div className=\"flex flex-col items-center mt-1\">\n {bucket.entries.length > 0 ? (\n bucket.entries.map((entry, eIdx) => (\n <React.Fragment key={eIdx}>\n {eIdx > 0 && (\n <div className=\"w-0.5 h-2 bg-gray-300\" />\n )}\n <div\n className={`px-2 py-1 text-[10px] rounded transition-colors whitespace-nowrap ${getEntryStyle(idx, eIdx)}`}\n >\n {entry.key}: {entry.value}\n </div>\n </React.Fragment>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 mt-1\">∅</div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Hash Visualization */}\n {stepData.hash !== undefined && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600\">\n <span className=\"font-medium\">Hash Calculation:</span>\n <div className=\"mt-1 font-mono text-indigo-600\">\n hashCode(\"{stepData.key}\") = {stepData.hash}\n </div>\n <div className=\"font-mono text-purple-600\">\n {stepData.hash} % {BUCKET_COUNT} = {stepData.bucketIndex}\n </div>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={HASHMAP_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"indigo\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const HashMapVisualizer = React.memo(HashMapVisualizerComponent);\nexport default HashMapVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Plus } from 'lucide-react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface HashStep {\n operation: 'insert' | 'collision' | 'placed' | 'rehash' | 'done';\n key: string;\n hashValue: number;\n bucketIndex: number;\n buckets: (string | null)[][];\n probeIndex?: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface HashTableVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst INITIAL_SIZE = 7;\nconst LOAD_FACTOR_THRESHOLD = 0.7;\n\nconst SAMPLE_KEYS = [\n 'apple',\n 'banana',\n 'cherry',\n 'date',\n 'elderberry',\n 'fig',\n 'grape',\n];\n\n// Algorithm code snippets\nconst HASH_TABLE_CODE = [\n 'function insert(key):',\n ' hash = hashFunction(key)',\n ' index = hash % tableSize',\n ' if bucket[index] has collision:',\n ' chain to existing bucket',\n ' bucket[index].append(key)',\n ' if loadFactor > threshold:',\n ' rehash(newSize = size * 2)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-50', label: 'Empty', border: '#d1d5db' },\n { color: 'bg-yellow-50', label: 'Hashing', border: '#facc15' },\n { color: 'bg-red-50', label: 'Collision', border: '#f87171' },\n { color: 'bg-green-50', label: 'Placed', border: '#4ade80' },\n];\n\nfunction simpleHash(key: string, size: number): number {\n let hash = 0;\n for (let i = 0; i < key.length; i++) {\n hash = (hash * 31 + key.charCodeAt(i)) % size;\n }\n return hash;\n}\n\nfunction generateHashSteps(keys: string[]): HashStep[] {\n const steps: HashStep[] = [];\n let buckets: (string | null)[][] = Array(INITIAL_SIZE)\n .fill(null)\n .map(() => []);\n let itemCount = 0;\n\n steps.push({\n operation: 'done',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Initialize hash table with ${INITIAL_SIZE} buckets (chaining)`,\n codeLine: -1,\n });\n\n for (const key of keys) {\n const currentSize = buckets.length;\n const hashValue = simpleHash(key, currentSize);\n const bucketIndex = hashValue;\n\n // Show hash calculation\n steps.push({\n operation: 'insert',\n key,\n hashValue,\n bucketIndex,\n buckets: buckets.map((b) => [...b]),\n description: `Insert \"${key}\": hash(\"${key}\") = ${hashValue}, index = ${hashValue} % ${currentSize} = ${bucketIndex}`,\n codeLine: 1,\n variables: {\n key: `\"${key}\"`,\n hash: hashValue,\n tableSize: currentSize,\n index: bucketIndex,\n },\n });\n\n // Check for collision\n if (buckets[bucketIndex].length > 0) {\n steps.push({\n operation: 'collision',\n key,\n hashValue,\n bucketIndex,\n buckets: buckets.map((b) => [...b]),\n description: `Collision at bucket ${bucketIndex}! Chain with existing: [${buckets[bucketIndex].join(', ')}]`,\n codeLine: 4,\n variables: {\n index: bucketIndex,\n existing: buckets[bucketIndex].length,\n },\n });\n }\n\n // Place the key\n buckets[bucketIndex].push(key);\n itemCount++;\n\n const loadFactor = itemCount / currentSize;\n steps.push({\n operation: 'placed',\n key,\n hashValue,\n bucketIndex,\n buckets: buckets.map((b) => [...b]),\n description: `Placed \"${key}\" in bucket ${bucketIndex}. Load factor: ${loadFactor.toFixed(2)}`,\n codeLine: 5,\n variables: {\n key: `\"${key}\"`,\n index: bucketIndex,\n loadFactor: loadFactor.toFixed(2),\n },\n });\n\n // Check if rehashing needed\n if (\n loadFactor > LOAD_FACTOR_THRESHOLD &&\n keys.indexOf(key) < keys.length - 1\n ) {\n const newSize = currentSize * 2 + 1; // Next odd number roughly double\n const newBuckets: (string | null)[][] = Array(newSize)\n .fill(null)\n .map(() => []);\n\n steps.push({\n operation: 'rehash',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Load factor ${loadFactor.toFixed(2)} > ${LOAD_FACTOR_THRESHOLD}. Rehashing to ${newSize} buckets...`,\n codeLine: 7,\n variables: {\n loadFactor: loadFactor.toFixed(2),\n threshold: LOAD_FACTOR_THRESHOLD,\n newSize,\n },\n });\n\n // Rehash all existing keys\n for (const bucket of buckets) {\n for (const existingKey of bucket) {\n if (existingKey) {\n const newHash = simpleHash(existingKey, newSize);\n newBuckets[newHash].push(existingKey);\n }\n }\n }\n\n buckets = newBuckets;\n\n steps.push({\n operation: 'done',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Rehashing complete! New size: ${newSize}, new load factor: ${(itemCount / newSize).toFixed(2)}`,\n codeLine: -1,\n variables: { newSize, newLoadFactor: (itemCount / newSize).toFixed(2) },\n });\n }\n }\n\n steps.push({\n operation: 'done',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Done! Inserted ${keys.length} keys. Final load factor: ${(itemCount / buckets.length).toFixed(2)}`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nconst HashTableVisualizerComponent: React.FC<HashTableVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<HashStep[]>([]);\n const [customKey, setCustomKey] = useState('');\n const [keys, setKeys] = useState<string[]>(SAMPLE_KEYS.slice(0, 5));\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initializeHash = useCallback(() => {\n const newSteps = generateHashSteps(keys);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [keys]);\n\n useEffect(() => {\n initializeHash();\n }, [initializeHash]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const handleAddKey = () => {\n if (customKey.trim() && !keys.includes(customKey.trim())) {\n setKeys([...keys, customKey.trim()]);\n setCustomKey('');\n }\n };\n\n const handleResetKeys = () => {\n setKeys(SAMPLE_KEYS.slice(0, 5));\n setCurrentStep(0);\n };\n\n const currentStepData = steps[currentStep] || {\n operation: 'done',\n buckets: [],\n bucketIndex: -1,\n key: '',\n };\n const { operation, buckets, bucketIndex, key } = currentStepData;\n\n const getBucketStyle = (index: number): string => {\n if (index === bucketIndex) {\n if (operation === 'collision') return 'border-red-400 bg-red-50';\n if (operation === 'placed') return 'border-green-400 bg-green-50';\n if (operation === 'insert') return 'border-yellow-400 bg-yellow-50';\n }\n return 'border-gray-300 bg-gray-50';\n };\n\n const getKeyStyle = (bucketKey: string | null): string => {\n if (\n bucketKey === key &&\n (operation === 'placed' || operation === 'insert')\n ) {\n return 'bg-yellow-200 text-yellow-900 border-yellow-400';\n }\n return 'bg-blue-100 text-blue-800 border-blue-300';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-violet-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n Hash Table (Chaining)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-violet-100 text-violet-700 rounded\">\n Avg: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Worst: O(n)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Keys to insert */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Keys to insert:\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {keys.map((k, idx) => {\n const isInserted = steps\n .slice(0, currentStep + 1)\n .some((s) => s.key === k && s.operation === 'placed');\n return (\n <span\n key={idx}\n className={`px-2 py-1 text-xs rounded border ${\n isInserted\n ? 'bg-green-100 text-green-700 border-green-300'\n : k === key\n ? 'bg-yellow-100 text-yellow-700 border-yellow-300'\n : 'bg-gray-100 text-gray-600 border-gray-300'\n }`}\n >\n {k}\n </span>\n );\n })}\n </div>\n </div>\n\n {/* Hash Table Buckets */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Hash Table ({buckets.length} buckets):\n </div>\n <div\n className=\"grid gap-2\"\n style={{\n gridTemplateColumns: `repeat(auto-fill, minmax(120px, 1fr))`,\n }}\n >\n {buckets.map((bucket, idx) => (\n <div\n key={idx}\n className={`p-2 rounded border-2 min-h-[60px] transition-all ${getBucketStyle(idx)}`}\n >\n <div className=\"text-xs font-mono text-gray-500 mb-1\">\n [{idx}]\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {bucket.length === 0 ? (\n <span className=\"text-xs text-gray-400 italic\">\n empty\n </span>\n ) : (\n bucket.map((bucketKey, keyIdx) => (\n <span\n key={keyIdx}\n className={`px-1.5 py-0.5 text-xs rounded border ${getKeyStyle(bucketKey)}`}\n >\n {bucketKey}\n </span>\n ))\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Hash Function Demo */}\n {operation === 'insert' && key && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-sm font-medium text-gray-700 mb-1\">\n Hash Calculation:\n </div>\n <div className=\"font-mono text-sm\">\n hash("{key}") mod {buckets.length} = {bucketIndex}\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n operation === 'collision'\n ? 'error'\n : operation === 'placed'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={HASH_TABLE_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"purple\"\n extraControls={\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={customKey}\n onChange={(e) => setCustomKey(e.target.value)}\n placeholder=\"Add key...\"\n className=\"px-2 py-1 text-sm border border-gray-300 rounded w-24 font-medium text-gray-900\"\n onKeyDown={(e) => e.key === 'Enter' && handleAddKey()}\n />\n <button\n onClick={handleAddKey}\n disabled={!customKey.trim()}\n className=\"p-1.5 bg-violet-100 text-violet-700 rounded hover:bg-violet-200 disabled:opacity-50\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleResetKeys}\n className=\"px-2 py-1 text-xs bg-gray-200 text-gray-700 rounded hover:bg-gray-300\"\n >\n Reset\n </button>\n </div>\n }\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const HashTableVisualizer = React.memo(HashTableVisualizerComponent);\nexport default HashTableVisualizer;\n","import React, { useMemo, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface Node {\n value: number;\n id: number;\n}\n\ninterface LinkedListStep {\n operation:\n | 'addFirst'\n | 'addLast'\n | 'removeFirst'\n | 'removeLast'\n | 'get'\n | 'init'\n | 'done';\n value?: number;\n index?: number;\n nodes: Node[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightNode?: number;\n traverseProgress?: number;\n}\n\ninterface LinkedListVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{\n op: 'addFirst' | 'addLast' | 'removeFirst' | 'removeLast' | 'get';\n value?: number;\n index?: number;\n}> = [\n { op: 'addFirst', value: 10 },\n { op: 'addLast', value: 20 },\n { op: 'addLast', value: 30 },\n { op: 'addFirst', value: 5 },\n { op: 'addLast', value: 40 },\n { op: 'get', index: 2 },\n { op: 'removeFirst' },\n { op: 'removeLast' },\n { op: 'get', index: 1 },\n];\n\nconst LINKEDLIST_CODE = [\n 'class Node { value, next, prev }',\n '',\n 'addFirst(value):',\n ' node = new Node(value)',\n ' node.next = head',\n ' head.prev = node',\n ' head = node',\n '',\n 'addLast(value):',\n ' node = new Node(value)',\n ' tail.next = node',\n ' node.prev = tail',\n ' tail = node',\n '',\n 'get(index):',\n ' node = head',\n ' for i = 0 to index:',\n ' node = node.next',\n ' return node.value',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-white', label: 'Node', border: '#d1d5db' },\n { color: 'bg-blue-500', label: 'Active' },\n];\n\nlet nodeIdCounter = 0;\n\nfunction generateLinkedListSteps(): LinkedListStep[] {\n const steps: LinkedListStep[] = [];\n let nodes: Node[] = [];\n nodeIdCounter = 0;\n\n steps.push({\n operation: 'init',\n nodes: [],\n description:\n 'Initialize empty LinkedList (doubly-linked). O(1) for add/remove at ends, O(n) for indexed access.',\n codeLine: -1,\n });\n\n for (const { op, value, index } of OPERATIONS) {\n if (op === 'addFirst' && value !== undefined) {\n const newNode: Node = { value, id: nodeIdCounter++ };\n nodes = [newNode, ...nodes];\n\n steps.push({\n operation: 'addFirst',\n value,\n nodes: [...nodes],\n description: `addFirst(${value}): Create new node, link to old head, update head pointer → O(1)`,\n codeLine: 2,\n variables: { value, size: nodes.length },\n highlightNode: newNode.id,\n });\n } else if (op === 'addLast' && value !== undefined) {\n const newNode: Node = { value, id: nodeIdCounter++ };\n nodes = [...nodes, newNode];\n\n steps.push({\n operation: 'addLast',\n value,\n nodes: [...nodes],\n description: `addLast(${value}): Create new node, link from old tail, update tail pointer → O(1)`,\n codeLine: 8,\n variables: { value, size: nodes.length },\n highlightNode: newNode.id,\n });\n } else if (op === 'removeFirst') {\n const removed = nodes[0];\n nodes = nodes.slice(1);\n\n steps.push({\n operation: 'removeFirst',\n value: removed?.value,\n nodes: [...nodes],\n description: `removeFirst(): Remove head node (${removed?.value}), update head to next → O(1)`,\n codeLine: 2,\n variables: { removed: removed?.value ?? 'null', size: nodes.length },\n });\n } else if (op === 'removeLast') {\n const removed = nodes[nodes.length - 1];\n nodes = nodes.slice(0, -1);\n\n steps.push({\n operation: 'removeLast',\n value: removed?.value,\n nodes: [...nodes],\n description: `removeLast(): Remove tail node (${removed?.value}), update tail to prev → O(1)`,\n codeLine: 8,\n variables: { removed: removed?.value ?? 'null', size: nodes.length },\n });\n } else if (op === 'get' && index !== undefined) {\n // Show traversal\n for (let i = 0; i <= index && i < nodes.length; i++) {\n steps.push({\n operation: 'get',\n index,\n nodes: [...nodes],\n description:\n i < index\n ? `get(${index}): Traversing... at index ${i}, need to reach ${index}`\n : `get(${index}): Found! Value = ${nodes[i]?.value} after ${i + 1} steps → O(n)`,\n codeLine: i < index ? 16 : 17,\n variables: { index, current: i, value: nodes[i]?.value ?? 'null' },\n highlightNode: nodes[i]?.id,\n traverseProgress: i,\n });\n }\n }\n }\n\n steps.push({\n operation: 'done',\n nodes: [...nodes],\n description: `✓ Done! LinkedList has ${nodes.length} elements. Remember: O(1) ends, O(n) middle access.`,\n codeLine: -1,\n variables: { size: nodes.length },\n });\n\n return steps;\n}\n\nconst LinkedListVisualizerComponent: React.FC<LinkedListVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'linkedlist-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'linkedlist', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateLinkedListSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<LinkedListStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n nodes: [],\n description: '',\n };\n\n const { nodes, highlightNode, description } = stepData;\n\n const getStatusVariant = () => {\n if (stepData.operation === 'done') return 'success' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n LinkedList Operations\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700 rounded\">\n Ends: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Index: O(n)\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350} className={showCode ? 'flex-1' : 'w-full'}>\n {/* LinkedList Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Doubly-Linked List\n </div>\n <div className=\"bg-gray-50 rounded-lg p-4 overflow-x-auto\">\n {nodes.length > 0 ? (\n <div className=\"flex items-center gap-1 min-w-max\">\n <div className=\"text-xs text-gray-500 font-mono mr-2\">\n head →\n </div>\n {nodes.map((node, idx) => (\n <React.Fragment key={node.id}>\n <div\n className={`flex flex-col items-center transition-all ${\n node.id === highlightNode ? 'scale-110' : ''\n }`}\n >\n <div\n className={`w-12 h-12 flex items-center justify-center rounded-lg border-2 font-medium transition-colors ${\n node.id === highlightNode\n ? 'bg-blue-500 border-blue-600 text-white'\n : 'bg-white border-gray-300 text-gray-700'\n }`}\n >\n {node.value}\n </div>\n <div className=\"text-[10px] text-gray-400 mt-1\">\n idx:{idx}\n </div>\n </div>\n {idx < nodes.length - 1 && (\n <div className=\"flex items-center text-gray-400\">\n <span className=\"text-lg\">⇄</span>\n </div>\n )}\n </React.Fragment>\n ))}\n <div className=\"text-xs text-gray-500 font-mono ml-2\">\n ← tail\n </div>\n </div>\n ) : (\n <div className=\"h-16 flex items-center justify-center text-gray-400 text-sm\">\n Empty list (head = tail = null)\n </div>\n )}\n </div>\n </div>\n\n {/* Pointers Info */}\n {nodes.length > 0 && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600 flex gap-4\">\n <span>\n <span className=\"font-medium\">head:</span> {nodes[0]?.value}\n </span>\n <span>\n <span className=\"font-medium\">tail:</span>{' '}\n {nodes[nodes.length - 1]?.value}\n </span>\n <span>\n <span className=\"font-medium\">size:</span> {nodes.length}\n </span>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={LINKEDLIST_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"blue\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const LinkedListVisualizer = React.memo(LinkedListVisualizerComponent);\nexport default LinkedListVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface Entry {\n key: string;\n value: number;\n hash: number;\n prev: string | null;\n next: string | null;\n}\n\ninterface Bucket {\n entries: Entry[];\n}\n\ninterface LinkedHashMapStep {\n operation: 'init' | 'put' | 'get' | 'hash' | 'link' | 'access' | 'done';\n key: string;\n value?: number;\n hash?: number;\n bucketIndex?: number;\n buckets: Bucket[];\n linkedOrder: string[]; // Keys in insertion/access order\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightBucket?: number;\n highlightEntry?: { bucket: number; index: number };\n highlightLinkedKey?: string;\n found?: boolean;\n accessOrder?: boolean;\n}\n\ninterface LinkedHashMapVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst BUCKET_COUNT = 6;\n\nconst OPERATIONS: Array<{\n op: 'put' | 'get';\n key: string;\n value?: number;\n}> = [\n { op: 'put', key: 'A', value: 10 },\n { op: 'put', key: 'B', value: 20 },\n { op: 'put', key: 'C', value: 30 },\n { op: 'put', key: 'D', value: 40 },\n { op: 'get', key: 'A' }, // Access moves to end in access-order mode\n { op: 'put', key: 'E', value: 50 },\n { op: 'get', key: 'B' },\n { op: 'put', key: 'A', value: 15 }, // Update existing\n];\n\nconst LINKEDHASHMAP_CODE = [\n 'class LinkedHashMap<K,V> extends HashMap {',\n ' Entry<K,V> head, tail;',\n ' boolean accessOrder; // false=insertion',\n '',\n ' V put(K key, V value) {',\n ' Entry e = super.put(key, value);',\n ' if (e.isNew()) {',\n ' linkNodeLast(e); // Add to list end',\n ' } else if (accessOrder) {',\n ' moveToLast(e);',\n ' }',\n ' return e.value;',\n ' }',\n '',\n ' V get(K key) {',\n ' Entry e = super.get(key);',\n ' if (e != null && accessOrder) {',\n ' moveToLast(e); // LRU: move to end',\n ' }',\n ' return e != null ? e.value : null;',\n ' }',\n '}',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-50', label: 'Current bucket', border: '#60a5fa' },\n { color: 'bg-blue-500', label: 'Insert/Update' },\n { color: 'bg-green-400', label: 'Found' },\n { color: 'bg-orange-400', label: 'Linked list order' },\n];\n\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) & 0x7fffffff;\n }\n return hash;\n}\n\nfunction generateLinkedHashMapSteps(accessOrder = true): LinkedHashMapStep[] {\n const steps: LinkedHashMapStep[] = [];\n const buckets: Bucket[] = Array.from({ length: BUCKET_COUNT }, () => ({\n entries: [],\n }));\n const linkedOrder: string[] = [];\n const entryMap: Map<string, Entry> = new Map();\n\n // Initial state\n steps.push({\n operation: 'init',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n linkedOrder: [...linkedOrder],\n description: `Initialize LinkedHashMap with ${BUCKET_COUNT} buckets. Mode: ${accessOrder ? 'Access-order (LRU)' : 'Insertion-order'}`,\n codeLine: 0,\n accessOrder,\n });\n\n for (const { op, key, value } of OPERATIONS) {\n const hash = simpleHash(key);\n const index = hash % BUCKET_COUNT;\n\n if (op === 'put') {\n // Step 1: Calculate hash\n steps.push({\n operation: 'hash',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `put(\"${key}\", ${value}): hash = ${hash}, bucket = ${index}`,\n codeLine: 5,\n variables: { key: `\"${key}\"`, hash, bucket: index },\n highlightBucket: index,\n accessOrder,\n });\n\n // Check for existing key\n const existingBucketIdx = buckets[index].entries.findIndex(\n (e) => e.key === key\n );\n\n if (existingBucketIdx >= 0) {\n // Update existing\n const oldValue = buckets[index].entries[existingBucketIdx].value;\n buckets[index].entries[existingBucketIdx].value = value ?? 0;\n\n if (accessOrder) {\n // Move to end of linked list\n const linkedIdx = linkedOrder.indexOf(key);\n if (linkedIdx !== -1) {\n linkedOrder.splice(linkedIdx, 1);\n linkedOrder.push(key);\n }\n\n steps.push({\n operation: 'access',\n key,\n value,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Update \"${key}\": ${oldValue} → ${value}. Access-order: move to end`,\n codeLine: 9,\n variables: { key: `\"${key}\"`, old: oldValue, new: value ?? 0 },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: existingBucketIdx },\n highlightLinkedKey: key,\n accessOrder,\n });\n } else {\n steps.push({\n operation: 'put',\n key,\n value,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Update \"${key}\": ${oldValue} → ${value}. Insertion-order: position unchanged`,\n codeLine: 6,\n variables: { key: `\"${key}\"`, old: oldValue, new: value ?? 0 },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: existingBucketIdx },\n accessOrder,\n });\n }\n } else {\n // Add new entry\n const newEntry: Entry = {\n key,\n value: value ?? 0,\n hash,\n prev: linkedOrder.length > 0 ? linkedOrder[linkedOrder.length - 1] : null,\n next: null,\n };\n\n // Update previous tail's next pointer\n if (linkedOrder.length > 0) {\n const prevKey = linkedOrder[linkedOrder.length - 1];\n const prevEntry = entryMap.get(prevKey);\n if (prevEntry) {\n prevEntry.next = key;\n }\n }\n\n buckets[index].entries.push(newEntry);\n linkedOrder.push(key);\n entryMap.set(key, newEntry);\n\n steps.push({\n operation: 'link',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Add \"${key}\" to bucket ${index} and link to end of list`,\n codeLine: 7,\n variables: {\n key: `\"${key}\"`,\n value: value ?? 0,\n prev: newEntry.prev || 'null',\n },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: buckets[index].entries.length - 1 },\n highlightLinkedKey: key,\n accessOrder,\n });\n }\n } else {\n // GET operation\n steps.push({\n operation: 'hash',\n key,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `get(\"${key}\"): hash = ${hash}, bucket = ${index}`,\n codeLine: 15,\n variables: { key: `\"${key}\"`, hash, bucket: index },\n highlightBucket: index,\n accessOrder,\n });\n\n const foundIdx = buckets[index].entries.findIndex((e) => e.key === key);\n\n if (foundIdx >= 0) {\n const foundValue = buckets[index].entries[foundIdx].value;\n\n if (accessOrder) {\n // Move to end of linked list\n const linkedIdx = linkedOrder.indexOf(key);\n if (linkedIdx !== -1 && linkedIdx !== linkedOrder.length - 1) {\n linkedOrder.splice(linkedIdx, 1);\n linkedOrder.push(key);\n }\n\n steps.push({\n operation: 'access',\n key,\n value: foundValue,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Found \"${key}\" = ${foundValue}. Access-order: move to end (LRU)`,\n codeLine: 17,\n variables: { key: `\"${key}\"`, value: foundValue },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: foundIdx },\n highlightLinkedKey: key,\n found: true,\n accessOrder,\n });\n } else {\n steps.push({\n operation: 'get',\n key,\n value: foundValue,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Found \"${key}\" = ${foundValue}`,\n codeLine: 19,\n variables: { key: `\"${key}\"`, value: foundValue },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: foundIdx },\n found: true,\n accessOrder,\n });\n }\n } else {\n steps.push({\n operation: 'get',\n key,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Key \"${key}\" not found → null`,\n codeLine: 19,\n variables: { key: `\"${key}\"`, result: 'null' },\n highlightBucket: index,\n found: false,\n accessOrder,\n });\n }\n }\n }\n\n // Final state\n const totalEntries = buckets.reduce((sum, b) => sum + b.entries.length, 0);\n steps.push({\n operation: 'done',\n key: '',\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `✓ Done! ${totalEntries} entries. Iteration order: ${linkedOrder.join(' → ')}`,\n codeLine: -1,\n variables: { size: totalEntries },\n accessOrder,\n });\n\n return steps;\n}\n\nconst LinkedHashMapVisualizerComponent: React.FC<LinkedHashMapVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'linkedhashmap-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'linkedhashmap', scrollToId: VISUALIZER_ID });\n\n const [accessOrder, setAccessOrder] = useState(true);\n\n const generateSteps = useMemo(\n () => () => generateLinkedHashMapSteps(accessOrder),\n [accessOrder]\n );\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<LinkedHashMapStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n key: '',\n buckets: [],\n linkedOrder: [],\n description: '',\n };\n\n const {\n buckets,\n linkedOrder,\n highlightBucket,\n highlightEntry,\n highlightLinkedKey,\n description,\n found,\n } = stepData;\n\n const toggleAccessOrder = useCallback(() => {\n setAccessOrder((prev) => !prev);\n }, []);\n\n const getBucketStyle = (index: number): string => {\n if (index === highlightBucket) {\n if (stepData.operation === 'get') {\n return found\n ? 'border-green-400 bg-green-50'\n : 'border-red-400 bg-red-50';\n }\n return 'border-blue-400 bg-blue-50';\n }\n return 'border-gray-200 bg-gray-50';\n };\n\n const getEntryStyle = (bucketIdx: number, entryIdx: number): string => {\n if (\n highlightEntry &&\n highlightEntry.bucket === bucketIdx &&\n highlightEntry.index === entryIdx\n ) {\n if (stepData.operation === 'get' && found) {\n return 'bg-green-400 text-white';\n }\n if (stepData.operation === 'access') {\n return 'bg-orange-400 text-white';\n }\n return 'bg-blue-500 text-white';\n }\n return 'bg-white border border-gray-300 text-gray-700';\n };\n\n const getLinkedNodeStyle = (key: string): string => {\n if (key === highlightLinkedKey) {\n return 'bg-orange-400 text-white ring-2 ring-orange-300';\n }\n return 'bg-orange-100 text-orange-700';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'get' && found === false) return 'error' as const;\n if (stepData.operation === 'get' && found === true) return 'success' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-orange-50 to-amber-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">LinkedHashMap</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n O(1) ops\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-700 rounded\">\n Ordered\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleAccessOrder}\n className={`px-3 py-1 text-xs font-medium rounded transition-colors ${\n accessOrder\n ? 'bg-orange-500 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n {accessOrder ? 'Access-Order (LRU)' : 'Insertion-Order'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Dual Structure Info */}\n <div className=\"mb-3 p-2 bg-amber-50 rounded text-xs text-amber-700\">\n <strong>Dual structure:</strong> Hash table (O(1) lookup) + Doubly-linked list (ordered iteration)\n </div>\n\n {/* Bucket Array */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Hash Table ({BUCKET_COUNT} buckets)\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {buckets.map((bucket, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-8 h-8 flex items-center justify-center text-xs font-medium rounded border-2 transition-colors ${getBucketStyle(idx)}`}\n >\n {idx}\n </div>\n <div className=\"flex flex-col items-center mt-1\">\n {bucket.entries.length > 0 ? (\n bucket.entries.map((entry, eIdx) => (\n <React.Fragment key={eIdx}>\n {eIdx > 0 && (\n <div className=\"w-0.5 h-1 bg-gray-300\" />\n )}\n <div\n className={`px-2 py-0.5 text-[10px] rounded transition-colors whitespace-nowrap ${getEntryStyle(idx, eIdx)}`}\n >\n {entry.key}:{entry.value}\n </div>\n </React.Fragment>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 mt-1\">∅</div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Linked List Order */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n {accessOrder ? 'Access Order (LRU: oldest → newest)' : 'Insertion Order'}\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n {linkedOrder.length > 0 ? (\n <>\n <span className=\"text-[10px] text-gray-500\">HEAD →</span>\n {linkedOrder.map((key, idx) => (\n <React.Fragment key={key}>\n {idx > 0 && (\n <span className=\"text-orange-400\">→</span>\n )}\n <div\n className={`px-2 py-0.5 text-xs font-medium rounded transition-all ${getLinkedNodeStyle(key)}`}\n >\n {key}\n </div>\n </React.Fragment>\n ))}\n <span className=\"text-[10px] text-gray-500\">→ TAIL</span>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 italic\">Empty list</span>\n )}\n </div>\n </div>\n\n {/* LRU Cache Example */}\n {accessOrder && (\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-blue-700\">\n <strong>LRU Cache Usage:</strong>\n <div className=\"mt-1 text-[11px]\">\n {linkedOrder.length > 0 ? (\n <>\n Least Recently Used: <strong>{linkedOrder[0]}</strong> |\n Most Recently Used: <strong>{linkedOrder[linkedOrder.length - 1]}</strong>\n </>\n ) : (\n 'Cache empty'\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={LINKEDHASHMAP_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const LinkedHashMapVisualizer = React.memo(LinkedHashMapVisualizerComponent);\nexport default LinkedHashMapVisualizer;\n","import React, { useMemo, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface ArrayListStep {\n operation: 'add' | 'addAt' | 'get' | 'remove' | 'resize' | 'init' | 'done';\n value?: number;\n index?: number;\n array: (number | null)[];\n size: number;\n capacity: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n shiftIndices?: number[];\n}\n\ninterface ArrayListVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst INITIAL_CAPACITY = 4;\n\nconst OPERATIONS: Array<{\n op: 'add' | 'addAt' | 'get' | 'remove';\n value?: number;\n index?: number;\n}> = [\n { op: 'add', value: 10 },\n { op: 'add', value: 20 },\n { op: 'add', value: 30 },\n { op: 'add', value: 40 },\n { op: 'add', value: 50 }, // Triggers resize\n { op: 'get', index: 2 },\n { op: 'addAt', value: 25, index: 2 },\n { op: 'remove', index: 1 },\n { op: 'get', index: 0 },\n];\n\nconst ARRAYLIST_CODE = [\n 'add(value):',\n ' if size == capacity:',\n ' resize(capacity * 2)',\n ' array[size] = value',\n ' size++',\n '',\n 'add(index, value):',\n ' shift elements right',\n ' array[index] = value',\n ' size++',\n '',\n 'get(index):',\n ' return array[index] // O(1)',\n '',\n 'remove(index):',\n ' shift elements left',\n ' size--',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-white border-gray-300', label: 'Used', border: '#d1d5db' },\n { color: 'bg-gray-100', label: 'Empty' },\n { color: 'bg-orange-500', label: 'Active' },\n { color: 'bg-yellow-200', label: 'Shifted', border: '#fbbf24' },\n];\n\nfunction generateArrayListSteps(): ArrayListStep[] {\n const steps: ArrayListStep[] = [];\n let array: (number | null)[] = new Array(INITIAL_CAPACITY).fill(null);\n let size = 0;\n let capacity = INITIAL_CAPACITY;\n\n steps.push({\n operation: 'init',\n array: [...array],\n size: 0,\n capacity,\n description: `Initialize ArrayList with capacity ${capacity}. Auto-grows when full (amortized O(1) add).`,\n codeLine: -1,\n });\n\n for (const { op, value, index } of OPERATIONS) {\n if (op === 'add' && value !== undefined) {\n if (size === capacity) {\n const oldCapacity = capacity;\n capacity *= 2;\n const newArray: (number | null)[] = new Array(capacity).fill(null);\n for (let i = 0; i < size; i++) {\n newArray[i] = array[i];\n }\n array = newArray;\n\n steps.push({\n operation: 'resize',\n array: [...array],\n size,\n capacity,\n description: `Resize! Array full (${oldCapacity}/${oldCapacity}). Create new array with capacity ${capacity}, copy elements → O(n)`,\n codeLine: 2,\n variables: { oldCapacity, newCapacity: capacity, copied: size },\n });\n }\n\n array[size] = value;\n size++;\n\n steps.push({\n operation: 'add',\n value,\n array: [...array],\n size,\n capacity,\n description: `add(${value}): Place at index ${size - 1} → O(1) amortized`,\n codeLine: 3,\n variables: { value, index: size - 1, size },\n highlightIndex: size - 1,\n });\n } else if (op === 'addAt' && value !== undefined && index !== undefined) {\n const shiftIndices: number[] = [];\n for (let i = size; i > index; i--) {\n array[i] = array[i - 1];\n shiftIndices.push(i);\n }\n\n steps.push({\n operation: 'addAt',\n value,\n index,\n array: [...array],\n size,\n capacity,\n description: `add(${index}, ${value}): Shift ${size - index} elements right to make room → O(n)`,\n codeLine: 7,\n variables: { index, shifted: size - index },\n shiftIndices,\n });\n\n array[index] = value;\n size++;\n\n steps.push({\n operation: 'addAt',\n value,\n index,\n array: [...array],\n size,\n capacity,\n description: `add(${index}, ${value}): Insert value at index ${index}`,\n codeLine: 8,\n variables: { value, index, size },\n highlightIndex: index,\n });\n } else if (op === 'get' && index !== undefined) {\n steps.push({\n operation: 'get',\n index,\n value: array[index] ?? undefined,\n array: [...array],\n size,\n capacity,\n description: `get(${index}): Direct access → ${array[index]} in O(1)`,\n codeLine: 11,\n variables: { index, value: array[index] ?? 'null' },\n highlightIndex: index,\n });\n } else if (op === 'remove' && index !== undefined) {\n const removed = array[index];\n const shiftIndices: number[] = [];\n for (let i = index; i < size - 1; i++) {\n array[i] = array[i + 1];\n shiftIndices.push(i);\n }\n array[size - 1] = null;\n size--;\n\n steps.push({\n operation: 'remove',\n index,\n value: removed ?? undefined,\n array: [...array],\n size,\n capacity,\n description: `remove(${index}): Removed ${removed}, shifted ${shiftIndices.length} elements left → O(n)`,\n codeLine: 14,\n variables: {\n index,\n removed: removed ?? 'null',\n shifted: shiftIndices.length,\n },\n shiftIndices,\n });\n }\n }\n\n steps.push({\n operation: 'done',\n array: [...array],\n size,\n capacity,\n description: `✓ Done! ArrayList: size=${size}, capacity=${capacity}. O(1) get, O(1) amortized add, O(n) insert/remove.`,\n codeLine: -1,\n variables: { size, capacity },\n });\n\n return steps;\n}\n\nconst ArrayListVisualizerComponent: React.FC<ArrayListVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'arraylist-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'arraylist', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateArrayListSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<ArrayListStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n array: [],\n size: 0,\n capacity: INITIAL_CAPACITY,\n description: '',\n };\n\n const { array, size, capacity, highlightIndex, shiftIndices, description } =\n stepData;\n\n const getCellStyle = (idx: number): string => {\n if (idx === highlightIndex) {\n return 'bg-orange-500 border-orange-600 text-white';\n }\n if (shiftIndices?.includes(idx)) {\n return 'bg-yellow-200 border-yellow-400 text-yellow-800';\n }\n if (idx < size) {\n return 'bg-white border-gray-300 text-gray-700';\n }\n return 'bg-gray-100 border-gray-200 text-gray-300';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'resize') return 'error' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-orange-50 to-amber-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n ArrayList Operations\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n Get: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-700 rounded\">\n Add: O(1)*\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Array Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Internal Array (capacity: {capacity})\n </div>\n <div className=\"bg-gray-50 rounded-lg p-4 overflow-x-auto\">\n <div className=\"flex gap-1 min-w-max\">\n {array.map((val, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-12 h-12 flex items-center justify-center rounded border-2 font-medium transition-all ${getCellStyle(idx)}`}\n >\n {val !== null ? val : ''}\n </div>\n <div className=\"text-[10px] text-gray-400 mt-1\">\n [{idx}]\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Size/Capacity Info */}\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"flex gap-6 text-xs\">\n <div>\n <span className=\"font-medium text-gray-700\">size:</span>{' '}\n <span className=\"text-orange-600 font-mono\">{size}</span>\n </div>\n <div>\n <span className=\"font-medium text-gray-700\">capacity:</span>{' '}\n <span className=\"text-amber-600 font-mono\">{capacity}</span>\n </div>\n <div>\n <span className=\"font-medium text-gray-700\">load:</span>{' '}\n <span className=\"font-mono\">\n {Math.round((size / capacity) * 100)}%\n </span>\n </div>\n </div>\n <div className=\"mt-2 h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-orange-500 transition-all\"\n style={{ width: `${(size / capacity) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ARRAYLIST_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ArrayListVisualizer = React.memo(ArrayListVisualizerComponent);\nexport default ArrayListVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface ArrayDequeStep {\n operation:\n | 'init'\n | 'addFirst'\n | 'addLast'\n | 'removeFirst'\n | 'removeLast'\n | 'resize'\n | 'done';\n value?: number;\n array: (number | null)[];\n head: number;\n tail: number;\n capacity: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n highlightType?: 'add' | 'remove' | 'head' | 'tail';\n resizing?: boolean;\n}\n\ninterface ArrayDequeVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst INITIAL_CAPACITY = 8;\n\nconst OPERATIONS: Array<{\n op: 'addFirst' | 'addLast' | 'removeFirst' | 'removeLast';\n value?: number;\n}> = [\n { op: 'addLast', value: 10 },\n { op: 'addLast', value: 20 },\n { op: 'addFirst', value: 5 },\n { op: 'addLast', value: 30 },\n { op: 'addFirst', value: 1 },\n { op: 'removeFirst' },\n { op: 'removeLast' },\n { op: 'addLast', value: 40 },\n { op: 'addLast', value: 50 },\n { op: 'addFirst', value: 0 },\n { op: 'addLast', value: 60 }, // May trigger resize\n];\n\nconst ARRAYDEQUE_CODE = [\n 'class ArrayDeque<E> {',\n ' E[] elements;',\n ' int head = 0, tail = 0;',\n '',\n ' void addFirst(E e) {',\n ' head = (head - 1) & (capacity - 1);',\n ' elements[head] = e;',\n ' if (head == tail) grow();',\n ' }',\n '',\n ' void addLast(E e) {',\n ' elements[tail] = e;',\n ' tail = (tail + 1) & (capacity - 1);',\n ' if (head == tail) grow();',\n ' }',\n '',\n ' E removeFirst() {',\n ' E e = elements[head];',\n ' elements[head] = null;',\n ' head = (head + 1) & (capacity - 1);',\n ' return e;',\n ' }',\n '',\n ' E removeLast() {',\n ' tail = (tail - 1) & (capacity - 1);',\n ' E e = elements[tail];',\n ' elements[tail] = null;',\n ' return e;',\n ' }',\n '}',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-teal-500', label: 'Head pointer' },\n { color: 'bg-violet-500', label: 'Tail pointer' },\n { color: 'bg-green-400', label: 'Added element' },\n { color: 'bg-red-400', label: 'Removed element' },\n { color: 'bg-yellow-200', label: 'Resize' },\n];\n\nfunction generateArrayDequeSteps(): ArrayDequeStep[] {\n const steps: ArrayDequeStep[] = [];\n let array: (number | null)[] = new Array(INITIAL_CAPACITY).fill(null);\n let head = 0;\n let tail = 0;\n let capacity = INITIAL_CAPACITY;\n\n const getSize = () => (tail - head + capacity) % capacity;\n\n // Initial state\n steps.push({\n operation: 'init',\n array: [...array],\n head,\n tail,\n capacity,\n description: `Initialize ArrayDeque with capacity ${capacity}. Circular buffer: head and tail wrap around.`,\n codeLine: 0,\n variables: { head, tail, capacity, size: 0 },\n });\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'addFirst' && value !== undefined) {\n // Check if resize needed\n if (getSize() === capacity - 1) {\n const oldCapacity = capacity;\n const newCapacity = capacity * 2;\n const newArray: (number | null)[] = new Array(newCapacity).fill(null);\n\n // Copy elements in order\n let idx = 0;\n let i = head;\n while (i !== tail) {\n newArray[idx++] = array[i];\n i = (i + 1) % capacity;\n }\n\n array = newArray;\n head = 0;\n tail = idx;\n capacity = newCapacity;\n\n steps.push({\n operation: 'resize',\n array: [...array],\n head,\n tail,\n capacity,\n description: `Resize: ${oldCapacity} → ${newCapacity}. Elements copied in order, head reset to 0.`,\n codeLine: 7,\n variables: { oldCapacity, newCapacity, size: getSize() },\n resizing: true,\n });\n }\n\n // Decrement head (wrap around)\n head = (head - 1 + capacity) % capacity;\n array[head] = value;\n\n steps.push({\n operation: 'addFirst',\n value,\n array: [...array],\n head,\n tail,\n capacity,\n description: `addFirst(${value}): head = (${(head + 1) % capacity} - 1) % ${capacity} = ${head}`,\n codeLine: 5,\n variables: { value, head, tail, size: getSize() },\n highlightIndex: head,\n highlightType: 'add',\n });\n } else if (op === 'addLast' && value !== undefined) {\n // Check if resize needed\n if (getSize() === capacity - 1) {\n const oldCapacity = capacity;\n const newCapacity = capacity * 2;\n const newArray: (number | null)[] = new Array(newCapacity).fill(null);\n\n // Copy elements in order\n let idx = 0;\n let i = head;\n while (i !== tail) {\n newArray[idx++] = array[i];\n i = (i + 1) % capacity;\n }\n\n array = newArray;\n head = 0;\n tail = idx;\n capacity = newCapacity;\n\n steps.push({\n operation: 'resize',\n array: [...array],\n head,\n tail,\n capacity,\n description: `Resize: ${oldCapacity} → ${newCapacity}. Elements copied in order, head reset to 0.`,\n codeLine: 13,\n variables: { oldCapacity, newCapacity, size: getSize() },\n resizing: true,\n });\n }\n\n array[tail] = value;\n const oldTail = tail;\n tail = (tail + 1) % capacity;\n\n steps.push({\n operation: 'addLast',\n value,\n array: [...array],\n head,\n tail,\n capacity,\n description: `addLast(${value}): elements[${oldTail}] = ${value}, tail = (${oldTail} + 1) % ${capacity} = ${tail}`,\n codeLine: 11,\n variables: { value, head, tail, size: getSize() },\n highlightIndex: oldTail,\n highlightType: 'add',\n });\n } else if (op === 'removeFirst') {\n if (head === tail) {\n steps.push({\n operation: 'removeFirst',\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeFirst(): Deque is empty!`,\n codeLine: 16,\n variables: { head, tail, size: 0 },\n });\n continue;\n }\n\n const removed = array[head];\n array[head] = null;\n const oldHead = head;\n head = (head + 1) % capacity;\n\n steps.push({\n operation: 'removeFirst',\n value: removed ?? undefined,\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeFirst(): removed ${removed} from index ${oldHead}, head = ${head}`,\n codeLine: 17,\n variables: { removed: removed ?? 'null', head, tail, size: getSize() },\n highlightIndex: oldHead,\n highlightType: 'remove',\n });\n } else if (op === 'removeLast') {\n if (head === tail) {\n steps.push({\n operation: 'removeLast',\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeLast(): Deque is empty!`,\n codeLine: 23,\n variables: { head, tail, size: 0 },\n });\n continue;\n }\n\n tail = (tail - 1 + capacity) % capacity;\n const removed = array[tail];\n array[tail] = null;\n\n steps.push({\n operation: 'removeLast',\n value: removed ?? undefined,\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeLast(): tail = ${tail}, removed ${removed}`,\n codeLine: 24,\n variables: { removed: removed ?? 'null', head, tail, size: getSize() },\n highlightIndex: tail,\n highlightType: 'remove',\n });\n }\n }\n\n // Final state\n steps.push({\n operation: 'done',\n array: [...array],\n head,\n tail,\n capacity,\n description: `✓ Done! Size: ${getSize()}, Capacity: ${capacity}. O(1) for all operations!`,\n codeLine: -1,\n variables: { size: getSize(), capacity, head, tail },\n });\n\n return steps;\n}\n\nconst ArrayDequeVisualizerComponent: React.FC<ArrayDequeVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'arraydeque-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'arraydeque', scrollToId: VISUALIZER_ID });\n\n const [showCircular, setShowCircular] = useState(true);\n const generateSteps = useMemo(() => generateArrayDequeSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<ArrayDequeStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n array: [],\n head: 0,\n tail: 0,\n capacity: INITIAL_CAPACITY,\n description: '',\n };\n\n const { array, head, tail, capacity, highlightIndex, highlightType, description, resizing } =\n stepData;\n\n const toggleCircular = useCallback(() => {\n setShowCircular((prev) => !prev);\n }, []);\n\n const getCellStyle = (index: number): string => {\n const isHead = index === head;\n const isTail = index === tail;\n const isHighlighted = index === highlightIndex;\n const hasValue = array[index] !== null;\n\n let baseStyle = 'border-2 transition-all duration-200 ';\n\n if (resizing) {\n baseStyle += 'bg-yellow-100 border-yellow-400 ';\n } else if (isHighlighted) {\n if (highlightType === 'add') {\n baseStyle += 'bg-green-400 border-green-500 text-white ';\n } else if (highlightType === 'remove') {\n baseStyle += 'bg-red-400 border-red-500 text-white ';\n }\n } else if (hasValue) {\n baseStyle += 'bg-blue-100 border-blue-300 ';\n } else {\n baseStyle += 'bg-gray-100 border-gray-200 ';\n }\n\n // Add head/tail indicator\n if (isHead && isTail && head !== tail) {\n baseStyle += 'ring-2 ring-purple-500 ';\n } else if (isHead) {\n baseStyle += 'ring-2 ring-teal-500 ';\n } else if (isTail) {\n baseStyle += 'ring-2 ring-violet-500 ';\n }\n\n return baseStyle;\n };\n\n // Calculate logical order for display\n const getLogicalElements = (): (number | null)[] => {\n const result: (number | null)[] = [];\n let i = head;\n while (i !== tail) {\n result.push(array[i]);\n i = (i + 1) % capacity;\n }\n return result;\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'resize') return 'warning' as const;\n if (stepData.operation === 'done') return 'success' as const;\n if (highlightType === 'remove') return 'error' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-teal-50 to-violet-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">ArrayDeque</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-teal-100 text-teal-700 rounded\">\n O(1) all ops\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-violet-100 text-violet-700 rounded\">\n Circular buffer\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleCircular}\n className={`px-3 py-1 text-xs font-medium rounded transition-colors ${\n showCircular\n ? 'bg-teal-500 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n {showCircular ? 'Circular View' : 'Linear View'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={450} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Array visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Internal Array (capacity: {capacity})\n </div>\n\n {showCircular ? (\n /* Circular view */\n <div className=\"flex justify-center mb-4\">\n <div className=\"relative w-64 h-64\">\n {array.map((val, idx) => {\n const angle = (idx / capacity) * 2 * Math.PI - Math.PI / 2;\n const radius = 100;\n const x = 128 + radius * Math.cos(angle);\n const y = 128 + radius * Math.sin(angle);\n\n return (\n <div\n key={idx}\n className={`absolute w-10 h-10 -ml-5 -mt-5 rounded flex flex-col items-center justify-center text-xs font-medium ${getCellStyle(idx)}`}\n style={{ left: x, top: y }}\n >\n <span className=\"text-[8px] text-gray-400\">{idx}</span>\n <span>{val ?? '∅'}</span>\n </div>\n );\n })}\n {/* Center info */}\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-xs\">\n <div className=\"text-teal-600\">H: {head}</div>\n <div className=\"text-violet-600\">T: {tail}</div>\n </div>\n </div>\n </div>\n ) : (\n /* Linear view */\n <div className=\"flex flex-wrap gap-1 mb-4\">\n {array.map((val, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-10 h-10 rounded flex flex-col items-center justify-center text-xs font-medium ${getCellStyle(idx)}`}\n >\n <span className=\"text-[8px] text-gray-400\">{idx}</span>\n <span>{val ?? '∅'}</span>\n </div>\n <div className=\"text-[9px] text-gray-500 mt-0.5\">\n {idx === head && idx === tail\n ? 'H/T'\n : idx === head\n ? 'H'\n : idx === tail\n ? 'T'\n : ''}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Logical order */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-xs text-gray-600 mb-2\">\n <span className=\"font-medium\">Logical Order (front → back):</span>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n {getLogicalElements().length > 0 ? (\n <>\n <span className=\"text-[10px] text-teal-600\">FRONT →</span>\n {getLogicalElements().map((val, idx) => (\n <React.Fragment key={idx}>\n {idx > 0 && <span className=\"text-gray-400\">→</span>}\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700 rounded\">\n {val}\n </span>\n </React.Fragment>\n ))}\n <span className=\"text-[10px] text-violet-600\">→ BACK</span>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 italic\">Empty deque</span>\n )}\n </div>\n </div>\n\n {/* Pointer arithmetic explanation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-blue-700\">\n <strong>Circular indexing:</strong>\n <div className=\"mt-1 font-mono text-[11px] space-y-1\">\n <div>next = (index + 1) & (capacity - 1)</div>\n <div>prev = (index - 1) & (capacity - 1)</div>\n </div>\n <div className=\"mt-1 text-[10px] text-blue-600\">\n Bitwise AND for power-of-2 capacity (faster than modulo)\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ARRAYDEQUE_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"teal\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ArrayDequeVisualizer = React.memo(ArrayDequeVisualizerComponent);\nexport default ArrayDequeVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n VisualizationArea,\n} from '../shared';\n\ninterface TreeNode {\n value: number;\n left: TreeNode | null;\n right: TreeNode | null;\n x?: number;\n y?: number;\n}\n\ninterface TreeSetStep {\n operation: 'add' | 'contains' | 'traverse' | 'init' | 'done';\n value?: number;\n tree: TreeNode | null;\n path: number[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n found?: boolean;\n currentNode?: number;\n traversalOrder?: number[];\n}\n\ninterface TreeSetVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{ op: 'add' | 'contains'; value: number }> = [\n { op: 'add', value: 50 },\n { op: 'add', value: 30 },\n { op: 'add', value: 70 },\n { op: 'add', value: 20 },\n { op: 'add', value: 40 },\n { op: 'add', value: 60 },\n { op: 'add', value: 80 },\n { op: 'contains', value: 40 },\n { op: 'contains', value: 55 },\n { op: 'add', value: 35 },\n];\n\nconst TREESET_CODE = [\n 'function add(value):',\n ' if root == null:',\n ' root = new Node(value)',\n ' return',\n ' node = root',\n ' while true:',\n ' if value < node.value:',\n ' if node.left == null:',\n ' node.left = new Node(value)',\n ' return',\n ' node = node.left',\n ' else if value > node.value:',\n ' if node.right == null:',\n ' node.right = new Node(value)',\n ' return',\n ' node = node.right',\n ' else: return // duplicate',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-yellow-100', label: 'Path', border: '#facc15' },\n { color: 'bg-blue-500', label: 'Current/Insert' },\n { color: 'bg-green-500', label: 'Found' },\n { color: 'bg-red-500', label: 'Not found' },\n];\n\nfunction cloneTree(node: TreeNode | null): TreeNode | null {\n if (!node) return null;\n return {\n value: node.value,\n left: cloneTree(node.left),\n right: cloneTree(node.right),\n };\n}\n\nfunction insertNode(root: TreeNode | null, value: number): TreeNode {\n if (!root) {\n return { value, left: null, right: null };\n }\n if (value < root.value) {\n root.left = insertNode(root.left, value);\n } else if (value > root.value) {\n root.right = insertNode(root.right, value);\n }\n return root;\n}\n\nfunction findPath(root: TreeNode | null, value: number): number[] {\n const path: number[] = [];\n let current = root;\n while (current) {\n path.push(current.value);\n if (value === current.value) break;\n if (value < current.value) {\n current = current.left;\n } else {\n current = current.right;\n }\n }\n return path;\n}\n\nfunction generateTreeSetSteps(): TreeSetStep[] {\n const steps: TreeSetStep[] = [];\n let tree: TreeNode | null = null;\n\n steps.push({\n operation: 'init',\n tree: null,\n path: [],\n description:\n 'Initialize empty TreeSet (Binary Search Tree). Values are stored in sorted order.',\n codeLine: -1,\n });\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'add') {\n const path = tree ? findPath(tree, value) : [];\n\n // Step: Show traversal path\n if (tree) {\n steps.push({\n operation: 'add',\n value,\n tree: cloneTree(tree),\n path: path,\n description: `add(${value}): Searching for insert position... ${path.length > 0 ? `Path: ${path.join(' → ')}` : ''}`,\n codeLine: 5,\n variables: { value, current: path[path.length - 1] || 'null' },\n currentNode: path[path.length - 1],\n });\n }\n\n // Insert the value\n tree = insertNode(tree, value);\n const newPath = findPath(tree, value);\n\n const isRoot = newPath.length === 1;\n const direction =\n newPath.length > 1\n ? value < newPath[newPath.length - 2]\n ? 'left'\n : 'right'\n : '';\n\n steps.push({\n operation: 'add',\n value,\n tree: cloneTree(tree),\n path: newPath,\n description: isRoot\n ? `add(${value}): Tree was empty, ${value} becomes root`\n : `add(${value}): Insert as ${direction} child of ${newPath[newPath.length - 2]}`,\n codeLine: isRoot ? 2 : direction === 'left' ? 8 : 13,\n variables: { value, parent: newPath[newPath.length - 2] || 'none' },\n currentNode: value,\n });\n } else {\n // contains operation\n const path = tree ? findPath(tree, value) : [];\n const found = path.length > 0 && path[path.length - 1] === value;\n\n steps.push({\n operation: 'contains',\n value,\n tree: cloneTree(tree),\n path: path,\n description: `contains(${value}): Searching... Path: ${path.join(' → ')}`,\n codeLine: 5,\n variables: { value, path: path.join('→') },\n currentNode: path[path.length - 1],\n });\n\n steps.push({\n operation: 'contains',\n value,\n tree: cloneTree(tree),\n path: path,\n description: found\n ? `contains(${value}): Found! Value exists in the tree`\n : `contains(${value}): Not found! Value does not exist`,\n codeLine: found ? 6 : 16,\n variables: { value, result: found ? 'true' : 'false' },\n found,\n currentNode: found ? value : undefined,\n });\n }\n }\n\n // Count nodes\n function countNodes(node: TreeNode | null): number {\n if (!node) return 0;\n return 1 + countNodes(node.left) + countNodes(node.right);\n }\n\n steps.push({\n operation: 'done',\n tree: cloneTree(tree),\n path: [],\n description: `✓ Done! TreeSet contains ${countNodes(tree)} elements in BST order.`,\n codeLine: -1,\n variables: { size: countNodes(tree) },\n });\n\n return steps;\n}\n\n// Calculate node positions for rendering\nfunction calculatePositions(\n node: TreeNode | null,\n depth: number,\n left: number,\n right: number,\n positions: Map<number, { x: number; y: number }>\n): void {\n if (!node) return;\n const x = (left + right) / 2;\n const y = depth * 60 + 30;\n positions.set(node.value, { x, y });\n calculatePositions(node.left, depth + 1, left, x, positions);\n calculatePositions(node.right, depth + 1, x, right, positions);\n}\n\nconst TreeSetVisualizerComponent: React.FC<TreeSetVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'treeset-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'treeset', scrollToId: VISUALIZER_ID });\n\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<TreeSetStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateTreeSetSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n tree: null,\n path: [],\n description: '',\n };\n\n const { tree, path, description, currentNode, found } = currentStepData;\n\n // Calculate positions for tree nodes\n const positions = new Map<number, { x: number; y: number }>();\n if (tree) {\n calculatePositions(tree, 0, 0, 300, positions);\n }\n\n // Render tree recursively\n const renderTree = (node: TreeNode | null): React.ReactNode => {\n if (!node) return null;\n\n const pos = positions.get(node.value);\n if (!pos) return null;\n\n const isInPath = path.includes(node.value);\n const isCurrent = node.value === currentNode;\n\n let nodeStyle = 'bg-white border-2 border-gray-300 text-gray-700';\n if (isCurrent) {\n if (currentStepData.operation === 'contains') {\n nodeStyle = found\n ? 'bg-green-500 border-green-600 text-white'\n : 'bg-red-500 border-red-600 text-white';\n } else {\n nodeStyle = 'bg-blue-500 border-blue-600 text-white';\n }\n } else if (isInPath) {\n nodeStyle = 'bg-yellow-100 border-yellow-400 text-yellow-800';\n }\n\n const leftPos = node.left ? positions.get(node.left.value) : null;\n const rightPos = node.right ? positions.get(node.right.value) : null;\n\n return (\n <React.Fragment key={node.value}>\n {/* Edges */}\n {leftPos && (\n <line\n x1={pos.x}\n y1={pos.y}\n x2={leftPos.x}\n y2={leftPos.y}\n stroke={\n node.left && path.includes(node.left.value)\n ? '#facc15'\n : '#d1d5db'\n }\n strokeWidth=\"2\"\n />\n )}\n {rightPos && (\n <line\n x1={pos.x}\n y1={pos.y}\n x2={rightPos.x}\n y2={rightPos.y}\n stroke={\n node.right && path.includes(node.right.value)\n ? '#facc15'\n : '#d1d5db'\n }\n strokeWidth=\"2\"\n />\n )}\n {/* Node */}\n <g transform={`translate(${pos.x}, ${pos.y})`}>\n <circle\n r=\"18\"\n className={`${nodeStyle} transition-colors`}\n fill={\n isCurrent\n ? found === false\n ? '#ef4444'\n : found\n ? '#22c55e'\n : '#3b82f6'\n : isInPath\n ? '#fef3c7'\n : 'white'\n }\n stroke={\n isCurrent\n ? found === false\n ? '#dc2626'\n : found\n ? '#16a34a'\n : '#2563eb'\n : isInPath\n ? '#facc15'\n : '#d1d5db'\n }\n strokeWidth=\"2\"\n />\n <text\n textAnchor=\"middle\"\n dy=\"5\"\n className=\"text-xs font-medium\"\n fill={isCurrent ? 'white' : isInPath ? '#92400e' : '#374151'}\n >\n {node.value}\n </text>\n </g>\n {/* Render children */}\n {renderTree(node.left)}\n {renderTree(node.right)}\n </React.Fragment>\n );\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-emerald-50 to-teal-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n TreeSet Operations (BST)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-700 rounded\">\n Avg: O(log n)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-teal-100 text-teal-700 rounded\">\n Worst: O(n)\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Tree Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Binary Search Tree\n </div>\n <div className=\"bg-gray-50 rounded-lg p-2 overflow-x-auto\">\n {tree ? (\n <svg width=\"300\" height=\"250\" className=\"mx-auto\">\n {renderTree(tree)}\n </svg>\n ) : (\n <div className=\"h-32 flex items-center justify-center text-gray-400 text-sm\">\n Empty tree\n </div>\n )}\n </div>\n </div>\n\n {/* Path Display */}\n {path.length > 0 && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600\">\n <span className=\"font-medium\">Traversal Path:</span>\n <div className=\"mt-1 flex items-center gap-1 flex-wrap\">\n {path.map((v, idx) => (\n <React.Fragment key={idx}>\n {idx > 0 && <span className=\"text-gray-400\">→</span>}\n <span\n className={`px-2 py-0.5 rounded text-xs font-mono ${\n v === currentNode\n ? found === false\n ? 'bg-red-100 text-red-700'\n : found\n ? 'bg-green-100 text-green-700'\n : 'bg-blue-100 text-blue-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}\n >\n {v}\n </span>\n </React.Fragment>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n currentStepData.operation === 'contains' && found === false\n ? 'error'\n : currentStepData.operation === 'contains' && found === true\n ? 'success'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={TREESET_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"green\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const TreeSetVisualizer = React.memo(TreeSetVisualizerComponent);\nexport default TreeSetVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\n// Simulated enum with 8 values (fits in single long)\nconst DAYS_OF_WEEK = [\n 'MONDAY',\n 'TUESDAY',\n 'WEDNESDAY',\n 'THURSDAY',\n 'FRIDAY',\n 'SATURDAY',\n 'SUNDAY',\n] as const;\n\ntype DayOfWeek = (typeof DAYS_OF_WEEK)[number];\n\ninterface EnumSetStep {\n operation: 'init' | 'add' | 'remove' | 'contains' | 'done';\n value?: DayOfWeek;\n bitmask: number;\n bitPosition?: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n result?: boolean;\n highlightBit?: number;\n previousBitmask?: number;\n}\n\ninterface EnumSetVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{\n op: 'add' | 'remove' | 'contains';\n value: DayOfWeek;\n}> = [\n { op: 'add', value: 'MONDAY' },\n { op: 'add', value: 'WEDNESDAY' },\n { op: 'add', value: 'FRIDAY' },\n { op: 'add', value: 'SATURDAY' },\n { op: 'contains', value: 'WEDNESDAY' },\n { op: 'contains', value: 'TUESDAY' },\n { op: 'add', value: 'MONDAY' }, // Already exists\n { op: 'remove', value: 'FRIDAY' },\n { op: 'contains', value: 'FRIDAY' },\n { op: 'add', value: 'SUNDAY' },\n];\n\nconst ENUMSET_CODE = [\n 'class EnumSet<E extends Enum<E>> {',\n ' private long elements = 0L;',\n '',\n ' void add(E e) {',\n ' int ordinal = e.ordinal();',\n ' elements |= (1L << ordinal);',\n ' }',\n '',\n ' void remove(E e) {',\n ' int ordinal = e.ordinal();',\n ' elements &= ~(1L << ordinal);',\n ' }',\n '',\n ' boolean contains(E e) {',\n ' int ordinal = e.ordinal();',\n ' return (elements & (1L<<ordinal)) != 0;',\n ' }',\n '}',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-500', label: 'Bit set (1)' },\n { color: 'bg-gray-200', label: 'Bit clear (0)' },\n { color: 'bg-blue-500', label: 'Current operation' },\n { color: 'bg-yellow-400', label: 'Changed bit' },\n];\n\nfunction getBitPosition(day: DayOfWeek): number {\n return DAYS_OF_WEEK.indexOf(day);\n}\n\nfunction generateEnumSetSteps(): EnumSetStep[] {\n const steps: EnumSetStep[] = [];\n let bitmask = 0;\n\n // Initial state\n steps.push({\n operation: 'init',\n bitmask: 0,\n description:\n 'Initialize EnumSet with empty bitmask (0). Each enum constant maps to a bit position based on ordinal().',\n codeLine: 1,\n variables: { elements: '0b0000000' },\n });\n\n for (const { op, value } of OPERATIONS) {\n const bitPos = getBitPosition(value);\n const bitMaskForValue = 1 << bitPos;\n const previousBitmask = bitmask;\n\n if (op === 'add') {\n const wasSet = (bitmask & bitMaskForValue) !== 0;\n bitmask |= bitMaskForValue;\n\n steps.push({\n operation: 'add',\n value,\n bitmask,\n bitPosition: bitPos,\n previousBitmask,\n description: wasSet\n ? `add(${value}): Bit ${bitPos} already set. No change needed.`\n : `add(${value}): Set bit ${bitPos}. elements |= (1L << ${bitPos})`,\n codeLine: 5,\n variables: {\n ordinal: bitPos,\n mask: `0b${bitMaskForValue.toString(2).padStart(7, '0')}`,\n elements: `0b${bitmask.toString(2).padStart(7, '0')}`,\n },\n highlightBit: bitPos,\n });\n } else if (op === 'remove') {\n const wasSet = (bitmask & bitMaskForValue) !== 0;\n bitmask &= ~bitMaskForValue;\n\n steps.push({\n operation: 'remove',\n value,\n bitmask,\n bitPosition: bitPos,\n previousBitmask,\n description: wasSet\n ? `remove(${value}): Clear bit ${bitPos}. elements &= ~(1L << ${bitPos})`\n : `remove(${value}): Bit ${bitPos} already clear. No change needed.`,\n codeLine: 10,\n variables: {\n ordinal: bitPos,\n mask: `0b${(~bitMaskForValue & 0x7f).toString(2).padStart(7, '0')}`,\n elements: `0b${bitmask.toString(2).padStart(7, '0')}`,\n },\n highlightBit: bitPos,\n });\n } else {\n // contains\n const isSet = (bitmask & bitMaskForValue) !== 0;\n\n steps.push({\n operation: 'contains',\n value,\n bitmask,\n bitPosition: bitPos,\n result: isSet,\n description: `contains(${value}): Check bit ${bitPos}. (elements & (1L << ${bitPos})) ${isSet ? '!= 0 → true' : '== 0 → false'}`,\n codeLine: 15,\n variables: {\n ordinal: bitPos,\n mask: `0b${bitMaskForValue.toString(2).padStart(7, '0')}`,\n result: isSet ? 'true' : 'false',\n },\n highlightBit: bitPos,\n });\n }\n }\n\n // Count set bits\n let count = 0;\n let temp = bitmask;\n while (temp > 0) {\n count += temp & 1;\n temp >>= 1;\n }\n\n steps.push({\n operation: 'done',\n bitmask,\n description: `✓ Done! EnumSet contains ${count} elements. O(1) for all operations!`,\n codeLine: -1,\n variables: {\n size: count,\n elements: `0b${bitmask.toString(2).padStart(7, '0')}`,\n },\n });\n\n return steps;\n}\n\nconst EnumSetVisualizerComponent: React.FC<EnumSetVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'enumset-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'enumset', scrollToId: VISUALIZER_ID });\n\n const [showBinary, setShowBinary] = useState(true);\n const generateSteps = useMemo(() => generateEnumSetSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<EnumSetStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n bitmask: 0,\n description: '',\n };\n\n const { bitmask, highlightBit, description, result, previousBitmask } =\n stepData;\n\n const toggleBinaryView = useCallback(() => {\n setShowBinary((prev) => !prev);\n }, []);\n\n const getBitStyle = (bitIndex: number): string => {\n const isSet = (bitmask & (1 << bitIndex)) !== 0;\n const wasSet =\n previousBitmask !== undefined\n ? (previousBitmask & (1 << bitIndex)) !== 0\n : isSet;\n const isHighlighted = highlightBit === bitIndex;\n const changed = isSet !== wasSet;\n\n if (isHighlighted) {\n if (stepData.operation === 'contains') {\n return result\n ? 'bg-green-500 text-white ring-2 ring-green-300'\n : 'bg-red-400 text-white ring-2 ring-red-300';\n }\n if (changed) {\n return 'bg-yellow-400 text-gray-900 ring-2 ring-yellow-300';\n }\n return 'bg-blue-500 text-white ring-2 ring-blue-300';\n }\n\n return isSet\n ? 'bg-green-500 text-white'\n : 'bg-gray-200 text-gray-600';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'contains' && result === false)\n return 'error' as const;\n if (stepData.operation === 'contains' && result === true)\n return 'success' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-lime-50 to-green-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">EnumSet Bit Operations</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-lime-100 text-lime-700 rounded\">\n O(1) all ops\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\">\n Memory efficient\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleBinaryView}\n className=\"px-2 py-1 text-xs font-medium bg-white border border-gray-300 rounded hover:bg-gray-50 transition-colors\"\n >\n {showBinary ? 'Hide Binary' : 'Show Binary'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Enum Values with Bits */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n DayOfWeek Enum → Bitmask Mapping\n </div>\n\n {/* Bitmask visualization */}\n <div className=\"flex flex-wrap gap-1 mb-4\">\n {DAYS_OF_WEEK.map((day, idx) => {\n const isSet = (bitmask & (1 << idx)) !== 0;\n return (\n <div\n key={day}\n className=\"flex flex-col items-center\"\n >\n <div\n className={`w-14 h-10 flex flex-col items-center justify-center text-xs font-medium rounded transition-all duration-200 ${getBitStyle(idx)}`}\n >\n <span className=\"text-[10px] opacity-80\">bit {idx}</span>\n <span>{isSet ? '1' : '0'}</span>\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center leading-tight\">\n {day.slice(0, 3)}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Binary representation */}\n {showBinary && (\n <div className=\"p-3 bg-gray-900 rounded-lg text-sm font-mono\">\n <div className=\"flex items-center gap-2 text-gray-400\">\n <span className=\"text-green-400\">elements</span>\n <span>=</span>\n <span className=\"text-yellow-300\">\n 0b{bitmask.toString(2).padStart(7, '0')}\n </span>\n <span className=\"text-gray-500\">\n ({bitmask} in decimal)\n </span>\n </div>\n {stepData.operation === 'add' && highlightBit !== undefined && (\n <div className=\"mt-2 text-blue-300\">\n <span className=\"text-gray-500\">// Set bit: </span>\n elements |= (1L << {highlightBit})\n </div>\n )}\n {stepData.operation === 'remove' && highlightBit !== undefined && (\n <div className=\"mt-2 text-orange-300\">\n <span className=\"text-gray-500\">// Clear bit: </span>\n elements &= ~(1L << {highlightBit})\n </div>\n )}\n {stepData.operation === 'contains' && highlightBit !== undefined && (\n <div className=\"mt-2 text-purple-300\">\n <span className=\"text-gray-500\">// Check bit: </span>\n (elements & (1L << {highlightBit})) != 0\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Set contents */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-xs text-gray-600 mb-2\">\n <span className=\"font-medium\">Set Contents:</span>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {DAYS_OF_WEEK.filter((_, idx) => (bitmask & (1 << idx)) !== 0).map(\n (day) => (\n <span\n key={day}\n className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\"\n >\n {day}\n </span>\n )\n )}\n {bitmask === 0 && (\n <span className=\"text-xs text-gray-400 italic\">Empty set</span>\n )}\n </div>\n </div>\n\n {/* Comparison with HashSet */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-gray-700\">\n <span className=\"font-semibold text-blue-700\">vs HashSet:</span>\n <div className=\"mt-1 grid grid-cols-2 gap-2 text-[10px]\">\n <div>\n <span className=\"text-green-600\">EnumSet:</span> 1 long = 8 bytes\n </div>\n <div>\n <span className=\"text-gray-500\">HashSet:</span> ~40+ bytes per entry\n </div>\n <div>\n <span className=\"text-green-600\">EnumSet:</span> O(1) bit operation\n </div>\n <div>\n <span className=\"text-gray-500\">HashSet:</span> O(1) with hash overhead\n </div>\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ENUMSET_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"lime\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const EnumSetVisualizer = React.memo(EnumSetVisualizerComponent);\nexport default EnumSetVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface HeapStep {\n operation: 'offer' | 'poll' | 'siftUp' | 'siftDown' | 'init' | 'done';\n value?: number;\n heap: number[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n swapIndices?: [number, number];\n compareIndices?: [number, number];\n}\n\ninterface PriorityQueueVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{ op: 'offer' | 'poll'; value?: number }> = [\n { op: 'offer', value: 50 },\n { op: 'offer', value: 30 },\n { op: 'offer', value: 70 },\n { op: 'offer', value: 20 },\n { op: 'offer', value: 40 },\n { op: 'offer', value: 10 },\n { op: 'poll' },\n { op: 'poll' },\n { op: 'offer', value: 15 },\n];\n\nconst HEAP_CODE = [\n 'offer(value):',\n ' heap.add(value)',\n ' siftUp(size - 1)',\n '',\n 'siftUp(index):',\n ' while index > 0:',\n ' parent = (index-1) / 2',\n ' if heap[index] < heap[parent]:',\n ' swap(index, parent)',\n ' index = parent',\n '',\n 'poll():',\n ' result = heap[0]',\n ' heap[0] = heap[size-1]',\n ' siftDown(0)',\n ' return result',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-purple-100', label: 'Root (min)', border: '#c4b5fd' },\n { color: 'bg-purple-500', label: 'Active' },\n { color: 'bg-yellow-300', label: 'Comparing' },\n { color: 'bg-green-400', label: 'Swapped' },\n];\n\nfunction generateHeapSteps(): HeapStep[] {\n const steps: HeapStep[] = [];\n const heap: number[] = [];\n\n steps.push({\n operation: 'init',\n heap: [],\n description:\n 'Initialize min-heap PriorityQueue. Parent is always smaller than children. O(log n) insert/remove.',\n codeLine: -1,\n });\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'offer' && value !== undefined) {\n heap.push(value);\n let idx = heap.length - 1;\n\n steps.push({\n operation: 'offer',\n value,\n heap: [...heap],\n description: `offer(${value}): Add to end of heap at index ${idx}`,\n codeLine: 1,\n variables: { value, index: idx },\n highlightIndex: idx,\n });\n\n // Sift up\n while (idx > 0) {\n const parentIdx = Math.floor((idx - 1) / 2);\n\n steps.push({\n operation: 'siftUp',\n heap: [...heap],\n description: `siftUp: Compare ${heap[idx]} with parent ${heap[parentIdx]}`,\n codeLine: 7,\n variables: {\n index: idx,\n parent: parentIdx,\n child: heap[idx],\n parentVal: heap[parentIdx],\n },\n compareIndices: [idx, parentIdx],\n });\n\n if (heap[idx] < heap[parentIdx]) {\n // Swap\n [heap[idx], heap[parentIdx]] = [heap[parentIdx], heap[idx]];\n\n steps.push({\n operation: 'siftUp',\n heap: [...heap],\n description: `siftUp: ${heap[parentIdx]} < ${heap[idx]}, swap! Move up to index ${parentIdx}`,\n codeLine: 8,\n variables: { swapped: heap[parentIdx], index: parentIdx },\n swapIndices: [idx, parentIdx],\n highlightIndex: parentIdx,\n });\n\n idx = parentIdx;\n } else {\n steps.push({\n operation: 'siftUp',\n heap: [...heap],\n description: `siftUp: ${heap[idx]} >= ${heap[parentIdx]}, heap property satisfied!`,\n codeLine: 7,\n variables: { index: idx },\n highlightIndex: idx,\n });\n break;\n }\n }\n } else if (op === 'poll') {\n if (heap.length === 0) continue;\n\n const removed = heap[0];\n const last = heap.pop();\n if (last === undefined) continue;\n\n if (heap.length === 0) {\n steps.push({\n operation: 'poll',\n value: removed,\n heap: [],\n description: `poll(): Remove min ${removed}, heap is now empty`,\n codeLine: 11,\n variables: { removed },\n });\n continue;\n }\n\n heap[0] = last;\n\n steps.push({\n operation: 'poll',\n value: removed,\n heap: [...heap],\n description: `poll(): Remove min ${removed}, move last element ${last} to root`,\n codeLine: 13,\n variables: { removed, moved: last },\n highlightIndex: 0,\n });\n\n // Sift down\n let idx = 0;\n while (true) {\n const leftIdx = 2 * idx + 1;\n const rightIdx = 2 * idx + 2;\n let smallestIdx = idx;\n\n if (leftIdx < heap.length && heap[leftIdx] < heap[smallestIdx]) {\n smallestIdx = leftIdx;\n }\n if (rightIdx < heap.length && heap[rightIdx] < heap[smallestIdx]) {\n smallestIdx = rightIdx;\n }\n\n if (smallestIdx === idx) {\n steps.push({\n operation: 'siftDown',\n heap: [...heap],\n description: `siftDown: ${heap[idx]} is smaller than children, heap property satisfied!`,\n codeLine: 14,\n variables: { index: idx, value: heap[idx] },\n highlightIndex: idx,\n });\n break;\n }\n\n steps.push({\n operation: 'siftDown',\n heap: [...heap],\n description: `siftDown: ${heap[idx]} > ${heap[smallestIdx]}, swap with smaller child`,\n codeLine: 14,\n variables: {\n parent: heap[idx],\n child: heap[smallestIdx],\n childIdx: smallestIdx,\n },\n compareIndices: [idx, smallestIdx],\n });\n\n [heap[idx], heap[smallestIdx]] = [heap[smallestIdx], heap[idx]];\n\n steps.push({\n operation: 'siftDown',\n heap: [...heap],\n description: `siftDown: Swapped! Continue from index ${smallestIdx}`,\n codeLine: 14,\n variables: { index: smallestIdx },\n swapIndices: [idx, smallestIdx],\n highlightIndex: smallestIdx,\n });\n\n idx = smallestIdx;\n }\n }\n }\n\n steps.push({\n operation: 'done',\n heap: [...heap],\n description: `✓ Done! Min-heap has ${heap.length} elements. Root (${heap[0]}) is always minimum.`,\n codeLine: -1,\n variables: { size: heap.length, min: heap[0] },\n });\n\n return steps;\n}\n\n// Calculate tree positions for visualization\nfunction getTreePositions(size: number): Array<{ x: number; y: number }> {\n const positions: Array<{ x: number; y: number }> = [];\n const width = 280;\n\n for (let i = 0; i < size; i++) {\n const level = Math.floor(Math.log2(i + 1));\n const levelStart = Math.pow(2, level) - 1;\n const posInLevel = i - levelStart;\n const nodesInLevel = Math.pow(2, level);\n const spacing = width / (nodesInLevel + 1);\n\n positions.push({\n x: spacing * (posInLevel + 1),\n y: level * 55 + 30,\n });\n }\n\n return positions;\n}\n\nconst PriorityQueueVisualizerComponent: React.FC<\n PriorityQueueVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<HeapStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateHeapSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n heap: [],\n description: '',\n };\n\n const { heap, highlightIndex, swapIndices, compareIndices, description } =\n currentStepData;\n const positions = getTreePositions(heap.length);\n\n const getNodeStyle = (idx: number): string => {\n if (idx === highlightIndex) {\n return 'fill-purple-500 stroke-purple-600';\n }\n if (swapIndices?.includes(idx)) {\n return 'fill-green-400 stroke-green-500';\n }\n if (compareIndices?.includes(idx)) {\n return 'fill-yellow-300 stroke-yellow-400';\n }\n if (idx === 0) {\n return 'fill-purple-100 stroke-purple-300';\n }\n return 'fill-white stroke-gray-300';\n };\n\n const getTextColor = (idx: number): string => {\n if (idx === highlightIndex || swapIndices?.includes(idx)) {\n return 'white';\n }\n return '#374151';\n };\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-purple-50 to-pink-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n PriorityQueue (Min-Heap)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n offer: O(log n)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-pink-100 text-pink-700 rounded\">\n poll: O(log n)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n {/* Heap Tree Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Binary Heap Structure\n </div>\n <div className=\"bg-gray-50 rounded-lg p-2 overflow-x-auto\">\n {heap.length > 0 ? (\n <svg\n width=\"280\"\n height={Math.floor(Math.log2(heap.length)) * 55 + 80}\n className=\"mx-auto\"\n >\n {/* Draw edges */}\n {heap.map((_, idx) => {\n if (idx === 0) return null;\n const parentIdx = Math.floor((idx - 1) / 2);\n const parentPos = positions[parentIdx];\n const childPos = positions[idx];\n if (!parentPos || !childPos) return null;\n\n const isHighlighted =\n (compareIndices?.includes(idx) &&\n compareIndices?.includes(parentIdx)) ||\n (swapIndices?.includes(idx) &&\n swapIndices?.includes(parentIdx));\n\n return (\n <line\n key={`edge-${idx}`}\n x1={parentPos.x}\n y1={parentPos.y}\n x2={childPos.x}\n y2={childPos.y}\n stroke={isHighlighted ? '#a855f7' : '#d1d5db'}\n strokeWidth={isHighlighted ? 2 : 1}\n />\n );\n })}\n {/* Draw nodes */}\n {heap.map((val, idx) => {\n const pos = positions[idx];\n if (!pos) return null;\n\n return (\n <g\n key={idx}\n transform={`translate(${pos.x}, ${pos.y})`}\n >\n <circle\n r=\"18\"\n className={`${getNodeStyle(idx)} stroke-2 transition-all`}\n />\n <text\n textAnchor=\"middle\"\n dy=\"5\"\n className=\"text-xs font-medium\"\n fill={getTextColor(idx)}\n >\n {val}\n </text>\n <text\n textAnchor=\"middle\"\n dy=\"32\"\n className=\"text-[9px]\"\n fill=\"#9ca3af\"\n >\n [{idx}]\n </text>\n </g>\n );\n })}\n </svg>\n ) : (\n <div className=\"h-20 flex items-center justify-center text-gray-400 text-sm\">\n Empty heap\n </div>\n )}\n </div>\n </div>\n\n {/* Array representation */}\n {heap.length > 0 && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600 mb-1 font-medium\">\n Array representation:\n </div>\n <div className=\"flex gap-1 overflow-x-auto\">\n {heap.map((val, idx) => (\n <div\n key={idx}\n className={`w-8 h-8 flex items-center justify-center rounded text-xs font-mono ${\n idx === highlightIndex\n ? 'bg-purple-500 text-white'\n : idx === 0\n ? 'bg-purple-100 text-purple-700'\n : 'bg-white border border-gray-300 text-gray-700'\n }`}\n >\n {val}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={currentStepData.operation === 'done' ? 'success' : 'default'}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={HEAP_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"purple\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const PriorityQueueVisualizer = React.memo(\n PriorityQueueVisualizerComponent\n);\nexport default PriorityQueueVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface Segment {\n id: number;\n entries: Array<{ key: string; value: number }>;\n locked: boolean;\n lockOwner?: string;\n}\n\ninterface ConcurrentStep {\n operation: 'put' | 'get' | 'lock' | 'unlock' | 'init' | 'done';\n thread: string;\n key?: string;\n value?: number;\n segmentId?: number;\n segments: Segment[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightSegment?: number;\n activeThreads?: string[];\n}\n\ninterface ConcurrentHashMapVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst SEGMENT_COUNT = 4;\n\nconst OPERATIONS: Array<{\n thread: string;\n op: 'put' | 'get';\n key: string;\n value?: number;\n}> = [\n { thread: 'T1', op: 'put', key: 'Alice', value: 100 },\n { thread: 'T2', op: 'put', key: 'Bob', value: 200 },\n { thread: 'T1', op: 'put', key: 'Charlie', value: 150 },\n { thread: 'T3', op: 'get', key: 'Alice' },\n { thread: 'T2', op: 'put', key: 'Diana', value: 300 },\n { thread: 'T1', op: 'get', key: 'Bob' },\n { thread: 'T3', op: 'put', key: 'Eve', value: 250 },\n];\n\nconst CHM_CODE = [\n '// ConcurrentHashMap (Java 8+)',\n 'put(key, value):',\n ' hash = spread(key.hashCode())',\n ' segment = hash & (n-1)',\n ' synchronized(segment):',\n ' // Only this segment locked',\n ' bucket.add(key, value)',\n '',\n 'get(key):',\n ' // No lock needed!',\n ' // Volatile reads ensure visibility',\n ' return bucket.get(key)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-50', label: 'Active segment', border: '#60a5fa' },\n { color: 'bg-red-50', label: 'Locked', border: '#f87171' },\n { color: 'bg-gray-50', label: 'Unlocked', border: '#d1d5db' },\n];\n\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) & 0x7fffffff;\n }\n return hash;\n}\n\nfunction generateConcurrentSteps(): ConcurrentStep[] {\n const steps: ConcurrentStep[] = [];\n const segments: Segment[] = Array.from({ length: SEGMENT_COUNT }, (_, i) => ({\n id: i,\n entries: [],\n locked: false,\n }));\n\n const _threadColors: Record<string, string> = {\n T1: 'blue',\n T2: 'green',\n T3: 'purple',\n };\n\n steps.push({\n operation: 'init',\n thread: '',\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `Initialize ConcurrentHashMap with ${SEGMENT_COUNT} segments. Each segment can be locked independently for concurrent access.`,\n codeLine: -1,\n activeThreads: [],\n });\n\n for (const { thread, op, key, value } of OPERATIONS) {\n const hash = simpleHash(key);\n const segmentId = hash % SEGMENT_COUNT;\n\n if (op === 'put') {\n // Step 1: Calculate segment\n steps.push({\n operation: 'put',\n thread,\n key,\n value,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: put(\"${key}\", ${value}) → hash=${hash}, segment=${segmentId}`,\n codeLine: 2,\n variables: { thread, key: `\"${key}\"`, hash, segment: segmentId },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n\n // Step 2: Acquire lock\n segments[segmentId].locked = true;\n segments[segmentId].lockOwner = thread;\n\n steps.push({\n operation: 'lock',\n thread,\n key,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: Lock segment ${segmentId} (other segments remain accessible!)`,\n codeLine: 4,\n variables: { thread, segment: segmentId, locked: 'true' },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n\n // Step 3: Insert\n const existingIdx = segments[segmentId].entries.findIndex(\n (e) => e.key === key\n );\n if (existingIdx >= 0) {\n segments[segmentId].entries[existingIdx].value = value ?? 0;\n } else {\n segments[segmentId].entries.push({ key, value: value ?? 0 });\n }\n\n steps.push({\n operation: 'put',\n thread,\n key,\n value,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: Insert (\"${key}\", ${value}) into segment ${segmentId}`,\n codeLine: 6,\n variables: { thread, key: `\"${key}\"`, value: value ?? 0 },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n\n // Step 4: Release lock\n segments[segmentId].locked = false;\n segments[segmentId].lockOwner = undefined;\n\n steps.push({\n operation: 'unlock',\n thread,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: Unlock segment ${segmentId}`,\n codeLine: 4,\n variables: { thread, segment: segmentId, locked: 'false' },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n } else {\n // GET operation - no lock needed!\n const entry = segments[segmentId].entries.find((e) => e.key === key);\n\n steps.push({\n operation: 'get',\n thread,\n key,\n value: entry?.value,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: get(\"${key}\") → segment ${segmentId}, NO LOCK needed! Returns: ${entry?.value ?? 'null'}`,\n codeLine: 9,\n variables: { thread, key: `\"${key}\"`, result: entry?.value ?? 'null' },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n }\n }\n\n const totalEntries = segments.reduce((sum, s) => sum + s.entries.length, 0);\n steps.push({\n operation: 'done',\n thread: '',\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `✓ Done! ConcurrentHashMap: ${totalEntries} entries across ${SEGMENT_COUNT} segments. Lock-free reads, segment-level write locks.`,\n codeLine: -1,\n variables: { entries: totalEntries, segments: SEGMENT_COUNT },\n activeThreads: [],\n });\n\n return steps;\n}\n\nconst ConcurrentHashMapVisualizerComponent: React.FC<\n ConcurrentHashMapVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<ConcurrentStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateConcurrentSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n thread: '',\n segments: [],\n description: '',\n };\n\n const { segments, highlightSegment, description, activeThreads } =\n currentStepData;\n\n const getSegmentStyle = (seg: Segment, idx: number): string => {\n if (idx === highlightSegment) {\n if (seg.locked) {\n return 'border-red-400 bg-red-50';\n }\n return 'border-blue-400 bg-blue-50';\n }\n if (seg.locked) {\n return 'border-orange-300 bg-orange-50';\n }\n return 'border-gray-200 bg-gray-50';\n };\n\n const getThreadColor = (thread: string): string => {\n const colors: Record<string, string> = {\n T1: 'bg-blue-500',\n T2: 'bg-green-500',\n T3: 'bg-purple-500',\n };\n return colors[thread] || 'bg-gray-500';\n };\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-red-50 to-orange-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">ConcurrentHashMap</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-red-100 text-red-700 rounded\">\n Segment Locks\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n Lock-free Reads\n </span>\n </div>\n </div>\n {/* Active Threads */}\n <div className=\"flex items-center gap-2\">\n {['T1', 'T2', 'T3'].map((t) => (\n <div\n key={t}\n className={`px-2 py-0.5 text-xs font-medium rounded transition-opacity ${getThreadColor(t)} text-white ${\n activeThreads?.includes(t) ? 'opacity-100' : 'opacity-30'\n }`}\n >\n {t}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Segments */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Segments (independent locks)\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n {segments.map((seg, idx) => (\n <div\n key={idx}\n className={`rounded-lg border-2 p-3 transition-colors ${getSegmentStyle(seg, idx)}`}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-medium text-gray-600\">\n Segment {idx}\n </span>\n {seg.locked && (\n <span className=\"flex items-center gap-1 text-[10px] text-red-600 font-medium\">\n <span className=\"w-2 h-2 bg-red-500 rounded-full animate-pulse\" />\n Locked by {seg.lockOwner}\n </span>\n )}\n </div>\n <div className=\"space-y-1\">\n {seg.entries.length > 0 ? (\n seg.entries.map((entry, eIdx) => (\n <div\n key={eIdx}\n className=\"flex justify-between px-2 py-1 bg-white rounded text-xs border border-gray-200\"\n >\n <span className=\"text-gray-700\">{entry.key}</span>\n <span className=\"text-gray-500\">{entry.value}</span>\n </div>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 text-center py-2\">\n Empty\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Concurrency Info */}\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600\">\n <span className=\"font-medium\">Key insight:</span> Multiple\n threads can write to different segments simultaneously. Reads\n never block!\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={currentStepData.operation === 'done' ? 'success' : 'default'}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={CHM_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"red\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ConcurrentHashMapVisualizer = React.memo(\n ConcurrentHashMapVisualizerComponent\n);\nexport default ConcurrentHashMapVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface QueueItem {\n id: number;\n value: string;\n}\n\ninterface BlockingStep {\n operation: 'put' | 'take' | 'blocked' | 'unblocked' | 'init' | 'done';\n thread: string;\n value?: string;\n queue: QueueItem[];\n capacity: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n blockedProducers: string[];\n blockedConsumers: string[];\n activeThread?: string;\n}\n\ninterface BlockingQueueVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst CAPACITY = 3;\n\nconst OPERATIONS: Array<{\n thread: string;\n role: 'producer' | 'consumer';\n value?: string;\n}> = [\n { thread: 'P1', role: 'producer', value: 'Task-A' },\n { thread: 'P2', role: 'producer', value: 'Task-B' },\n { thread: 'C1', role: 'consumer' },\n { thread: 'P1', role: 'producer', value: 'Task-C' },\n { thread: 'P2', role: 'producer', value: 'Task-D' },\n { thread: 'P1', role: 'producer', value: 'Task-E' },\n { thread: 'P2', role: 'producer', value: 'Task-F' }, // Will block - queue full\n { thread: 'C1', role: 'consumer' },\n { thread: 'C2', role: 'consumer' },\n { thread: 'C1', role: 'consumer' },\n { thread: 'C2', role: 'consumer' }, // Will block - queue empty\n { thread: 'P1', role: 'producer', value: 'Task-G' },\n];\n\nconst BQ_CODE = [\n 'put(item): // Producer',\n ' lock.lock()',\n ' while queue.isFull():',\n ' notFull.await() // Block!',\n ' queue.add(item)',\n ' notEmpty.signal()',\n ' lock.unlock()',\n '',\n 'take(): // Consumer',\n ' lock.lock()',\n ' while queue.isEmpty():',\n ' notEmpty.await() // Block!',\n ' item = queue.remove()',\n ' notFull.signal()',\n ' lock.unlock()',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-100', label: 'Producer' },\n { color: 'bg-blue-100', label: 'Consumer' },\n { color: 'bg-red-100', label: 'Blocked', border: '#fca5a5' },\n];\n\nlet itemIdCounter = 0;\n\nfunction generateBlockingQueueSteps(): BlockingStep[] {\n const steps: BlockingStep[] = [];\n const queue: QueueItem[] = [];\n const blockedProducers: string[] = [];\n const blockedConsumers: string[] = [];\n itemIdCounter = 0;\n\n steps.push({\n operation: 'init',\n thread: '',\n queue: [],\n capacity: CAPACITY,\n description: `Initialize BlockingQueue with capacity ${CAPACITY}. Producers block when full, consumers block when empty.`,\n codeLine: -1,\n blockedProducers: [],\n blockedConsumers: [],\n });\n\n for (const { thread, role, value } of OPERATIONS) {\n if (role === 'producer') {\n if (queue.length >= CAPACITY) {\n // Producer blocks\n blockedProducers.push(thread);\n\n steps.push({\n operation: 'blocked',\n thread,\n value,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: put(\"${value}\") - Queue FULL! Producer blocked, waiting for space...`,\n codeLine: 3,\n variables: { thread, size: queue.length, capacity: CAPACITY },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n } else {\n // Normal put\n const item: QueueItem = { id: itemIdCounter++, value: value ?? '' };\n queue.push(item);\n\n // Unblock a consumer if any waiting\n let unblockedConsumer: string | undefined;\n if (blockedConsumers.length > 0 && queue.length === 1) {\n unblockedConsumer = blockedConsumers.shift();\n }\n\n steps.push({\n operation: 'put',\n thread,\n value,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: put(\"${value}\") → Queue: ${queue.length}/${CAPACITY}${unblockedConsumer ? ` | Signaled ${unblockedConsumer}` : ''}`,\n codeLine: 4,\n variables: { thread, item: `\"${value}\"`, size: queue.length },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n }\n } else {\n // Consumer\n if (queue.length === 0) {\n // Consumer blocks\n blockedConsumers.push(thread);\n\n steps.push({\n operation: 'blocked',\n thread,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: take() - Queue EMPTY! Consumer blocked, waiting for items...`,\n codeLine: 11,\n variables: { thread, size: 0 },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n } else {\n // Normal take\n const item = queue.shift();\n const wasFull = queue.length === CAPACITY - 1;\n\n // Unblock a producer if any waiting and we made space\n let unblockedProducer: string | undefined;\n if (blockedProducers.length > 0 && wasFull) {\n unblockedProducer = blockedProducers.shift();\n }\n\n steps.push({\n operation: 'take',\n thread,\n value: item?.value,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: take() → \"${item?.value}\" | Queue: ${queue.length}/${CAPACITY}${unblockedProducer ? ` | Signaled ${unblockedProducer}` : ''}`,\n codeLine: 12,\n variables: { thread, item: `\"${item?.value}\"`, size: queue.length },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n }\n }\n }\n\n steps.push({\n operation: 'done',\n thread: '',\n queue: [...queue],\n capacity: CAPACITY,\n description: `✓ Done! BlockingQueue orchestrates producer-consumer coordination. No busy waiting!`,\n codeLine: -1,\n variables: { finalSize: queue.length },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n });\n\n return steps;\n}\n\nconst BlockingQueueVisualizerComponent: React.FC<\n BlockingQueueVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<BlockingStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateBlockingQueueSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n thread: '',\n queue: [],\n capacity: CAPACITY,\n description: '',\n blockedProducers: [],\n blockedConsumers: [],\n };\n\n const {\n queue,\n capacity,\n description,\n blockedProducers,\n blockedConsumers,\n activeThread,\n } = currentStepData;\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-cyan-50 to-blue-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">BlockingQueue</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-cyan-100 text-cyan-700 rounded\">\n Producer-Consumer\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700 rounded\">\n Thread-safe\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Producer-Consumer Layout */}\n <div className=\"flex items-center justify-between gap-4 mb-4\">\n {/* Producers */}\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n Producers\n </div>\n <div className=\"flex flex-col gap-2\">\n {['P1', 'P2'].map((p) => (\n <div\n key={p}\n className={`px-3 py-2 rounded-lg text-center text-sm font-medium transition-all ${\n activeThread === p\n ? 'bg-green-500 text-white scale-105'\n : blockedProducers.includes(p)\n ? 'bg-red-100 text-red-700 border-2 border-red-300'\n : 'bg-green-100 text-green-700'\n }`}\n >\n {p}\n {blockedProducers.includes(p) && (\n <span className=\"block text-[10px]\">BLOCKED</span>\n )}\n </div>\n ))}\n </div>\n </div>\n\n {/* Queue */}\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n Queue ({queue.length}/{capacity})\n </div>\n <div className=\"bg-gray-100 rounded-lg p-2 min-h-[100px]\">\n <div className=\"flex flex-col gap-1\">\n {queue.length > 0 ? (\n queue.map((item, idx) => (\n <div\n key={item.id}\n className={`px-2 py-1.5 bg-white rounded border text-xs font-medium text-center transition-all ${\n idx === 0\n ? 'border-blue-300 bg-blue-50'\n : 'border-gray-200'\n }`}\n >\n {item.value}\n </div>\n ))\n ) : (\n <div className=\"text-center text-gray-400 text-xs py-4\">\n Empty\n </div>\n )}\n </div>\n {/* Capacity indicator */}\n <div className=\"mt-2 h-1.5 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className={`h-full transition-all ${\n queue.length === capacity ? 'bg-red-500' : 'bg-cyan-500'\n }`}\n style={{ width: `${(queue.length / capacity) * 100}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Consumers */}\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n Consumers\n </div>\n <div className=\"flex flex-col gap-2\">\n {['C1', 'C2'].map((c) => (\n <div\n key={c}\n className={`px-3 py-2 rounded-lg text-center text-sm font-medium transition-all ${\n activeThread === c\n ? 'bg-blue-500 text-white scale-105'\n : blockedConsumers.includes(c)\n ? 'bg-red-100 text-red-700 border-2 border-red-300'\n : 'bg-blue-100 text-blue-700'\n }`}\n >\n {c}\n {blockedConsumers.includes(c) && (\n <span className=\"block text-[10px]\">BLOCKED</span>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Flow arrows */}\n <div className=\"flex justify-center gap-8 text-gray-400 text-lg mb-4\">\n <span>→ put()</span>\n <span>take() →</span>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n currentStepData.operation === 'blocked'\n ? 'error'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={BQ_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"cyan\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const BlockingQueueVisualizer = React.memo(\n BlockingQueueVisualizerComponent\n);\nexport default BlockingQueueVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface COWStep {\n operation: 'read' | 'write' | 'copy' | 'init' | 'done';\n thread: string;\n value?: string;\n oldArray: string[];\n newArray: string[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n showCopy?: boolean;\n activeReaders?: string[];\n}\n\ninterface CopyOnWriteVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{\n thread: string;\n op: 'read' | 'write';\n value?: string;\n}> = [\n { thread: 'R1', op: 'read' },\n { thread: 'R2', op: 'read' },\n { thread: 'W1', op: 'write', value: 'D' },\n { thread: 'R1', op: 'read' },\n { thread: 'R3', op: 'read' },\n { thread: 'W1', op: 'write', value: 'E' },\n { thread: 'R2', op: 'read' },\n];\n\nconst COW_CODE = [\n '// CopyOnWriteArrayList',\n '',\n 'get(index): // Lock-free!',\n ' return array[index]',\n '',\n 'add(element):',\n ' lock.lock()',\n ' newArray = Arrays.copyOf(array)',\n ' newArray[len] = element',\n ' array = newArray // Atomic swap',\n ' lock.unlock()',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'Reader' },\n { color: 'bg-orange-500', label: 'Writer' },\n { color: 'bg-green-500', label: 'New element' },\n];\n\nfunction generateCOWSteps(): COWStep[] {\n const steps: COWStep[] = [];\n let array = ['A', 'B', 'C'];\n const activeReaders: string[] = [];\n\n steps.push({\n operation: 'init',\n thread: '',\n oldArray: [...array],\n newArray: [...array],\n description:\n 'CopyOnWriteArrayList: Reads are lock-free, writes create a full copy. Ideal for read-heavy scenarios.',\n codeLine: -1,\n activeReaders: [],\n });\n\n for (const { thread, op, value } of OPERATIONS) {\n if (op === 'read') {\n if (!activeReaders.includes(thread)) {\n activeReaders.push(thread);\n }\n\n steps.push({\n operation: 'read',\n thread,\n oldArray: [...array],\n newArray: [...array],\n description: `${thread}: get() → Reading \"${array[0]}, ${array[1]}, ...\" - NO LOCK needed! Readers never block.`,\n codeLine: 3,\n variables: { thread, 'array.length': array.length },\n activeReaders: [...activeReaders],\n });\n } else {\n // Write operation - show the copy process\n const oldArray = [...array];\n\n // Step 1: Acquire lock\n steps.push({\n operation: 'write',\n thread,\n value,\n oldArray: [...oldArray],\n newArray: [...oldArray],\n description: `${thread}: add(\"${value}\") - Acquiring exclusive write lock...`,\n codeLine: 6,\n variables: { thread, element: `\"${value}\"` },\n activeReaders: [...activeReaders],\n });\n\n // Step 2: Create copy\n const newArray = [...oldArray, value ?? ''];\n\n steps.push({\n operation: 'copy',\n thread,\n value,\n oldArray: [...oldArray],\n newArray: [...newArray],\n description: `${thread}: Creating NEW array copy (${oldArray.length} → ${newArray.length} elements). Old array still serves readers!`,\n codeLine: 7,\n variables: { oldLen: oldArray.length, newLen: newArray.length },\n showCopy: true,\n activeReaders: [...activeReaders],\n });\n\n // Step 3: Atomic swap\n array = newArray;\n\n steps.push({\n operation: 'write',\n thread,\n value,\n oldArray: [...oldArray],\n newArray: [...array],\n description: `${thread}: Atomic reference swap! New readers see updated array. Old readers finish safely.`,\n codeLine: 9,\n variables: { thread, 'new length': array.length },\n highlightIndex: array.length - 1,\n activeReaders: [...activeReaders],\n });\n }\n }\n\n steps.push({\n operation: 'done',\n thread: '',\n oldArray: [...array],\n newArray: [...array],\n description: `✓ Done! Copy-on-write: O(1) reads, O(n) writes. Best for read-heavy, rarely-modified collections.`,\n codeLine: -1,\n variables: { finalSize: array.length },\n activeReaders: [],\n });\n\n return steps;\n}\n\nconst CopyOnWriteVisualizerComponent: React.FC<CopyOnWriteVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<COWStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateCOWSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n thread: '',\n oldArray: [],\n newArray: [],\n description: '',\n activeReaders: [],\n };\n\n const {\n oldArray,\n newArray,\n description,\n showCopy,\n highlightIndex,\n activeReaders,\n } = currentStepData;\n\n const renderArray = (\n arr: string[],\n label: string,\n isNew: boolean = false\n ) => (\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n {label}\n </div>\n <div className=\"flex justify-center gap-1\">\n {arr.map((item, idx) => (\n <div\n key={idx}\n className={`w-10 h-10 flex items-center justify-center rounded border-2 font-medium transition-all ${\n isNew && idx === highlightIndex\n ? 'bg-green-500 border-green-600 text-white scale-110'\n : isNew\n ? 'bg-green-100 border-green-300 text-green-700'\n : 'bg-gray-100 border-gray-300 text-gray-700'\n }`}\n >\n {item}\n </div>\n ))}\n </div>\n </div>\n );\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-lime-50 to-green-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n CopyOnWriteArrayList\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-lime-100 text-lime-700 rounded\">\n Read: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\">\n Write: O(n)\n </span>\n </div>\n </div>\n {/* Active Threads */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-500\">Readers:</span>\n {['R1', 'R2', 'R3'].map((r) => (\n <div\n key={r}\n className={`px-2 py-0.5 text-xs font-medium rounded transition-opacity ${\n activeReaders?.includes(r)\n ? 'bg-blue-500 text-white opacity-100'\n : 'bg-blue-100 text-blue-700 opacity-40'\n }`}\n >\n {r}\n </div>\n ))}\n <span className=\"text-xs text-gray-500 ml-2\">Writer:</span>\n <div\n className={`px-2 py-0.5 text-xs font-medium rounded ${\n currentStepData.thread === 'W1'\n ? 'bg-orange-500 text-white'\n : 'bg-orange-100 text-orange-700 opacity-40'\n }`}\n >\n W1\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Arrays Visualization */}\n <div className=\"mb-4 p-4 bg-gray-50 rounded-lg\">\n {showCopy ? (\n <div className=\"flex items-center gap-4\">\n {renderArray(oldArray, 'Old Array (readers use this)')}\n <div className=\"text-2xl text-gray-400\">→</div>\n {renderArray(newArray, 'New Array (being created)', true)}\n </div>\n ) : (\n <div className=\"flex justify-center\">\n {renderArray(\n newArray,\n 'Current Array',\n highlightIndex !== undefined\n )}\n </div>\n )}\n </div>\n\n {/* Key Insight */}\n <div className=\"mb-4 p-3 bg-lime-50 rounded-lg border border-lime-200\">\n <div className=\"text-xs text-lime-800\">\n <span className=\"font-medium\">Key insight:</span> During writes,\n old array continues serving readers. No reader ever sees partial\n state!\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n currentStepData.operation === 'copy'\n ? 'warning'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={COW_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"lime\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const CopyOnWriteVisualizer = React.memo(CopyOnWriteVisualizerComponent);\nexport default CopyOnWriteVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Lock, Shield } from 'lucide-react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface ImmutableStep {\n operation: 'create' | 'tryModify' | 'derive' | 'init' | 'done';\n method?: string;\n original: string[];\n derived?: string[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n error?: boolean;\n showDerived?: boolean;\n}\n\ninterface ImmutableCollectionsVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst IMMUTABLE_CODE = [\n '// Java 9+ Immutable Collections',\n '',\n '// Creation - O(1) for small, O(n) copy',\n 'List.of(\"A\", \"B\", \"C\")',\n 'Set.of(1, 2, 3)',\n 'Map.of(\"k1\", \"v1\", \"k2\", \"v2\")',\n '',\n '// Modification attempts throw!',\n 'list.add(\"D\") // UnsupportedOp!',\n 'list.set(0, \"X\") // UnsupportedOp!',\n '',\n '// Safe derivation pattern',\n 'var newList = new ArrayList<>(list)',\n 'newList.add(\"D\") // Works!',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-violet-100', label: 'Immutable', border: '#c4b5fd' },\n { color: 'bg-green-100', label: 'Mutable copy', border: '#86efac' },\n { color: 'bg-red-100', label: 'Error', border: '#fca5a5' },\n];\n\nfunction generateImmutableSteps(): ImmutableStep[] {\n const steps: ImmutableStep[] = [];\n\n steps.push({\n operation: 'init',\n original: [],\n description:\n 'Immutable Collections (Java 9+): Thread-safe by design. No locks needed - nothing can change!',\n codeLine: -1,\n });\n\n // Create immutable list\n steps.push({\n operation: 'create',\n method: 'List.of()',\n original: ['A', 'B', 'C'],\n description:\n 'List.of(\"A\", \"B\", \"C\") → Creates unmodifiable List. Compact, no extra memory overhead.',\n codeLine: 3,\n variables: { size: 3, type: 'ImmutableList' },\n });\n\n // Try to add\n steps.push({\n operation: 'tryModify',\n method: 'add()',\n original: ['A', 'B', 'C'],\n description:\n 'list.add(\"D\") → UnsupportedOperationException! Immutable means NO modifications.',\n codeLine: 8,\n variables: { method: 'add', result: 'Exception!' },\n error: true,\n });\n\n // Try to set\n steps.push({\n operation: 'tryModify',\n method: 'set()',\n original: ['A', 'B', 'C'],\n description:\n 'list.set(0, \"X\") → UnsupportedOperationException! Even index-based changes fail.',\n codeLine: 9,\n variables: { method: 'set', result: 'Exception!' },\n error: true,\n });\n\n // Try to remove\n steps.push({\n operation: 'tryModify',\n method: 'remove()',\n original: ['A', 'B', 'C'],\n description:\n 'list.remove(0) → UnsupportedOperationException! No element can be removed.',\n codeLine: 8,\n variables: { method: 'remove', result: 'Exception!' },\n error: true,\n });\n\n // Derive new collection\n steps.push({\n operation: 'derive',\n method: 'new ArrayList<>()',\n original: ['A', 'B', 'C'],\n derived: ['A', 'B', 'C'],\n description:\n 'new ArrayList<>(list) → Create mutable copy. Original stays unchanged forever!',\n codeLine: 12,\n variables: { copied: 3 },\n showDerived: true,\n });\n\n // Modify derived\n steps.push({\n operation: 'derive',\n method: 'newList.add()',\n original: ['A', 'B', 'C'],\n derived: ['A', 'B', 'C', 'D'],\n description:\n 'newList.add(\"D\") → Works! Mutable copy can be modified. Original unchanged.',\n codeLine: 13,\n variables: { newSize: 4, originalSize: 3 },\n showDerived: true,\n });\n\n steps.push({\n operation: 'done',\n original: ['A', 'B', 'C'],\n description:\n '✓ Immutable = Thread-safe without locks. Share freely between threads!',\n codeLine: -1,\n variables: { 'thread-safe': 'always' },\n });\n\n return steps;\n}\n\nconst ImmutableCollectionsVisualizerComponent: React.FC<\n ImmutableCollectionsVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<ImmutableStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateImmutableSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n original: [],\n description: '',\n };\n\n const { original, derived, description, error, showDerived } =\n currentStepData;\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-violet-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n Immutable Collections\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-violet-100 text-violet-700 rounded flex items-center gap-1\">\n <Lock className=\"w-3 h-3\" />\n Unmodifiable\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded flex items-center gap-1\">\n <Shield className=\"w-3 h-3\" />\n Thread-safe\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Collections Display */}\n <div className=\"mb-4 space-y-4\">\n {/* Original Immutable */}\n {original.length > 0 && (\n <div className=\"p-4 bg-violet-50 rounded-lg border-2 border-violet-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Lock className=\"w-4 h-4 text-violet-600\" />\n <span className=\"text-sm font-medium text-violet-700\">\n Immutable List (List.of)\n </span>\n </div>\n <div className=\"flex gap-2\">\n {original.map((item, idx) => (\n <div\n key={idx}\n className={`w-12 h-12 flex items-center justify-center rounded-lg border-2 font-bold transition-all ${\n error\n ? 'bg-red-100 border-red-300 text-red-700 animate-pulse'\n : 'bg-violet-100 border-violet-300 text-violet-700'\n }`}\n >\n {item}\n </div>\n ))}\n {error && (\n <div className=\"flex items-center text-red-600 text-sm font-medium ml-2\">\n ✗ Cannot modify!\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Derived Mutable */}\n {showDerived && derived && (\n <div className=\"p-4 bg-green-50 rounded-lg border-2 border-green-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-medium text-green-700\">\n Mutable Copy (ArrayList)\n </span>\n </div>\n <div className=\"flex gap-2\">\n {derived.map((item, idx) => (\n <div\n key={idx}\n className={`w-12 h-12 flex items-center justify-center rounded-lg border-2 font-bold ${\n idx === derived.length - 1 &&\n derived.length > original.length\n ? 'bg-green-500 border-green-600 text-white'\n : 'bg-green-100 border-green-300 text-green-700'\n }`}\n >\n {item}\n </div>\n ))}\n <div className=\"flex items-center text-green-600 text-sm font-medium ml-2\">\n ✓ Modifiable\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Benefits */}\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600 grid grid-cols-3 gap-2\">\n <div className=\"text-center\">\n <div className=\"font-medium text-violet-700\">No Locks</div>\n <div className=\"text-gray-500\">Thread-safe by nature</div>\n </div>\n <div className=\"text-center\">\n <div className=\"font-medium text-violet-700\">Compact</div>\n <div className=\"text-gray-500\">Optimized memory</div>\n </div>\n <div className=\"text-center\">\n <div className=\"font-medium text-violet-700\">\n Safe Sharing\n </div>\n <div className=\"text-gray-500\">Pass freely</div>\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n error\n ? 'error'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={IMMUTABLE_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"violet\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ImmutableCollectionsVisualizer = React.memo(\n ImmutableCollectionsVisualizerComponent\n);\nexport default ImmutableCollectionsVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n VisualizationArea,\n useVisualizerPlayback,\n} from '../shared';\n\ninterface HeapObject {\n id: string;\n size: number;\n age: number;\n reachable: boolean;\n generation: 'eden' | 'survivor0' | 'survivor1' | 'old';\n}\n\ninterface GCStep {\n operation:\n | 'init'\n | 'allocate'\n | 'mark'\n | 'sweep'\n | 'promote'\n | 'minor_gc'\n | 'major_gc'\n | 'done';\n objects: HeapObject[];\n eden: string[];\n survivor0: string[];\n survivor1: string[];\n old: string[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightObjects?: string[];\n gcType?: 'minor' | 'major';\n activeSurvivor?: 0 | 1;\n}\n\ninterface GCVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst GC_CODE = [\n '// JVM Generational GC',\n '',\n '// 1. Object Allocation',\n 'Object obj = new Object(); // Eden',\n '',\n '// 2. Minor GC (Young Gen)',\n 'for (obj in eden + survivor_from) {',\n ' if (isReachable(obj)) {',\n ' if (obj.age >= threshold) {',\n ' promote(obj, oldGen);',\n ' } else {',\n ' copy(obj, survivor_to);',\n ' obj.age++;',\n ' }',\n ' }',\n '}',\n '',\n '// 3. Major GC (Old Gen)',\n 'mark(); // Mark reachable objects',\n 'sweep(); // Free unreachable',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-400', label: 'Reachable' },\n { color: 'bg-red-400', label: 'Unreachable (garbage)' },\n { color: 'bg-yellow-400', label: 'Being collected' },\n { color: 'bg-blue-400', label: 'Promoted' },\n];\n\nconst PROMOTION_THRESHOLD = 3;\n\nfunction generateGCSteps(): GCStep[] {\n const steps: GCStep[] = [];\n let objects: HeapObject[] = [];\n let eden: string[] = [];\n let survivor0: string[] = [];\n let survivor1: string[] = [];\n let old: string[] = [];\n let objCounter = 0;\n let activeSurvivor: 0 | 1 = 0;\n\n const createObject = (reachable: boolean): HeapObject => ({\n id: `obj${++objCounter}`,\n size: Math.floor(Math.random() * 3) + 1,\n age: 0,\n reachable,\n generation: 'eden',\n });\n\n // Initial state\n steps.push({\n operation: 'init',\n objects: [],\n eden: [],\n survivor0: [],\n survivor1: [],\n old: [],\n description: 'JVM Heap initialized. Young Gen: Eden + 2 Survivor spaces. Old Gen for long-lived objects.',\n codeLine: 0,\n activeSurvivor: 0,\n });\n\n // Allocate objects in Eden\n for (let i = 0; i < 5; i++) {\n const obj = createObject(i % 2 === 0 || i === 1); // Some reachable, some not\n objects.push(obj);\n eden.push(obj.id);\n\n steps.push({\n operation: 'allocate',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Allocate ${obj.id} in Eden (size: ${obj.size}KB). ${obj.reachable ? 'Referenced' : 'No references'}.`,\n codeLine: 3,\n variables: { allocated: obj.id, edenUsed: eden.length },\n highlightObjects: [obj.id],\n activeSurvivor,\n });\n }\n\n // Minor GC #1\n steps.push({\n operation: 'minor_gc',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: 'Eden full! Triggering Minor GC (Young Generation collection).',\n codeLine: 5,\n gcType: 'minor',\n activeSurvivor,\n });\n\n // Mark phase\n const reachableInYoung = objects.filter(\n (o) => o.reachable && (eden.includes(o.id) || survivor0.includes(o.id) || survivor1.includes(o.id))\n );\n\n steps.push({\n operation: 'mark',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Mark phase: Found ${reachableInYoung.length} reachable objects in Young Gen.`,\n codeLine: 7,\n highlightObjects: reachableInYoung.map((o) => o.id),\n activeSurvivor,\n });\n\n // Move survivors to survivor space\n const targetSurvivor = activeSurvivor === 0 ? survivor1 : survivor0;\n const targetKey = activeSurvivor === 0 ? 'survivor1' : 'survivor0';\n\n for (const obj of reachableInYoung) {\n obj.age++;\n obj.generation = targetKey as 'survivor0' | 'survivor1';\n targetSurvivor.push(obj.id);\n }\n\n // Clear eden and source survivor\n const garbage = objects.filter(\n (o) => !o.reachable && (eden.includes(o.id) || survivor0.includes(o.id) || survivor1.includes(o.id))\n );\n objects = objects.filter((o) => o.reachable || old.includes(o.id));\n eden = [];\n if (activeSurvivor === 0) {\n survivor0 = [];\n } else {\n survivor1 = [];\n }\n\n steps.push({\n operation: 'sweep',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Copy ${reachableInYoung.length} survivors to S${activeSurvivor === 0 ? 1 : 0}. Freed ${garbage.length} objects. Eden cleared.`,\n codeLine: 11,\n variables: { survivors: reachableInYoung.length, freed: garbage.length },\n highlightObjects: reachableInYoung.map((o) => o.id),\n activeSurvivor: activeSurvivor === 0 ? 1 : 0,\n });\n\n activeSurvivor = activeSurvivor === 0 ? 1 : 0;\n\n // More allocations\n for (let i = 0; i < 4; i++) {\n const obj = createObject(i < 2);\n objects.push(obj);\n eden.push(obj.id);\n }\n\n steps.push({\n operation: 'allocate',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Allocated 4 more objects in Eden. Preparing for next Minor GC.`,\n codeLine: 3,\n variables: { edenUsed: eden.length },\n activeSurvivor,\n });\n\n // Minor GC #2 - simulate multiple cycles to show promotion\n for (let gc = 0; gc < 2; gc++) {\n steps.push({\n operation: 'minor_gc',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Minor GC #${gc + 2}: Collecting Young Generation.`,\n codeLine: 5,\n gcType: 'minor',\n activeSurvivor,\n });\n\n const allYoung = [...eden, ...(activeSurvivor === 0 ? survivor0 : survivor1)];\n const reachable = objects.filter((o) => o.reachable && allYoung.includes(o.id));\n const toPromote = reachable.filter((o) => o.age >= PROMOTION_THRESHOLD);\n const toSurvivor = reachable.filter((o) => o.age < PROMOTION_THRESHOLD);\n\n // Promote old objects\n for (const obj of toPromote) {\n obj.generation = 'old';\n old.push(obj.id);\n }\n\n if (toPromote.length > 0) {\n steps.push({\n operation: 'promote',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Promoted ${toPromote.length} objects to Old Gen (age >= ${PROMOTION_THRESHOLD}).`,\n codeLine: 9,\n variables: { promoted: toPromote.length, threshold: PROMOTION_THRESHOLD },\n highlightObjects: toPromote.map((o) => o.id),\n activeSurvivor,\n });\n }\n\n // Move survivors\n const targetSurv = activeSurvivor === 0 ? survivor1 : survivor0;\n for (const obj of toSurvivor) {\n obj.age++;\n obj.generation = (activeSurvivor === 0 ? 'survivor1' : 'survivor0') as 'survivor0' | 'survivor1';\n if (!targetSurv.includes(obj.id)) {\n targetSurv.push(obj.id);\n }\n }\n\n // Clear\n const freedCount = allYoung.length - reachable.length;\n objects = objects.filter((o) => o.reachable || !allYoung.includes(o.id));\n eden = [];\n if (activeSurvivor === 0) {\n survivor0 = [];\n } else {\n survivor1 = [];\n }\n\n steps.push({\n operation: 'sweep',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Minor GC complete. Freed ${freedCount} objects. Survivors: ${toSurvivor.length}.`,\n codeLine: 15,\n variables: { freed: freedCount, survivors: toSurvivor.length },\n activeSurvivor: activeSurvivor === 0 ? 1 : 0,\n });\n\n activeSurvivor = activeSurvivor === 0 ? 1 : 0;\n\n // Allocate more\n if (gc < 1) {\n for (let i = 0; i < 3; i++) {\n const obj = createObject(true);\n objects.push(obj);\n eden.push(obj.id);\n }\n }\n }\n\n // Major GC\n // Make some old gen objects unreachable\n const oldObjs = objects.filter((o) => old.includes(o.id));\n if (oldObjs.length > 0) {\n oldObjs[0].reachable = false;\n }\n\n steps.push({\n operation: 'major_gc',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: 'Old Gen filling up! Triggering Major GC (Full GC).',\n codeLine: 17,\n gcType: 'major',\n activeSurvivor,\n });\n\n // Mark\n const reachableOld = objects.filter((o) => o.reachable && old.includes(o.id));\n const unreachableOld = objects.filter((o) => !o.reachable && old.includes(o.id));\n\n steps.push({\n operation: 'mark',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Major GC Mark: ${reachableOld.length} reachable, ${unreachableOld.length} unreachable in Old Gen.`,\n codeLine: 18,\n highlightObjects: [...reachableOld.map((o) => o.id), ...unreachableOld.map((o) => o.id)],\n activeSurvivor,\n });\n\n // Sweep old gen\n objects = objects.filter((o) => o.reachable || !old.includes(o.id));\n old = old.filter((id) => objects.find((o) => o.id === id && o.reachable));\n\n steps.push({\n operation: 'sweep',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Major GC Sweep: Freed ${unreachableOld.length} objects from Old Gen.`,\n codeLine: 19,\n variables: { freed: unreachableOld.length, remaining: old.length },\n activeSurvivor,\n });\n\n // Final state\n const totalObjects = objects.length;\n steps.push({\n operation: 'done',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `GC Demo complete! ${totalObjects} live objects. Young Gen uses copy collector, Old Gen uses mark-sweep.`,\n codeLine: -1,\n variables: { total: totalObjects, eden: eden.length, survivors: survivor0.length + survivor1.length, old: old.length },\n activeSurvivor,\n });\n\n return steps;\n}\n\nconst GCVisualizerComponent: React.FC<GCVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'gc-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'gc', scrollToId: VISUALIZER_ID });\n\n const [showDetails, setShowDetails] = useState(true);\n const generateSteps = useMemo(() => generateGCSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<GCStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n objects: [],\n eden: [],\n survivor0: [],\n survivor1: [],\n old: [],\n description: '',\n };\n\n const { objects, eden, survivor0, survivor1, old, highlightObjects, description, gcType, activeSurvivor } =\n stepData;\n\n const toggleDetails = useCallback(() => {\n setShowDetails((prev) => !prev);\n }, []);\n\n const getObjectStyle = (obj: HeapObject): string => {\n const isHighlighted = highlightObjects?.includes(obj.id);\n\n if (isHighlighted && stepData.operation === 'promote') {\n return 'bg-blue-400 text-white ring-2 ring-blue-300';\n }\n if (isHighlighted && !obj.reachable) {\n return 'bg-red-400 text-white ring-2 ring-red-300';\n }\n if (isHighlighted) {\n return 'bg-yellow-400 text-gray-900 ring-2 ring-yellow-300';\n }\n if (!obj.reachable) {\n return 'bg-red-300 text-red-800';\n }\n return 'bg-green-400 text-white';\n };\n\n const renderGeneration = (\n name: string,\n ids: string[],\n color: string,\n capacity: number\n ) => {\n const genObjects = objects.filter((o) => ids.includes(o.id));\n const fillPercent = Math.min((ids.length / capacity) * 100, 100);\n\n return (\n <div className=\"mb-3\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-gray-700\">{name}</span>\n <span className=\"text-[10px] text-gray-500\">\n {ids.length}/{capacity}\n </span>\n </div>\n <div className={`h-12 ${color} rounded border border-gray-300 relative overflow-hidden`}>\n <div\n className=\"absolute inset-y-0 left-0 bg-opacity-30 bg-gray-500 transition-all duration-300\"\n style={{ width: `${fillPercent}%` }}\n />\n <div className=\"absolute inset-0 flex flex-wrap items-center gap-1 p-1\">\n {genObjects.map((obj) => (\n <div\n key={obj.id}\n className={`px-1.5 py-0.5 text-[9px] font-medium rounded transition-all duration-200 ${getObjectStyle(obj)}`}\n title={`${obj.id} (age: ${obj.age}, ${obj.reachable ? 'reachable' : 'garbage'})`}\n >\n {obj.id.replace('obj', '')}\n {showDetails && <span className=\"opacity-70\">:{obj.age}</span>}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n };\n\n const getStatusVariant = () => {\n if (gcType === 'major') return 'error' as const;\n if (gcType === 'minor') return 'warning' as const;\n if (stepData.operation === 'done') return 'success' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-purple-50 to-pink-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">JVM Garbage Collection</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Generational GC\n </span>\n {gcType && (\n <span\n className={`px-2 py-0.5 text-xs font-medium rounded ${\n gcType === 'major'\n ? 'bg-red-100 text-red-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}\n >\n {gcType === 'major' ? 'Major GC' : 'Minor GC'}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleDetails}\n className={`px-3 py-1 text-xs font-medium rounded transition-colors ${\n showDetails\n ? 'bg-purple-500 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n {showDetails ? 'Hide Ages' : 'Show Ages'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Heap Layout */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n JVM Heap Memory\n </div>\n\n {/* Young Generation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs font-semibold text-blue-700 mb-2\">\n Young Generation\n </div>\n {renderGeneration('Eden Space', eden, 'bg-blue-100', 8)}\n <div className=\"grid grid-cols-2 gap-2\">\n <div className={activeSurvivor === 0 ? 'ring-2 ring-blue-400 rounded' : ''}>\n {renderGeneration('Survivor 0 (From)', survivor0, 'bg-cyan-100', 4)}\n </div>\n <div className={activeSurvivor === 1 ? 'ring-2 ring-blue-400 rounded' : ''}>\n {renderGeneration('Survivor 1 (To)', survivor1, 'bg-cyan-100', 4)}\n </div>\n </div>\n </div>\n\n {/* Old Generation */}\n <div className=\"p-3 bg-amber-50 rounded-lg\">\n <div className=\"text-xs font-semibold text-amber-700 mb-2\">\n Old Generation (Tenured)\n </div>\n {renderGeneration('Old Space', old, 'bg-amber-100', 12)}\n </div>\n </div>\n\n {/* GC Info */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-xs text-gray-700 grid grid-cols-2 gap-2\">\n <div>\n <span className=\"font-semibold\">Minor GC:</span> Collects Young Gen\n </div>\n <div>\n <span className=\"font-semibold\">Major GC:</span> Collects Old Gen\n </div>\n <div>\n <span className=\"font-semibold\">Promotion:</span> age {'>='} {PROMOTION_THRESHOLD}\n </div>\n <div>\n <span className=\"font-semibold\">Algorithm:</span> Copy + Mark-Sweep\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={GC_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"purple\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const GCVisualizer = React.memo(GCVisualizerComponent);\nexport default GCVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n VisualizationArea,\n useVisualizerPlayback,\n} from '../shared';\n\ninterface TableRow {\n id: number;\n name: string;\n foreignKey?: number | null;\n}\n\ninterface JoinResult {\n leftRow: TableRow | null;\n rightRow: TableRow | null;\n matched: boolean;\n}\n\ntype JoinType = 'inner' | 'left' | 'right' | 'full';\n\ninterface SQLJoinStep {\n operation: 'init' | 'scan' | 'compare' | 'match' | 'no_match' | 'include_null' | 'done';\n joinType: JoinType;\n leftTable: TableRow[];\n rightTable: TableRow[];\n results: JoinResult[];\n currentLeftIndex: number;\n currentRightIndex: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightLeft?: number;\n highlightRight?: number;\n highlightResult?: number;\n}\n\ninterface SQLJoinVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst EMPLOYEES: TableRow[] = [\n { id: 1, name: 'Alice', foreignKey: 101 },\n { id: 2, name: 'Bob', foreignKey: 102 },\n { id: 3, name: 'Charlie', foreignKey: null },\n { id: 4, name: 'Diana', foreignKey: 101 },\n];\n\nconst DEPARTMENTS: TableRow[] = [\n { id: 101, name: 'Engineering' },\n { id: 102, name: 'Marketing' },\n { id: 103, name: 'Sales' },\n];\n\nconst JOIN_CODES: Record<JoinType, string[]> = {\n inner: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'INNER JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns only matching rows',\n '-- from both tables',\n '',\n 'Algorithm: Nested Loop',\n 'for each row in employees:',\n ' for each row in departments:',\n ' if e.dept_id == d.id:',\n ' emit (e, d)',\n ],\n left: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'LEFT JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns ALL rows from left',\n '-- + matching rows from right',\n '-- NULL if no match on right',\n '',\n 'for each row in employees:',\n ' matched = false',\n ' for each row in departments:',\n ' if e.dept_id == d.id:',\n ' emit (e, d); matched=true',\n ' if not matched:',\n ' emit (e, NULL)',\n ],\n right: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'RIGHT JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns ALL rows from right',\n '-- + matching rows from left',\n '-- NULL if no match on left',\n '',\n 'for each row in departments:',\n ' matched = false',\n ' for each row in employees:',\n ' if e.dept_id == d.id:',\n ' emit (e, d); matched=true',\n ' if not matched:',\n ' emit (NULL, d)',\n ],\n full: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'FULL OUTER JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns ALL rows from both',\n '-- NULL where no match exists',\n '',\n '// Step 1: LEFT JOIN logic',\n '// Step 2: Add unmatched right',\n '',\n 'Combines LEFT + RIGHT results',\n 'removing duplicates',\n ],\n};\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-400', label: 'Matched rows' },\n { color: 'bg-blue-400', label: 'Current comparison' },\n { color: 'bg-yellow-400', label: 'NULL (no match)' },\n { color: 'bg-gray-300', label: 'Not included' },\n];\n\nfunction generateJoinSteps(joinType: JoinType): SQLJoinStep[] {\n const steps: SQLJoinStep[] = [];\n const results: JoinResult[] = [];\n const leftTable = [...EMPLOYEES];\n const rightTable = [...DEPARTMENTS];\n const matchedRight = new Set<number>();\n\n // Initial state\n steps.push({\n operation: 'init',\n joinType,\n leftTable,\n rightTable,\n results: [],\n currentLeftIndex: -1,\n currentRightIndex: -1,\n description: `${joinType.toUpperCase()} JOIN: Combining employees (left) with departments (right).`,\n codeLine: 0,\n });\n\n // Process based on join type\n if (joinType === 'inner' || joinType === 'left' || joinType === 'full') {\n for (let i = 0; i < leftTable.length; i++) {\n const leftRow = leftTable[i];\n let foundMatch = false;\n\n steps.push({\n operation: 'scan',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: -1,\n description: `Scanning left table: ${leftRow.name} (dept_id: ${leftRow.foreignKey ?? 'NULL'})`,\n codeLine: joinType === 'inner' ? 9 : 9,\n variables: { employee: leftRow.name, dept_id: leftRow.foreignKey ?? 'NULL' },\n highlightLeft: i,\n });\n\n for (let j = 0; j < rightTable.length; j++) {\n const rightRow = rightTable[j];\n\n steps.push({\n operation: 'compare',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Compare: ${leftRow.foreignKey ?? 'NULL'} == ${rightRow.id}?`,\n codeLine: joinType === 'inner' ? 11 : 12,\n variables: { left_key: leftRow.foreignKey ?? 'NULL', right_key: rightRow.id },\n highlightLeft: i,\n highlightRight: j,\n });\n\n if (leftRow.foreignKey === rightRow.id) {\n foundMatch = true;\n matchedRight.add(j);\n results.push({ leftRow, rightRow, matched: true });\n\n steps.push({\n operation: 'match',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Match found! ${leftRow.name} works in ${rightRow.name}.`,\n codeLine: joinType === 'inner' ? 12 : 13,\n highlightLeft: i,\n highlightRight: j,\n highlightResult: results.length - 1,\n });\n }\n }\n\n // Handle no match for LEFT/FULL JOIN\n if (!foundMatch && (joinType === 'left' || joinType === 'full')) {\n results.push({ leftRow, rightRow: null, matched: false });\n\n steps.push({\n operation: 'include_null',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: -1,\n description: `No match for ${leftRow.name}. Include with NULL department.`,\n codeLine: 15,\n highlightLeft: i,\n highlightResult: results.length - 1,\n });\n } else if (!foundMatch && joinType === 'inner') {\n steps.push({\n operation: 'no_match',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: -1,\n description: `No match for ${leftRow.name}. Skipped (INNER JOIN).`,\n codeLine: 11,\n highlightLeft: i,\n });\n }\n }\n }\n\n // For RIGHT or FULL JOIN: add unmatched right rows\n if (joinType === 'right' || joinType === 'full') {\n for (let j = 0; j < rightTable.length; j++) {\n if (joinType === 'right' || !matchedRight.has(j)) {\n const rightRow = rightTable[j];\n let foundMatch = false;\n\n if (joinType === 'right') {\n steps.push({\n operation: 'scan',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: -1,\n currentRightIndex: j,\n description: `Scanning right table: ${rightRow.name} (id: ${rightRow.id})`,\n codeLine: 9,\n highlightRight: j,\n });\n\n for (let i = 0; i < leftTable.length; i++) {\n const leftRow = leftTable[i];\n\n steps.push({\n operation: 'compare',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Compare: ${leftRow.foreignKey ?? 'NULL'} == ${rightRow.id}?`,\n codeLine: 12,\n highlightLeft: i,\n highlightRight: j,\n });\n\n if (leftRow.foreignKey === rightRow.id) {\n foundMatch = true;\n results.push({ leftRow, rightRow, matched: true });\n\n steps.push({\n operation: 'match',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Match found! ${leftRow.name} works in ${rightRow.name}.`,\n codeLine: 13,\n highlightLeft: i,\n highlightRight: j,\n highlightResult: results.length - 1,\n });\n }\n }\n }\n\n if (!foundMatch && !matchedRight.has(j)) {\n results.push({ leftRow: null, rightRow, matched: false });\n\n steps.push({\n operation: 'include_null',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: -1,\n currentRightIndex: j,\n description: `No employee in ${rightRow.name}. Include with NULL employee.`,\n codeLine: joinType === 'right' ? 15 : 10,\n highlightRight: j,\n highlightResult: results.length - 1,\n });\n }\n }\n }\n }\n\n // Final state\n steps.push({\n operation: 'done',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: -1,\n currentRightIndex: -1,\n description: `${joinType.toUpperCase()} JOIN complete! ${results.length} rows returned.`,\n codeLine: -1,\n variables: { total_rows: results.length },\n });\n\n return steps;\n}\n\nconst SQLJoinVisualizerComponent: React.FC<SQLJoinVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'sqljoin-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'sqljoin', scrollToId: VISUALIZER_ID });\n\n const [joinType, setJoinType] = useState<JoinType>('inner');\n\n const generateSteps = useMemo(\n () => () => generateJoinSteps(joinType),\n [joinType]\n );\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<SQLJoinStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n joinType: 'inner' as const,\n leftTable: EMPLOYEES,\n rightTable: DEPARTMENTS,\n results: [],\n currentLeftIndex: -1,\n currentRightIndex: -1,\n description: '',\n };\n\n const {\n leftTable,\n rightTable,\n results,\n highlightLeft,\n highlightRight,\n highlightResult,\n description,\n } = stepData;\n\n const handleJoinTypeChange = useCallback((type: JoinType) => {\n setJoinType(type);\n }, []);\n\n const getRowStyle = (index: number, isLeft: boolean): string => {\n const highlight = isLeft ? highlightLeft : highlightRight;\n if (index === highlight) {\n return 'bg-blue-400 text-white';\n }\n return 'bg-white';\n };\n\n const getResultStyle = (index: number, result: JoinResult): string => {\n if (index === highlightResult) {\n return result.matched ? 'bg-green-400 text-white' : 'bg-yellow-400 text-gray-900';\n }\n if (result.matched) {\n return 'bg-green-100';\n }\n return 'bg-yellow-100';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'match') return 'success' as const;\n if (stepData.operation === 'no_match') return 'error' as const;\n if (stepData.operation === 'include_null') return 'warning' as const;\n if (stepData.operation === 'done') return 'success' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-cyan-50 to-blue-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">SQL JOIN Operations</h3>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-cyan-100 text-cyan-700 rounded\">\n {joinType.toUpperCase()} JOIN\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <div className=\"flex gap-1\">\n {(['inner', 'left', 'right', 'full'] as JoinType[]).map((type) => (\n <button\n key={type}\n onClick={() => handleJoinTypeChange(type)}\n className={`px-2 py-1 text-xs font-medium rounded transition-colors ${\n joinType === type\n ? 'bg-cyan-500 text-white'\n : 'bg-gray-200 text-gray-700 hover:bg-gray-300'\n }`}\n >\n {type.toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={450} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Tables */}\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\n {/* Left Table (Employees) */}\n <div>\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">\n employees (Left)\n </div>\n <div className=\"border border-gray-300 rounded overflow-hidden\">\n <div className=\"grid grid-cols-3 bg-gray-100 text-[10px] font-semibold text-gray-600\">\n <div className=\"px-2 py-1 border-r\">id</div>\n <div className=\"px-2 py-1 border-r\">name</div>\n <div className=\"px-2 py-1\">dept_id</div>\n </div>\n {leftTable.map((row, idx) => (\n <div\n key={row.id}\n className={`grid grid-cols-3 text-[10px] border-t transition-colors ${getRowStyle(idx, true)}`}\n >\n <div className=\"px-2 py-1 border-r\">{row.id}</div>\n <div className=\"px-2 py-1 border-r\">{row.name}</div>\n <div className=\"px-2 py-1\">{row.foreignKey ?? 'NULL'}</div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Right Table (Departments) */}\n <div>\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">\n departments (Right)\n </div>\n <div className=\"border border-gray-300 rounded overflow-hidden\">\n <div className=\"grid grid-cols-2 bg-gray-100 text-[10px] font-semibold text-gray-600\">\n <div className=\"px-2 py-1 border-r\">id</div>\n <div className=\"px-2 py-1\">name</div>\n </div>\n {rightTable.map((row, idx) => (\n <div\n key={row.id}\n className={`grid grid-cols-2 text-[10px] border-t transition-colors ${getRowStyle(idx, false)}`}\n >\n <div className=\"px-2 py-1 border-r\">{row.id}</div>\n <div className=\"px-2 py-1\">{row.name}</div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Result Table */}\n <div className=\"mb-4\">\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">\n Result ({results.length} rows)\n </div>\n <div className=\"border border-gray-300 rounded overflow-hidden max-h-40 overflow-y-auto\">\n <div className=\"grid grid-cols-2 bg-gray-100 text-[10px] font-semibold text-gray-600 sticky top-0\">\n <div className=\"px-2 py-1 border-r\">e.name</div>\n <div className=\"px-2 py-1\">d.name</div>\n </div>\n {results.length > 0 ? (\n results.map((result, idx) => (\n <div\n key={idx}\n className={`grid grid-cols-2 text-[10px] border-t transition-colors ${getResultStyle(idx, result)}`}\n >\n <div className=\"px-2 py-1 border-r\">\n {result.leftRow?.name ?? <span className=\"text-gray-400\">NULL</span>}\n </div>\n <div className=\"px-2 py-1\">\n {result.rightRow?.name ?? <span className=\"text-gray-400\">NULL</span>}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 text-center py-2\">\n No results yet\n </div>\n )}\n </div>\n </div>\n\n {/* Join Type Explanation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-blue-700\">\n <strong>{joinType.toUpperCase()} JOIN:</strong>\n {joinType === 'inner' && ' Returns only rows with matches in BOTH tables.'}\n {joinType === 'left' && ' Returns ALL rows from left + matching rows from right (NULL if no match).'}\n {joinType === 'right' && ' Returns ALL rows from right + matching rows from left (NULL if no match).'}\n {joinType === 'full' && ' Returns ALL rows from BOTH tables (NULL where no match exists).'}\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={JOIN_CODES[joinType]}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"cyan\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const SQLJoinVisualizer = React.memo(SQLJoinVisualizerComponent);\nexport default SQLJoinVisualizer;\n"],"names":["Code2","ACCENT_COLORS","Edit2","ALGORITHM_NAMES","ALGORITHM_COMPLEXITIES","LEGEND_ITEMS","generateBubbleSortSteps","generateSelectionSortSteps","generateInsertionSortSteps","generateQuickSortSteps","generateMergeSortSteps","STEP_GENERATORS","generateRandomArray","generateGraph","BUCKET_COUNT","OPERATIONS","simpleHash","INITIAL_CAPACITY"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/check.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/code-xml.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/copy.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/history.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/keyboard.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/lock.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/pause.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/pen.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/play.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/share-2.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/shield.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/shuffle.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/skip-back.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/skip-forward.js","../../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/esm/icons/x.js","../src/shared/CodePanel.tsx","../src/shared/HelpPanel.tsx","../src/shared/ControlPanel.tsx","../src/shared/Legend.tsx","../src/shared/StatusPanel.tsx","../src/shared/ArrayInput.tsx","../src/shared/StepHistory.tsx","../src/shared/ShareButton.tsx","../src/shared/VisualizationArea.tsx","../src/shared/useVisualizerPlayback.ts","../src/shared/useUrlState.ts","../src/shared/constants.ts","../src/visualizers/BinarySearchVisualizer.tsx","../src/visualizers/SortingVisualizer.tsx","../src/visualizers/SortingComparisonVisualizer.tsx","../src/visualizers/DijkstraVisualizer.tsx","../src/visualizers/DPVisualizer.tsx","../src/visualizers/GraphVisualizer.tsx","../src/visualizers/HashMapVisualizer.tsx","../src/visualizers/HashTableVisualizer.tsx","../src/visualizers/LinkedListVisualizer.tsx","../src/visualizers/LinkedHashMapVisualizer.tsx","../src/visualizers/ArrayListVisualizer.tsx","../src/visualizers/ArrayDequeVisualizer.tsx","../src/visualizers/TreeSetVisualizer.tsx","../src/visualizers/EnumSetVisualizer.tsx","../src/visualizers/PriorityQueueVisualizer.tsx","../src/visualizers/ConcurrentHashMapVisualizer.tsx","../src/visualizers/BlockingQueueVisualizer.tsx","../src/visualizers/CopyOnWriteVisualizer.tsx","../src/visualizers/ImmutableCollectionsVisualizer.tsx","../src/visualizers/GCVisualizer.tsx","../src/visualizers/SQLJoinVisualizer.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Check = createLucideIcon(\"Check\", [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]]);\n\nexport { Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronDown = createLucideIcon(\"ChevronDown\", [\n [\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]\n]);\n\nexport { ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CodeXml = createLucideIcon(\"CodeXml\", [\n [\"path\", { d: \"m18 16 4-4-4-4\", key: \"1inbqp\" }],\n [\"path\", { d: \"m6 8-4 4 4 4\", key: \"15zrgr\" }],\n [\"path\", { d: \"m14.5 4-5 16\", key: \"e7oirm\" }]\n]);\n\nexport { CodeXml as default };\n//# sourceMappingURL=code-xml.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Copy = createLucideIcon(\"Copy\", [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n]);\n\nexport { Copy as default };\n//# sourceMappingURL=copy.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst History = createLucideIcon(\"History\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }],\n [\"path\", { d: \"M12 7v5l4 2\", key: \"1fdv2h\" }]\n]);\n\nexport { History as default };\n//# sourceMappingURL=history.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Keyboard = createLucideIcon(\"Keyboard\", [\n [\"path\", { d: \"M10 8h.01\", key: \"1r9ogq\" }],\n [\"path\", { d: \"M12 12h.01\", key: \"1mp3jc\" }],\n [\"path\", { d: \"M14 8h.01\", key: \"1primd\" }],\n [\"path\", { d: \"M16 12h.01\", key: \"1l6xoz\" }],\n [\"path\", { d: \"M18 8h.01\", key: \"emo2bl\" }],\n [\"path\", { d: \"M6 8h.01\", key: \"x9i8wu\" }],\n [\"path\", { d: \"M7 16h10\", key: \"wp8him\" }],\n [\"path\", { d: \"M8 12h.01\", key: \"czm47f\" }],\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }]\n]);\n\nexport { Keyboard as default };\n//# sourceMappingURL=keyboard.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Lock = createLucideIcon(\"Lock\", [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n]);\n\nexport { Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pause = createLucideIcon(\"Pause\", [\n [\"rect\", { x: \"14\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"zuxfzm\" }],\n [\"rect\", { x: \"6\", y: \"4\", width: \"4\", height: \"16\", rx: \"1\", key: \"1okwgv\" }]\n]);\n\nexport { Pause as default };\n//# sourceMappingURL=pause.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pen = createLucideIcon(\"Pen\", [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ]\n]);\n\nexport { Pen as default };\n//# sourceMappingURL=pen.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Play = createLucideIcon(\"Play\", [\n [\"polygon\", { points: \"6 3 20 12 6 21 6 3\", key: \"1oa8hb\" }]\n]);\n\nexport { Play as default };\n//# sourceMappingURL=play.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Search = createLucideIcon(\"Search\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n]);\n\nexport { Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Share2 = createLucideIcon(\"Share2\", [\n [\"circle\", { cx: \"18\", cy: \"5\", r: \"3\", key: \"gq8acd\" }],\n [\"circle\", { cx: \"6\", cy: \"12\", r: \"3\", key: \"w7nqdw\" }],\n [\"circle\", { cx: \"18\", cy: \"19\", r: \"3\", key: \"1xt0gg\" }],\n [\"line\", { x1: \"8.59\", x2: \"15.42\", y1: \"13.51\", y2: \"17.49\", key: \"47mynk\" }],\n [\"line\", { x1: \"15.41\", x2: \"8.59\", y1: \"6.51\", y2: \"10.49\", key: \"1n3mei\" }]\n]);\n\nexport { Share2 as default };\n//# sourceMappingURL=share-2.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"Shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shuffle = createLucideIcon(\"Shuffle\", [\n [\"path\", { d: \"m18 14 4 4-4 4\", key: \"10pe0f\" }],\n [\"path\", { d: \"m18 2 4 4-4 4\", key: \"pucp1d\" }],\n [\"path\", { d: \"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22\", key: \"1ailkh\" }],\n [\"path\", { d: \"M2 6h1.972a4 4 0 0 1 3.6 2.2\", key: \"km57vx\" }],\n [\"path\", { d: \"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45\", key: \"os18l9\" }]\n]);\n\nexport { Shuffle as default };\n//# sourceMappingURL=shuffle.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SkipBack = createLucideIcon(\"SkipBack\", [\n [\"polygon\", { points: \"19 20 9 12 19 4 19 20\", key: \"o2sva\" }],\n [\"line\", { x1: \"5\", x2: \"5\", y1: \"19\", y2: \"5\", key: \"1ocqjk\" }]\n]);\n\nexport { SkipBack as default };\n//# sourceMappingURL=skip-back.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SkipForward = createLucideIcon(\"SkipForward\", [\n [\"polygon\", { points: \"5 4 15 12 5 20 5 4\", key: \"16p6eg\" }],\n [\"line\", { x1: \"19\", x2: \"19\", y1: \"5\", y2: \"19\", key: \"futhcm\" }]\n]);\n\nexport { SkipForward as default };\n//# sourceMappingURL=skip-forward.js.map\n","/**\n * @license lucide-react v0.468.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","import React from 'react';\nimport { Code2 } from 'lucide-react';\n\ninterface CodePanelProps {\n code: string[];\n activeLine: number;\n variables?: Record<string, string | number>;\n}\n\nexport const CodePanel: React.FC<CodePanelProps> = ({\n code,\n activeLine,\n variables,\n}) => (\n <div className=\"bg-gray-900 rounded-lg p-1.5 text-[11px] font-mono overflow-hidden leading-tight\">\n <div className=\"flex items-center gap-1 mb-1 pb-1 border-b border-gray-700\">\n <Code2 className=\"w-2.5 h-2.5 text-gray-400\" />\n <span className=\"text-gray-400 text-[8px] uppercase tracking-wide\">\n Pseudocode\n </span>\n </div>\n <div>\n {code.map((line, idx) => (\n <div\n key={idx}\n className={`px-0.5 rounded transition-all whitespace-pre ${\n idx === activeLine\n ? 'bg-yellow-500/30 text-yellow-200 border-l border-yellow-400'\n : 'text-gray-400 border-l border-transparent'\n }`}\n >\n <span className=\"text-gray-600 mr-1 select-none text-[9px]\">\n {idx + 1}\n </span>\n {line || ' '}\n </div>\n ))}\n </div>\n {variables && Object.keys(variables).length > 0 && (\n <div className=\"mt-1 pt-1 border-t border-gray-700\">\n <div className=\"text-[8px] text-gray-500 uppercase tracking-wide mb-0.5\">\n Vars\n </div>\n <div className=\"flex flex-wrap gap-0.5\">\n {Object.entries(variables).map(([key, value]) => (\n <span\n key={key}\n className=\"px-0.5 bg-gray-800 rounded text-[9px] text-gray-300\"\n >\n <span className=\"text-blue-400\">{key}</span>\n <span className=\"text-gray-500\">=</span>\n <span className=\"text-green-400\">{value}</span>\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n);\n\nexport default CodePanel;\n","import React from 'react';\n\nexport const HelpPanel: React.FC = () => (\n <div className=\"bg-gray-100 rounded-lg p-2 text-[10px]\">\n <div className=\"font-medium text-gray-700 mb-1\">Keyboard Shortcuts</div>\n <div className=\"space-y-0.5 text-gray-600\">\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n P\n </kbd>{' '}\n Play / Pause\n </div>\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n [\n </kbd>{' '}\n Step back\n </div>\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n ]\n </kbd>{' '}\n Step forward\n </div>\n <div>\n <kbd className=\"px-1 py-0.5 bg-white rounded border text-[9px] font-mono\">\n R\n </kbd>{' '}\n Reset\n </div>\n </div>\n </div>\n);\n\nexport default HelpPanel;\n","import React from 'react';\nimport {\n Play,\n Pause,\n SkipForward,\n SkipBack,\n RotateCcw,\n Shuffle,\n} from 'lucide-react';\n\nexport interface ControlPanelProps {\n isPlaying: boolean;\n currentStep: number;\n totalSteps: number;\n speed: number;\n onPlayPause: () => void;\n onStep: () => void;\n onStepBack: () => void;\n onReset: () => void;\n onSpeedChange: (speed: number) => void;\n onShuffle?: () => void;\n accentColor?:\n | 'indigo'\n | 'orange'\n | 'green'\n | 'purple'\n | 'blue'\n | 'cyan'\n | 'red'\n | 'lime'\n | 'teal'\n | 'violet';\n showShuffle?: boolean;\n shuffleLabel?: string;\n extraControls?: React.ReactNode;\n}\n\nconst ACCENT_COLORS = {\n indigo: {\n playing: 'text-indigo-600',\n playingDot: 'bg-indigo-500',\n button: 'bg-indigo-600 hover:bg-indigo-700',\n buttonActive: 'bg-indigo-500 hover:bg-indigo-600',\n },\n orange: {\n playing: 'text-orange-600',\n playingDot: 'bg-orange-500',\n button: 'bg-orange-600 hover:bg-orange-700',\n buttonActive: 'bg-orange-500 hover:bg-orange-600',\n },\n green: {\n playing: 'text-green-600',\n playingDot: 'bg-green-500',\n button: 'bg-green-600 hover:bg-green-700',\n buttonActive: 'bg-green-500 hover:bg-green-600',\n },\n purple: {\n playing: 'text-purple-600',\n playingDot: 'bg-purple-500',\n button: 'bg-purple-600 hover:bg-purple-700',\n buttonActive: 'bg-purple-500 hover:bg-purple-600',\n },\n blue: {\n playing: 'text-blue-600',\n playingDot: 'bg-blue-500',\n button: 'bg-blue-600 hover:bg-blue-700',\n buttonActive: 'bg-blue-500 hover:bg-blue-600',\n },\n cyan: {\n playing: 'text-cyan-600',\n playingDot: 'bg-cyan-500',\n button: 'bg-cyan-600 hover:bg-cyan-700',\n buttonActive: 'bg-cyan-500 hover:bg-cyan-600',\n },\n red: {\n playing: 'text-red-600',\n playingDot: 'bg-red-500',\n button: 'bg-red-600 hover:bg-red-700',\n buttonActive: 'bg-red-500 hover:bg-red-600',\n },\n lime: {\n playing: 'text-lime-600',\n playingDot: 'bg-lime-500',\n button: 'bg-lime-600 hover:bg-lime-700',\n buttonActive: 'bg-lime-500 hover:bg-lime-600',\n },\n teal: {\n playing: 'text-teal-600',\n playingDot: 'bg-teal-500',\n button: 'bg-teal-600 hover:bg-teal-700',\n buttonActive: 'bg-teal-500 hover:bg-teal-600',\n },\n violet: {\n playing: 'text-violet-600',\n playingDot: 'bg-violet-500',\n button: 'bg-violet-600 hover:bg-violet-700',\n buttonActive: 'bg-violet-500 hover:bg-violet-600',\n },\n};\n\nexport const ControlPanel: React.FC<ControlPanelProps> = ({\n isPlaying,\n currentStep,\n totalSteps,\n speed,\n onPlayPause,\n onStep,\n onStepBack,\n onReset,\n onSpeedChange,\n onShuffle,\n accentColor = 'indigo',\n showShuffle = false,\n shuffleLabel,\n extraControls,\n}) => {\n const colors = ACCENT_COLORS[accentColor];\n\n return (\n <div className=\"flex items-center justify-between flex-wrap gap-3\">\n {/* Playback Controls */}\n <div className=\"flex items-center gap-2\">\n {isPlaying && (\n <span\n className={`flex items-center gap-1 text-xs ${colors.playing} font-medium`}\n >\n <span\n className={`w-2 h-2 ${colors.playingDot} rounded-full animate-pulse`}\n />\n Playing\n </span>\n )}\n <button\n onClick={onPlayPause}\n className={`p-2 text-white rounded-lg transition-colors ${\n isPlaying ? colors.buttonActive : colors.button\n }`}\n title=\"Play/Pause (P)\"\n >\n {isPlaying ? (\n <Pause className=\"w-4 h-4\" />\n ) : (\n <Play className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={onStepBack}\n disabled={isPlaying || currentStep <= 0}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50\"\n title=\"Step Back ([)\"\n >\n <SkipBack className=\"w-4 h-4\" />\n </button>\n <button\n onClick={onStep}\n disabled={isPlaying || currentStep >= totalSteps - 1}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50\"\n title=\"Step Forward (])\"\n >\n <SkipForward className=\"w-4 h-4\" />\n </button>\n <button\n onClick={onReset}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors\"\n title=\"Reset (R)\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </button>\n {showShuffle && onShuffle && (\n <button\n onClick={onShuffle}\n disabled={isPlaying}\n className={`bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50 ${shuffleLabel ? 'px-3 py-2 text-sm' : 'p-2'}`}\n title={shuffleLabel || 'Shuffle'}\n >\n {shuffleLabel || <Shuffle className=\"w-4 h-4\" />}\n </button>\n )}\n </div>\n\n {/* Speed & Extra Controls */}\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Speed</label>\n <input\n type=\"range\"\n min=\"1\"\n max=\"100\"\n value={speed}\n onChange={(e) => onSpeedChange(Number(e.target.value))}\n className=\"w-24 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n {extraControls}\n </div>\n </div>\n );\n};\n\nexport default ControlPanel;\n","import React from 'react';\nimport { Keyboard } from 'lucide-react';\n\nexport interface LegendItem {\n color: string;\n label: string;\n border?: string;\n}\n\nexport interface LegendProps {\n items: LegendItem[];\n showKeyboardHints?: boolean;\n}\n\nexport const Legend: React.FC<LegendProps> = ({\n items,\n showKeyboardHints = true,\n}) => {\n return (\n <div className=\"flex items-center justify-between mt-3 text-xs\">\n <div className=\"flex items-center gap-4 flex-wrap\">\n {items.map((item, index) => (\n <div key={index} className=\"flex items-center gap-1\">\n <div\n className={`w-3 h-3 rounded ${item.color}`}\n style={item.border ? { border: `2px solid ${item.border}` } : {}}\n />\n <span className=\"text-gray-500\">{item.label}</span>\n </div>\n ))}\n </div>\n {showKeyboardHints && (\n <div className=\"flex items-center gap-1 text-gray-400\">\n <Keyboard className=\"w-3 h-3\" />\n <span>P · [ ] · R</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default Legend;\n","import React from 'react';\n\nexport interface StatusPanelProps {\n description: string;\n currentStep: number;\n totalSteps: number;\n variant?: 'default' | 'success' | 'error' | 'warning';\n}\n\nconst VARIANT_STYLES = {\n default: 'text-gray-700',\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-orange-700',\n};\n\nexport const StatusPanel: React.FC<StatusPanelProps> = ({\n description,\n currentStep,\n totalSteps,\n variant = 'default',\n}) => {\n return (\n <div className=\"p-3 bg-gray-50 rounded-lg\">\n <div className={`text-sm font-medium ${VARIANT_STYLES[variant]}`}>\n {description}\n </div>\n <div className=\"mt-1 text-xs text-gray-400\">\n Step {currentStep + 1} / {totalSteps}\n </div>\n </div>\n );\n};\n\nexport default StatusPanel;\n","import React, { useState, useCallback } from 'react';\nimport { Edit2, Check, X } from 'lucide-react';\n\nexport interface ArrayInputProps {\n array: number[];\n onArrayChange: (newArray: number[]) => void;\n disabled?: boolean;\n maxSize?: number;\n minSize?: number;\n maxValue?: number;\n minValue?: number;\n accentColor?: 'indigo' | 'orange' | 'green' | 'purple' | 'blue' | 'cyan' | 'red' | 'lime' | 'teal' | 'violet';\n}\n\nconst ACCENT_COLORS = {\n indigo: 'focus:ring-indigo-500 focus:border-indigo-500',\n orange: 'focus:ring-orange-500 focus:border-orange-500',\n green: 'focus:ring-green-500 focus:border-green-500',\n purple: 'focus:ring-purple-500 focus:border-purple-500',\n blue: 'focus:ring-blue-500 focus:border-blue-500',\n cyan: 'focus:ring-cyan-500 focus:border-cyan-500',\n red: 'focus:ring-red-500 focus:border-red-500',\n lime: 'focus:ring-lime-500 focus:border-lime-500',\n teal: 'focus:ring-teal-500 focus:border-teal-500',\n violet: 'focus:ring-violet-500 focus:border-violet-500',\n};\n\nconst ACCENT_BUTTON_COLORS = {\n indigo: 'bg-indigo-600 hover:bg-indigo-700',\n orange: 'bg-orange-600 hover:bg-orange-700',\n green: 'bg-green-600 hover:bg-green-700',\n purple: 'bg-purple-600 hover:bg-purple-700',\n blue: 'bg-blue-600 hover:bg-blue-700',\n cyan: 'bg-cyan-600 hover:bg-cyan-700',\n red: 'bg-red-600 hover:bg-red-700',\n lime: 'bg-lime-600 hover:bg-lime-700',\n teal: 'bg-teal-600 hover:bg-teal-700',\n violet: 'bg-violet-600 hover:bg-violet-700',\n};\n\nexport const ArrayInput: React.FC<ArrayInputProps> = ({\n array,\n onArrayChange,\n disabled = false,\n maxSize = 20,\n minSize = 3,\n maxValue = 100,\n minValue = 1,\n accentColor = 'indigo',\n}) => {\n const [isEditing, setIsEditing] = useState(false);\n const [inputValue, setInputValue] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleStartEdit = useCallback(() => {\n setInputValue(array.join(', '));\n setIsEditing(true);\n setError(null);\n }, [array]);\n\n const handleCancel = useCallback(() => {\n setIsEditing(false);\n setInputValue('');\n setError(null);\n }, []);\n\n const handleConfirm = useCallback(() => {\n const parts = inputValue\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n const numbers: number[] = [];\n for (const part of parts) {\n const num = parseInt(part, 10);\n if (isNaN(num)) {\n setError(`Invalid number: \"${part}\"`);\n return;\n }\n if (num < minValue || num > maxValue) {\n setError(`Numbers must be between ${minValue} and ${maxValue}`);\n return;\n }\n numbers.push(num);\n }\n\n if (numbers.length < minSize) {\n setError(`At least ${minSize} numbers required`);\n return;\n }\n\n if (numbers.length > maxSize) {\n setError(`Maximum ${maxSize} numbers allowed`);\n return;\n }\n\n onArrayChange(numbers);\n setIsEditing(false);\n setInputValue('');\n setError(null);\n }, [inputValue, onArrayChange, minSize, maxSize, minValue, maxValue]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleConfirm();\n } else if (e.key === 'Escape') {\n handleCancel();\n }\n },\n [handleConfirm, handleCancel]\n );\n\n if (disabled) {\n return null;\n }\n\n if (isEditing) {\n return (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-1\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"e.g., 5, 3, 8, 1, 9\"\n className={`px-2 py-1 text-xs border border-gray-300 rounded w-40 ${ACCENT_COLORS[accentColor]}`}\n autoFocus\n />\n <button\n onClick={handleConfirm}\n className={`p-1 text-white rounded transition-colors ${ACCENT_BUTTON_COLORS[accentColor]}`}\n title=\"Apply (Enter)\"\n >\n <Check className=\"w-3 h-3\" />\n </button>\n <button\n onClick={handleCancel}\n className=\"p-1 bg-gray-200 text-gray-700 rounded hover:bg-gray-300 transition-colors\"\n title=\"Cancel (Esc)\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n {error && (\n <span className=\"text-[10px] text-red-500 mt-0.5\">{error}</span>\n )}\n </div>\n </div>\n );\n }\n\n return (\n <button\n onClick={handleStartEdit}\n className=\"flex items-center gap-1 px-2 py-1 text-xs text-gray-600 bg-gray-100 rounded hover:bg-gray-200 transition-colors\"\n title=\"Edit array values\"\n >\n <Edit2 className=\"w-3 h-3\" />\n <span>Custom</span>\n </button>\n );\n};\n\nexport default ArrayInput;\n","import React, { useRef, useEffect } from 'react';\nimport { History, ChevronRight, ChevronDown } from 'lucide-react';\n\nexport interface Step {\n description: string;\n comparisons?: number;\n swaps?: number;\n}\n\nexport interface StepHistoryProps {\n steps: Step[];\n currentStep: number;\n onStepClick: (stepIndex: number) => void;\n maxHeight?: string;\n showStats?: boolean;\n accentColor?: 'indigo' | 'orange' | 'green' | 'purple' | 'blue' | 'cyan' | 'red' | 'lime' | 'teal' | 'violet';\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n}\n\nconst ACCENT_COLORS = {\n indigo: {\n active: 'bg-indigo-100 border-indigo-500 text-indigo-900',\n hover: 'hover:bg-indigo-50',\n dot: 'bg-indigo-500',\n },\n orange: {\n active: 'bg-orange-100 border-orange-500 text-orange-900',\n hover: 'hover:bg-orange-50',\n dot: 'bg-orange-500',\n },\n green: {\n active: 'bg-green-100 border-green-500 text-green-900',\n hover: 'hover:bg-green-50',\n dot: 'bg-green-500',\n },\n purple: {\n active: 'bg-purple-100 border-purple-500 text-purple-900',\n hover: 'hover:bg-purple-50',\n dot: 'bg-purple-500',\n },\n blue: {\n active: 'bg-blue-100 border-blue-500 text-blue-900',\n hover: 'hover:bg-blue-50',\n dot: 'bg-blue-500',\n },\n cyan: {\n active: 'bg-cyan-100 border-cyan-500 text-cyan-900',\n hover: 'hover:bg-cyan-50',\n dot: 'bg-cyan-500',\n },\n red: {\n active: 'bg-red-100 border-red-500 text-red-900',\n hover: 'hover:bg-red-50',\n dot: 'bg-red-500',\n },\n lime: {\n active: 'bg-lime-100 border-lime-500 text-lime-900',\n hover: 'hover:bg-lime-50',\n dot: 'bg-lime-500',\n },\n teal: {\n active: 'bg-teal-100 border-teal-500 text-teal-900',\n hover: 'hover:bg-teal-50',\n dot: 'bg-teal-500',\n },\n violet: {\n active: 'bg-violet-100 border-violet-500 text-violet-900',\n hover: 'hover:bg-violet-50',\n dot: 'bg-violet-500',\n },\n};\n\nexport const StepHistory: React.FC<StepHistoryProps> = ({\n steps,\n currentStep,\n onStepClick,\n maxHeight = '300px',\n showStats = false,\n accentColor = 'indigo',\n collapsed = false,\n onToggleCollapse,\n}) => {\n const colors = ACCENT_COLORS[accentColor];\n const listRef = useRef<HTMLDivElement>(null);\n const activeItemRef = useRef<HTMLButtonElement>(null);\n\n // Auto-scroll to current step\n useEffect(() => {\n if (activeItemRef.current && listRef.current) {\n const container = listRef.current;\n const item = activeItemRef.current;\n const containerRect = container.getBoundingClientRect();\n const itemRect = item.getBoundingClientRect();\n\n if (itemRect.top < containerRect.top || itemRect.bottom > containerRect.bottom) {\n item.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [currentStep]);\n\n if (collapsed) {\n return (\n <button\n onClick={onToggleCollapse}\n className=\"flex items-center gap-2 px-3 py-2 text-xs text-gray-600 bg-gray-100 rounded-lg hover:bg-gray-200 transition-colors\"\n title=\"Show step history\"\n >\n <History className=\"w-4 h-4\" />\n <span>History ({steps.length})</span>\n <ChevronRight className=\"w-3 h-3\" />\n </button>\n );\n }\n\n return (\n <div className=\"bg-white border border-gray-200 rounded-lg overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-3 py-2 bg-gray-50 border-b border-gray-200\">\n <div className=\"flex items-center gap-2\">\n <History className=\"w-4 h-4 text-gray-500\" />\n <span className=\"text-xs font-medium text-gray-700\">\n Step History\n </span>\n <span className=\"px-1.5 py-0.5 text-[10px] bg-gray-200 text-gray-600 rounded\">\n {currentStep + 1}/{steps.length}\n </span>\n </div>\n {onToggleCollapse && (\n <button\n onClick={onToggleCollapse}\n className=\"p-1 text-gray-400 hover:text-gray-600 transition-colors\"\n title=\"Collapse history\"\n >\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n )}\n </div>\n\n {/* Step List */}\n <div\n ref={listRef}\n className=\"overflow-y-auto\"\n style={{ maxHeight }}\n >\n <div className=\"divide-y divide-gray-100\">\n {steps.map((step, index) => {\n const isActive = index === currentStep;\n const isPast = index < currentStep;\n\n return (\n <button\n key={index}\n ref={isActive ? activeItemRef : null}\n onClick={() => onStepClick(index)}\n className={`w-full flex items-start gap-2 px-3 py-2 text-left transition-colors border-l-2 ${\n isActive\n ? `${colors.active} border-l-2`\n : isPast\n ? `text-gray-500 border-transparent ${colors.hover}`\n : `text-gray-700 border-transparent ${colors.hover}`\n }`}\n >\n {/* Step Number */}\n <div className=\"flex-shrink-0 mt-0.5\">\n <span\n className={`inline-flex items-center justify-center w-5 h-5 text-[10px] font-medium rounded-full ${\n isActive\n ? `${colors.dot} text-white`\n : isPast\n ? 'bg-gray-300 text-gray-600'\n : 'bg-gray-200 text-gray-600'\n }`}\n >\n {index + 1}\n </span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <p\n className={`text-[11px] leading-tight truncate ${\n isActive ? 'font-medium' : ''\n }`}\n title={step.description}\n >\n {step.description}\n </p>\n {showStats && step.comparisons !== undefined && (\n <div className=\"flex gap-2 mt-0.5 text-[9px] text-gray-400\">\n <span>C: {step.comparisons}</span>\n <span>S: {step.swaps ?? 0}</span>\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n\nexport default StepHistory;\n","import React, { useState, useCallback } from 'react';\nimport { Share2, Check, Copy, X } from 'lucide-react';\n\nexport interface ShareButtonProps {\n onShare: () => Promise<boolean>;\n className?: string;\n accentColor?: 'indigo' | 'orange' | 'green' | 'purple' | 'blue' | 'cyan' | 'red' | 'lime' | 'teal' | 'violet';\n}\n\nconst ACCENT_COLORS = {\n indigo: 'hover:bg-indigo-100 text-indigo-600',\n orange: 'hover:bg-orange-100 text-orange-600',\n green: 'hover:bg-green-100 text-green-600',\n purple: 'hover:bg-purple-100 text-purple-600',\n blue: 'hover:bg-blue-100 text-blue-600',\n cyan: 'hover:bg-cyan-100 text-cyan-600',\n red: 'hover:bg-red-100 text-red-600',\n lime: 'hover:bg-lime-100 text-lime-600',\n teal: 'hover:bg-teal-100 text-teal-600',\n violet: 'hover:bg-violet-100 text-violet-600',\n};\n\ntype ShareState = 'idle' | 'copying' | 'success' | 'error';\n\nexport const ShareButton: React.FC<ShareButtonProps> = ({\n onShare,\n className = '',\n accentColor = 'indigo',\n}) => {\n const [state, setState] = useState<ShareState>('idle');\n\n const handleClick = useCallback(async () => {\n if (state !== 'idle') return;\n\n setState('copying');\n try {\n const success = await onShare();\n setState(success ? 'success' : 'error');\n } catch {\n setState('error');\n }\n\n setTimeout(() => setState('idle'), 2000);\n }, [onShare, state]);\n\n const getIcon = () => {\n switch (state) {\n case 'copying':\n return <Copy className=\"w-4 h-4 animate-pulse\" />;\n case 'success':\n return <Check className=\"w-4 h-4 text-green-500\" />;\n case 'error':\n return <X className=\"w-4 h-4 text-red-500\" />;\n default:\n return <Share2 className=\"w-4 h-4\" />;\n }\n };\n\n const getTitle = () => {\n switch (state) {\n case 'copying':\n return 'Copying...';\n case 'success':\n return 'URL copied!';\n case 'error':\n return 'Copy failed';\n default:\n return 'Share URL';\n }\n };\n\n return (\n <button\n onClick={handleClick}\n disabled={state !== 'idle'}\n className={`p-1.5 rounded transition-colors ${ACCENT_COLORS[accentColor]} disabled:opacity-50 ${className}`}\n title={getTitle()}\n >\n {getIcon()}\n </button>\n );\n};\n\nexport default ShareButton;\n","import React from 'react';\n\nexport interface VisualizationAreaProps {\n children: React.ReactNode;\n minHeight?: number;\n className?: string;\n}\n\n/**\n * Container for visualization content with fixed minimum height\n * to prevent layout shifts during animation steps.\n */\nexport const VisualizationArea: React.FC<VisualizationAreaProps> = ({\n children,\n minHeight = 300,\n className = '',\n}) => {\n return (\n <div\n className={`relative ${className}`}\n style={{ minHeight: `${minHeight}px` }}\n >\n {children}\n </div>\n );\n};\n\nexport default VisualizationArea;\n","import { useState, useEffect, useCallback, useRef } from 'react';\n\nexport interface UseVisualizerPlaybackOptions<T> {\n generateSteps: () => T[];\n onReset?: () => void;\n}\n\nexport interface UseVisualizerPlaybackReturn<T> {\n steps: T[];\n currentStep: number;\n currentStepData: T | undefined;\n isPlaying: boolean;\n speed: number;\n setSpeed: (speed: number) => void;\n handlePlayPause: () => void;\n handleStep: () => void;\n handleStepBack: () => void;\n handleReset: () => void;\n reinitialize: () => void;\n}\n\nexport function useVisualizerPlayback<T>({\n generateSteps,\n onReset,\n}: UseVisualizerPlaybackOptions<T>): UseVisualizerPlaybackReturn<T> {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<T[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [generateSteps]);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n // Animation loop\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying((prev) => !prev);\n playingRef.current = !playingRef.current;\n }, [currentStep, steps.length]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n onReset?.();\n }, [onReset]);\n\n const reinitialize = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n initialize();\n }, [initialize]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't intercept when typing in inputs\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, handleReset, isPlaying]);\n\n return {\n steps,\n currentStep,\n currentStepData: steps[currentStep],\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n reinitialize,\n };\n}\n\nexport default useVisualizerPlayback;\n","import { useState, useEffect, useCallback } from 'react';\n\nexport interface VisualizerState {\n array?: number[];\n algorithm?: string;\n step?: number;\n speed?: number;\n}\n\nexport interface UseUrlStateOptions {\n prefix?: string;\n enabled?: boolean;\n scrollToId?: string;\n}\n\nexport interface UseUrlStateReturn {\n state: VisualizerState | null;\n updateUrl: (state: VisualizerState) => void;\n getShareableUrl: (state: VisualizerState) => string;\n copyUrlToClipboard: (state: VisualizerState) => Promise<boolean>;\n clearUrlState: () => void;\n}\n\nfunction encodeState(state: VisualizerState): string {\n const parts: string[] = [];\n\n if (state.array && state.array.length > 0) {\n parts.push(`a=${state.array.join(',')}`);\n }\n if (state.algorithm) {\n parts.push(`alg=${state.algorithm}`);\n }\n if (state.step !== undefined) {\n parts.push(`s=${state.step}`);\n }\n if (state.speed !== undefined) {\n parts.push(`sp=${state.speed}`);\n }\n\n return parts.join('&');\n}\n\nfunction decodeState(hash: string): VisualizerState | null {\n if (!hash || hash === '#') return null;\n\n const params = new URLSearchParams(hash.startsWith('#') ? hash.slice(1) : hash);\n const state: VisualizerState = {};\n\n const arrayStr = params.get('a');\n if (arrayStr) {\n const numbers = arrayStr.split(',').map((n) => parseInt(n, 10)).filter((n) => !isNaN(n));\n if (numbers.length > 0) {\n state.array = numbers;\n }\n }\n\n const algorithm = params.get('alg');\n if (algorithm) {\n state.algorithm = algorithm;\n }\n\n const step = params.get('s');\n if (step) {\n const stepNum = parseInt(step, 10);\n if (!isNaN(stepNum)) {\n state.step = stepNum;\n }\n }\n\n const speed = params.get('sp');\n if (speed) {\n const speedNum = parseInt(speed, 10);\n if (!isNaN(speedNum)) {\n state.speed = speedNum;\n }\n }\n\n return Object.keys(state).length > 0 ? state : null;\n}\n\nexport function useUrlState(options: UseUrlStateOptions = {}): UseUrlStateReturn {\n const { prefix = '', enabled = true, scrollToId } = options;\n const [state, setState] = useState<VisualizerState | null>(null);\n\n // Read initial state from URL on mount and scroll to visualizer if needed\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n\n const hash = window.location.hash;\n const decoded = decodeState(hash);\n if (decoded) {\n setState(decoded);\n // Scroll to visualizer after a short delay to ensure component is rendered\n if (scrollToId) {\n setTimeout(() => {\n const element = document.getElementById(scrollToId);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, 100);\n }\n }\n }, [enabled, scrollToId]);\n\n // Update URL with current state\n const updateUrl = useCallback(\n (newState: VisualizerState) => {\n if (!enabled || typeof window === 'undefined') return;\n\n const encoded = encodeState(newState);\n const newHash = prefix ? `${prefix}-${encoded}` : encoded;\n\n // Use replaceState to avoid polluting history\n window.history.replaceState(null, '', `#${newHash}`);\n },\n [enabled, prefix]\n );\n\n // Get shareable URL without modifying current URL\n const getShareableUrl = useCallback(\n (shareState: VisualizerState): string => {\n if (typeof window === 'undefined') return '';\n\n const encoded = encodeState(shareState);\n const hash = prefix ? `${prefix}-${encoded}` : encoded;\n const url = new URL(window.location.href);\n url.hash = hash;\n return url.toString();\n },\n [prefix]\n );\n\n // Copy shareable URL to clipboard\n const copyUrlToClipboard = useCallback(\n async (shareState: VisualizerState): Promise<boolean> => {\n const url = getShareableUrl(shareState);\n\n if (navigator.clipboard && navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(url);\n return true;\n } catch {\n return false;\n }\n }\n\n // Fallback for older browsers\n try {\n const textArea = document.createElement('textarea');\n textArea.value = url;\n textArea.style.position = 'fixed';\n textArea.style.left = '-999999px';\n textArea.style.top = '-999999px';\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n const success = document.execCommand('copy');\n document.body.removeChild(textArea);\n return success;\n } catch {\n return false;\n }\n },\n [getShareableUrl]\n );\n\n // Clear URL state\n const clearUrlState = useCallback(() => {\n if (typeof window === 'undefined') return;\n\n window.history.replaceState(null, '', window.location.pathname + window.location.search);\n setState(null);\n }, []);\n\n return {\n state,\n updateUrl,\n getShareableUrl,\n copyUrlToClipboard,\n clearUrlState,\n };\n}\n\nexport default useUrlState;\n","/**\n * Shared constants for sorting algorithm visualizers.\n * Centralizes algorithm metadata to avoid duplication.\n */\n\nexport type SortingAlgorithm =\n | 'bubble'\n | 'selection'\n | 'insertion'\n | 'quick'\n | 'merge';\n\nexport const ALGORITHM_NAMES: Record<SortingAlgorithm, string> = {\n bubble: 'Bubble Sort',\n selection: 'Selection Sort',\n insertion: 'Insertion Sort',\n quick: 'QuickSort',\n merge: 'MergeSort',\n};\n\nexport const ALGORITHM_COMPLEXITIES: Record<\n SortingAlgorithm,\n { time: string; space: string }\n> = {\n bubble: { time: 'O(n²)', space: 'O(1)' },\n selection: { time: 'O(n²)', space: 'O(1)' },\n insertion: { time: 'O(n²)', space: 'O(1)' },\n quick: { time: 'O(n log n)', space: 'O(log n)' },\n merge: { time: 'O(n log n)', space: 'O(n)' },\n};\n\nexport const ALGORITHM_CODE: Record<SortingAlgorithm, string[]> = {\n bubble: [\n 'for (i = 0; i < n-1; i++)',\n ' for (j = 0; j < n-i-1; j++)',\n ' if (arr[j] > arr[j+1])',\n ' swap(arr[j], arr[j+1])',\n ],\n selection: [\n 'for (i = 0; i < n-1; i++)',\n ' minIdx = i',\n ' for (j = i+1; j < n; j++)',\n ' if (arr[j] < arr[minIdx])',\n ' minIdx = j',\n ' swap(arr[i], arr[minIdx])',\n ],\n insertion: [\n 'for (i = 1; i < n; i++)',\n ' key = arr[i]',\n ' j = i - 1',\n ' while (j >= 0 && arr[j] > key)',\n ' arr[j+1] = arr[j]',\n ' j--',\n ' arr[j+1] = key',\n ],\n quick: [\n 'quickSort(arr, low, high)',\n ' if (low < high)',\n ' pi = partition(arr, low, high)',\n ' quickSort(arr, low, pi-1)',\n ' quickSort(arr, pi+1, high)',\n ],\n merge: [\n 'mergeSort(arr, l, r)',\n ' if (l < r)',\n ' m = (l + r) / 2',\n ' mergeSort(arr, l, m)',\n ' mergeSort(arr, m+1, r)',\n ' merge(arr, l, m, r)',\n ],\n};\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Search } from 'lucide-react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface SearchStep {\n left: number;\n right: number;\n mid: number;\n comparison: 'less' | 'greater' | 'equal' | null;\n description: string;\n found?: boolean;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface BinarySearchVisualizerProps {\n initialSize?: number;\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\n// Algorithm code snippets\nconst BINARY_SEARCH_CODE = [\n 'binarySearch(arr, target):',\n ' left = 0, right = n - 1',\n ' while left <= right:',\n ' mid = (left + right) / 2',\n ' if arr[mid] == target:',\n ' return mid // Found!',\n ' elif arr[mid] < target:',\n ' left = mid + 1',\n ' else:',\n ' right = mid - 1',\n ' return -1 // Not found',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-100', label: 'Search Space' },\n { color: 'bg-gray-200', label: 'Eliminated' },\n { color: 'bg-purple-500', label: 'Mid' },\n { color: 'bg-green-500', label: 'Found' },\n];\n\nfunction generateSortedArray(size: number): number[] {\n const arr: number[] = [];\n let current = Math.floor(Math.random() * 5) + 1;\n for (let i = 0; i < size; i++) {\n arr.push(current);\n current += Math.floor(Math.random() * 5) + 1;\n }\n return arr;\n}\n\nfunction generateSearchSteps(arr: number[], target: number): SearchStep[] {\n const steps: SearchStep[] = [];\n let left = 0;\n let right = arr.length - 1;\n\n steps.push({\n left,\n right,\n mid: -1,\n comparison: null,\n description: `Initialize: searching for ${target} in sorted array [${arr[0]}...${arr[arr.length - 1]}]`,\n codeLine: 1,\n variables: { target, left, right, n: arr.length },\n });\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n\n steps.push({\n left,\n right,\n mid,\n comparison: null,\n description: `Calculate mid = (${left} + ${right}) / 2 = ${mid}. Check arr[${mid}] = ${arr[mid]}`,\n codeLine: 3,\n variables: { left, right, mid, 'arr[mid]': arr[mid], target },\n });\n\n if (arr[mid] === target) {\n steps.push({\n left,\n right,\n mid,\n comparison: 'equal',\n description: `✓ Found! arr[${mid}] = ${arr[mid]} equals target ${target}`,\n found: true,\n codeLine: 5,\n variables: { mid, 'arr[mid]': arr[mid], target },\n });\n return steps;\n } else if (arr[mid] < target) {\n steps.push({\n left,\n right,\n mid,\n comparison: 'less',\n description: `arr[${mid}] = ${arr[mid]} < ${target} → search right half, set left = ${mid + 1}`,\n codeLine: 7,\n variables: { 'arr[mid]': arr[mid], target, 'new left': mid + 1 },\n });\n left = mid + 1;\n } else {\n steps.push({\n left,\n right,\n mid,\n comparison: 'greater',\n description: `arr[${mid}] = ${arr[mid]} > ${target} → search left half, set right = ${mid - 1}`,\n codeLine: 9,\n variables: { 'arr[mid]': arr[mid], target, 'new right': mid - 1 },\n });\n right = mid - 1;\n }\n }\n\n steps.push({\n left,\n right,\n mid: -1,\n comparison: null,\n description: `✗ Not found! ${target} is not in the array (left > right)`,\n found: false,\n codeLine: 10,\n variables: { left, right, target },\n });\n\n return steps;\n}\n\nconst BinarySearchVisualizerComponent: React.FC<\n BinarySearchVisualizerProps\n> = ({\n initialSize = 12,\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [arraySize] = useState(initialSize);\n const [array, setArray] = useState<number[]>([]);\n const [, setTarget] = useState<number>(0);\n const [targetInput, setTargetInput] = useState<string>('');\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<SearchStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Initialize array\n const initializeArray = useCallback(() => {\n const newArray = generateSortedArray(arraySize);\n setArray(newArray);\n // Pick a random target - 70% chance it exists in array\n const existsInArray = Math.random() < 0.7;\n const newTarget = existsInArray\n ? newArray[Math.floor(Math.random() * newArray.length)]\n : newArray[Math.floor(newArray.length / 2)] + 1;\n setTarget(newTarget);\n setTargetInput(String(newTarget));\n const newSteps = generateSearchSteps(newArray, newTarget);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [arraySize]);\n\n useEffect(() => {\n initializeArray();\n }, [initializeArray]);\n\n // Animation loop\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const handleNewSearch = () => {\n const newTarget = parseInt(targetInput, 10);\n if (!isNaN(newTarget)) {\n setTarget(newTarget);\n const newSteps = generateSearchSteps(array, newTarget);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }\n };\n\n const handleShuffle = () => {\n initializeArray();\n };\n\n const currentStepData = steps[currentStep] || {\n left: 0,\n right: array.length - 1,\n mid: -1,\n };\n const { left, right, mid, found } = currentStepData;\n\n const getElementStyle = (index: number): string => {\n if (found === true && index === mid) {\n return 'bg-green-500 text-white scale-110';\n }\n if (index === mid) {\n return 'bg-purple-500 text-white';\n }\n if (index < left || index > right) {\n return 'bg-gray-200 text-gray-400';\n }\n if (index === left || index === right) {\n return 'bg-blue-400 text-white';\n }\n return 'bg-blue-100 text-blue-800';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n const getStatusVariant = () => {\n if (found === true) return 'success' as const;\n if (found === false) return 'error' as const;\n return 'default' as const;\n };\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-green-50 to-emerald-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">Binary Search</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\">\n Time: O(log n)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-700 rounded\">\n Space: O(1)\n </span>\n </div>\n </div>\n\n {/* Target Input */}\n <div className=\"flex items-center gap-2\">\n <label className=\"text-sm font-medium text-gray-700\">Target:</label>\n <input\n type=\"number\"\n value={targetInput}\n onChange={(e) => setTargetInput(e.target.value)}\n className=\"w-20 px-2 py-1 text-sm font-semibold text-gray-900 border border-gray-300 rounded-md focus:ring-2 focus:ring-green-500 focus:border-green-500\"\n disabled={isPlaying}\n />\n <button\n onClick={handleNewSearch}\n disabled={isPlaying}\n className=\"p-1.5 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors disabled:opacity-50\"\n title=\"Search\"\n >\n <Search className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Array Display */}\n <div className=\"flex items-center justify-center gap-1 flex-wrap mb-4\">\n {array.map((value, index) => (\n <div key={index} className=\"flex flex-col items-center\">\n <div\n className={`w-10 h-10 flex items-center justify-center rounded-lg font-medium text-sm transition-all duration-300 ${getElementStyle(index)}`}\n >\n {value}\n </div>\n <span className=\"text-[10px] text-gray-400 mt-1\">\n {index}\n </span>\n </div>\n ))}\n </div>\n\n {/* Pointers Legend */}\n <div className=\"flex items-center justify-center gap-6 mb-4 text-sm\">\n {left <= right && (\n <>\n <div className=\"flex items-center gap-1\">\n <div className=\"w-3 h-3 bg-blue-400 rounded\" />\n <span className=\"text-gray-600\">L={left}</span>\n </div>\n {mid >= 0 && (\n <div className=\"flex items-center gap-1\">\n <div className=\"w-3 h-3 bg-purple-500 rounded\" />\n <span className=\"text-gray-600\">M={mid}</span>\n </div>\n )}\n <div className=\"flex items-center gap-1\">\n <div className=\"w-3 h-3 bg-blue-400 rounded\" />\n <span className=\"text-gray-600\">R={right}</span>\n </div>\n </>\n )}\n </div>\n\n {/* Status */}\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={BINARY_SEARCH_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n onShuffle={handleShuffle}\n showShuffle={true}\n shuffleLabel=\"New Array\"\n accentColor=\"green\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const BinarySearchVisualizer = React.memo(\n BinarySearchVisualizerComponent\n);\nexport default BinarySearchVisualizer;\n","import React, { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ArrayInput,\n StepHistory,\n ShareButton,\n useUrlState,\n VisualizationArea,\n ALGORITHM_NAMES,\n ALGORITHM_COMPLEXITIES,\n} from '../shared';\nimport type { SortingAlgorithm } from '../shared';\n\ninterface ArrayBar {\n value: number;\n state: 'default' | 'comparing' | 'swapping' | 'sorted' | 'pivot';\n}\n\ninterface SortingStep {\n array: number[];\n comparing?: [number, number];\n swapping?: [number, number];\n sorted?: number[];\n pivot?: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n comparisons: number;\n swaps: number;\n}\n\ninterface SortingVisualizerProps {\n algorithm?: SortingAlgorithm;\n initialSize?: number;\n showControls?: boolean;\n showAlgorithmSelector?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\n// Extended code with detailed comments - kept local as it differs from shared version\nconst ALGORITHM_CODE: Record<SortingAlgorithm, string[]> = {\n bubble: [\n 'for (i = 0; i < n-1; i++)',\n ' for (j = 0; j < n-i-1; j++)',\n ' if (arr[j] > arr[j+1])',\n ' swap(arr[j], arr[j+1])',\n ],\n selection: [\n 'for (i = 0; i < n-1; i++)',\n ' minIdx = i',\n ' for (j = i+1; j < n; j++)',\n ' if (arr[j] < arr[minIdx])',\n ' minIdx = j',\n ' swap(arr[i], arr[minIdx])',\n ],\n insertion: [\n 'for (i = 1; i < n; i++)',\n ' key = arr[i]',\n ' j = i - 1',\n ' while (j >= 0 && arr[j] > key)',\n ' arr[j+1] = arr[j]',\n ' j--',\n ' arr[j+1] = key',\n ],\n quick: [\n 'quickSort(arr, low, high):',\n ' if (low < high)',\n ' pivot = partition(arr, low, high)',\n ' quickSort(arr, low, pivot-1)',\n ' quickSort(arr, pivot+1, high)',\n '',\n 'partition(arr, low, high):',\n ' pivot = arr[high]',\n ' i = low - 1',\n ' for (j = low; j < high; j++)',\n ' if (arr[j] <= pivot)',\n ' i++; swap(arr[i], arr[j])',\n ' swap(arr[i+1], arr[high])',\n ' return i + 1',\n ],\n merge: [\n 'mergeSort(arr, l, r):',\n ' if (l < r)',\n ' mid = (l + r) / 2',\n ' mergeSort(arr, l, mid)',\n ' mergeSort(arr, mid+1, r)',\n ' merge(arr, l, mid, r)',\n '',\n 'merge(arr, l, mid, r):',\n ' // merge left and right subarrays',\n ' while (i < left.len && j < right.len)',\n ' if (left[i] <= right[j])',\n ' arr[k++] = left[i++]',\n ' else arr[k++] = right[j++]',\n ],\n};\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'Default' },\n { color: 'bg-yellow-400', label: 'Comparing' },\n { color: 'bg-red-500', label: 'Swapping' },\n { color: 'bg-purple-500', label: 'Pivot' },\n { color: 'bg-green-500', label: 'Sorted' },\n];\n\n// Generate sorting steps for each algorithm\nfunction generateBubbleSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({\n array: [...array],\n description:\n 'Starting Bubble Sort - will compare adjacent elements and swap if needed',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n for (let i = 0; i < n - 1; i++) {\n steps.push({\n array: [...array],\n sorted: [...sorted],\n description: `Pass ${i + 1}: Bubbling largest unsorted element to position ${n - 1 - i}`,\n codeLine: 0,\n variables: { i, n: n - 1 },\n comparisons,\n swaps,\n });\n\n for (let j = 0; j < n - i - 1; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, j + 1],\n sorted: [...sorted],\n description: `Comparing arr[${j}]=${array[j]} with arr[${j + 1}]=${array[j + 1]}`,\n codeLine: 2,\n variables: { i, j, 'arr[j]': array[j], 'arr[j+1]': array[j + 1] },\n comparisons,\n swaps,\n });\n\n if (array[j] > array[j + 1]) {\n swaps++;\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: [...sorted],\n description: `${array[j]} > ${array[j + 1]} → Swapping!`,\n codeLine: 3,\n variables: { i, j, 'arr[j]': array[j], 'arr[j+1]': array[j + 1] },\n comparisons,\n swaps,\n });\n [array[j], array[j + 1]] = [array[j + 1], array[j]];\n } else {\n steps.push({\n array: [...array],\n comparing: [j, j + 1],\n sorted: [...sorted],\n description: `${array[j]} ≤ ${array[j + 1]} → No swap needed`,\n codeLine: 2,\n variables: { i, j, 'arr[j]': array[j], 'arr[j+1]': array[j + 1] },\n comparisons,\n swaps,\n });\n }\n }\n sorted.unshift(n - 1 - i);\n }\n sorted.unshift(0);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateSelectionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({\n array: [...array],\n description:\n 'Starting Selection Sort - will find minimum and place it at the beginning',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n for (let i = 0; i < n - 1; i++) {\n let minIdx = i;\n\n steps.push({\n array: [...array],\n sorted: [...sorted],\n description: `Finding minimum in unsorted portion [${i}..${n - 1}]`,\n codeLine: 0,\n variables: { i, minIdx },\n comparisons,\n swaps,\n });\n\n for (let j = i + 1; j < n; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [minIdx, j],\n sorted: [...sorted],\n description: `Comparing current min arr[${minIdx}]=${array[minIdx]} with arr[${j}]=${array[j]}`,\n codeLine: 3,\n variables: {\n i,\n j,\n minIdx,\n 'arr[minIdx]': array[minIdx],\n 'arr[j]': array[j],\n },\n comparisons,\n swaps,\n });\n\n if (array[j] < array[minIdx]) {\n minIdx = j;\n steps.push({\n array: [...array],\n comparing: [minIdx, j],\n sorted: [...sorted],\n description: `Found new minimum: ${array[minIdx]} at index ${minIdx}`,\n codeLine: 4,\n variables: { i, j, minIdx, 'new min': array[minIdx] },\n comparisons,\n swaps,\n });\n }\n }\n\n if (minIdx !== i) {\n swaps++;\n steps.push({\n array: [...array],\n swapping: [i, minIdx],\n sorted: [...sorted],\n description: `Placing minimum ${array[minIdx]} at position ${i} (swapping with ${array[i]})`,\n codeLine: 5,\n variables: {\n i,\n minIdx,\n 'arr[i]': array[i],\n 'arr[minIdx]': array[minIdx],\n },\n comparisons,\n swaps,\n });\n [array[i], array[minIdx]] = [array[minIdx], array[i]];\n }\n\n sorted.push(i);\n }\n sorted.push(n - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateInsertionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({\n array: [...array],\n sorted: [0],\n description: 'Starting Insertion Sort - first element is already \"sorted\"',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n for (let i = 1; i < n; i++) {\n const key = array[i];\n let j = i - 1;\n\n steps.push({\n array: [...array],\n comparing: [i, j],\n sorted: Array.from({ length: i }, (_, idx) => idx),\n description: `Taking key=${key} from index ${i}, will insert into sorted portion [0..${i - 1}]`,\n codeLine: 1,\n variables: { i, key, j },\n comparisons,\n swaps,\n });\n\n while (j >= 0 && array[j] > key) {\n comparisons++;\n swaps++;\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: Array.from({ length: i }, (_, idx) => idx),\n description: `arr[${j}]=${array[j]} > key=${key} → Shifting ${array[j]} right`,\n codeLine: 4,\n variables: { i, key, j, 'arr[j]': array[j] },\n comparisons,\n swaps,\n });\n array[j + 1] = array[j];\n j--;\n }\n if (j >= 0) comparisons++; // Final comparison that exits the while\n\n array[j + 1] = key;\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: i + 1 }, (_, idx) => idx),\n description: `Inserted key=${key} at position ${j + 1}`,\n codeLine: 6,\n variables: { i, key, position: j + 1 },\n comparisons,\n swaps,\n });\n }\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateQuickSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const sorted: Set<number> = new Set();\n const stats = { comparisons: 0, swaps: 0 };\n\n steps.push({\n array: [...array],\n description: 'Starting QuickSort - will pick pivot and partition array',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n function quickSort(low: number, high: number) {\n if (low < high) {\n const pivotIdx = partition(low, high);\n sorted.add(pivotIdx);\n quickSort(low, pivotIdx - 1);\n quickSort(pivotIdx + 1, high);\n } else if (low === high) {\n sorted.add(low);\n }\n }\n\n function partition(low: number, high: number): number {\n const pivot = array[high];\n\n steps.push({\n array: [...array],\n pivot: high,\n sorted: [...sorted],\n description: `Partitioning [${low}..${high}]: pivot=${pivot} (rightmost element)`,\n codeLine: 7,\n variables: { low, high, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n let i = low - 1;\n\n for (let j = low; j < high; j++) {\n stats.comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, high],\n pivot: high,\n sorted: [...sorted],\n description: `Comparing arr[${j}]=${array[j]} with pivot=${pivot}`,\n codeLine: 10,\n variables: { i, j, pivot, 'arr[j]': array[j] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n if (array[j] <= pivot) {\n i++;\n if (i !== j) {\n stats.swaps++;\n steps.push({\n array: [...array],\n swapping: [i, j],\n pivot: high,\n sorted: [...sorted],\n description: `${array[j]} ≤ ${pivot} → Swapping arr[${i}]=${array[i]} with arr[${j}]=${array[j]}`,\n codeLine: 11,\n variables: { i, j, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n [array[i], array[j]] = [array[j], array[i]];\n } else {\n steps.push({\n array: [...array],\n comparing: [j, high],\n pivot: high,\n sorted: [...sorted],\n description: `${array[j]} ≤ ${pivot} → Element already in correct position`,\n codeLine: 11,\n variables: { i, j, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n }\n }\n\n if (i + 1 !== high) {\n stats.swaps++;\n steps.push({\n array: [...array],\n swapping: [i + 1, high],\n sorted: [...sorted],\n description: `Placing pivot ${pivot} at its final position ${i + 1}`,\n codeLine: 12,\n variables: { 'pivot position': i + 1, pivot },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n [array[i + 1], array[high]] = [array[high], array[i + 1]];\n }\n\n return i + 1;\n }\n\n quickSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nfunction generateMergeSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const stats = { comparisons: 0, swaps: 0 }; // swaps = array writes for merge sort\n\n steps.push({\n array: [...array],\n description:\n 'Starting MergeSort - will divide array and merge sorted halves',\n codeLine: -1,\n comparisons: 0,\n swaps: 0,\n });\n\n function mergeSort(start: number, end: number) {\n if (start >= end) return;\n\n const mid = Math.floor((start + end) / 2);\n\n steps.push({\n array: [...array],\n comparing: [start, end],\n description: `Dividing [${start}..${end}] into [${start}..${mid}] and [${mid + 1}..${end}]`,\n codeLine: 2,\n variables: { l: start, r: end, mid },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n mergeSort(start, mid);\n mergeSort(mid + 1, end);\n merge(start, mid, end);\n }\n\n function merge(start: number, mid: number, end: number) {\n const left = array.slice(start, mid + 1);\n const right = array.slice(mid + 1, end + 1);\n\n steps.push({\n array: [...array],\n description: `Merging [${start}..${mid}]=[${left.join(',')}] and [${mid + 1}..${end}]=[${right.join(',')}]`,\n codeLine: 5,\n variables: { l: start, mid, r: end },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n let i = 0,\n j = 0,\n k = start;\n\n while (i < left.length && j < right.length) {\n stats.comparisons++;\n steps.push({\n array: [...array],\n comparing: [start + i, mid + 1 + j],\n description: `Comparing left[${i}]=${left[i]} with right[${j}]=${right[j]}`,\n codeLine: 10,\n variables: { i, j, 'left[i]': left[i], 'right[j]': right[j] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n if (left[i] <= right[j]) {\n array[k] = left[i];\n stats.swaps++;\n steps.push({\n array: [...array],\n description: `${left[i]} ≤ ${right[j]} → Taking ${left[i]} from left`,\n codeLine: 11,\n variables: { k, value: left[i] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n i++;\n } else {\n array[k] = right[j];\n stats.swaps++;\n steps.push({\n array: [...array],\n description: `${left[i]} > ${right[j]} → Taking ${right[j]} from right`,\n codeLine: 12,\n variables: { k, value: right[j] },\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n j++;\n }\n k++;\n }\n\n while (i < left.length) {\n array[k] = left[i];\n stats.swaps++;\n i++;\n k++;\n }\n\n while (j < right.length) {\n array[k] = right[j];\n stats.swaps++;\n j++;\n k++;\n }\n\n steps.push({\n array: [...array],\n description: `Merged result: [${array.slice(start, end + 1).join(', ')}]`,\n codeLine: -1,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n\n mergeSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: '✓ Array sorted! All elements are in correct positions.',\n codeLine: -1,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nconst STEP_GENERATORS: Record<\n SortingAlgorithm,\n (arr: number[]) => SortingStep[]\n> = {\n bubble: generateBubbleSortSteps,\n selection: generateSelectionSortSteps,\n insertion: generateInsertionSortSteps,\n quick: generateQuickSortSteps,\n merge: generateMergeSortSteps,\n};\n\nfunction generateRandomArray(size: number): number[] {\n return Array.from(\n { length: size },\n () => Math.floor(Math.random() * 100) + 5\n );\n}\n\nconst SortingVisualizerComponent: React.FC<SortingVisualizerProps> = ({\n algorithm: initialAlgorithm = 'bubble',\n initialSize = 10,\n showControls = true,\n showAlgorithmSelector = true,\n showCode = true,\n className = '',\n}) => {\n const [algorithm, setAlgorithm] =\n useState<SortingAlgorithm>(initialAlgorithm);\n const [arraySize, setArraySize] = useState(initialSize);\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<SortingStep[]>([]);\n const [bars, setBars] = useState<ArrayBar[]>([]);\n const [customArray, setCustomArray] = useState<number[] | null>(null);\n const [historyCollapsed, setHistoryCollapsed] = useState(true);\n const [urlStateLoaded, setUrlStateLoaded] = useState(false);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const VISUALIZER_ID = 'sorting-visualizer';\n\n // URL state management\n const { state: urlState, copyUrlToClipboard } = useUrlState({ prefix: 'sort', scrollToId: VISUALIZER_ID });\n\n const initializeArray = useCallback((useCustom?: number[]) => {\n const arrayToUse = useCustom ?? customArray ?? generateRandomArray(arraySize);\n const newSteps = STEP_GENERATORS[algorithm](arrayToUse);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [algorithm, arraySize, customArray]);\n\n const handleCustomArrayChange = useCallback((newArray: number[]) => {\n setCustomArray(newArray);\n setArraySize(newArray.length);\n initializeArray(newArray);\n }, [initializeArray]);\n\n // Load from URL state on mount\n useEffect(() => {\n if (urlState && !urlStateLoaded) {\n setUrlStateLoaded(true);\n if (urlState.algorithm && Object.keys(ALGORITHM_NAMES).includes(urlState.algorithm)) {\n setAlgorithm(urlState.algorithm as SortingAlgorithm);\n }\n if (urlState.array && urlState.array.length > 0) {\n setCustomArray(urlState.array);\n setArraySize(urlState.array.length);\n }\n if (urlState.speed !== undefined) {\n setSpeed(urlState.speed);\n }\n }\n }, [urlState, urlStateLoaded]);\n\n useEffect(() => {\n initializeArray();\n }, [initializeArray]);\n\n useEffect(() => {\n if (steps.length === 0) return;\n\n const step = steps[currentStep];\n const newBars: ArrayBar[] = step.array.map((value, index) => {\n let state: ArrayBar['state'] = 'default';\n\n if (step.sorted?.includes(index)) {\n state = 'sorted';\n } else if (step.pivot === index) {\n state = 'pivot';\n } else if (step.swapping?.includes(index)) {\n state = 'swapping';\n } else if (step.comparing?.includes(index)) {\n state = 'comparing';\n }\n\n return { value, state };\n });\n\n setBars(newBars);\n }, [currentStep, steps]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n }, []);\n\n const handleShuffle = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setCustomArray(null); // Reset custom array on shuffle\n const newArray = generateRandomArray(arraySize);\n const newSteps = STEP_GENERATORS[algorithm](newArray);\n setSteps(newSteps);\n setCurrentStep(0);\n }, [algorithm, arraySize]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't intercept when typing in inputs\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, handleReset, isPlaying]);\n\n const getBarColor = (state: ArrayBar['state']): string => {\n switch (state) {\n case 'comparing':\n return 'bg-yellow-400';\n case 'swapping':\n return 'bg-red-500';\n case 'sorted':\n return 'bg-green-500';\n case 'pivot':\n return 'bg-purple-500';\n default:\n return 'bg-blue-500';\n }\n };\n\n const maxValue = Math.max(...bars.map((b) => b.value), 1);\n const currentStepData = steps[currentStep];\n const currentDescription = currentStepData?.description || '';\n const complexity = ALGORITHM_COMPLEXITIES[algorithm];\n\n const currentArray = useMemo(() => {\n if (steps.length === 0) return [];\n return steps[0].array;\n }, [steps]);\n\n const historySteps = useMemo(() => {\n return steps.map((step) => ({\n description: step.description,\n comparisons: step.comparisons,\n swaps: step.swaps,\n }));\n }, [steps]);\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({\n array: currentArray,\n algorithm,\n speed,\n });\n }, [copyUrlToClipboard, currentArray, algorithm, speed]);\n\n const sizeControl = useMemo(\n () => (\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Size</label>\n <input\n type=\"range\"\n min=\"5\"\n max=\"20\"\n value={arraySize}\n onChange={(e) => {\n setCustomArray(null);\n setArraySize(Number(e.target.value));\n }}\n disabled={isPlaying}\n className=\"w-20 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer disabled:opacity-50\"\n />\n <span className=\"text-xs text-gray-500 w-6\">{arraySize}</span>\n </div>\n <ArrayInput\n array={currentArray}\n onArrayChange={handleCustomArrayChange}\n disabled={isPlaying}\n accentColor=\"indigo\"\n />\n </div>\n ),\n [arraySize, isPlaying, currentArray, handleCustomArrayChange]\n );\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-indigo-50 to-blue-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n {ALGORITHM_NAMES[algorithm]}\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Time: {complexity.time}\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Space: {complexity.space}\n </span>\n </div>\n {/* Live operation counters */}\n <div className=\"flex gap-2 ml-2 border-l border-gray-300 pl-3\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-yellow-100 text-yellow-700 rounded\">\n Comparisons: {currentStepData?.comparisons ?? 0}\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-red-100 text-red-700 rounded\">\n {algorithm === 'merge' ? 'Writes' : 'Swaps'}: {currentStepData?.swaps ?? 0}\n </span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {showAlgorithmSelector && (\n <select\n value={algorithm}\n onChange={(e) => setAlgorithm(e.target.value as SortingAlgorithm)}\n className=\"px-3 py-1.5 text-sm font-medium text-gray-900 bg-white border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500\"\n disabled={isPlaying}\n >\n {Object.entries(ALGORITHM_NAMES).map(([key, name]) => (\n <option key={key} value={key}>\n {name}\n </option>\n ))}\n </select>\n )}\n <ShareButton onShare={handleShare} accentColor=\"indigo\" />\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Visualization Area */}\n <VisualizationArea minHeight={300} className={showCode ? 'flex-1' : 'w-full'}>\n <div className=\"flex items-end justify-center gap-1 h-48 bg-gray-50 rounded-lg p-4\">\n {bars.map((bar, index) => (\n <div\n key={index}\n className={`${getBarColor(bar.state)} rounded-t transition-all duration-200 flex items-end justify-center relative group`}\n style={{\n height: `${(bar.value / maxValue) * 100}%`,\n width: `${Math.max(100 / bars.length - 1, 8)}%`,\n minWidth: '12px',\n maxWidth: '50px',\n }}\n >\n {bars.length <= 15 && (\n <span className=\"text-[10px] text-white font-bold mb-1\">\n {bar.value}\n </span>\n )}\n <span className=\"absolute -bottom-5 text-[9px] text-gray-400\">\n {index}\n </span>\n </div>\n ))}\n </div>\n\n {/* Status */}\n <div className=\"mt-6\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={currentDescription.startsWith('✓') ? 'success' : 'default'}\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel & History */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ALGORITHM_CODE[algorithm]}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <StepHistory\n steps={historySteps}\n currentStep={currentStep}\n onStepClick={setCurrentStep}\n maxHeight=\"180px\"\n showStats={true}\n accentColor=\"indigo\"\n collapsed={historyCollapsed}\n onToggleCollapse={() => setHistoryCollapsed(!historyCollapsed)}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n onShuffle={handleShuffle}\n accentColor=\"indigo\"\n showShuffle={true}\n extraControls={sizeControl}\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const SortingVisualizer = React.memo(SortingVisualizerComponent);\nexport default SortingVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Play, Pause, RotateCcw, Shuffle } from 'lucide-react';\nimport {\n VisualizationArea,\n ALGORITHM_NAMES,\n ALGORITHM_COMPLEXITIES,\n} from '../shared';\nimport type { SortingAlgorithm } from '../shared';\n\ninterface SortingStep {\n array: number[];\n comparing?: [number, number];\n swapping?: [number, number];\n sorted?: number[];\n pivot?: number;\n description: string;\n comparisons: number;\n swaps: number;\n}\n\ninterface AlgorithmState {\n steps: SortingStep[];\n currentStep: number;\n isFinished: boolean;\n}\n\ninterface SortingComparisonVisualizerProps {\n className?: string;\n}\n\n// Step generators (simplified from main visualizer)\nfunction generateBubbleSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n for (let i = 0; i < n - 1; i++) {\n for (let j = 0; j < n - i - 1; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, j + 1],\n sorted: [...sorted],\n description: `Compare ${array[j]} vs ${array[j + 1]}`,\n comparisons,\n swaps,\n });\n\n if (array[j] > array[j + 1]) {\n swaps++;\n [array[j], array[j + 1]] = [array[j + 1], array[j]];\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: [...sorted],\n description: `Swap`,\n comparisons,\n swaps,\n });\n }\n }\n sorted.unshift(n - 1 - i);\n }\n sorted.unshift(0);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: 'Done!',\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateSelectionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n const sorted: number[] = [];\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n for (let i = 0; i < n - 1; i++) {\n let minIdx = i;\n\n for (let j = i + 1; j < n; j++) {\n comparisons++;\n steps.push({\n array: [...array],\n comparing: [minIdx, j],\n sorted: [...sorted],\n description: `Find min`,\n comparisons,\n swaps,\n });\n\n if (array[j] < array[minIdx]) {\n minIdx = j;\n }\n }\n\n if (minIdx !== i) {\n swaps++;\n [array[i], array[minIdx]] = [array[minIdx], array[i]];\n steps.push({\n array: [...array],\n swapping: [i, minIdx],\n sorted: [...sorted],\n description: `Swap min`,\n comparisons,\n swaps,\n });\n }\n\n sorted.push(i);\n }\n sorted.push(n - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: 'Done!',\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateInsertionSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const n = array.length;\n let comparisons = 0;\n let swaps = 0;\n\n steps.push({ array: [...array], sorted: [0], description: 'Start', comparisons: 0, swaps: 0 });\n\n for (let i = 1; i < n; i++) {\n const key = array[i];\n let j = i - 1;\n\n while (j >= 0 && array[j] > key) {\n comparisons++;\n swaps++;\n steps.push({\n array: [...array],\n swapping: [j, j + 1],\n sorted: Array.from({ length: i }, (_, idx) => idx),\n description: `Shift ${array[j]}`,\n comparisons,\n swaps,\n });\n array[j + 1] = array[j];\n j--;\n }\n if (j >= 0) comparisons++;\n\n array[j + 1] = key;\n steps.push({\n array: [...array],\n sorted: Array.from({ length: i + 1 }, (_, idx) => idx),\n description: `Insert ${key}`,\n comparisons,\n swaps,\n });\n }\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: n }, (_, i) => i),\n description: 'Done!',\n comparisons,\n swaps,\n });\n\n return steps;\n}\n\nfunction generateQuickSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const sorted: Set<number> = new Set();\n const stats = { comparisons: 0, swaps: 0 };\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n function quickSort(low: number, high: number) {\n if (low < high) {\n const pivotIdx = partition(low, high);\n sorted.add(pivotIdx);\n quickSort(low, pivotIdx - 1);\n quickSort(pivotIdx + 1, high);\n } else if (low === high) {\n sorted.add(low);\n }\n }\n\n function partition(low: number, high: number): number {\n const pivot = array[high];\n let i = low - 1;\n\n for (let j = low; j < high; j++) {\n stats.comparisons++;\n steps.push({\n array: [...array],\n comparing: [j, high],\n pivot: high,\n sorted: [...sorted],\n description: `Compare with pivot`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n if (array[j] <= pivot) {\n i++;\n if (i !== j) {\n stats.swaps++;\n [array[i], array[j]] = [array[j], array[i]];\n steps.push({\n array: [...array],\n swapping: [i, j],\n pivot: high,\n sorted: [...sorted],\n description: `Swap`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n }\n }\n\n if (i + 1 !== high) {\n stats.swaps++;\n [array[i + 1], array[high]] = [array[high], array[i + 1]];\n steps.push({\n array: [...array],\n swapping: [i + 1, high],\n sorted: [...sorted],\n description: `Place pivot`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n\n return i + 1;\n }\n\n quickSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: 'Done!',\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nfunction generateMergeSortSteps(arr: number[]): SortingStep[] {\n const steps: SortingStep[] = [];\n const array = [...arr];\n const stats = { comparisons: 0, swaps: 0 };\n\n steps.push({ array: [...array], description: 'Start', comparisons: 0, swaps: 0 });\n\n function mergeSort(start: number, end: number) {\n if (start >= end) return;\n\n const mid = Math.floor((start + end) / 2);\n mergeSort(start, mid);\n mergeSort(mid + 1, end);\n merge(start, mid, end);\n }\n\n function merge(start: number, mid: number, end: number) {\n const left = array.slice(start, mid + 1);\n const right = array.slice(mid + 1, end + 1);\n let i = 0, j = 0, k = start;\n\n while (i < left.length && j < right.length) {\n stats.comparisons++;\n if (left[i] <= right[j]) {\n array[k] = left[i];\n stats.swaps++;\n i++;\n } else {\n array[k] = right[j];\n stats.swaps++;\n j++;\n }\n k++;\n }\n\n while (i < left.length) {\n array[k] = left[i];\n stats.swaps++;\n i++;\n k++;\n }\n\n while (j < right.length) {\n array[k] = right[j];\n stats.swaps++;\n j++;\n k++;\n }\n\n steps.push({\n array: [...array],\n description: `Merge [${start}..${end}]`,\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n }\n\n mergeSort(0, array.length - 1);\n\n steps.push({\n array: [...array],\n sorted: Array.from({ length: array.length }, (_, i) => i),\n description: 'Done!',\n comparisons: stats.comparisons,\n swaps: stats.swaps,\n });\n\n return steps;\n}\n\nconst STEP_GENERATORS: Record<SortingAlgorithm, (arr: number[]) => SortingStep[]> = {\n bubble: generateBubbleSortSteps,\n selection: generateSelectionSortSteps,\n insertion: generateInsertionSortSteps,\n quick: generateQuickSortSteps,\n merge: generateMergeSortSteps,\n};\n\nfunction generateRandomArray(size: number): number[] {\n return Array.from({ length: size }, () => Math.floor(Math.random() * 100) + 5);\n}\n\nconst SortingComparisonVisualizerComponent: React.FC<SortingComparisonVisualizerProps> = ({\n className = '',\n}) => {\n const [algorithm1, setAlgorithm1] = useState<SortingAlgorithm>('bubble');\n const [algorithm2, setAlgorithm2] = useState<SortingAlgorithm>('quick');\n const [arraySize, setArraySize] = useState(8);\n const [speed, setSpeed] = useState(50);\n const [isPlaying, setIsPlaying] = useState(false);\n const [baseArray, setBaseArray] = useState<number[]>([]);\n\n const [state1, setState1] = useState<AlgorithmState>({ steps: [], currentStep: 0, isFinished: false });\n const [state2, setState2] = useState<AlgorithmState>({ steps: [], currentStep: 0, isFinished: false });\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newArray = generateRandomArray(arraySize);\n setBaseArray(newArray);\n\n const steps1 = STEP_GENERATORS[algorithm1]([...newArray]);\n const steps2 = STEP_GENERATORS[algorithm2]([...newArray]);\n\n setState1({ steps: steps1, currentStep: 0, isFinished: false });\n setState2({ steps: steps2, currentStep: 0, isFinished: false });\n setIsPlaying(false);\n playingRef.current = false;\n }, [algorithm1, algorithm2, arraySize]);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n const bothFinished = state1.isFinished && state2.isFinished;\n\n if (isPlaying && !bothFinished) {\n playingRef.current = true;\n const delay = Math.max(50, 1000 - speed * 9.5);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setState1(prev => {\n if (prev.currentStep < prev.steps.length - 1) {\n return { ...prev, currentStep: prev.currentStep + 1 };\n }\n return { ...prev, isFinished: true };\n });\n\n setState2(prev => {\n if (prev.currentStep < prev.steps.length - 1) {\n return { ...prev, currentStep: prev.currentStep + 1 };\n }\n return { ...prev, isFinished: true };\n });\n }\n }, delay);\n } else if (bothFinished) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, state1.currentStep, state2.currentStep, state1.isFinished, state2.isFinished, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (state1.isFinished && state2.isFinished) {\n setState1(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n setState2(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [state1.isFinished, state2.isFinished, isPlaying]);\n\n const handleReset = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n setState1(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n setState2(prev => ({ ...prev, currentStep: 0, isFinished: false }));\n }, []);\n\n const handleShuffle = useCallback(() => {\n setIsPlaying(false);\n playingRef.current = false;\n initialize();\n }, [initialize]);\n\n const getBarColor = (step: SortingStep, index: number): string => {\n if (step.sorted?.includes(index)) return 'bg-green-500';\n if (step.pivot === index) return 'bg-purple-500';\n if (step.swapping?.includes(index)) return 'bg-red-500';\n if (step.comparing?.includes(index)) return 'bg-yellow-400';\n return 'bg-blue-500';\n };\n\n const renderAlgorithmPanel = (\n algorithm: SortingAlgorithm,\n state: AlgorithmState,\n setAlgorithm: (alg: SortingAlgorithm) => void,\n otherAlgorithm: SortingAlgorithm,\n panelColor: string\n ) => {\n const step = state.steps[state.currentStep];\n if (!step) return null;\n\n const maxValue = Math.max(...step.array, 1);\n const complexity = ALGORITHM_COMPLEXITIES[algorithm];\n const finalStep = state.steps[state.steps.length - 1];\n const winner = state.isFinished && state1.isFinished && state2.isFinished;\n\n return (\n <div className={`flex-1 border-2 rounded-lg overflow-hidden ${panelColor}`}>\n {/* Header */}\n <div className=\"px-3 py-2 bg-gray-50 border-b flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <select\n value={algorithm}\n onChange={(e) => setAlgorithm(e.target.value as SortingAlgorithm)}\n className=\"px-2 py-1 text-sm font-medium bg-white border border-gray-300 rounded shadow-sm\"\n disabled={isPlaying}\n >\n {Object.entries(ALGORITHM_NAMES)\n .filter(([key]) => key !== otherAlgorithm)\n .map(([key, name]) => (\n <option key={key} value={key}>{name}</option>\n ))}\n </select>\n <span className=\"text-xs text-gray-500\">{complexity.time}</span>\n </div>\n {state.isFinished && winner && (\n <span className=\"px-2 py-0.5 text-xs font-bold bg-green-100 text-green-700 rounded\">\n Finished!\n </span>\n )}\n </div>\n\n {/* Bars */}\n <div className=\"p-3\">\n <div className=\"flex items-end justify-center gap-0.5 h-32 bg-gray-50 rounded p-2\">\n {step.array.map((value, index) => (\n <div\n key={index}\n className={`${getBarColor(step, index)} rounded-t transition-all duration-150`}\n style={{\n height: `${(value / maxValue) * 100}%`,\n width: `${Math.max(100 / step.array.length - 1, 6)}%`,\n minWidth: '8px',\n }}\n />\n ))}\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"px-3 py-2 bg-gray-50 border-t\">\n <div className=\"flex justify-between text-xs\">\n <div>\n <span className=\"text-gray-500\">Steps: </span>\n <span className=\"font-medium\">{state.currentStep + 1}/{state.steps.length}</span>\n </div>\n <div>\n <span className=\"text-yellow-600 font-medium\">C: {step.comparisons}</span>\n <span className=\"text-gray-400 mx-1\">|</span>\n <span className=\"text-red-600 font-medium\">\n {algorithm === 'merge' ? 'W' : 'S'}: {step.swaps}\n </span>\n </div>\n </div>\n {state.isFinished && finalStep && (\n <div className=\"mt-1 text-xs text-gray-600 text-center\">\n Total: {finalStep.comparisons} comparisons, {finalStep.swaps} {algorithm === 'merge' ? 'writes' : 'swaps'}\n </div>\n )}\n </div>\n </div>\n );\n };\n\n return (\n <div className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}>\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-indigo-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold text-gray-900\">Algorithm Comparison</h3>\n <div className=\"flex items-center gap-2 text-xs text-gray-500\">\n <span>Array: [{baseArray.slice(0, 5).join(', ')}{baseArray.length > 5 ? '...' : ''}]</span>\n </div>\n </div>\n </div>\n\n {/* Comparison Area */}\n <div className=\"p-4\">\n <VisualizationArea minHeight={350}>\n <div className=\"flex gap-4\">\n {renderAlgorithmPanel(algorithm1, state1, setAlgorithm1, algorithm2, 'border-indigo-200')}\n <div className=\"flex items-center text-2xl font-bold text-gray-300\">VS</div>\n {renderAlgorithmPanel(algorithm2, state2, setAlgorithm2, algorithm1, 'border-purple-200')}\n </div>\n </VisualizationArea>\n </div>\n\n {/* Controls */}\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-2\">\n {isPlaying && (\n <span className=\"flex items-center gap-1 text-xs text-indigo-600 font-medium\">\n <span className=\"w-2 h-2 bg-indigo-500 rounded-full animate-pulse\" />\n Racing\n </span>\n )}\n <button\n onClick={handlePlayPause}\n className={`p-2 text-white rounded-lg transition-colors ${\n isPlaying ? 'bg-indigo-500 hover:bg-indigo-600' : 'bg-indigo-600 hover:bg-indigo-700'\n }`}\n title=\"Play/Pause\"\n >\n {isPlaying ? <Pause className=\"w-4 h-4\" /> : <Play className=\"w-4 h-4\" />}\n </button>\n <button\n onClick={handleReset}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors\"\n title=\"Reset\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleShuffle}\n disabled={isPlaying}\n className=\"p-2 bg-gray-200 text-gray-700 rounded-lg hover:bg-gray-300 transition-colors disabled:opacity-50\"\n title=\"New Array\"\n >\n <Shuffle className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Size</label>\n <input\n type=\"range\"\n min=\"5\"\n max=\"15\"\n value={arraySize}\n onChange={(e) => setArraySize(Number(e.target.value))}\n disabled={isPlaying}\n className=\"w-20 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer disabled:opacity-50\"\n />\n <span className=\"text-xs text-gray-500 w-4\">{arraySize}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <label className=\"text-xs text-gray-500\">Speed</label>\n <input\n type=\"range\"\n min=\"1\"\n max=\"100\"\n value={speed}\n onChange={(e) => setSpeed(Number(e.target.value))}\n className=\"w-20 h-1 bg-gray-300 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const SortingComparisonVisualizer = React.memo(SortingComparisonVisualizerComponent);\nexport default SortingComparisonVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface Node {\n id: number;\n x: number;\n y: number;\n}\n\ninterface Edge {\n from: number;\n to: number;\n weight: number;\n}\n\ninterface DijkstraStep {\n current: number;\n distances: number[];\n visited: number[];\n previous: (number | null)[];\n priorityQueue: { node: number; dist: number }[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface DijkstraVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\n// Algorithm code snippets\nconst DIJKSTRA_CODE = [\n 'dijkstra(graph, start):',\n ' dist[start]=0, dist[*]=∞',\n ' pq.add((0, start))',\n ' while pq not empty:',\n ' (d,u) = pq.extractMin()',\n ' if visited[u]: continue',\n ' visited[u] = true',\n ' for neighbor v of u:',\n ' if dist[u]+w < dist[v]:',\n ' dist[v] = dist[u]+w',\n ' pq.add((dist[v], v))',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-100', label: 'Unvisited', border: '#60a5fa' },\n { color: 'bg-yellow-400', label: 'Current', border: '#ca8a04' },\n { color: 'bg-green-400', label: 'Visited', border: '#16a34a' },\n];\n\n// Generate a weighted graph\nfunction generateGraph(): {\n nodes: Node[];\n edges: Edge[];\n adjacencyList: Map<number, { to: number; weight: number }[]>;\n} {\n const nodes: Node[] = [\n { id: 0, x: 60, y: 150 }, // Start\n { id: 1, x: 150, y: 60 },\n { id: 2, x: 150, y: 240 },\n { id: 3, x: 260, y: 100 },\n { id: 4, x: 260, y: 200 },\n { id: 5, x: 360, y: 150 }, // End\n ];\n\n const edges: Edge[] = [\n { from: 0, to: 1, weight: 4 },\n { from: 0, to: 2, weight: 2 },\n { from: 1, to: 3, weight: 5 },\n { from: 2, to: 1, weight: 1 },\n { from: 2, to: 4, weight: 4 },\n { from: 3, to: 5, weight: 2 },\n { from: 4, to: 3, weight: 1 },\n { from: 4, to: 5, weight: 3 },\n ];\n\n const adjacencyList = new Map<number, { to: number; weight: number }[]>();\n nodes.forEach((node) => adjacencyList.set(node.id, []));\n edges.forEach(({ from, to, weight }) => {\n adjacencyList.get(from)?.push({ to, weight });\n });\n\n return { nodes, edges, adjacencyList };\n}\n\nfunction generateDijkstraSteps(\n nodes: Node[],\n adjacencyList: Map<number, { to: number; weight: number }[]>,\n startNode: number\n): DijkstraStep[] {\n const steps: DijkstraStep[] = [];\n const n = nodes.length;\n const distances = Array(n).fill(Infinity);\n const visited: number[] = [];\n const previous: (number | null)[] = Array(n).fill(null);\n const pq: { node: number; dist: number }[] = [];\n\n distances[startNode] = 0;\n pq.push({ node: startNode, dist: 0 });\n\n steps.push({\n current: -1,\n distances: [...distances],\n visited: [],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Initialize: dist[${startNode}] = 0, all others = ∞. Add source to priority queue.`,\n codeLine: 1,\n variables: { start: startNode, 'dist[start]': 0 },\n });\n\n while (pq.length > 0) {\n // Sort by distance and get minimum\n pq.sort((a, b) => a.dist - b.dist);\n const shifted = pq.shift();\n if (!shifted) break;\n const { node: current, dist: currentDist } = shifted;\n\n if (visited.includes(current)) {\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Node ${current} already visited, skip it`,\n codeLine: 5,\n variables: { u: current },\n });\n continue;\n }\n\n visited.push(current);\n\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Extract min from PQ: node ${current} with dist = ${currentDist}. Mark as visited.`,\n codeLine: 6,\n variables: { u: current, d: currentDist },\n });\n\n const neighbors = adjacencyList.get(current) || [];\n for (const { to, weight } of neighbors) {\n if (visited.includes(to)) continue;\n\n const newDist = distances[current] + weight;\n\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Check edge ${current}→${to} (weight=${weight}): dist[${current}] + ${weight} = ${newDist}, current dist[${to}] = ${distances[to] === Infinity ? '∞' : distances[to]}`,\n codeLine: 8,\n variables: {\n u: current,\n v: to,\n w: weight,\n 'new dist': newDist,\n 'old dist': distances[to] === Infinity ? '∞' : distances[to],\n },\n });\n\n if (newDist < distances[to]) {\n const oldDist = distances[to];\n distances[to] = newDist;\n previous[to] = current;\n pq.push({ node: to, dist: newDist });\n\n steps.push({\n current,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [...pq],\n description: `Relax! ${newDist} < ${oldDist === Infinity ? '∞' : oldDist} → Update dist[${to}] = ${newDist}, add to PQ`,\n codeLine: 10,\n variables: { v: to, 'dist[v]': newDist, via: current },\n });\n }\n }\n }\n\n steps.push({\n current: -1,\n distances: [...distances],\n visited: [...visited],\n previous: [...previous],\n priorityQueue: [],\n description: `✓ Done! Shortest paths from node ${startNode}: [${distances.map((d, i) => `${i}:${d}`).join(', ')}]`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nconst DijkstraVisualizerComponent: React.FC<DijkstraVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<DijkstraStep[]>([]);\n const [graph, setGraph] = useState<ReturnType<typeof generateGraph> | null>(\n null\n );\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initializeGraph = useCallback(() => {\n const newGraph = generateGraph();\n setGraph(newGraph);\n const newSteps = generateDijkstraSteps(\n newGraph.nodes,\n newGraph.adjacencyList,\n 0\n );\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initializeGraph();\n }, [initializeGraph]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n if (!graph) return null;\n\n const currentStepData = steps[currentStep] || {\n current: -1,\n visited: [],\n distances: [],\n priorityQueue: [],\n };\n const { current, visited, distances, priorityQueue } = currentStepData;\n\n const getNodeColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-400 stroke-yellow-600';\n if (visited.includes(nodeId)) return 'fill-green-400 stroke-green-600';\n return 'fill-blue-100 stroke-blue-400';\n };\n\n const getNodeTextColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-900';\n if (visited.includes(nodeId)) return 'fill-green-900';\n return 'fill-blue-700';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-orange-50 to-amber-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n Dijkstra's Algorithm\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n Time: O((V+E) log V)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-700 rounded\">\n Space: O(V)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4 overflow-x-auto\">\n <div className=\"flex flex-col lg:flex-row gap-4 min-w-0\">\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n {/* Graph SVG - larger */}\n <div className=\"bg-gray-50 rounded-lg\">\n <svg viewBox=\"0 0 420 300\" className=\"w-full h-64 md:h-72\">\n {/* Edges with weights */}\n {graph.edges.map((edge, index) => {\n const fromNode = graph.nodes[edge.from];\n const toNode = graph.nodes[edge.to];\n const midX = (fromNode.x + toNode.x) / 2;\n const midY = (fromNode.y + toNode.y) / 2;\n\n // Offset for weight label\n const dx = toNode.x - fromNode.x;\n const dy = toNode.y - fromNode.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n const offsetX = (-dy / len) * 12;\n const offsetY = (dx / len) * 12;\n\n return (\n <g key={index}>\n {/* Arrow line */}\n <line\n x1={fromNode.x}\n y1={fromNode.y}\n x2={toNode.x}\n y2={toNode.y}\n className=\"stroke-gray-400 stroke-2\"\n markerEnd=\"url(#arrowhead)\"\n />\n {/* Weight label */}\n <circle\n cx={midX + offsetX}\n cy={midY + offsetY}\n r={10}\n className=\"fill-white stroke-gray-300\"\n />\n <text\n x={midX + offsetX}\n y={midY + offsetY + 4}\n textAnchor=\"middle\"\n className=\"text-xs font-bold fill-gray-600\"\n >\n {edge.weight}\n </text>\n </g>\n );\n })}\n\n {/* Arrow marker definition */}\n <defs>\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"28\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon\n points=\"0 0, 10 3.5, 0 7\"\n className=\"fill-gray-400\"\n />\n </marker>\n </defs>\n\n {/* Nodes */}\n {graph.nodes.map((node) => (\n <g key={node.id}>\n <circle\n cx={node.x}\n cy={node.y}\n r={22}\n className={`${getNodeColor(node.id)} stroke-2 transition-all duration-300`}\n />\n <text\n x={node.x}\n y={node.y + 5}\n textAnchor=\"middle\"\n className={`text-sm font-bold ${getNodeTextColor(node.id)}`}\n >\n {node.id}\n </text>\n </g>\n ))}\n </svg>\n </div>\n\n {/* Distances & Priority Queue - compact horizontal layout */}\n <div className=\"mt-3 flex flex-wrap gap-3\">\n {/* Distance badges */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-xs font-medium text-gray-600\">Dist:</span>\n {distances.map((dist, idx) => (\n <span\n key={idx}\n className={`px-2 py-0.5 text-xs font-mono rounded ${\n idx === current\n ? 'bg-yellow-200 text-yellow-900'\n : visited.includes(idx)\n ? 'bg-green-100 text-green-800'\n : 'bg-gray-100 text-gray-600'\n }`}\n >\n {idx}:{dist === Infinity ? '∞' : dist}\n </span>\n ))}\n </div>\n\n {/* Priority Queue badges */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"text-xs font-medium text-gray-600\">PQ:</span>\n {priorityQueue.length > 0 ? (\n priorityQueue\n .sort((a, b) => a.dist - b.dist)\n .map((item, index) => (\n <span\n key={index}\n className=\"px-2 py-0.5 bg-orange-100 text-orange-800 text-xs rounded font-mono\"\n >\n {item.node}:{item.dist}\n </span>\n ))\n ) : (\n <span className=\"text-xs text-gray-400\">empty</span>\n )}\n </div>\n </div>\n\n {/* Status */}\n <div className=\"mt-3\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel - on right */}\n {showCode && (\n <div className=\"w-full lg:w-60 flex-shrink-0 space-y-2\">\n <CodePanel\n code={DIJKSTRA_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const DijkstraVisualizer = React.memo(DijkstraVisualizerComponent);\nexport default DijkstraVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface Item {\n weight: number;\n value: number;\n}\n\ninterface DPStep {\n i: number; // current item index\n w: number; // current capacity\n table: number[][];\n decision: 'skip' | 'take' | null;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface DPVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst DEFAULT_ITEMS: Item[] = [\n { weight: 2, value: 3 },\n { weight: 3, value: 4 },\n { weight: 4, value: 5 },\n { weight: 5, value: 6 },\n];\n\nconst DEFAULT_CAPACITY = 8;\n\n// Algorithm code snippets\nconst KNAPSACK_CODE = [\n 'for i = 1 to n:',\n ' for w = 1 to capacity:',\n ' if item[i].weight > w:',\n ' dp[i][w] = dp[i-1][w]',\n ' else:',\n ' skip = dp[i-1][w]',\n ' take = dp[i-1][w-weight] + value',\n ' dp[i][w] = max(skip, take)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-50', label: 'Not computed', border: '#d1d5db' },\n { color: 'bg-blue-100', label: 'Computed' },\n { color: 'bg-green-400', label: 'Take item' },\n { color: 'bg-yellow-300', label: 'Skip item' },\n];\n\nfunction generateKnapsackSteps(items: Item[], capacity: number): DPStep[] {\n const steps: DPStep[] = [];\n const n = items.length;\n const dp: number[][] = Array(n + 1)\n .fill(null)\n .map(() => Array(capacity + 1).fill(0));\n\n steps.push({\n i: -1,\n w: -1,\n table: dp.map((row) => [...row]),\n decision: null,\n description: `Initialize DP table: ${n + 1} rows (items) × ${capacity + 1} cols (capacity). Base case: dp[0][*] = 0`,\n codeLine: -1,\n });\n\n for (let i = 1; i <= n; i++) {\n const item = items[i - 1];\n\n for (let w = 1; w <= capacity; w++) {\n if (item.weight > w) {\n // Can't take this item\n dp[i][w] = dp[i - 1][w];\n steps.push({\n i,\n w,\n table: dp.map((row) => [...row]),\n decision: 'skip',\n description: `Item ${i} (w=${item.weight}, v=${item.value}): weight ${item.weight} > capacity ${w}, must skip → dp[${i}][${w}] = dp[${i - 1}][${w}] = ${dp[i][w]}`,\n codeLine: 3,\n variables: {\n i,\n w,\n 'item.weight': item.weight,\n 'dp[i-1][w]': dp[i - 1][w],\n },\n });\n } else {\n // Choose max of skip or take\n const skipValue = dp[i - 1][w];\n const takeValue = dp[i - 1][w - item.weight] + item.value;\n\n if (takeValue > skipValue) {\n dp[i][w] = takeValue;\n steps.push({\n i,\n w,\n table: dp.map((row) => [...row]),\n decision: 'take',\n description: `Item ${i}: take (${takeValue} = dp[${i - 1}][${w - item.weight}] + ${item.value}) > skip (${skipValue}) → Take it! dp[${i}][${w}] = ${takeValue}`,\n codeLine: 7,\n variables: {\n i,\n w,\n skip: skipValue,\n take: takeValue,\n max: takeValue,\n },\n });\n } else {\n dp[i][w] = skipValue;\n steps.push({\n i,\n w,\n table: dp.map((row) => [...row]),\n decision: 'skip',\n description: `Item ${i}: skip (${skipValue}) ≥ take (${takeValue} = dp[${i - 1}][${w - item.weight}] + ${item.value}) → Skip it! dp[${i}][${w}] = ${skipValue}`,\n codeLine: 7,\n variables: {\n i,\n w,\n skip: skipValue,\n take: takeValue,\n max: skipValue,\n },\n });\n }\n }\n }\n }\n\n steps.push({\n i: n,\n w: capacity,\n table: dp.map((row) => [...row]),\n decision: null,\n description: `✓ Done! Maximum value = ${dp[n][capacity]} (optimal solution in dp[${n}][${capacity}])`,\n codeLine: -1,\n variables: { 'max value': dp[n][capacity] },\n });\n\n return steps;\n}\n\nconst DPVisualizerComponent: React.FC<DPVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [items] = useState<Item[]>(DEFAULT_ITEMS);\n const [capacity] = useState(DEFAULT_CAPACITY);\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<DPStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initializeDP = useCallback(() => {\n const newSteps = generateKnapsackSteps(items, capacity);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [items, capacity]);\n\n useEffect(() => {\n initializeDP();\n }, [initializeDP]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const currentStepData = steps[currentStep] || {\n i: -1,\n w: -1,\n table: [],\n decision: null,\n };\n const { i: currentI, w: currentW, table, decision } = currentStepData;\n\n const getCellStyle = (i: number, w: number): string => {\n if (i === currentI && w === currentW) {\n if (decision === 'take') return 'bg-green-400 text-green-900 font-bold';\n if (decision === 'skip') return 'bg-yellow-300 text-yellow-900 font-bold';\n return 'bg-purple-400 text-purple-900 font-bold';\n }\n if (i < currentI || (i === currentI && w < currentW)) {\n return 'bg-blue-100 text-blue-800';\n }\n return 'bg-gray-50 text-gray-400';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-teal-50 to-cyan-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n 0/1 Knapsack (Dynamic Programming)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-teal-100 text-teal-700 rounded\">\n Time: O(nW)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-cyan-100 text-cyan-700 rounded\">\n Space: O(nW)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n <div className=\"flex gap-6\">\n {/* Items List */}\n <div className=\"w-36\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Items:\n </div>\n <div className=\"space-y-1\">\n {items.map((item, idx) => (\n <div\n key={idx}\n className={`px-2 py-1 rounded text-xs ${\n idx + 1 === currentI\n ? 'bg-purple-100 text-purple-800 font-medium'\n : idx + 1 < currentI\n ? 'bg-blue-50 text-blue-600'\n : 'bg-gray-100 text-gray-500'\n }`}\n >\n Item {idx + 1}: w={item.weight}, v={item.value}\n </div>\n ))}\n </div>\n <div className=\"mt-3 text-sm\">\n <span className=\"font-medium text-gray-700\">Capacity:</span>{' '}\n <span className=\"text-gray-900\">{capacity}</span>\n </div>\n </div>\n\n {/* DP Table */}\n <div className=\"flex-1 overflow-x-auto\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n DP Table:\n </div>\n <table className=\"text-xs border-collapse\">\n <thead>\n <tr>\n <th className=\"w-8 p-1 text-gray-500 font-normal\">i\\w</th>\n {Array.from({ length: capacity + 1 }, (_, w) => (\n <th\n key={w}\n className={`w-8 p-1 ${w === currentW ? 'text-purple-700 font-bold' : 'text-gray-500 font-normal'}`}\n >\n {w}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {table.map((row, i) => (\n <tr key={i}>\n <td\n className={`p-1 text-center ${i === currentI ? 'text-purple-700 font-bold' : 'text-gray-500'}`}\n >\n {i}\n </td>\n {row.map((cell, w) => (\n <td\n key={w}\n className={`p-1 text-center rounded ${getCellStyle(i, w)}`}\n >\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Status */}\n <div className=\"mt-4\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n decision === 'take'\n ? 'success'\n : decision === 'skip'\n ? 'warning'\n : 'default'\n }\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={KNAPSACK_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"teal\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const DPVisualizer = React.memo(DPVisualizerComponent);\nexport default DPVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ntype TraversalAlgorithm = 'dfs' | 'bfs';\n\ninterface Node {\n id: number;\n x: number;\n y: number;\n}\n\ninterface Edge {\n from: number;\n to: number;\n}\n\ninterface TraversalStep {\n current: number;\n visited: number[];\n queue?: number[]; // For BFS\n stack?: number[]; // For DFS\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface GraphVisualizerProps {\n algorithm?: TraversalAlgorithm;\n showControls?: boolean;\n showAlgorithmSelector?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst ALGORITHM_NAMES: Record<TraversalAlgorithm, string> = {\n dfs: 'Depth-First Search',\n bfs: 'Breadth-First Search',\n};\n\nconst ALGORITHM_COMPLEXITIES: Record<\n TraversalAlgorithm,\n { time: string; space: string }\n> = {\n dfs: { time: 'O(V + E)', space: 'O(V)' },\n bfs: { time: 'O(V + E)', space: 'O(V)' },\n};\n\n// Algorithm code snippets\nconst DFS_CODE = [\n 'dfs(graph, start):',\n ' stack.push(start)',\n ' while stack not empty:',\n ' node = stack.pop()',\n ' if visited[node]: continue',\n ' visited[node] = true',\n ' process(node)',\n ' for neighbor in adj[node]:',\n ' if not visited[neighbor]:',\n ' stack.push(neighbor)',\n];\n\nconst BFS_CODE = [\n 'bfs(graph, start):',\n ' queue.enqueue(start)',\n ' visited[start] = true',\n ' while queue not empty:',\n ' node = queue.dequeue()',\n ' process(node)',\n ' for neighbor in adj[node]:',\n ' if not visited[neighbor]:',\n ' visited[neighbor] = true',\n ' queue.enqueue(neighbor)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-100', label: 'Unvisited', border: '#60a5fa' },\n { color: 'bg-yellow-400', label: 'Current', border: '#ca8a04' },\n { color: 'bg-green-400', label: 'Visited', border: '#16a34a' },\n];\n\n// Generate a sample graph with positions\nfunction generateGraph(): {\n nodes: Node[];\n edges: Edge[];\n adjacencyList: number[][];\n} {\n // Create a connected graph with 8 nodes\n const nodes: Node[] = [\n { id: 0, x: 200, y: 40 }, // Root\n { id: 1, x: 100, y: 100 },\n { id: 2, x: 300, y: 100 },\n { id: 3, x: 50, y: 180 },\n { id: 4, x: 150, y: 180 },\n { id: 5, x: 250, y: 180 },\n { id: 6, x: 350, y: 180 },\n { id: 7, x: 100, y: 260 },\n ];\n\n const edges: Edge[] = [\n { from: 0, to: 1 },\n { from: 0, to: 2 },\n { from: 1, to: 3 },\n { from: 1, to: 4 },\n { from: 2, to: 5 },\n { from: 2, to: 6 },\n { from: 3, to: 7 },\n { from: 4, to: 7 },\n ];\n\n // Build adjacency list\n const adjacencyList: number[][] = Array.from(\n { length: nodes.length },\n () => []\n );\n edges.forEach(({ from, to }) => {\n adjacencyList[from].push(to);\n adjacencyList[to].push(from); // Undirected graph\n });\n\n return { nodes, edges, adjacencyList };\n}\n\nfunction generateDFSSteps(\n adjacencyList: number[][],\n startNode: number\n): TraversalStep[] {\n const steps: TraversalStep[] = [];\n const visited = new Set<number>();\n const stack: number[] = [startNode];\n\n steps.push({\n current: -1,\n visited: [],\n stack: [...stack],\n description: `Initialize: push start node ${startNode} onto stack`,\n codeLine: 1,\n variables: { start: startNode },\n });\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === undefined) break;\n\n if (visited.has(current)) {\n steps.push({\n current,\n visited: [...visited],\n stack: [...stack],\n description: `Node ${current} already visited, skip it`,\n codeLine: 4,\n variables: { node: current },\n });\n continue;\n }\n\n visited.add(current);\n\n steps.push({\n current,\n visited: [...visited],\n stack: [...stack],\n description: `Pop ${current} from stack, mark as visited. Process node ${current}`,\n codeLine: 6,\n variables: { node: current, 'visited count': visited.size },\n });\n\n // Add neighbors in reverse order so we visit them in order\n const neighbors = adjacencyList[current]\n .filter((n) => !visited.has(n))\n .reverse();\n\n if (neighbors.length > 0) {\n stack.push(...neighbors);\n steps.push({\n current,\n visited: [...visited],\n stack: [...stack],\n description: `Push unvisited neighbors [${neighbors.reverse().join(', ')}] onto stack`,\n codeLine: 9,\n variables: { node: current, neighbors: neighbors.length },\n });\n }\n }\n\n steps.push({\n current: -1,\n visited: [...visited],\n stack: [],\n description: `✓ DFS complete! Visit order: [${[...visited].join(' → ')}]`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nfunction generateBFSSteps(\n adjacencyList: number[][],\n startNode: number\n): TraversalStep[] {\n const steps: TraversalStep[] = [];\n const visited = new Set<number>();\n const queue: number[] = [startNode];\n visited.add(startNode);\n\n steps.push({\n current: -1,\n visited: [],\n queue: [...queue],\n description: `Initialize: enqueue start node ${startNode}, mark as visited`,\n codeLine: 1,\n variables: { start: startNode },\n });\n\n const visitOrder: number[] = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n visitOrder.push(current);\n\n steps.push({\n current,\n visited: [...visitOrder],\n queue: [...queue],\n description: `Dequeue ${current}, process it`,\n codeLine: 5,\n variables: { node: current },\n });\n\n const neighbors = adjacencyList[current].filter((n) => !visited.has(n));\n\n if (neighbors.length > 0) {\n neighbors.forEach((n) => {\n visited.add(n);\n queue.push(n);\n });\n\n steps.push({\n current,\n visited: [...visitOrder],\n queue: [...queue],\n description: `Enqueue unvisited neighbors [${neighbors.join(', ')}], mark as visited`,\n codeLine: 9,\n variables: { node: current, neighbors: neighbors.length },\n });\n }\n }\n\n steps.push({\n current: -1,\n visited: [...visitOrder],\n queue: [],\n description: `✓ BFS complete! Visit order: [${visitOrder.join(' → ')}]`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nconst GraphVisualizerComponent: React.FC<GraphVisualizerProps> = ({\n algorithm: initialAlgorithm = 'dfs',\n showControls = true,\n showAlgorithmSelector = true,\n showCode = true,\n className = '',\n}) => {\n const [algorithm, setAlgorithm] =\n useState<TraversalAlgorithm>(initialAlgorithm);\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<TraversalStep[]>([]);\n const [graph, setGraph] = useState<ReturnType<typeof generateGraph> | null>(\n null\n );\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Initialize graph and generate steps\n const initializeGraph = useCallback(() => {\n const newGraph = generateGraph();\n setGraph(newGraph);\n const newSteps =\n algorithm === 'dfs'\n ? generateDFSSteps(newGraph.adjacencyList, 0)\n : generateBFSSteps(newGraph.adjacencyList, 0);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [algorithm]);\n\n useEffect(() => {\n initializeGraph();\n }, [initializeGraph]);\n\n // Animation loop\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const handleShuffle = () => {\n initializeGraph();\n };\n\n if (!graph) return null;\n\n const currentStepData = steps[currentStep] || { current: -1, visited: [] };\n const { current, visited } = currentStepData;\n const dataStructure =\n algorithm === 'dfs' ? currentStepData.stack : currentStepData.queue;\n const dataStructureName = algorithm === 'dfs' ? 'Stack' : 'Queue';\n const algorithmCode = algorithm === 'dfs' ? DFS_CODE : BFS_CODE;\n\n const getNodeColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-400 stroke-yellow-600';\n if (visited.includes(nodeId)) return 'fill-green-400 stroke-green-600';\n return 'fill-blue-100 stroke-blue-400';\n };\n\n const getNodeTextColor = (nodeId: number): string => {\n if (nodeId === current) return 'fill-yellow-900';\n if (visited.includes(nodeId)) return 'fill-green-900';\n return 'fill-blue-700';\n };\n\n const complexity = ALGORITHM_COMPLEXITIES[algorithm];\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-purple-50 to-indigo-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n {ALGORITHM_NAMES[algorithm]}\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Time: {complexity.time}\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Space: {complexity.space}\n </span>\n </div>\n </div>\n\n {showAlgorithmSelector && (\n <select\n value={algorithm}\n onChange={(e) =>\n setAlgorithm(e.target.value as TraversalAlgorithm)\n }\n className=\"px-3 py-1.5 text-sm font-medium text-gray-900 bg-white border border-gray-300 rounded-md shadow-sm focus:ring-2 focus:ring-purple-500 focus:border-purple-500\"\n disabled={isPlaying}\n >\n {Object.entries(ALGORITHM_NAMES).map(([key, name]) => (\n <option key={key} value={key}>\n {name}\n </option>\n ))}\n </select>\n )}\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n <div className=\"flex gap-4\">\n {/* Graph SVG */}\n <div className=\"flex-1 bg-gray-50 rounded-lg\">\n <svg viewBox=\"0 0 400 300\" className=\"w-full h-64\">\n {/* Edges */}\n {graph.edges.map((edge, index) => {\n const fromNode = graph.nodes[edge.from];\n const toNode = graph.nodes[edge.to];\n return (\n <line\n key={index}\n x1={fromNode.x}\n y1={fromNode.y}\n x2={toNode.x}\n y2={toNode.y}\n className=\"stroke-gray-300 stroke-2\"\n />\n );\n })}\n\n {/* Nodes */}\n {graph.nodes.map((node) => (\n <g key={node.id}>\n <circle\n cx={node.x}\n cy={node.y}\n r={20}\n className={`${getNodeColor(node.id)} stroke-2 transition-all duration-300`}\n />\n <text\n x={node.x}\n y={node.y + 5}\n textAnchor=\"middle\"\n className={`text-sm font-bold ${getNodeTextColor(node.id)}`}\n >\n {node.id}\n </text>\n </g>\n ))}\n </svg>\n </div>\n\n {/* Data Structure Display */}\n <div className=\"w-32 flex flex-col\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n {dataStructureName}:\n </div>\n <div className=\"flex-1 bg-gray-100 rounded-lg p-2 min-h-[100px]\">\n {dataStructure && dataStructure.length > 0 ? (\n <div\n className={`flex ${algorithm === 'dfs' ? 'flex-col-reverse' : 'flex-col'} gap-1`}\n >\n {dataStructure.map((nodeId, index) => (\n <div\n key={index}\n className=\"px-2 py-1 bg-blue-100 text-blue-800 text-center rounded text-sm font-medium\"\n >\n {nodeId}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-gray-400 text-xs text-center\">\n Empty\n </div>\n )}\n </div>\n\n {/* Visit Order */}\n <div className=\"mt-3\">\n <div className=\"text-sm font-medium text-gray-700 mb-1\">\n Visited:\n </div>\n <div className=\"text-sm text-green-700 font-mono\">\n [{visited.join(', ')}]\n </div>\n </div>\n </div>\n </div>\n\n {/* Status */}\n <div className=\"mt-3\">\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n />\n </div>\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={algorithmCode}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n onShuffle={handleShuffle}\n showShuffle={true}\n accentColor=\"purple\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const GraphVisualizer = React.memo(GraphVisualizerComponent);\nexport default GraphVisualizer;\n","import React, { useMemo, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface Entry {\n key: string;\n value: number;\n hash: number;\n}\n\ninterface Bucket {\n entries: Entry[];\n}\n\ninterface HashMapStep {\n operation: 'put' | 'get' | 'hash' | 'init' | 'done';\n key: string;\n value?: number;\n hash?: number;\n bucketIndex?: number;\n buckets: Bucket[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightBucket?: number;\n highlightEntry?: { bucket: number; index: number };\n found?: boolean;\n}\n\ninterface HashMapVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst BUCKET_COUNT = 8;\n\nconst OPERATIONS: Array<{ op: 'put' | 'get'; key: string; value?: number }> = [\n { op: 'put', key: 'Alice', value: 25 },\n { op: 'put', key: 'Bob', value: 30 },\n { op: 'put', key: 'Charlie', value: 35 },\n { op: 'put', key: 'Diana', value: 28 },\n { op: 'put', key: 'Eve', value: 22 },\n { op: 'get', key: 'Bob' },\n { op: 'put', key: 'Alice', value: 26 }, // Update existing\n { op: 'get', key: 'Frank' }, // Not found\n];\n\nconst HASHMAP_CODE = [\n 'function put(key, value):',\n ' hash = hashCode(key)',\n ' index = hash % capacity',\n ' bucket = buckets[index]',\n ' for entry in bucket:',\n ' if entry.key == key:',\n ' entry.value = value',\n ' return',\n ' bucket.add(Entry(key, value))',\n '',\n 'function get(key):',\n ' hash = hashCode(key)',\n ' index = hash % capacity',\n ' bucket = buckets[index]',\n ' for entry in bucket:',\n ' if entry.key == key:',\n ' return entry.value',\n ' return null',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-50', label: 'Current bucket', border: '#60a5fa' },\n { color: 'bg-blue-500', label: 'Insert/Update' },\n { color: 'bg-green-400', label: 'Found' },\n { color: 'bg-red-400', label: 'Not found' },\n];\n\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) & 0x7fffffff;\n }\n return hash;\n}\n\nfunction generateHashMapSteps(): HashMapStep[] {\n const steps: HashMapStep[] = [];\n const buckets: Bucket[] = Array.from({ length: BUCKET_COUNT }, () => ({\n entries: [],\n }));\n\n // Initial state\n steps.push({\n operation: 'init',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Initialize HashMap with ${BUCKET_COUNT} buckets. Each bucket is a linked list for collision handling.`,\n codeLine: -1,\n });\n\n for (const { op, key, value } of OPERATIONS) {\n const hash = simpleHash(key);\n const index = hash % BUCKET_COUNT;\n\n if (op === 'put') {\n // Step 1: Calculate hash\n steps.push({\n operation: 'hash',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `put(\"${key}\", ${value}): Calculate hash = ${hash}, index = ${hash} % ${BUCKET_COUNT} = ${index}`,\n codeLine: 1,\n variables: { key: `\"${key}\"`, value: value ?? 0, hash, index },\n highlightBucket: index,\n });\n\n // Check for existing key\n const existingIndex = buckets[index].entries.findIndex(\n (e) => e.key === key\n );\n\n if (existingIndex >= 0) {\n // Update existing\n const oldValue = buckets[index].entries[existingIndex].value;\n buckets[index].entries[existingIndex].value = value ?? 0;\n\n steps.push({\n operation: 'put',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Found \"${key}\" in bucket ${index}. Update value: ${oldValue} → ${value}`,\n codeLine: 6,\n variables: { key: `\"${key}\"`, old: oldValue, new: value ?? 0 },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: existingIndex },\n });\n } else {\n // Add new entry\n buckets[index].entries.push({ key, value: value ?? 0, hash });\n\n const collisionMsg =\n buckets[index].entries.length > 1\n ? ` (Collision! Chaining with ${buckets[index].entries.length - 1} existing entry)`\n : '';\n\n steps.push({\n operation: 'put',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Add Entry(\"${key}\", ${value}) to bucket ${index}${collisionMsg}`,\n codeLine: 8,\n variables: { key: `\"${key}\"`, value: value ?? 0, bucket: index },\n highlightBucket: index,\n highlightEntry: {\n bucket: index,\n index: buckets[index].entries.length - 1,\n },\n });\n }\n } else {\n // GET operation\n // Step 1: Calculate hash\n steps.push({\n operation: 'hash',\n key,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `get(\"${key}\"): Calculate hash = ${hash}, index = ${hash} % ${BUCKET_COUNT} = ${index}`,\n codeLine: 11,\n variables: { key: `\"${key}\"`, hash, index },\n highlightBucket: index,\n });\n\n // Search in bucket\n const foundIndex = buckets[index].entries.findIndex((e) => e.key === key);\n\n if (foundIndex >= 0) {\n const foundValue = buckets[index].entries[foundIndex].value;\n steps.push({\n operation: 'get',\n key,\n value: foundValue,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Found \"${key}\" in bucket ${index} → return ${foundValue}`,\n codeLine: 16,\n variables: { key: `\"${key}\"`, result: foundValue },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: foundIndex },\n found: true,\n });\n } else {\n steps.push({\n operation: 'get',\n key,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `Key \"${key}\" not found in bucket ${index} → return null`,\n codeLine: 17,\n variables: { key: `\"${key}\"`, result: 'null' },\n highlightBucket: index,\n found: false,\n });\n }\n }\n }\n\n // Final state\n const totalEntries = buckets.reduce((sum, b) => sum + b.entries.length, 0);\n steps.push({\n operation: 'done',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n description: `✓ Done! HashMap contains ${totalEntries} entries across ${BUCKET_COUNT} buckets.`,\n codeLine: -1,\n variables: { size: totalEntries, capacity: BUCKET_COUNT },\n });\n\n return steps;\n}\n\nconst HashMapVisualizerComponent: React.FC<HashMapVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'hashmap-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'hashmap', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateHashMapSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<HashMapStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n key: '',\n buckets: [],\n description: '',\n };\n\n const { buckets, highlightBucket, highlightEntry, description, found } =\n stepData;\n\n const getBucketStyle = (index: number): string => {\n if (index === highlightBucket) {\n if (stepData.operation === 'get') {\n return found\n ? 'border-green-400 bg-green-50'\n : 'border-red-400 bg-red-50';\n }\n return 'border-blue-400 bg-blue-50';\n }\n return 'border-gray-200 bg-gray-50';\n };\n\n const getEntryStyle = (bucketIdx: number, entryIdx: number): string => {\n if (\n highlightEntry &&\n highlightEntry.bucket === bucketIdx &&\n highlightEntry.index === entryIdx\n ) {\n if (stepData.operation === 'get') {\n return found ? 'bg-green-400 text-white' : 'bg-red-400 text-white';\n }\n return 'bg-blue-500 text-white';\n }\n return 'bg-white border border-gray-300 text-gray-700';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'get' && found === false) return 'error' as const;\n if (stepData.operation === 'get' && found === true) return 'success' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-indigo-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">HashMap Operations</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Avg: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Worst: O(n)\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Bucket Array */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Bucket Array (capacity: {BUCKET_COUNT})\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {buckets.map((bucket, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-8 h-8 flex items-center justify-center text-xs font-medium rounded border-2 transition-colors ${getBucketStyle(idx)}`}\n >\n {idx}\n </div>\n {/* Entries chain */}\n <div className=\"flex flex-col items-center mt-1\">\n {bucket.entries.length > 0 ? (\n bucket.entries.map((entry, eIdx) => (\n <React.Fragment key={eIdx}>\n {eIdx > 0 && (\n <div className=\"w-0.5 h-2 bg-gray-300\" />\n )}\n <div\n className={`px-2 py-1 text-[10px] rounded transition-colors whitespace-nowrap ${getEntryStyle(idx, eIdx)}`}\n >\n {entry.key}: {entry.value}\n </div>\n </React.Fragment>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 mt-1\">∅</div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Hash Visualization */}\n {stepData.hash !== undefined && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600\">\n <span className=\"font-medium\">Hash Calculation:</span>\n <div className=\"mt-1 font-mono text-indigo-600\">\n hashCode(\"{stepData.key}\") = {stepData.hash}\n </div>\n <div className=\"font-mono text-purple-600\">\n {stepData.hash} % {BUCKET_COUNT} = {stepData.bucketIndex}\n </div>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={HASHMAP_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"indigo\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const HashMapVisualizer = React.memo(HashMapVisualizerComponent);\nexport default HashMapVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Plus } from 'lucide-react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface HashStep {\n operation: 'insert' | 'collision' | 'placed' | 'rehash' | 'done';\n key: string;\n hashValue: number;\n bucketIndex: number;\n buckets: (string | null)[][];\n probeIndex?: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n}\n\ninterface HashTableVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst INITIAL_SIZE = 7;\nconst LOAD_FACTOR_THRESHOLD = 0.7;\n\nconst SAMPLE_KEYS = [\n 'apple',\n 'banana',\n 'cherry',\n 'date',\n 'elderberry',\n 'fig',\n 'grape',\n];\n\n// Algorithm code snippets\nconst HASH_TABLE_CODE = [\n 'function insert(key):',\n ' hash = hashFunction(key)',\n ' index = hash % tableSize',\n ' if bucket[index] has collision:',\n ' chain to existing bucket',\n ' bucket[index].append(key)',\n ' if loadFactor > threshold:',\n ' rehash(newSize = size * 2)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-gray-50', label: 'Empty', border: '#d1d5db' },\n { color: 'bg-yellow-50', label: 'Hashing', border: '#facc15' },\n { color: 'bg-red-50', label: 'Collision', border: '#f87171' },\n { color: 'bg-green-50', label: 'Placed', border: '#4ade80' },\n];\n\nfunction simpleHash(key: string, size: number): number {\n let hash = 0;\n for (let i = 0; i < key.length; i++) {\n hash = (hash * 31 + key.charCodeAt(i)) % size;\n }\n return hash;\n}\n\nfunction generateHashSteps(keys: string[]): HashStep[] {\n const steps: HashStep[] = [];\n let buckets: (string | null)[][] = Array(INITIAL_SIZE)\n .fill(null)\n .map(() => []);\n let itemCount = 0;\n\n steps.push({\n operation: 'done',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Initialize hash table with ${INITIAL_SIZE} buckets (chaining)`,\n codeLine: -1,\n });\n\n for (const key of keys) {\n const currentSize = buckets.length;\n const hashValue = simpleHash(key, currentSize);\n const bucketIndex = hashValue;\n\n // Show hash calculation\n steps.push({\n operation: 'insert',\n key,\n hashValue,\n bucketIndex,\n buckets: buckets.map((b) => [...b]),\n description: `Insert \"${key}\": hash(\"${key}\") = ${hashValue}, index = ${hashValue} % ${currentSize} = ${bucketIndex}`,\n codeLine: 1,\n variables: {\n key: `\"${key}\"`,\n hash: hashValue,\n tableSize: currentSize,\n index: bucketIndex,\n },\n });\n\n // Check for collision\n if (buckets[bucketIndex].length > 0) {\n steps.push({\n operation: 'collision',\n key,\n hashValue,\n bucketIndex,\n buckets: buckets.map((b) => [...b]),\n description: `Collision at bucket ${bucketIndex}! Chain with existing: [${buckets[bucketIndex].join(', ')}]`,\n codeLine: 4,\n variables: {\n index: bucketIndex,\n existing: buckets[bucketIndex].length,\n },\n });\n }\n\n // Place the key\n buckets[bucketIndex].push(key);\n itemCount++;\n\n const loadFactor = itemCount / currentSize;\n steps.push({\n operation: 'placed',\n key,\n hashValue,\n bucketIndex,\n buckets: buckets.map((b) => [...b]),\n description: `Placed \"${key}\" in bucket ${bucketIndex}. Load factor: ${loadFactor.toFixed(2)}`,\n codeLine: 5,\n variables: {\n key: `\"${key}\"`,\n index: bucketIndex,\n loadFactor: loadFactor.toFixed(2),\n },\n });\n\n // Check if rehashing needed\n if (\n loadFactor > LOAD_FACTOR_THRESHOLD &&\n keys.indexOf(key) < keys.length - 1\n ) {\n const newSize = currentSize * 2 + 1; // Next odd number roughly double\n const newBuckets: (string | null)[][] = Array(newSize)\n .fill(null)\n .map(() => []);\n\n steps.push({\n operation: 'rehash',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Load factor ${loadFactor.toFixed(2)} > ${LOAD_FACTOR_THRESHOLD}. Rehashing to ${newSize} buckets...`,\n codeLine: 7,\n variables: {\n loadFactor: loadFactor.toFixed(2),\n threshold: LOAD_FACTOR_THRESHOLD,\n newSize,\n },\n });\n\n // Rehash all existing keys\n for (const bucket of buckets) {\n for (const existingKey of bucket) {\n if (existingKey) {\n const newHash = simpleHash(existingKey, newSize);\n newBuckets[newHash].push(existingKey);\n }\n }\n }\n\n buckets = newBuckets;\n\n steps.push({\n operation: 'done',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Rehashing complete! New size: ${newSize}, new load factor: ${(itemCount / newSize).toFixed(2)}`,\n codeLine: -1,\n variables: { newSize, newLoadFactor: (itemCount / newSize).toFixed(2) },\n });\n }\n }\n\n steps.push({\n operation: 'done',\n key: '',\n hashValue: 0,\n bucketIndex: -1,\n buckets: buckets.map((b) => [...b]),\n description: `Done! Inserted ${keys.length} keys. Final load factor: ${(itemCount / buckets.length).toFixed(2)}`,\n codeLine: -1,\n });\n\n return steps;\n}\n\nconst HashTableVisualizerComponent: React.FC<HashTableVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [speed, setSpeed] = useState(25); // Slower default\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<HashStep[]>([]);\n const [customKey, setCustomKey] = useState('');\n const [keys, setKeys] = useState<string[]>(SAMPLE_KEYS.slice(0, 5));\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initializeHash = useCallback(() => {\n const newSteps = generateHashSteps(keys);\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, [keys]);\n\n useEffect(() => {\n initializeHash();\n }, [initializeHash]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n // Slower: min 100ms, max 2000ms\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n // Keyboard shortcuts (P = play/pause, [ = back, ] = forward, R = reset)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n const handleAddKey = () => {\n if (customKey.trim() && !keys.includes(customKey.trim())) {\n setKeys([...keys, customKey.trim()]);\n setCustomKey('');\n }\n };\n\n const handleResetKeys = () => {\n setKeys(SAMPLE_KEYS.slice(0, 5));\n setCurrentStep(0);\n };\n\n const currentStepData = steps[currentStep] || {\n operation: 'done',\n buckets: [],\n bucketIndex: -1,\n key: '',\n };\n const { operation, buckets, bucketIndex, key } = currentStepData;\n\n const getBucketStyle = (index: number): string => {\n if (index === bucketIndex) {\n if (operation === 'collision') return 'border-red-400 bg-red-50';\n if (operation === 'placed') return 'border-green-400 bg-green-50';\n if (operation === 'insert') return 'border-yellow-400 bg-yellow-50';\n }\n return 'border-gray-300 bg-gray-50';\n };\n\n const getKeyStyle = (bucketKey: string | null): string => {\n if (\n bucketKey === key &&\n (operation === 'placed' || operation === 'insert')\n ) {\n return 'bg-yellow-200 text-yellow-900 border-yellow-400';\n }\n return 'bg-blue-100 text-blue-800 border-blue-300';\n };\n\n const currentDescription = steps[currentStep]?.description || '';\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-violet-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n Hash Table (Chaining)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-violet-100 text-violet-700 rounded\">\n Avg: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Worst: O(n)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Keys to insert */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Keys to insert:\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {keys.map((k, idx) => {\n const isInserted = steps\n .slice(0, currentStep + 1)\n .some((s) => s.key === k && s.operation === 'placed');\n return (\n <span\n key={idx}\n className={`px-2 py-1 text-xs rounded border ${\n isInserted\n ? 'bg-green-100 text-green-700 border-green-300'\n : k === key\n ? 'bg-yellow-100 text-yellow-700 border-yellow-300'\n : 'bg-gray-100 text-gray-600 border-gray-300'\n }`}\n >\n {k}\n </span>\n );\n })}\n </div>\n </div>\n\n {/* Hash Table Buckets */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Hash Table ({buckets.length} buckets):\n </div>\n <div\n className=\"grid gap-2\"\n style={{\n gridTemplateColumns: `repeat(auto-fill, minmax(120px, 1fr))`,\n }}\n >\n {buckets.map((bucket, idx) => (\n <div\n key={idx}\n className={`p-2 rounded border-2 min-h-[60px] transition-colors ${getBucketStyle(idx)}`}\n >\n <div className=\"text-xs font-mono text-gray-500 mb-1\">\n [{idx}]\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {bucket.length === 0 ? (\n <span className=\"text-xs text-gray-400 italic\">\n empty\n </span>\n ) : (\n bucket.map((bucketKey, keyIdx) => (\n <span\n key={keyIdx}\n className={`px-1.5 py-0.5 text-xs rounded border ${getKeyStyle(bucketKey)}`}\n >\n {bucketKey}\n </span>\n ))\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Hash Function Demo */}\n {operation === 'insert' && key && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-sm font-medium text-gray-700 mb-1\">\n Hash Calculation:\n </div>\n <div className=\"font-mono text-sm\">\n hash("{key}") mod {buckets.length} = {bucketIndex}\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={currentDescription}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n operation === 'collision'\n ? 'error'\n : operation === 'placed'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={HASH_TABLE_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"purple\"\n extraControls={\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={customKey}\n onChange={(e) => setCustomKey(e.target.value)}\n placeholder=\"Add key...\"\n className=\"px-2 py-1 text-sm border border-gray-300 rounded w-24 font-medium text-gray-900\"\n onKeyDown={(e) => e.key === 'Enter' && handleAddKey()}\n />\n <button\n onClick={handleAddKey}\n disabled={!customKey.trim()}\n className=\"p-1.5 bg-violet-100 text-violet-700 rounded hover:bg-violet-200 disabled:opacity-50\"\n >\n <Plus className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleResetKeys}\n className=\"px-2 py-1 text-xs bg-gray-200 text-gray-700 rounded hover:bg-gray-300\"\n >\n Reset\n </button>\n </div>\n }\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const HashTableVisualizer = React.memo(HashTableVisualizerComponent);\nexport default HashTableVisualizer;\n","import React, { useMemo, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface Node {\n value: number;\n id: number;\n}\n\ninterface LinkedListStep {\n operation:\n | 'addFirst'\n | 'addLast'\n | 'removeFirst'\n | 'removeLast'\n | 'get'\n | 'init'\n | 'done';\n value?: number;\n index?: number;\n nodes: Node[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightNode?: number;\n traverseProgress?: number;\n}\n\ninterface LinkedListVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{\n op: 'addFirst' | 'addLast' | 'removeFirst' | 'removeLast' | 'get';\n value?: number;\n index?: number;\n}> = [\n { op: 'addFirst', value: 10 },\n { op: 'addLast', value: 20 },\n { op: 'addLast', value: 30 },\n { op: 'addFirst', value: 5 },\n { op: 'addLast', value: 40 },\n { op: 'get', index: 2 },\n { op: 'removeFirst' },\n { op: 'removeLast' },\n { op: 'get', index: 1 },\n];\n\nconst LINKEDLIST_CODE = [\n 'class Node { value, next, prev }',\n '',\n 'addFirst(value):',\n ' node = new Node(value)',\n ' node.next = head',\n ' head.prev = node',\n ' head = node',\n '',\n 'addLast(value):',\n ' node = new Node(value)',\n ' tail.next = node',\n ' node.prev = tail',\n ' tail = node',\n '',\n 'get(index):',\n ' node = head',\n ' for i = 0 to index:',\n ' node = node.next',\n ' return node.value',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-white', label: 'Node', border: '#d1d5db' },\n { color: 'bg-blue-500', label: 'Active' },\n];\n\nlet nodeIdCounter = 0;\n\nfunction generateLinkedListSteps(): LinkedListStep[] {\n const steps: LinkedListStep[] = [];\n let nodes: Node[] = [];\n nodeIdCounter = 0;\n\n steps.push({\n operation: 'init',\n nodes: [],\n description:\n 'Initialize empty LinkedList (doubly-linked). O(1) for add/remove at ends, O(n) for indexed access.',\n codeLine: -1,\n });\n\n for (const { op, value, index } of OPERATIONS) {\n if (op === 'addFirst' && value !== undefined) {\n const newNode: Node = { value, id: nodeIdCounter++ };\n nodes = [newNode, ...nodes];\n\n steps.push({\n operation: 'addFirst',\n value,\n nodes: [...nodes],\n description: `addFirst(${value}): Create new node, link to old head, update head pointer → O(1)`,\n codeLine: 2,\n variables: { value, size: nodes.length },\n highlightNode: newNode.id,\n });\n } else if (op === 'addLast' && value !== undefined) {\n const newNode: Node = { value, id: nodeIdCounter++ };\n nodes = [...nodes, newNode];\n\n steps.push({\n operation: 'addLast',\n value,\n nodes: [...nodes],\n description: `addLast(${value}): Create new node, link from old tail, update tail pointer → O(1)`,\n codeLine: 8,\n variables: { value, size: nodes.length },\n highlightNode: newNode.id,\n });\n } else if (op === 'removeFirst') {\n const removed = nodes[0];\n nodes = nodes.slice(1);\n\n steps.push({\n operation: 'removeFirst',\n value: removed?.value,\n nodes: [...nodes],\n description: `removeFirst(): Remove head node (${removed?.value}), update head to next → O(1)`,\n codeLine: 2,\n variables: { removed: removed?.value ?? 'null', size: nodes.length },\n });\n } else if (op === 'removeLast') {\n const removed = nodes[nodes.length - 1];\n nodes = nodes.slice(0, -1);\n\n steps.push({\n operation: 'removeLast',\n value: removed?.value,\n nodes: [...nodes],\n description: `removeLast(): Remove tail node (${removed?.value}), update tail to prev → O(1)`,\n codeLine: 8,\n variables: { removed: removed?.value ?? 'null', size: nodes.length },\n });\n } else if (op === 'get' && index !== undefined) {\n // Show traversal\n for (let i = 0; i <= index && i < nodes.length; i++) {\n steps.push({\n operation: 'get',\n index,\n nodes: [...nodes],\n description:\n i < index\n ? `get(${index}): Traversing... at index ${i}, need to reach ${index}`\n : `get(${index}): Found! Value = ${nodes[i]?.value} after ${i + 1} steps → O(n)`,\n codeLine: i < index ? 16 : 17,\n variables: { index, current: i, value: nodes[i]?.value ?? 'null' },\n highlightNode: nodes[i]?.id,\n traverseProgress: i,\n });\n }\n }\n }\n\n steps.push({\n operation: 'done',\n nodes: [...nodes],\n description: `✓ Done! LinkedList has ${nodes.length} elements. Remember: O(1) ends, O(n) middle access.`,\n codeLine: -1,\n variables: { size: nodes.length },\n });\n\n return steps;\n}\n\nconst LinkedListVisualizerComponent: React.FC<LinkedListVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'linkedlist-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'linkedlist', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateLinkedListSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<LinkedListStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n nodes: [],\n description: '',\n };\n\n const { nodes, highlightNode, description } = stepData;\n\n const getStatusVariant = () => {\n if (stepData.operation === 'done') return 'success' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n LinkedList Operations\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700 rounded\">\n Ends: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-700 rounded\">\n Index: O(n)\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350} className={showCode ? 'flex-1' : 'w-full'}>\n {/* LinkedList Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Doubly-Linked List\n </div>\n <div className=\"bg-gray-50 rounded-lg p-4 overflow-x-auto\">\n {nodes.length > 0 ? (\n <div className=\"flex items-center gap-1 min-w-max\">\n <div className=\"text-xs text-gray-500 font-mono mr-2\">\n head →\n </div>\n {nodes.map((node, idx) => (\n <React.Fragment key={node.id}>\n <div\n className={`flex flex-col items-center transition-all ${\n node.id === highlightNode ? 'scale-110' : ''\n }`}\n >\n <div\n className={`w-12 h-12 flex items-center justify-center rounded-lg border-2 font-medium transition-colors ${\n node.id === highlightNode\n ? 'bg-blue-500 border-blue-600 text-white'\n : 'bg-white border-gray-300 text-gray-700'\n }`}\n >\n {node.value}\n </div>\n <div className=\"text-[10px] text-gray-400 mt-1\">\n idx:{idx}\n </div>\n </div>\n {idx < nodes.length - 1 && (\n <div className=\"flex items-center text-gray-400\">\n <span className=\"text-lg\">⇄</span>\n </div>\n )}\n </React.Fragment>\n ))}\n <div className=\"text-xs text-gray-500 font-mono ml-2\">\n ← tail\n </div>\n </div>\n ) : (\n <div className=\"h-16 flex items-center justify-center text-gray-400 text-sm\">\n Empty list (head = tail = null)\n </div>\n )}\n </div>\n </div>\n\n {/* Pointers Info */}\n {nodes.length > 0 && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600 flex gap-4\">\n <span>\n <span className=\"font-medium\">head:</span> {nodes[0]?.value}\n </span>\n <span>\n <span className=\"font-medium\">tail:</span>{' '}\n {nodes[nodes.length - 1]?.value}\n </span>\n <span>\n <span className=\"font-medium\">size:</span> {nodes.length}\n </span>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={LINKEDLIST_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"blue\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const LinkedListVisualizer = React.memo(LinkedListVisualizerComponent);\nexport default LinkedListVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface Entry {\n key: string;\n value: number;\n hash: number;\n prev: string | null;\n next: string | null;\n}\n\ninterface Bucket {\n entries: Entry[];\n}\n\ninterface LinkedHashMapStep {\n operation: 'init' | 'put' | 'get' | 'hash' | 'link' | 'access' | 'done';\n key: string;\n value?: number;\n hash?: number;\n bucketIndex?: number;\n buckets: Bucket[];\n linkedOrder: string[]; // Keys in insertion/access order\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightBucket?: number;\n highlightEntry?: { bucket: number; index: number };\n highlightLinkedKey?: string;\n found?: boolean;\n accessOrder?: boolean;\n}\n\ninterface LinkedHashMapVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst BUCKET_COUNT = 6;\n\nconst OPERATIONS: Array<{\n op: 'put' | 'get';\n key: string;\n value?: number;\n}> = [\n { op: 'put', key: 'A', value: 10 },\n { op: 'put', key: 'B', value: 20 },\n { op: 'put', key: 'C', value: 30 },\n { op: 'put', key: 'D', value: 40 },\n { op: 'get', key: 'A' }, // Access moves to end in access-order mode\n { op: 'put', key: 'E', value: 50 },\n { op: 'get', key: 'B' },\n { op: 'put', key: 'A', value: 15 }, // Update existing\n];\n\nconst LINKEDHASHMAP_CODE = [\n 'class LinkedHashMap<K,V> extends HashMap {',\n ' Entry<K,V> head, tail;',\n ' boolean accessOrder; // false=insertion',\n '',\n ' V put(K key, V value) {',\n ' Entry e = super.put(key, value);',\n ' if (e.isNew()) {',\n ' linkNodeLast(e); // Add to list end',\n ' } else if (accessOrder) {',\n ' moveToLast(e);',\n ' }',\n ' return e.value;',\n ' }',\n '',\n ' V get(K key) {',\n ' Entry e = super.get(key);',\n ' if (e != null && accessOrder) {',\n ' moveToLast(e); // LRU: move to end',\n ' }',\n ' return e != null ? e.value : null;',\n ' }',\n '}',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-50', label: 'Current bucket', border: '#60a5fa' },\n { color: 'bg-blue-500', label: 'Insert/Update' },\n { color: 'bg-green-400', label: 'Found' },\n { color: 'bg-orange-400', label: 'Linked list order' },\n];\n\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) & 0x7fffffff;\n }\n return hash;\n}\n\nfunction generateLinkedHashMapSteps(accessOrder = true): LinkedHashMapStep[] {\n const steps: LinkedHashMapStep[] = [];\n const buckets: Bucket[] = Array.from({ length: BUCKET_COUNT }, () => ({\n entries: [],\n }));\n const linkedOrder: string[] = [];\n const entryMap: Map<string, Entry> = new Map();\n\n // Initial state\n steps.push({\n operation: 'init',\n key: '',\n buckets: buckets.map((b) => ({ entries: [...b.entries] })),\n linkedOrder: [...linkedOrder],\n description: `Initialize LinkedHashMap with ${BUCKET_COUNT} buckets. Mode: ${accessOrder ? 'Access-order (LRU)' : 'Insertion-order'}`,\n codeLine: 0,\n accessOrder,\n });\n\n for (const { op, key, value } of OPERATIONS) {\n const hash = simpleHash(key);\n const index = hash % BUCKET_COUNT;\n\n if (op === 'put') {\n // Step 1: Calculate hash\n steps.push({\n operation: 'hash',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `put(\"${key}\", ${value}): hash = ${hash}, bucket = ${index}`,\n codeLine: 5,\n variables: { key: `\"${key}\"`, hash, bucket: index },\n highlightBucket: index,\n accessOrder,\n });\n\n // Check for existing key\n const existingBucketIdx = buckets[index].entries.findIndex(\n (e) => e.key === key\n );\n\n if (existingBucketIdx >= 0) {\n // Update existing\n const oldValue = buckets[index].entries[existingBucketIdx].value;\n buckets[index].entries[existingBucketIdx].value = value ?? 0;\n\n if (accessOrder) {\n // Move to end of linked list\n const linkedIdx = linkedOrder.indexOf(key);\n if (linkedIdx !== -1) {\n linkedOrder.splice(linkedIdx, 1);\n linkedOrder.push(key);\n }\n\n steps.push({\n operation: 'access',\n key,\n value,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Update \"${key}\": ${oldValue} → ${value}. Access-order: move to end`,\n codeLine: 9,\n variables: { key: `\"${key}\"`, old: oldValue, new: value ?? 0 },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: existingBucketIdx },\n highlightLinkedKey: key,\n accessOrder,\n });\n } else {\n steps.push({\n operation: 'put',\n key,\n value,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Update \"${key}\": ${oldValue} → ${value}. Insertion-order: position unchanged`,\n codeLine: 6,\n variables: { key: `\"${key}\"`, old: oldValue, new: value ?? 0 },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: existingBucketIdx },\n accessOrder,\n });\n }\n } else {\n // Add new entry\n const newEntry: Entry = {\n key,\n value: value ?? 0,\n hash,\n prev: linkedOrder.length > 0 ? linkedOrder[linkedOrder.length - 1] : null,\n next: null,\n };\n\n // Update previous tail's next pointer\n if (linkedOrder.length > 0) {\n const prevKey = linkedOrder[linkedOrder.length - 1];\n const prevEntry = entryMap.get(prevKey);\n if (prevEntry) {\n prevEntry.next = key;\n }\n }\n\n buckets[index].entries.push(newEntry);\n linkedOrder.push(key);\n entryMap.set(key, newEntry);\n\n steps.push({\n operation: 'link',\n key,\n value,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Add \"${key}\" to bucket ${index} and link to end of list`,\n codeLine: 7,\n variables: {\n key: `\"${key}\"`,\n value: value ?? 0,\n prev: newEntry.prev || 'null',\n },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: buckets[index].entries.length - 1 },\n highlightLinkedKey: key,\n accessOrder,\n });\n }\n } else {\n // GET operation\n steps.push({\n operation: 'hash',\n key,\n hash,\n bucketIndex: index,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `get(\"${key}\"): hash = ${hash}, bucket = ${index}`,\n codeLine: 15,\n variables: { key: `\"${key}\"`, hash, bucket: index },\n highlightBucket: index,\n accessOrder,\n });\n\n const foundIdx = buckets[index].entries.findIndex((e) => e.key === key);\n\n if (foundIdx >= 0) {\n const foundValue = buckets[index].entries[foundIdx].value;\n\n if (accessOrder) {\n // Move to end of linked list\n const linkedIdx = linkedOrder.indexOf(key);\n if (linkedIdx !== -1 && linkedIdx !== linkedOrder.length - 1) {\n linkedOrder.splice(linkedIdx, 1);\n linkedOrder.push(key);\n }\n\n steps.push({\n operation: 'access',\n key,\n value: foundValue,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Found \"${key}\" = ${foundValue}. Access-order: move to end (LRU)`,\n codeLine: 17,\n variables: { key: `\"${key}\"`, value: foundValue },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: foundIdx },\n highlightLinkedKey: key,\n found: true,\n accessOrder,\n });\n } else {\n steps.push({\n operation: 'get',\n key,\n value: foundValue,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Found \"${key}\" = ${foundValue}`,\n codeLine: 19,\n variables: { key: `\"${key}\"`, value: foundValue },\n highlightBucket: index,\n highlightEntry: { bucket: index, index: foundIdx },\n found: true,\n accessOrder,\n });\n }\n } else {\n steps.push({\n operation: 'get',\n key,\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `Key \"${key}\" not found → null`,\n codeLine: 19,\n variables: { key: `\"${key}\"`, result: 'null' },\n highlightBucket: index,\n found: false,\n accessOrder,\n });\n }\n }\n }\n\n // Final state\n const totalEntries = buckets.reduce((sum, b) => sum + b.entries.length, 0);\n steps.push({\n operation: 'done',\n key: '',\n buckets: buckets.map((b) => ({\n entries: b.entries.map((e) => ({ ...e })),\n })),\n linkedOrder: [...linkedOrder],\n description: `✓ Done! ${totalEntries} entries. Iteration order: ${linkedOrder.join(' → ')}`,\n codeLine: -1,\n variables: { size: totalEntries },\n accessOrder,\n });\n\n return steps;\n}\n\nconst LinkedHashMapVisualizerComponent: React.FC<LinkedHashMapVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'linkedhashmap-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'linkedhashmap', scrollToId: VISUALIZER_ID });\n\n const [accessOrder, setAccessOrder] = useState(true);\n\n const generateSteps = useMemo(\n () => () => generateLinkedHashMapSteps(accessOrder),\n [accessOrder]\n );\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<LinkedHashMapStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n key: '',\n buckets: [],\n linkedOrder: [],\n description: '',\n };\n\n const {\n buckets,\n linkedOrder,\n highlightBucket,\n highlightEntry,\n highlightLinkedKey,\n description,\n found,\n } = stepData;\n\n const toggleAccessOrder = useCallback(() => {\n setAccessOrder((prev) => !prev);\n }, []);\n\n const getBucketStyle = (index: number): string => {\n if (index === highlightBucket) {\n if (stepData.operation === 'get') {\n return found\n ? 'border-green-400 bg-green-50'\n : 'border-red-400 bg-red-50';\n }\n return 'border-blue-400 bg-blue-50';\n }\n return 'border-gray-200 bg-gray-50';\n };\n\n const getEntryStyle = (bucketIdx: number, entryIdx: number): string => {\n if (\n highlightEntry &&\n highlightEntry.bucket === bucketIdx &&\n highlightEntry.index === entryIdx\n ) {\n if (stepData.operation === 'get' && found) {\n return 'bg-green-400 text-white';\n }\n if (stepData.operation === 'access') {\n return 'bg-orange-400 text-white';\n }\n return 'bg-blue-500 text-white';\n }\n return 'bg-white border border-gray-300 text-gray-700';\n };\n\n const getLinkedNodeStyle = (key: string): string => {\n if (key === highlightLinkedKey) {\n return 'bg-orange-400 text-white ring-2 ring-orange-300';\n }\n return 'bg-orange-100 text-orange-700';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'get' && found === false) return 'error' as const;\n if (stepData.operation === 'get' && found === true) return 'success' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-orange-50 to-amber-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">LinkedHashMap</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n O(1) ops\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-700 rounded\">\n Ordered\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleAccessOrder}\n className={`px-3 py-1 text-xs font-medium rounded transition-colors ${\n accessOrder\n ? 'bg-orange-500 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n {accessOrder ? 'Access-Order (LRU)' : 'Insertion-Order'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Dual Structure Info */}\n <div className=\"mb-3 p-2 bg-amber-50 rounded text-xs text-amber-700\">\n <strong>Dual structure:</strong> Hash table (O(1) lookup) + Doubly-linked list (ordered iteration)\n </div>\n\n {/* Bucket Array */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Hash Table ({BUCKET_COUNT} buckets)\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {buckets.map((bucket, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-8 h-8 flex items-center justify-center text-xs font-medium rounded border-2 transition-colors ${getBucketStyle(idx)}`}\n >\n {idx}\n </div>\n <div className=\"flex flex-col items-center mt-1\">\n {bucket.entries.length > 0 ? (\n bucket.entries.map((entry, eIdx) => (\n <React.Fragment key={eIdx}>\n {eIdx > 0 && (\n <div className=\"w-0.5 h-1 bg-gray-300\" />\n )}\n <div\n className={`px-2 py-0.5 text-[10px] rounded transition-colors whitespace-nowrap ${getEntryStyle(idx, eIdx)}`}\n >\n {entry.key}:{entry.value}\n </div>\n </React.Fragment>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 mt-1\">∅</div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Linked List Order */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n {accessOrder ? 'Access Order (LRU: oldest → newest)' : 'Insertion Order'}\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n {linkedOrder.length > 0 ? (\n <>\n <span className=\"text-[10px] text-gray-500\">HEAD →</span>\n {linkedOrder.map((key, idx) => (\n <React.Fragment key={key}>\n {idx > 0 && (\n <span className=\"text-orange-400\">→</span>\n )}\n <div\n className={`px-2 py-0.5 text-xs font-medium rounded transition-all ${getLinkedNodeStyle(key)}`}\n >\n {key}\n </div>\n </React.Fragment>\n ))}\n <span className=\"text-[10px] text-gray-500\">→ TAIL</span>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 italic\">Empty list</span>\n )}\n </div>\n </div>\n\n {/* LRU Cache Example */}\n {accessOrder && (\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-blue-700\">\n <strong>LRU Cache Usage:</strong>\n <div className=\"mt-1 text-[11px]\">\n {linkedOrder.length > 0 ? (\n <>\n Least Recently Used: <strong>{linkedOrder[0]}</strong> |\n Most Recently Used: <strong>{linkedOrder[linkedOrder.length - 1]}</strong>\n </>\n ) : (\n 'Cache empty'\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={LINKEDHASHMAP_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const LinkedHashMapVisualizer = React.memo(LinkedHashMapVisualizerComponent);\nexport default LinkedHashMapVisualizer;\n","import React, { useMemo, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface ArrayListStep {\n operation: 'add' | 'addAt' | 'get' | 'remove' | 'resize' | 'init' | 'done';\n value?: number;\n index?: number;\n array: (number | null)[];\n size: number;\n capacity: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n shiftIndices?: number[];\n}\n\ninterface ArrayListVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst INITIAL_CAPACITY = 4;\n\nconst OPERATIONS: Array<{\n op: 'add' | 'addAt' | 'get' | 'remove';\n value?: number;\n index?: number;\n}> = [\n { op: 'add', value: 10 },\n { op: 'add', value: 20 },\n { op: 'add', value: 30 },\n { op: 'add', value: 40 },\n { op: 'add', value: 50 }, // Triggers resize\n { op: 'get', index: 2 },\n { op: 'addAt', value: 25, index: 2 },\n { op: 'remove', index: 1 },\n { op: 'get', index: 0 },\n];\n\nconst ARRAYLIST_CODE = [\n 'add(value):',\n ' if size == capacity:',\n ' resize(capacity * 2)',\n ' array[size] = value',\n ' size++',\n '',\n 'add(index, value):',\n ' shift elements right',\n ' array[index] = value',\n ' size++',\n '',\n 'get(index):',\n ' return array[index] // O(1)',\n '',\n 'remove(index):',\n ' shift elements left',\n ' size--',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-white border-gray-300', label: 'Used', border: '#d1d5db' },\n { color: 'bg-gray-100', label: 'Empty' },\n { color: 'bg-orange-500', label: 'Active' },\n { color: 'bg-yellow-200', label: 'Shifted', border: '#fbbf24' },\n];\n\nfunction generateArrayListSteps(): ArrayListStep[] {\n const steps: ArrayListStep[] = [];\n let array: (number | null)[] = new Array(INITIAL_CAPACITY).fill(null);\n let size = 0;\n let capacity = INITIAL_CAPACITY;\n\n steps.push({\n operation: 'init',\n array: [...array],\n size: 0,\n capacity,\n description: `Initialize ArrayList with capacity ${capacity}. Auto-grows when full (amortized O(1) add).`,\n codeLine: -1,\n });\n\n for (const { op, value, index } of OPERATIONS) {\n if (op === 'add' && value !== undefined) {\n if (size === capacity) {\n const oldCapacity = capacity;\n capacity *= 2;\n const newArray: (number | null)[] = new Array(capacity).fill(null);\n for (let i = 0; i < size; i++) {\n newArray[i] = array[i];\n }\n array = newArray;\n\n steps.push({\n operation: 'resize',\n array: [...array],\n size,\n capacity,\n description: `Resize! Array full (${oldCapacity}/${oldCapacity}). Create new array with capacity ${capacity}, copy elements → O(n)`,\n codeLine: 2,\n variables: { oldCapacity, newCapacity: capacity, copied: size },\n });\n }\n\n array[size] = value;\n size++;\n\n steps.push({\n operation: 'add',\n value,\n array: [...array],\n size,\n capacity,\n description: `add(${value}): Place at index ${size - 1} → O(1) amortized`,\n codeLine: 3,\n variables: { value, index: size - 1, size },\n highlightIndex: size - 1,\n });\n } else if (op === 'addAt' && value !== undefined && index !== undefined) {\n const shiftIndices: number[] = [];\n for (let i = size; i > index; i--) {\n array[i] = array[i - 1];\n shiftIndices.push(i);\n }\n\n steps.push({\n operation: 'addAt',\n value,\n index,\n array: [...array],\n size,\n capacity,\n description: `add(${index}, ${value}): Shift ${size - index} elements right to make room → O(n)`,\n codeLine: 7,\n variables: { index, shifted: size - index },\n shiftIndices,\n });\n\n array[index] = value;\n size++;\n\n steps.push({\n operation: 'addAt',\n value,\n index,\n array: [...array],\n size,\n capacity,\n description: `add(${index}, ${value}): Insert value at index ${index}`,\n codeLine: 8,\n variables: { value, index, size },\n highlightIndex: index,\n });\n } else if (op === 'get' && index !== undefined) {\n steps.push({\n operation: 'get',\n index,\n value: array[index] ?? undefined,\n array: [...array],\n size,\n capacity,\n description: `get(${index}): Direct access → ${array[index]} in O(1)`,\n codeLine: 11,\n variables: { index, value: array[index] ?? 'null' },\n highlightIndex: index,\n });\n } else if (op === 'remove' && index !== undefined) {\n const removed = array[index];\n const shiftIndices: number[] = [];\n for (let i = index; i < size - 1; i++) {\n array[i] = array[i + 1];\n shiftIndices.push(i);\n }\n array[size - 1] = null;\n size--;\n\n steps.push({\n operation: 'remove',\n index,\n value: removed ?? undefined,\n array: [...array],\n size,\n capacity,\n description: `remove(${index}): Removed ${removed}, shifted ${shiftIndices.length} elements left → O(n)`,\n codeLine: 14,\n variables: {\n index,\n removed: removed ?? 'null',\n shifted: shiftIndices.length,\n },\n shiftIndices,\n });\n }\n }\n\n steps.push({\n operation: 'done',\n array: [...array],\n size,\n capacity,\n description: `✓ Done! ArrayList: size=${size}, capacity=${capacity}. O(1) get, O(1) amortized add, O(n) insert/remove.`,\n codeLine: -1,\n variables: { size, capacity },\n });\n\n return steps;\n}\n\nconst ArrayListVisualizerComponent: React.FC<ArrayListVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'arraylist-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'arraylist', scrollToId: VISUALIZER_ID });\n\n const generateSteps = useMemo(() => generateArrayListSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<ArrayListStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n array: [],\n size: 0,\n capacity: INITIAL_CAPACITY,\n description: '',\n };\n\n const { array, size, capacity, highlightIndex, shiftIndices, description } =\n stepData;\n\n const getCellStyle = (idx: number): string => {\n if (idx === highlightIndex) {\n return 'bg-orange-500 border-orange-600 text-white';\n }\n if (shiftIndices?.includes(idx)) {\n return 'bg-yellow-200 border-yellow-400 text-yellow-800';\n }\n if (idx < size) {\n return 'bg-white border-gray-300 text-gray-700';\n }\n return 'bg-gray-100 border-gray-200 text-gray-300';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'resize') return 'error' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-orange-50 to-amber-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n ArrayList Operations\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n Get: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-amber-100 text-amber-700 rounded\">\n Add: O(1)*\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Array Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Internal Array (capacity: {capacity})\n </div>\n <div className=\"bg-gray-50 rounded-lg p-4 overflow-x-auto\">\n <div className=\"flex gap-1 min-w-max\">\n {array.map((val, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-12 h-12 flex items-center justify-center rounded border-2 font-medium transition-all ${getCellStyle(idx)}`}\n >\n {val !== null ? val : ''}\n </div>\n <div className=\"text-[10px] text-gray-400 mt-1\">\n [{idx}]\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Size/Capacity Info */}\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"flex gap-6 text-xs\">\n <div>\n <span className=\"font-medium text-gray-700\">size:</span>{' '}\n <span className=\"text-orange-600 font-mono\">{size}</span>\n </div>\n <div>\n <span className=\"font-medium text-gray-700\">capacity:</span>{' '}\n <span className=\"text-amber-600 font-mono\">{capacity}</span>\n </div>\n <div>\n <span className=\"font-medium text-gray-700\">load:</span>{' '}\n <span className=\"font-mono\">\n {Math.round((size / capacity) * 100)}%\n </span>\n </div>\n </div>\n <div className=\"mt-2 h-2 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-orange-500 transition-all\"\n style={{ width: `${(size / capacity) * 100}%` }}\n />\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ARRAYLIST_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"orange\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ArrayListVisualizer = React.memo(ArrayListVisualizerComponent);\nexport default ArrayListVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\ninterface ArrayDequeStep {\n operation:\n | 'init'\n | 'addFirst'\n | 'addLast'\n | 'removeFirst'\n | 'removeLast'\n | 'resize'\n | 'done';\n value?: number;\n array: (number | null)[];\n head: number;\n tail: number;\n capacity: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n highlightType?: 'add' | 'remove' | 'head' | 'tail';\n resizing?: boolean;\n}\n\ninterface ArrayDequeVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst INITIAL_CAPACITY = 8;\n\nconst OPERATIONS: Array<{\n op: 'addFirst' | 'addLast' | 'removeFirst' | 'removeLast';\n value?: number;\n}> = [\n { op: 'addLast', value: 10 },\n { op: 'addLast', value: 20 },\n { op: 'addFirst', value: 5 },\n { op: 'addLast', value: 30 },\n { op: 'addFirst', value: 1 },\n { op: 'removeFirst' },\n { op: 'removeLast' },\n { op: 'addLast', value: 40 },\n { op: 'addLast', value: 50 },\n { op: 'addFirst', value: 0 },\n { op: 'addLast', value: 60 }, // May trigger resize\n];\n\nconst ARRAYDEQUE_CODE = [\n 'class ArrayDeque<E> {',\n ' E[] elements;',\n ' int head = 0, tail = 0;',\n '',\n ' void addFirst(E e) {',\n ' head = (head - 1) & (capacity - 1);',\n ' elements[head] = e;',\n ' if (head == tail) grow();',\n ' }',\n '',\n ' void addLast(E e) {',\n ' elements[tail] = e;',\n ' tail = (tail + 1) & (capacity - 1);',\n ' if (head == tail) grow();',\n ' }',\n '',\n ' E removeFirst() {',\n ' E e = elements[head];',\n ' elements[head] = null;',\n ' head = (head + 1) & (capacity - 1);',\n ' return e;',\n ' }',\n '',\n ' E removeLast() {',\n ' tail = (tail - 1) & (capacity - 1);',\n ' E e = elements[tail];',\n ' elements[tail] = null;',\n ' return e;',\n ' }',\n '}',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-teal-500', label: 'Head pointer' },\n { color: 'bg-violet-500', label: 'Tail pointer' },\n { color: 'bg-green-400', label: 'Added element' },\n { color: 'bg-red-400', label: 'Removed element' },\n { color: 'bg-yellow-200', label: 'Resize' },\n];\n\nfunction generateArrayDequeSteps(): ArrayDequeStep[] {\n const steps: ArrayDequeStep[] = [];\n let array: (number | null)[] = new Array(INITIAL_CAPACITY).fill(null);\n let head = 0;\n let tail = 0;\n let capacity = INITIAL_CAPACITY;\n\n const getSize = () => (tail - head + capacity) % capacity;\n\n // Initial state\n steps.push({\n operation: 'init',\n array: [...array],\n head,\n tail,\n capacity,\n description: `Initialize ArrayDeque with capacity ${capacity}. Circular buffer: head and tail wrap around.`,\n codeLine: 0,\n variables: { head, tail, capacity, size: 0 },\n });\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'addFirst' && value !== undefined) {\n // Check if resize needed\n if (getSize() === capacity - 1) {\n const oldCapacity = capacity;\n const newCapacity = capacity * 2;\n const newArray: (number | null)[] = new Array(newCapacity).fill(null);\n\n // Copy elements in order\n let idx = 0;\n let i = head;\n while (i !== tail) {\n newArray[idx++] = array[i];\n i = (i + 1) % capacity;\n }\n\n array = newArray;\n head = 0;\n tail = idx;\n capacity = newCapacity;\n\n steps.push({\n operation: 'resize',\n array: [...array],\n head,\n tail,\n capacity,\n description: `Resize: ${oldCapacity} → ${newCapacity}. Elements copied in order, head reset to 0.`,\n codeLine: 7,\n variables: { oldCapacity, newCapacity, size: getSize() },\n resizing: true,\n });\n }\n\n // Decrement head (wrap around)\n head = (head - 1 + capacity) % capacity;\n array[head] = value;\n\n steps.push({\n operation: 'addFirst',\n value,\n array: [...array],\n head,\n tail,\n capacity,\n description: `addFirst(${value}): head = (${(head + 1) % capacity} - 1) % ${capacity} = ${head}`,\n codeLine: 5,\n variables: { value, head, tail, size: getSize() },\n highlightIndex: head,\n highlightType: 'add',\n });\n } else if (op === 'addLast' && value !== undefined) {\n // Check if resize needed\n if (getSize() === capacity - 1) {\n const oldCapacity = capacity;\n const newCapacity = capacity * 2;\n const newArray: (number | null)[] = new Array(newCapacity).fill(null);\n\n // Copy elements in order\n let idx = 0;\n let i = head;\n while (i !== tail) {\n newArray[idx++] = array[i];\n i = (i + 1) % capacity;\n }\n\n array = newArray;\n head = 0;\n tail = idx;\n capacity = newCapacity;\n\n steps.push({\n operation: 'resize',\n array: [...array],\n head,\n tail,\n capacity,\n description: `Resize: ${oldCapacity} → ${newCapacity}. Elements copied in order, head reset to 0.`,\n codeLine: 13,\n variables: { oldCapacity, newCapacity, size: getSize() },\n resizing: true,\n });\n }\n\n array[tail] = value;\n const oldTail = tail;\n tail = (tail + 1) % capacity;\n\n steps.push({\n operation: 'addLast',\n value,\n array: [...array],\n head,\n tail,\n capacity,\n description: `addLast(${value}): elements[${oldTail}] = ${value}, tail = (${oldTail} + 1) % ${capacity} = ${tail}`,\n codeLine: 11,\n variables: { value, head, tail, size: getSize() },\n highlightIndex: oldTail,\n highlightType: 'add',\n });\n } else if (op === 'removeFirst') {\n if (head === tail) {\n steps.push({\n operation: 'removeFirst',\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeFirst(): Deque is empty!`,\n codeLine: 16,\n variables: { head, tail, size: 0 },\n });\n continue;\n }\n\n const removed = array[head];\n array[head] = null;\n const oldHead = head;\n head = (head + 1) % capacity;\n\n steps.push({\n operation: 'removeFirst',\n value: removed ?? undefined,\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeFirst(): removed ${removed} from index ${oldHead}, head = ${head}`,\n codeLine: 17,\n variables: { removed: removed ?? 'null', head, tail, size: getSize() },\n highlightIndex: oldHead,\n highlightType: 'remove',\n });\n } else if (op === 'removeLast') {\n if (head === tail) {\n steps.push({\n operation: 'removeLast',\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeLast(): Deque is empty!`,\n codeLine: 23,\n variables: { head, tail, size: 0 },\n });\n continue;\n }\n\n tail = (tail - 1 + capacity) % capacity;\n const removed = array[tail];\n array[tail] = null;\n\n steps.push({\n operation: 'removeLast',\n value: removed ?? undefined,\n array: [...array],\n head,\n tail,\n capacity,\n description: `removeLast(): tail = ${tail}, removed ${removed}`,\n codeLine: 24,\n variables: { removed: removed ?? 'null', head, tail, size: getSize() },\n highlightIndex: tail,\n highlightType: 'remove',\n });\n }\n }\n\n // Final state\n steps.push({\n operation: 'done',\n array: [...array],\n head,\n tail,\n capacity,\n description: `✓ Done! Size: ${getSize()}, Capacity: ${capacity}. O(1) for all operations!`,\n codeLine: -1,\n variables: { size: getSize(), capacity, head, tail },\n });\n\n return steps;\n}\n\nconst ArrayDequeVisualizerComponent: React.FC<ArrayDequeVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'arraydeque-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'arraydeque', scrollToId: VISUALIZER_ID });\n\n const [showCircular, setShowCircular] = useState(true);\n const generateSteps = useMemo(() => generateArrayDequeSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<ArrayDequeStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n array: [],\n head: 0,\n tail: 0,\n capacity: INITIAL_CAPACITY,\n description: '',\n };\n\n const { array, head, tail, capacity, highlightIndex, highlightType, description, resizing } =\n stepData;\n\n const toggleCircular = useCallback(() => {\n setShowCircular((prev) => !prev);\n }, []);\n\n const getCellStyle = (index: number): string => {\n const isHead = index === head;\n const isTail = index === tail;\n const isHighlighted = index === highlightIndex;\n const hasValue = array[index] !== null;\n\n let baseStyle = 'border-2 transition-all duration-200 ';\n\n if (resizing) {\n baseStyle += 'bg-yellow-100 border-yellow-400 ';\n } else if (isHighlighted) {\n if (highlightType === 'add') {\n baseStyle += 'bg-green-400 border-green-500 text-white ';\n } else if (highlightType === 'remove') {\n baseStyle += 'bg-red-400 border-red-500 text-white ';\n }\n } else if (hasValue) {\n baseStyle += 'bg-blue-100 border-blue-300 ';\n } else {\n baseStyle += 'bg-gray-100 border-gray-200 ';\n }\n\n // Add head/tail indicator\n if (isHead && isTail && head !== tail) {\n baseStyle += 'ring-2 ring-purple-500 ';\n } else if (isHead) {\n baseStyle += 'ring-2 ring-teal-500 ';\n } else if (isTail) {\n baseStyle += 'ring-2 ring-violet-500 ';\n }\n\n return baseStyle;\n };\n\n // Calculate logical order for display\n const getLogicalElements = (): (number | null)[] => {\n const result: (number | null)[] = [];\n let i = head;\n while (i !== tail) {\n result.push(array[i]);\n i = (i + 1) % capacity;\n }\n return result;\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'resize') return 'warning' as const;\n if (stepData.operation === 'done') return 'success' as const;\n if (highlightType === 'remove') return 'error' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-teal-50 to-violet-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">ArrayDeque</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-teal-100 text-teal-700 rounded\">\n O(1) all ops\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-violet-100 text-violet-700 rounded\">\n Circular buffer\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleCircular}\n className={`px-3 py-1 text-xs font-medium rounded transition-colors ${\n showCircular\n ? 'bg-teal-500 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n {showCircular ? 'Circular View' : 'Linear View'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={450} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Array visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Internal Array (capacity: {capacity})\n </div>\n\n {showCircular ? (\n /* Circular view */\n <div className=\"flex justify-center mb-4\">\n <div className=\"relative w-64 h-64\">\n {array.map((val, idx) => {\n const angle = (idx / capacity) * 2 * Math.PI - Math.PI / 2;\n const radius = 100;\n const x = 128 + radius * Math.cos(angle);\n const y = 128 + radius * Math.sin(angle);\n\n return (\n <div\n key={idx}\n className={`absolute w-10 h-10 -ml-5 -mt-5 rounded flex flex-col items-center justify-center text-xs font-medium ${getCellStyle(idx)}`}\n style={{ left: x, top: y }}\n >\n <span className=\"text-[8px] text-gray-400\">{idx}</span>\n <span>{val ?? '∅'}</span>\n </div>\n );\n })}\n {/* Center info */}\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-xs\">\n <div className=\"text-teal-600\">H: {head}</div>\n <div className=\"text-violet-600\">T: {tail}</div>\n </div>\n </div>\n </div>\n ) : (\n /* Linear view */\n <div className=\"flex flex-wrap gap-1 mb-4\">\n {array.map((val, idx) => (\n <div key={idx} className=\"flex flex-col items-center\">\n <div\n className={`w-10 h-10 rounded flex flex-col items-center justify-center text-xs font-medium ${getCellStyle(idx)}`}\n >\n <span className=\"text-[8px] text-gray-400\">{idx}</span>\n <span>{val ?? '∅'}</span>\n </div>\n <div className=\"text-[9px] text-gray-500 mt-0.5\">\n {idx === head && idx === tail\n ? 'H/T'\n : idx === head\n ? 'H'\n : idx === tail\n ? 'T'\n : ''}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Logical order */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-xs text-gray-600 mb-2\">\n <span className=\"font-medium\">Logical Order (front → back):</span>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n {getLogicalElements().length > 0 ? (\n <>\n <span className=\"text-[10px] text-teal-600\">FRONT →</span>\n {getLogicalElements().map((val, idx) => (\n <React.Fragment key={idx}>\n {idx > 0 && <span className=\"text-gray-400\">→</span>}\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700 rounded\">\n {val}\n </span>\n </React.Fragment>\n ))}\n <span className=\"text-[10px] text-violet-600\">→ BACK</span>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 italic\">Empty deque</span>\n )}\n </div>\n </div>\n\n {/* Pointer arithmetic explanation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-blue-700\">\n <strong>Circular indexing:</strong>\n <div className=\"mt-1 font-mono text-[11px] space-y-1\">\n <div>next = (index + 1) & (capacity - 1)</div>\n <div>prev = (index - 1) & (capacity - 1)</div>\n </div>\n <div className=\"mt-1 text-[10px] text-blue-600\">\n Bitwise AND for power-of-2 capacity (faster than modulo)\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ARRAYDEQUE_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"teal\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ArrayDequeVisualizer = React.memo(ArrayDequeVisualizerComponent);\nexport default ArrayDequeVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n VisualizationArea,\n} from '../shared';\n\ninterface TreeNode {\n value: number;\n left: TreeNode | null;\n right: TreeNode | null;\n x?: number;\n y?: number;\n}\n\ninterface TreeSetStep {\n operation: 'add' | 'contains' | 'traverse' | 'init' | 'done';\n value?: number;\n tree: TreeNode | null;\n path: number[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n found?: boolean;\n currentNode?: number;\n traversalOrder?: number[];\n}\n\ninterface TreeSetVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{ op: 'add' | 'contains'; value: number }> = [\n { op: 'add', value: 50 },\n { op: 'add', value: 30 },\n { op: 'add', value: 70 },\n { op: 'add', value: 20 },\n { op: 'add', value: 40 },\n { op: 'add', value: 60 },\n { op: 'add', value: 80 },\n { op: 'contains', value: 40 },\n { op: 'contains', value: 55 },\n { op: 'add', value: 35 },\n];\n\nconst TREESET_CODE = [\n 'function add(value):',\n ' if root == null:',\n ' root = new Node(value)',\n ' return',\n ' node = root',\n ' while true:',\n ' if value < node.value:',\n ' if node.left == null:',\n ' node.left = new Node(value)',\n ' return',\n ' node = node.left',\n ' else if value > node.value:',\n ' if node.right == null:',\n ' node.right = new Node(value)',\n ' return',\n ' node = node.right',\n ' else: return // duplicate',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-yellow-100', label: 'Path', border: '#facc15' },\n { color: 'bg-blue-500', label: 'Current/Insert' },\n { color: 'bg-green-500', label: 'Found' },\n { color: 'bg-red-500', label: 'Not found' },\n];\n\nfunction cloneTree(node: TreeNode | null): TreeNode | null {\n if (!node) return null;\n return {\n value: node.value,\n left: cloneTree(node.left),\n right: cloneTree(node.right),\n };\n}\n\nfunction insertNode(root: TreeNode | null, value: number): TreeNode {\n if (!root) {\n return { value, left: null, right: null };\n }\n if (value < root.value) {\n root.left = insertNode(root.left, value);\n } else if (value > root.value) {\n root.right = insertNode(root.right, value);\n }\n return root;\n}\n\nfunction findPath(root: TreeNode | null, value: number): number[] {\n const path: number[] = [];\n let current = root;\n while (current) {\n path.push(current.value);\n if (value === current.value) break;\n if (value < current.value) {\n current = current.left;\n } else {\n current = current.right;\n }\n }\n return path;\n}\n\nfunction generateTreeSetSteps(): TreeSetStep[] {\n const steps: TreeSetStep[] = [];\n let tree: TreeNode | null = null;\n\n steps.push({\n operation: 'init',\n tree: null,\n path: [],\n description:\n 'Initialize empty TreeSet (Binary Search Tree). Values are stored in sorted order.',\n codeLine: -1,\n });\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'add') {\n const path = tree ? findPath(tree, value) : [];\n\n // Step: Show traversal path\n if (tree) {\n steps.push({\n operation: 'add',\n value,\n tree: cloneTree(tree),\n path: path,\n description: `add(${value}): Searching for insert position... ${path.length > 0 ? `Path: ${path.join(' → ')}` : ''}`,\n codeLine: 5,\n variables: { value, current: path[path.length - 1] || 'null' },\n currentNode: path[path.length - 1],\n });\n }\n\n // Insert the value\n tree = insertNode(tree, value);\n const newPath = findPath(tree, value);\n\n const isRoot = newPath.length === 1;\n const direction =\n newPath.length > 1\n ? value < newPath[newPath.length - 2]\n ? 'left'\n : 'right'\n : '';\n\n steps.push({\n operation: 'add',\n value,\n tree: cloneTree(tree),\n path: newPath,\n description: isRoot\n ? `add(${value}): Tree was empty, ${value} becomes root`\n : `add(${value}): Insert as ${direction} child of ${newPath[newPath.length - 2]}`,\n codeLine: isRoot ? 2 : direction === 'left' ? 8 : 13,\n variables: { value, parent: newPath[newPath.length - 2] || 'none' },\n currentNode: value,\n });\n } else {\n // contains operation\n const path = tree ? findPath(tree, value) : [];\n const found = path.length > 0 && path[path.length - 1] === value;\n\n steps.push({\n operation: 'contains',\n value,\n tree: cloneTree(tree),\n path: path,\n description: `contains(${value}): Searching... Path: ${path.join(' → ')}`,\n codeLine: 5,\n variables: { value, path: path.join('→') },\n currentNode: path[path.length - 1],\n });\n\n steps.push({\n operation: 'contains',\n value,\n tree: cloneTree(tree),\n path: path,\n description: found\n ? `contains(${value}): Found! Value exists in the tree`\n : `contains(${value}): Not found! Value does not exist`,\n codeLine: found ? 6 : 16,\n variables: { value, result: found ? 'true' : 'false' },\n found,\n currentNode: found ? value : undefined,\n });\n }\n }\n\n // Count nodes\n function countNodes(node: TreeNode | null): number {\n if (!node) return 0;\n return 1 + countNodes(node.left) + countNodes(node.right);\n }\n\n steps.push({\n operation: 'done',\n tree: cloneTree(tree),\n path: [],\n description: `✓ Done! TreeSet contains ${countNodes(tree)} elements in BST order.`,\n codeLine: -1,\n variables: { size: countNodes(tree) },\n });\n\n return steps;\n}\n\n// Calculate node positions for rendering\nfunction calculatePositions(\n node: TreeNode | null,\n depth: number,\n left: number,\n right: number,\n positions: Map<number, { x: number; y: number }>\n): void {\n if (!node) return;\n const x = (left + right) / 2;\n const y = depth * 60 + 30;\n positions.set(node.value, { x, y });\n calculatePositions(node.left, depth + 1, left, x, positions);\n calculatePositions(node.right, depth + 1, x, right, positions);\n}\n\nconst TreeSetVisualizerComponent: React.FC<TreeSetVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'treeset-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'treeset', scrollToId: VISUALIZER_ID });\n\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<TreeSetStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateTreeSetSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n tree: null,\n path: [],\n description: '',\n };\n\n const { tree, path, description, currentNode, found } = currentStepData;\n\n // Calculate positions for tree nodes\n const positions = new Map<number, { x: number; y: number }>();\n if (tree) {\n calculatePositions(tree, 0, 0, 300, positions);\n }\n\n // Render tree recursively\n const renderTree = (node: TreeNode | null): React.ReactNode => {\n if (!node) return null;\n\n const pos = positions.get(node.value);\n if (!pos) return null;\n\n const isInPath = path.includes(node.value);\n const isCurrent = node.value === currentNode;\n\n let nodeStyle = 'bg-white border-2 border-gray-300 text-gray-700';\n if (isCurrent) {\n if (currentStepData.operation === 'contains') {\n nodeStyle = found\n ? 'bg-green-500 border-green-600 text-white'\n : 'bg-red-500 border-red-600 text-white';\n } else {\n nodeStyle = 'bg-blue-500 border-blue-600 text-white';\n }\n } else if (isInPath) {\n nodeStyle = 'bg-yellow-100 border-yellow-400 text-yellow-800';\n }\n\n const leftPos = node.left ? positions.get(node.left.value) : null;\n const rightPos = node.right ? positions.get(node.right.value) : null;\n\n return (\n <React.Fragment key={node.value}>\n {/* Edges */}\n {leftPos && (\n <line\n x1={pos.x}\n y1={pos.y}\n x2={leftPos.x}\n y2={leftPos.y}\n stroke={\n node.left && path.includes(node.left.value)\n ? '#facc15'\n : '#d1d5db'\n }\n strokeWidth=\"2\"\n />\n )}\n {rightPos && (\n <line\n x1={pos.x}\n y1={pos.y}\n x2={rightPos.x}\n y2={rightPos.y}\n stroke={\n node.right && path.includes(node.right.value)\n ? '#facc15'\n : '#d1d5db'\n }\n strokeWidth=\"2\"\n />\n )}\n {/* Node */}\n <g transform={`translate(${pos.x}, ${pos.y})`}>\n <circle\n r=\"18\"\n className={`${nodeStyle} transition-colors`}\n fill={\n isCurrent\n ? found === false\n ? '#ef4444'\n : found\n ? '#22c55e'\n : '#3b82f6'\n : isInPath\n ? '#fef3c7'\n : 'white'\n }\n stroke={\n isCurrent\n ? found === false\n ? '#dc2626'\n : found\n ? '#16a34a'\n : '#2563eb'\n : isInPath\n ? '#facc15'\n : '#d1d5db'\n }\n strokeWidth=\"2\"\n />\n <text\n textAnchor=\"middle\"\n dy=\"5\"\n className=\"text-xs font-medium\"\n fill={isCurrent ? 'white' : isInPath ? '#92400e' : '#374151'}\n >\n {node.value}\n </text>\n </g>\n {/* Render children */}\n {renderTree(node.left)}\n {renderTree(node.right)}\n </React.Fragment>\n );\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-emerald-50 to-teal-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n TreeSet Operations (BST)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-emerald-100 text-emerald-700 rounded\">\n Avg: O(log n)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-teal-100 text-teal-700 rounded\">\n Worst: O(n)\n </span>\n </div>\n </div>\n <ShareButton onShare={handleShare} />\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Tree Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Binary Search Tree\n </div>\n <div className=\"bg-gray-50 rounded-lg p-2 overflow-x-auto\">\n {tree ? (\n <svg width=\"300\" height=\"250\" className=\"mx-auto\">\n {renderTree(tree)}\n </svg>\n ) : (\n <div className=\"h-32 flex items-center justify-center text-gray-400 text-sm\">\n Empty tree\n </div>\n )}\n </div>\n </div>\n\n {/* Path Display */}\n {path.length > 0 && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600\">\n <span className=\"font-medium\">Traversal Path:</span>\n <div className=\"mt-1 flex items-center gap-1 flex-wrap\">\n {path.map((v, idx) => (\n <React.Fragment key={idx}>\n {idx > 0 && <span className=\"text-gray-400\">→</span>}\n <span\n className={`px-2 py-0.5 rounded text-xs font-mono ${\n v === currentNode\n ? found === false\n ? 'bg-red-100 text-red-700'\n : found\n ? 'bg-green-100 text-green-700'\n : 'bg-blue-100 text-blue-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}\n >\n {v}\n </span>\n </React.Fragment>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n currentStepData.operation === 'contains' && found === false\n ? 'error'\n : currentStepData.operation === 'contains' && found === true\n ? 'success'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={TREESET_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"green\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const TreeSetVisualizer = React.memo(TreeSetVisualizerComponent);\nexport default TreeSetVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n useVisualizerPlayback,\n VisualizationArea,\n} from '../shared';\n\n// Simulated enum with 8 values (fits in single long)\nconst DAYS_OF_WEEK = [\n 'MONDAY',\n 'TUESDAY',\n 'WEDNESDAY',\n 'THURSDAY',\n 'FRIDAY',\n 'SATURDAY',\n 'SUNDAY',\n] as const;\n\ntype DayOfWeek = (typeof DAYS_OF_WEEK)[number];\n\ninterface EnumSetStep {\n operation: 'init' | 'add' | 'remove' | 'contains' | 'done';\n value?: DayOfWeek;\n bitmask: number;\n bitPosition?: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n result?: boolean;\n highlightBit?: number;\n previousBitmask?: number;\n}\n\ninterface EnumSetVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{\n op: 'add' | 'remove' | 'contains';\n value: DayOfWeek;\n}> = [\n { op: 'add', value: 'MONDAY' },\n { op: 'add', value: 'WEDNESDAY' },\n { op: 'add', value: 'FRIDAY' },\n { op: 'add', value: 'SATURDAY' },\n { op: 'contains', value: 'WEDNESDAY' },\n { op: 'contains', value: 'TUESDAY' },\n { op: 'add', value: 'MONDAY' }, // Already exists\n { op: 'remove', value: 'FRIDAY' },\n { op: 'contains', value: 'FRIDAY' },\n { op: 'add', value: 'SUNDAY' },\n];\n\nconst ENUMSET_CODE = [\n 'class EnumSet<E extends Enum<E>> {',\n ' private long elements = 0L;',\n '',\n ' void add(E e) {',\n ' int ordinal = e.ordinal();',\n ' elements |= (1L << ordinal);',\n ' }',\n '',\n ' void remove(E e) {',\n ' int ordinal = e.ordinal();',\n ' elements &= ~(1L << ordinal);',\n ' }',\n '',\n ' boolean contains(E e) {',\n ' int ordinal = e.ordinal();',\n ' return (elements & (1L<<ordinal)) != 0;',\n ' }',\n '}',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-500', label: 'Bit set (1)' },\n { color: 'bg-gray-200', label: 'Bit clear (0)' },\n { color: 'bg-blue-500', label: 'Current operation' },\n { color: 'bg-yellow-400', label: 'Changed bit' },\n];\n\nfunction getBitPosition(day: DayOfWeek): number {\n return DAYS_OF_WEEK.indexOf(day);\n}\n\nfunction generateEnumSetSteps(): EnumSetStep[] {\n const steps: EnumSetStep[] = [];\n let bitmask = 0;\n\n // Initial state\n steps.push({\n operation: 'init',\n bitmask: 0,\n description:\n 'Initialize EnumSet with empty bitmask (0). Each enum constant maps to a bit position based on ordinal().',\n codeLine: 1,\n variables: { elements: '0b0000000' },\n });\n\n for (const { op, value } of OPERATIONS) {\n const bitPos = getBitPosition(value);\n const bitMaskForValue = 1 << bitPos;\n const previousBitmask = bitmask;\n\n if (op === 'add') {\n const wasSet = (bitmask & bitMaskForValue) !== 0;\n bitmask |= bitMaskForValue;\n\n steps.push({\n operation: 'add',\n value,\n bitmask,\n bitPosition: bitPos,\n previousBitmask,\n description: wasSet\n ? `add(${value}): Bit ${bitPos} already set. No change needed.`\n : `add(${value}): Set bit ${bitPos}. elements |= (1L << ${bitPos})`,\n codeLine: 5,\n variables: {\n ordinal: bitPos,\n mask: `0b${bitMaskForValue.toString(2).padStart(7, '0')}`,\n elements: `0b${bitmask.toString(2).padStart(7, '0')}`,\n },\n highlightBit: bitPos,\n });\n } else if (op === 'remove') {\n const wasSet = (bitmask & bitMaskForValue) !== 0;\n bitmask &= ~bitMaskForValue;\n\n steps.push({\n operation: 'remove',\n value,\n bitmask,\n bitPosition: bitPos,\n previousBitmask,\n description: wasSet\n ? `remove(${value}): Clear bit ${bitPos}. elements &= ~(1L << ${bitPos})`\n : `remove(${value}): Bit ${bitPos} already clear. No change needed.`,\n codeLine: 10,\n variables: {\n ordinal: bitPos,\n mask: `0b${(~bitMaskForValue & 0x7f).toString(2).padStart(7, '0')}`,\n elements: `0b${bitmask.toString(2).padStart(7, '0')}`,\n },\n highlightBit: bitPos,\n });\n } else {\n // contains\n const isSet = (bitmask & bitMaskForValue) !== 0;\n\n steps.push({\n operation: 'contains',\n value,\n bitmask,\n bitPosition: bitPos,\n result: isSet,\n description: `contains(${value}): Check bit ${bitPos}. (elements & (1L << ${bitPos})) ${isSet ? '!= 0 → true' : '== 0 → false'}`,\n codeLine: 15,\n variables: {\n ordinal: bitPos,\n mask: `0b${bitMaskForValue.toString(2).padStart(7, '0')}`,\n result: isSet ? 'true' : 'false',\n },\n highlightBit: bitPos,\n });\n }\n }\n\n // Count set bits\n let count = 0;\n let temp = bitmask;\n while (temp > 0) {\n count += temp & 1;\n temp >>= 1;\n }\n\n steps.push({\n operation: 'done',\n bitmask,\n description: `✓ Done! EnumSet contains ${count} elements. O(1) for all operations!`,\n codeLine: -1,\n variables: {\n size: count,\n elements: `0b${bitmask.toString(2).padStart(7, '0')}`,\n },\n });\n\n return steps;\n}\n\nconst EnumSetVisualizerComponent: React.FC<EnumSetVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'enumset-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'enumset', scrollToId: VISUALIZER_ID });\n\n const [showBinary, setShowBinary] = useState(true);\n const generateSteps = useMemo(() => generateEnumSetSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<EnumSetStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n bitmask: 0,\n description: '',\n };\n\n const { bitmask, highlightBit, description, result, previousBitmask } =\n stepData;\n\n const toggleBinaryView = useCallback(() => {\n setShowBinary((prev) => !prev);\n }, []);\n\n const getBitStyle = (bitIndex: number): string => {\n const isSet = (bitmask & (1 << bitIndex)) !== 0;\n const wasSet =\n previousBitmask !== undefined\n ? (previousBitmask & (1 << bitIndex)) !== 0\n : isSet;\n const isHighlighted = highlightBit === bitIndex;\n const changed = isSet !== wasSet;\n\n if (isHighlighted) {\n if (stepData.operation === 'contains') {\n return result\n ? 'bg-green-500 text-white ring-2 ring-green-300'\n : 'bg-red-400 text-white ring-2 ring-red-300';\n }\n if (changed) {\n return 'bg-yellow-400 text-gray-900 ring-2 ring-yellow-300';\n }\n return 'bg-blue-500 text-white ring-2 ring-blue-300';\n }\n\n return isSet\n ? 'bg-green-500 text-white'\n : 'bg-gray-200 text-gray-600';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'contains' && result === false)\n return 'error' as const;\n if (stepData.operation === 'contains' && result === true)\n return 'success' as const;\n if (stepData.operation === 'done') return 'warning' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-lime-50 to-green-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">EnumSet Bit Operations</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-lime-100 text-lime-700 rounded\">\n O(1) all ops\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\">\n Memory efficient\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleBinaryView}\n className=\"px-2 py-1 text-xs font-medium bg-white border border-gray-300 rounded hover:bg-gray-50 transition-colors\"\n >\n {showBinary ? 'Hide Binary' : 'Show Binary'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Enum Values with Bits */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n DayOfWeek Enum → Bitmask Mapping\n </div>\n\n {/* Bitmask visualization */}\n <div className=\"flex flex-wrap gap-1 mb-4\">\n {DAYS_OF_WEEK.map((day, idx) => {\n const isSet = (bitmask & (1 << idx)) !== 0;\n return (\n <div\n key={day}\n className=\"flex flex-col items-center\"\n >\n <div\n className={`w-14 h-10 flex flex-col items-center justify-center text-xs font-medium rounded transition-all duration-200 ${getBitStyle(idx)}`}\n >\n <span className=\"text-[10px] opacity-80\">bit {idx}</span>\n <span>{isSet ? '1' : '0'}</span>\n </div>\n <div className=\"text-[9px] text-gray-500 mt-1 text-center leading-tight\">\n {day.slice(0, 3)}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Binary representation */}\n {showBinary && (\n <div className=\"p-3 bg-gray-900 rounded-lg text-sm font-mono\">\n <div className=\"flex items-center gap-2 text-gray-400\">\n <span className=\"text-green-400\">elements</span>\n <span>=</span>\n <span className=\"text-yellow-300\">\n 0b{bitmask.toString(2).padStart(7, '0')}\n </span>\n <span className=\"text-gray-500\">\n ({bitmask} in decimal)\n </span>\n </div>\n {stepData.operation === 'add' && highlightBit !== undefined && (\n <div className=\"mt-2 text-blue-300\">\n <span className=\"text-gray-500\">// Set bit: </span>\n elements |= (1L << {highlightBit})\n </div>\n )}\n {stepData.operation === 'remove' && highlightBit !== undefined && (\n <div className=\"mt-2 text-orange-300\">\n <span className=\"text-gray-500\">// Clear bit: </span>\n elements &= ~(1L << {highlightBit})\n </div>\n )}\n {stepData.operation === 'contains' && highlightBit !== undefined && (\n <div className=\"mt-2 text-purple-300\">\n <span className=\"text-gray-500\">// Check bit: </span>\n (elements & (1L << {highlightBit})) != 0\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Set contents */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-xs text-gray-600 mb-2\">\n <span className=\"font-medium\">Set Contents:</span>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {DAYS_OF_WEEK.filter((_, idx) => (bitmask & (1 << idx)) !== 0).map(\n (day) => (\n <span\n key={day}\n className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\"\n >\n {day}\n </span>\n )\n )}\n {bitmask === 0 && (\n <span className=\"text-xs text-gray-400 italic\">Empty set</span>\n )}\n </div>\n </div>\n\n {/* Comparison with HashSet */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-gray-700\">\n <span className=\"font-semibold text-blue-700\">vs HashSet:</span>\n <div className=\"mt-1 grid grid-cols-2 gap-2 text-[10px]\">\n <div>\n <span className=\"text-green-600\">EnumSet:</span> 1 long = 8 bytes\n </div>\n <div>\n <span className=\"text-gray-500\">HashSet:</span> ~40+ bytes per entry\n </div>\n <div>\n <span className=\"text-green-600\">EnumSet:</span> O(1) bit operation\n </div>\n <div>\n <span className=\"text-gray-500\">HashSet:</span> O(1) with hash overhead\n </div>\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={ENUMSET_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"lime\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const EnumSetVisualizer = React.memo(EnumSetVisualizerComponent);\nexport default EnumSetVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface HeapStep {\n operation: 'offer' | 'poll' | 'siftUp' | 'siftDown' | 'init' | 'done';\n value?: number;\n heap: number[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n swapIndices?: [number, number];\n compareIndices?: [number, number];\n}\n\ninterface PriorityQueueVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{ op: 'offer' | 'poll'; value?: number }> = [\n { op: 'offer', value: 50 },\n { op: 'offer', value: 30 },\n { op: 'offer', value: 70 },\n { op: 'offer', value: 20 },\n { op: 'offer', value: 40 },\n { op: 'offer', value: 10 },\n { op: 'poll' },\n { op: 'poll' },\n { op: 'offer', value: 15 },\n];\n\nconst HEAP_CODE = [\n 'offer(value):',\n ' heap.add(value)',\n ' siftUp(size - 1)',\n '',\n 'siftUp(index):',\n ' while index > 0:',\n ' parent = (index-1) / 2',\n ' if heap[index] < heap[parent]:',\n ' swap(index, parent)',\n ' index = parent',\n '',\n 'poll():',\n ' result = heap[0]',\n ' heap[0] = heap[size-1]',\n ' siftDown(0)',\n ' return result',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-purple-100', label: 'Root (min)', border: '#c4b5fd' },\n { color: 'bg-purple-500', label: 'Active' },\n { color: 'bg-yellow-300', label: 'Comparing' },\n { color: 'bg-green-400', label: 'Swapped' },\n];\n\nfunction generateHeapSteps(): HeapStep[] {\n const steps: HeapStep[] = [];\n const heap: number[] = [];\n\n steps.push({\n operation: 'init',\n heap: [],\n description:\n 'Initialize min-heap PriorityQueue. Parent is always smaller than children. O(log n) insert/remove.',\n codeLine: -1,\n });\n\n for (const { op, value } of OPERATIONS) {\n if (op === 'offer' && value !== undefined) {\n heap.push(value);\n let idx = heap.length - 1;\n\n steps.push({\n operation: 'offer',\n value,\n heap: [...heap],\n description: `offer(${value}): Add to end of heap at index ${idx}`,\n codeLine: 1,\n variables: { value, index: idx },\n highlightIndex: idx,\n });\n\n // Sift up\n while (idx > 0) {\n const parentIdx = Math.floor((idx - 1) / 2);\n\n steps.push({\n operation: 'siftUp',\n heap: [...heap],\n description: `siftUp: Compare ${heap[idx]} with parent ${heap[parentIdx]}`,\n codeLine: 7,\n variables: {\n index: idx,\n parent: parentIdx,\n child: heap[idx],\n parentVal: heap[parentIdx],\n },\n compareIndices: [idx, parentIdx],\n });\n\n if (heap[idx] < heap[parentIdx]) {\n // Swap\n [heap[idx], heap[parentIdx]] = [heap[parentIdx], heap[idx]];\n\n steps.push({\n operation: 'siftUp',\n heap: [...heap],\n description: `siftUp: ${heap[parentIdx]} < ${heap[idx]}, swap! Move up to index ${parentIdx}`,\n codeLine: 8,\n variables: { swapped: heap[parentIdx], index: parentIdx },\n swapIndices: [idx, parentIdx],\n highlightIndex: parentIdx,\n });\n\n idx = parentIdx;\n } else {\n steps.push({\n operation: 'siftUp',\n heap: [...heap],\n description: `siftUp: ${heap[idx]} >= ${heap[parentIdx]}, heap property satisfied!`,\n codeLine: 7,\n variables: { index: idx },\n highlightIndex: idx,\n });\n break;\n }\n }\n } else if (op === 'poll') {\n if (heap.length === 0) continue;\n\n const removed = heap[0];\n const last = heap.pop();\n if (last === undefined) continue;\n\n if (heap.length === 0) {\n steps.push({\n operation: 'poll',\n value: removed,\n heap: [],\n description: `poll(): Remove min ${removed}, heap is now empty`,\n codeLine: 11,\n variables: { removed },\n });\n continue;\n }\n\n heap[0] = last;\n\n steps.push({\n operation: 'poll',\n value: removed,\n heap: [...heap],\n description: `poll(): Remove min ${removed}, move last element ${last} to root`,\n codeLine: 13,\n variables: { removed, moved: last },\n highlightIndex: 0,\n });\n\n // Sift down\n let idx = 0;\n while (true) {\n const leftIdx = 2 * idx + 1;\n const rightIdx = 2 * idx + 2;\n let smallestIdx = idx;\n\n if (leftIdx < heap.length && heap[leftIdx] < heap[smallestIdx]) {\n smallestIdx = leftIdx;\n }\n if (rightIdx < heap.length && heap[rightIdx] < heap[smallestIdx]) {\n smallestIdx = rightIdx;\n }\n\n if (smallestIdx === idx) {\n steps.push({\n operation: 'siftDown',\n heap: [...heap],\n description: `siftDown: ${heap[idx]} is smaller than children, heap property satisfied!`,\n codeLine: 14,\n variables: { index: idx, value: heap[idx] },\n highlightIndex: idx,\n });\n break;\n }\n\n steps.push({\n operation: 'siftDown',\n heap: [...heap],\n description: `siftDown: ${heap[idx]} > ${heap[smallestIdx]}, swap with smaller child`,\n codeLine: 14,\n variables: {\n parent: heap[idx],\n child: heap[smallestIdx],\n childIdx: smallestIdx,\n },\n compareIndices: [idx, smallestIdx],\n });\n\n [heap[idx], heap[smallestIdx]] = [heap[smallestIdx], heap[idx]];\n\n steps.push({\n operation: 'siftDown',\n heap: [...heap],\n description: `siftDown: Swapped! Continue from index ${smallestIdx}`,\n codeLine: 14,\n variables: { index: smallestIdx },\n swapIndices: [idx, smallestIdx],\n highlightIndex: smallestIdx,\n });\n\n idx = smallestIdx;\n }\n }\n }\n\n steps.push({\n operation: 'done',\n heap: [...heap],\n description: `✓ Done! Min-heap has ${heap.length} elements. Root (${heap[0]}) is always minimum.`,\n codeLine: -1,\n variables: { size: heap.length, min: heap[0] },\n });\n\n return steps;\n}\n\n// Calculate tree positions for visualization\nfunction getTreePositions(size: number): Array<{ x: number; y: number }> {\n const positions: Array<{ x: number; y: number }> = [];\n const width = 280;\n\n for (let i = 0; i < size; i++) {\n const level = Math.floor(Math.log2(i + 1));\n const levelStart = Math.pow(2, level) - 1;\n const posInLevel = i - levelStart;\n const nodesInLevel = Math.pow(2, level);\n const spacing = width / (nodesInLevel + 1);\n\n positions.push({\n x: spacing * (posInLevel + 1),\n y: level * 55 + 30,\n });\n }\n\n return positions;\n}\n\nconst PriorityQueueVisualizerComponent: React.FC<\n PriorityQueueVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<HeapStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateHeapSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n heap: [],\n description: '',\n };\n\n const { heap, highlightIndex, swapIndices, compareIndices, description } =\n currentStepData;\n const positions = getTreePositions(heap.length);\n\n const getNodeStyle = (idx: number): string => {\n if (idx === highlightIndex) {\n return 'fill-purple-500 stroke-purple-600';\n }\n if (swapIndices?.includes(idx)) {\n return 'fill-green-400 stroke-green-500';\n }\n if (compareIndices?.includes(idx)) {\n return 'fill-yellow-300 stroke-yellow-400';\n }\n if (idx === 0) {\n return 'fill-purple-100 stroke-purple-300';\n }\n return 'fill-white stroke-gray-300';\n };\n\n const getTextColor = (idx: number): string => {\n if (idx === highlightIndex || swapIndices?.includes(idx)) {\n return 'white';\n }\n return '#374151';\n };\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-purple-50 to-pink-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n PriorityQueue (Min-Heap)\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n offer: O(log n)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-pink-100 text-pink-700 rounded\">\n poll: O(log n)\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400}>\n {/* Heap Tree Visualization */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Binary Heap Structure\n </div>\n <div className=\"bg-gray-50 rounded-lg p-2 overflow-x-auto\">\n {heap.length > 0 ? (\n <svg\n width=\"280\"\n height={Math.floor(Math.log2(heap.length)) * 55 + 80}\n className=\"mx-auto\"\n >\n {/* Draw edges */}\n {heap.map((_, idx) => {\n if (idx === 0) return null;\n const parentIdx = Math.floor((idx - 1) / 2);\n const parentPos = positions[parentIdx];\n const childPos = positions[idx];\n if (!parentPos || !childPos) return null;\n\n const isHighlighted =\n (compareIndices?.includes(idx) &&\n compareIndices?.includes(parentIdx)) ||\n (swapIndices?.includes(idx) &&\n swapIndices?.includes(parentIdx));\n\n return (\n <line\n key={`edge-${idx}`}\n x1={parentPos.x}\n y1={parentPos.y}\n x2={childPos.x}\n y2={childPos.y}\n stroke={isHighlighted ? '#a855f7' : '#d1d5db'}\n strokeWidth={isHighlighted ? 2 : 1}\n />\n );\n })}\n {/* Draw nodes */}\n {heap.map((val, idx) => {\n const pos = positions[idx];\n if (!pos) return null;\n\n return (\n <g\n key={idx}\n transform={`translate(${pos.x}, ${pos.y})`}\n >\n <circle\n r=\"18\"\n className={`${getNodeStyle(idx)} stroke-2 transition-all`}\n />\n <text\n textAnchor=\"middle\"\n dy=\"5\"\n className=\"text-xs font-medium\"\n fill={getTextColor(idx)}\n >\n {val}\n </text>\n <text\n textAnchor=\"middle\"\n dy=\"32\"\n className=\"text-[9px]\"\n fill=\"#9ca3af\"\n >\n [{idx}]\n </text>\n </g>\n );\n })}\n </svg>\n ) : (\n <div className=\"h-20 flex items-center justify-center text-gray-400 text-sm\">\n Empty heap\n </div>\n )}\n </div>\n </div>\n\n {/* Array representation */}\n {heap.length > 0 && (\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600 mb-1 font-medium\">\n Array representation:\n </div>\n <div className=\"flex gap-1 overflow-x-auto\">\n {heap.map((val, idx) => (\n <div\n key={idx}\n className={`w-8 h-8 flex items-center justify-center rounded text-xs font-mono ${\n idx === highlightIndex\n ? 'bg-purple-500 text-white'\n : idx === 0\n ? 'bg-purple-100 text-purple-700'\n : 'bg-white border border-gray-300 text-gray-700'\n }`}\n >\n {val}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={currentStepData.operation === 'done' ? 'success' : 'default'}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={HEAP_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"purple\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const PriorityQueueVisualizer = React.memo(\n PriorityQueueVisualizerComponent\n);\nexport default PriorityQueueVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface Segment {\n id: number;\n entries: Array<{ key: string; value: number }>;\n locked: boolean;\n lockOwner?: string;\n}\n\ninterface ConcurrentStep {\n operation: 'put' | 'get' | 'lock' | 'unlock' | 'init' | 'done';\n thread: string;\n key?: string;\n value?: number;\n segmentId?: number;\n segments: Segment[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightSegment?: number;\n activeThreads?: string[];\n}\n\ninterface ConcurrentHashMapVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst SEGMENT_COUNT = 4;\n\nconst OPERATIONS: Array<{\n thread: string;\n op: 'put' | 'get';\n key: string;\n value?: number;\n}> = [\n { thread: 'T1', op: 'put', key: 'Alice', value: 100 },\n { thread: 'T2', op: 'put', key: 'Bob', value: 200 },\n { thread: 'T1', op: 'put', key: 'Charlie', value: 150 },\n { thread: 'T3', op: 'get', key: 'Alice' },\n { thread: 'T2', op: 'put', key: 'Diana', value: 300 },\n { thread: 'T1', op: 'get', key: 'Bob' },\n { thread: 'T3', op: 'put', key: 'Eve', value: 250 },\n];\n\nconst CHM_CODE = [\n '// ConcurrentHashMap (Java 8+)',\n 'put(key, value):',\n ' hash = spread(key.hashCode())',\n ' segment = hash & (n-1)',\n ' synchronized(segment):',\n ' // Only this segment locked',\n ' bucket.add(key, value)',\n '',\n 'get(key):',\n ' // No lock needed!',\n ' // Volatile reads ensure visibility',\n ' return bucket.get(key)',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-50', label: 'Active segment', border: '#60a5fa' },\n { color: 'bg-red-50', label: 'Locked', border: '#f87171' },\n { color: 'bg-gray-50', label: 'Unlocked', border: '#d1d5db' },\n];\n\nfunction simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 31 + str.charCodeAt(i)) & 0x7fffffff;\n }\n return hash;\n}\n\nfunction generateConcurrentSteps(): ConcurrentStep[] {\n const steps: ConcurrentStep[] = [];\n const segments: Segment[] = Array.from({ length: SEGMENT_COUNT }, (_, i) => ({\n id: i,\n entries: [],\n locked: false,\n }));\n\n const _threadColors: Record<string, string> = {\n T1: 'blue',\n T2: 'green',\n T3: 'purple',\n };\n\n steps.push({\n operation: 'init',\n thread: '',\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `Initialize ConcurrentHashMap with ${SEGMENT_COUNT} segments. Each segment can be locked independently for concurrent access.`,\n codeLine: -1,\n activeThreads: [],\n });\n\n for (const { thread, op, key, value } of OPERATIONS) {\n const hash = simpleHash(key);\n const segmentId = hash % SEGMENT_COUNT;\n\n if (op === 'put') {\n // Step 1: Calculate segment\n steps.push({\n operation: 'put',\n thread,\n key,\n value,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: put(\"${key}\", ${value}) → hash=${hash}, segment=${segmentId}`,\n codeLine: 2,\n variables: { thread, key: `\"${key}\"`, hash, segment: segmentId },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n\n // Step 2: Acquire lock\n segments[segmentId].locked = true;\n segments[segmentId].lockOwner = thread;\n\n steps.push({\n operation: 'lock',\n thread,\n key,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: Lock segment ${segmentId} (other segments remain accessible!)`,\n codeLine: 4,\n variables: { thread, segment: segmentId, locked: 'true' },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n\n // Step 3: Insert\n const existingIdx = segments[segmentId].entries.findIndex(\n (e) => e.key === key\n );\n if (existingIdx >= 0) {\n segments[segmentId].entries[existingIdx].value = value ?? 0;\n } else {\n segments[segmentId].entries.push({ key, value: value ?? 0 });\n }\n\n steps.push({\n operation: 'put',\n thread,\n key,\n value,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: Insert (\"${key}\", ${value}) into segment ${segmentId}`,\n codeLine: 6,\n variables: { thread, key: `\"${key}\"`, value: value ?? 0 },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n\n // Step 4: Release lock\n segments[segmentId].locked = false;\n segments[segmentId].lockOwner = undefined;\n\n steps.push({\n operation: 'unlock',\n thread,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: Unlock segment ${segmentId}`,\n codeLine: 4,\n variables: { thread, segment: segmentId, locked: 'false' },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n } else {\n // GET operation - no lock needed!\n const entry = segments[segmentId].entries.find((e) => e.key === key);\n\n steps.push({\n operation: 'get',\n thread,\n key,\n value: entry?.value,\n segmentId,\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `${thread}: get(\"${key}\") → segment ${segmentId}, NO LOCK needed! Returns: ${entry?.value ?? 'null'}`,\n codeLine: 9,\n variables: { thread, key: `\"${key}\"`, result: entry?.value ?? 'null' },\n highlightSegment: segmentId,\n activeThreads: [thread],\n });\n }\n }\n\n const totalEntries = segments.reduce((sum, s) => sum + s.entries.length, 0);\n steps.push({\n operation: 'done',\n thread: '',\n segments: segments.map((s) => ({ ...s, entries: [...s.entries] })),\n description: `✓ Done! ConcurrentHashMap: ${totalEntries} entries across ${SEGMENT_COUNT} segments. Lock-free reads, segment-level write locks.`,\n codeLine: -1,\n variables: { entries: totalEntries, segments: SEGMENT_COUNT },\n activeThreads: [],\n });\n\n return steps;\n}\n\nconst ConcurrentHashMapVisualizerComponent: React.FC<\n ConcurrentHashMapVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<ConcurrentStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateConcurrentSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n thread: '',\n segments: [],\n description: '',\n };\n\n const { segments, highlightSegment, description, activeThreads } =\n currentStepData;\n\n const getSegmentStyle = (seg: Segment, idx: number): string => {\n if (idx === highlightSegment) {\n if (seg.locked) {\n return 'border-red-400 bg-red-50';\n }\n return 'border-blue-400 bg-blue-50';\n }\n if (seg.locked) {\n return 'border-orange-300 bg-orange-50';\n }\n return 'border-gray-200 bg-gray-50';\n };\n\n const getThreadColor = (thread: string): string => {\n const colors: Record<string, string> = {\n T1: 'bg-blue-500',\n T2: 'bg-green-500',\n T3: 'bg-purple-500',\n };\n return colors[thread] || 'bg-gray-500';\n };\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-red-50 to-orange-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">ConcurrentHashMap</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-red-100 text-red-700 rounded\">\n Segment Locks\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-orange-100 text-orange-700 rounded\">\n Lock-free Reads\n </span>\n </div>\n </div>\n {/* Active Threads */}\n <div className=\"flex items-center gap-2\">\n {['T1', 'T2', 'T3'].map((t) => (\n <div\n key={t}\n className={`px-2 py-0.5 text-xs font-medium rounded transition-opacity ${getThreadColor(t)} text-white ${\n activeThreads?.includes(t) ? 'opacity-100' : 'opacity-30'\n }`}\n >\n {t}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Segments */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n Segments (independent locks)\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n {segments.map((seg, idx) => (\n <div\n key={idx}\n className={`rounded-lg border-2 p-3 transition-colors ${getSegmentStyle(seg, idx)}`}\n >\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-medium text-gray-600\">\n Segment {idx}\n </span>\n {seg.locked && (\n <span className=\"flex items-center gap-1 text-[10px] text-red-600 font-medium\">\n <span className=\"w-2 h-2 bg-red-500 rounded-full animate-pulse\" />\n Locked by {seg.lockOwner}\n </span>\n )}\n </div>\n <div className=\"space-y-1\">\n {seg.entries.length > 0 ? (\n seg.entries.map((entry, eIdx) => (\n <div\n key={eIdx}\n className=\"flex justify-between px-2 py-1 bg-white rounded text-xs border border-gray-200\"\n >\n <span className=\"text-gray-700\">{entry.key}</span>\n <span className=\"text-gray-500\">{entry.value}</span>\n </div>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 text-center py-2\">\n Empty\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Concurrency Info */}\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600\">\n <span className=\"font-medium\">Key insight:</span> Multiple\n threads can write to different segments simultaneously. Reads\n never block!\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={currentStepData.operation === 'done' ? 'success' : 'default'}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={CHM_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"red\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ConcurrentHashMapVisualizer = React.memo(\n ConcurrentHashMapVisualizerComponent\n);\nexport default ConcurrentHashMapVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface QueueItem {\n id: number;\n value: string;\n}\n\ninterface BlockingStep {\n operation: 'put' | 'take' | 'blocked' | 'unblocked' | 'init' | 'done';\n thread: string;\n value?: string;\n queue: QueueItem[];\n capacity: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n blockedProducers: string[];\n blockedConsumers: string[];\n activeThread?: string;\n}\n\ninterface BlockingQueueVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst CAPACITY = 3;\n\nconst OPERATIONS: Array<{\n thread: string;\n role: 'producer' | 'consumer';\n value?: string;\n}> = [\n { thread: 'P1', role: 'producer', value: 'Task-A' },\n { thread: 'P2', role: 'producer', value: 'Task-B' },\n { thread: 'C1', role: 'consumer' },\n { thread: 'P1', role: 'producer', value: 'Task-C' },\n { thread: 'P2', role: 'producer', value: 'Task-D' },\n { thread: 'P1', role: 'producer', value: 'Task-E' },\n { thread: 'P2', role: 'producer', value: 'Task-F' }, // Will block - queue full\n { thread: 'C1', role: 'consumer' },\n { thread: 'C2', role: 'consumer' },\n { thread: 'C1', role: 'consumer' },\n { thread: 'C2', role: 'consumer' }, // Will block - queue empty\n { thread: 'P1', role: 'producer', value: 'Task-G' },\n];\n\nconst BQ_CODE = [\n 'put(item): // Producer',\n ' lock.lock()',\n ' while queue.isFull():',\n ' notFull.await() // Block!',\n ' queue.add(item)',\n ' notEmpty.signal()',\n ' lock.unlock()',\n '',\n 'take(): // Consumer',\n ' lock.lock()',\n ' while queue.isEmpty():',\n ' notEmpty.await() // Block!',\n ' item = queue.remove()',\n ' notFull.signal()',\n ' lock.unlock()',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-100', label: 'Producer' },\n { color: 'bg-blue-100', label: 'Consumer' },\n { color: 'bg-red-100', label: 'Blocked', border: '#fca5a5' },\n];\n\nlet itemIdCounter = 0;\n\nfunction generateBlockingQueueSteps(): BlockingStep[] {\n const steps: BlockingStep[] = [];\n const queue: QueueItem[] = [];\n const blockedProducers: string[] = [];\n const blockedConsumers: string[] = [];\n itemIdCounter = 0;\n\n steps.push({\n operation: 'init',\n thread: '',\n queue: [],\n capacity: CAPACITY,\n description: `Initialize BlockingQueue with capacity ${CAPACITY}. Producers block when full, consumers block when empty.`,\n codeLine: -1,\n blockedProducers: [],\n blockedConsumers: [],\n });\n\n for (const { thread, role, value } of OPERATIONS) {\n if (role === 'producer') {\n if (queue.length >= CAPACITY) {\n // Producer blocks\n blockedProducers.push(thread);\n\n steps.push({\n operation: 'blocked',\n thread,\n value,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: put(\"${value}\") - Queue FULL! Producer blocked, waiting for space...`,\n codeLine: 3,\n variables: { thread, size: queue.length, capacity: CAPACITY },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n } else {\n // Normal put\n const item: QueueItem = { id: itemIdCounter++, value: value ?? '' };\n queue.push(item);\n\n // Unblock a consumer if any waiting\n let unblockedConsumer: string | undefined;\n if (blockedConsumers.length > 0 && queue.length === 1) {\n unblockedConsumer = blockedConsumers.shift();\n }\n\n steps.push({\n operation: 'put',\n thread,\n value,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: put(\"${value}\") → Queue: ${queue.length}/${CAPACITY}${unblockedConsumer ? ` | Signaled ${unblockedConsumer}` : ''}`,\n codeLine: 4,\n variables: { thread, item: `\"${value}\"`, size: queue.length },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n }\n } else {\n // Consumer\n if (queue.length === 0) {\n // Consumer blocks\n blockedConsumers.push(thread);\n\n steps.push({\n operation: 'blocked',\n thread,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: take() - Queue EMPTY! Consumer blocked, waiting for items...`,\n codeLine: 11,\n variables: { thread, size: 0 },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n } else {\n // Normal take\n const item = queue.shift();\n const wasFull = queue.length === CAPACITY - 1;\n\n // Unblock a producer if any waiting and we made space\n let unblockedProducer: string | undefined;\n if (blockedProducers.length > 0 && wasFull) {\n unblockedProducer = blockedProducers.shift();\n }\n\n steps.push({\n operation: 'take',\n thread,\n value: item?.value,\n queue: [...queue],\n capacity: CAPACITY,\n description: `${thread}: take() → \"${item?.value}\" | Queue: ${queue.length}/${CAPACITY}${unblockedProducer ? ` | Signaled ${unblockedProducer}` : ''}`,\n codeLine: 12,\n variables: { thread, item: `\"${item?.value}\"`, size: queue.length },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n activeThread: thread,\n });\n }\n }\n }\n\n steps.push({\n operation: 'done',\n thread: '',\n queue: [...queue],\n capacity: CAPACITY,\n description: `✓ Done! BlockingQueue orchestrates producer-consumer coordination. No busy waiting!`,\n codeLine: -1,\n variables: { finalSize: queue.length },\n blockedProducers: [...blockedProducers],\n blockedConsumers: [...blockedConsumers],\n });\n\n return steps;\n}\n\nconst BlockingQueueVisualizerComponent: React.FC<\n BlockingQueueVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<BlockingStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateBlockingQueueSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n thread: '',\n queue: [],\n capacity: CAPACITY,\n description: '',\n blockedProducers: [],\n blockedConsumers: [],\n };\n\n const {\n queue,\n capacity,\n description,\n blockedProducers,\n blockedConsumers,\n activeThread,\n } = currentStepData;\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-cyan-50 to-blue-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">BlockingQueue</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-cyan-100 text-cyan-700 rounded\">\n Producer-Consumer\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-blue-100 text-blue-700 rounded\">\n Thread-safe\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Producer-Consumer Layout */}\n <div className=\"flex items-center justify-between gap-4 mb-4\">\n {/* Producers */}\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n Producers\n </div>\n <div className=\"flex flex-col gap-2\">\n {['P1', 'P2'].map((p) => (\n <div\n key={p}\n className={`px-3 py-2 rounded-lg text-center text-sm font-medium transition-all ${\n activeThread === p\n ? 'bg-green-500 text-white scale-105'\n : blockedProducers.includes(p)\n ? 'bg-red-100 text-red-700 border-2 border-red-300'\n : 'bg-green-100 text-green-700'\n }`}\n >\n {p}\n {blockedProducers.includes(p) && (\n <span className=\"block text-[10px]\">BLOCKED</span>\n )}\n </div>\n ))}\n </div>\n </div>\n\n {/* Queue */}\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n Queue ({queue.length}/{capacity})\n </div>\n <div className=\"bg-gray-100 rounded-lg p-2 min-h-[100px]\">\n <div className=\"flex flex-col gap-1\">\n {queue.length > 0 ? (\n queue.map((item, idx) => (\n <div\n key={item.id}\n className={`px-2 py-1.5 bg-white rounded border text-xs font-medium text-center transition-all ${\n idx === 0\n ? 'border-blue-300 bg-blue-50'\n : 'border-gray-200'\n }`}\n >\n {item.value}\n </div>\n ))\n ) : (\n <div className=\"text-center text-gray-400 text-xs py-4\">\n Empty\n </div>\n )}\n </div>\n {/* Capacity indicator */}\n <div className=\"mt-2 h-1.5 bg-gray-200 rounded-full overflow-hidden\">\n <div\n className={`h-full transition-all ${\n queue.length === capacity ? 'bg-red-500' : 'bg-cyan-500'\n }`}\n style={{ width: `${(queue.length / capacity) * 100}%` }}\n />\n </div>\n </div>\n </div>\n\n {/* Consumers */}\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n Consumers\n </div>\n <div className=\"flex flex-col gap-2\">\n {['C1', 'C2'].map((c) => (\n <div\n key={c}\n className={`px-3 py-2 rounded-lg text-center text-sm font-medium transition-all ${\n activeThread === c\n ? 'bg-blue-500 text-white scale-105'\n : blockedConsumers.includes(c)\n ? 'bg-red-100 text-red-700 border-2 border-red-300'\n : 'bg-blue-100 text-blue-700'\n }`}\n >\n {c}\n {blockedConsumers.includes(c) && (\n <span className=\"block text-[10px]\">BLOCKED</span>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Flow arrows */}\n <div className=\"flex justify-center gap-8 text-gray-400 text-lg mb-4\">\n <span>→ put()</span>\n <span>take() →</span>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n currentStepData.operation === 'blocked'\n ? 'error'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={BQ_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"cyan\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const BlockingQueueVisualizer = React.memo(\n BlockingQueueVisualizerComponent\n);\nexport default BlockingQueueVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface COWStep {\n operation: 'read' | 'write' | 'copy' | 'init' | 'done';\n thread: string;\n value?: string;\n oldArray: string[];\n newArray: string[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightIndex?: number;\n showCopy?: boolean;\n activeReaders?: string[];\n}\n\ninterface CopyOnWriteVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst OPERATIONS: Array<{\n thread: string;\n op: 'read' | 'write';\n value?: string;\n}> = [\n { thread: 'R1', op: 'read' },\n { thread: 'R2', op: 'read' },\n { thread: 'W1', op: 'write', value: 'D' },\n { thread: 'R1', op: 'read' },\n { thread: 'R3', op: 'read' },\n { thread: 'W1', op: 'write', value: 'E' },\n { thread: 'R2', op: 'read' },\n];\n\nconst COW_CODE = [\n '// CopyOnWriteArrayList',\n '',\n 'get(index): // Lock-free!',\n ' return array[index]',\n '',\n 'add(element):',\n ' lock.lock()',\n ' newArray = Arrays.copyOf(array)',\n ' newArray[len] = element',\n ' array = newArray // Atomic swap',\n ' lock.unlock()',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-blue-500', label: 'Reader' },\n { color: 'bg-orange-500', label: 'Writer' },\n { color: 'bg-green-500', label: 'New element' },\n];\n\nfunction generateCOWSteps(): COWStep[] {\n const steps: COWStep[] = [];\n let array = ['A', 'B', 'C'];\n const activeReaders: string[] = [];\n\n steps.push({\n operation: 'init',\n thread: '',\n oldArray: [...array],\n newArray: [...array],\n description:\n 'CopyOnWriteArrayList: Reads are lock-free, writes create a full copy. Ideal for read-heavy scenarios.',\n codeLine: -1,\n activeReaders: [],\n });\n\n for (const { thread, op, value } of OPERATIONS) {\n if (op === 'read') {\n if (!activeReaders.includes(thread)) {\n activeReaders.push(thread);\n }\n\n steps.push({\n operation: 'read',\n thread,\n oldArray: [...array],\n newArray: [...array],\n description: `${thread}: get() → Reading \"${array[0]}, ${array[1]}, ...\" - NO LOCK needed! Readers never block.`,\n codeLine: 3,\n variables: { thread, 'array.length': array.length },\n activeReaders: [...activeReaders],\n });\n } else {\n // Write operation - show the copy process\n const oldArray = [...array];\n\n // Step 1: Acquire lock\n steps.push({\n operation: 'write',\n thread,\n value,\n oldArray: [...oldArray],\n newArray: [...oldArray],\n description: `${thread}: add(\"${value}\") - Acquiring exclusive write lock...`,\n codeLine: 6,\n variables: { thread, element: `\"${value}\"` },\n activeReaders: [...activeReaders],\n });\n\n // Step 2: Create copy\n const newArray = [...oldArray, value ?? ''];\n\n steps.push({\n operation: 'copy',\n thread,\n value,\n oldArray: [...oldArray],\n newArray: [...newArray],\n description: `${thread}: Creating NEW array copy (${oldArray.length} → ${newArray.length} elements). Old array still serves readers!`,\n codeLine: 7,\n variables: { oldLen: oldArray.length, newLen: newArray.length },\n showCopy: true,\n activeReaders: [...activeReaders],\n });\n\n // Step 3: Atomic swap\n array = newArray;\n\n steps.push({\n operation: 'write',\n thread,\n value,\n oldArray: [...oldArray],\n newArray: [...array],\n description: `${thread}: Atomic reference swap! New readers see updated array. Old readers finish safely.`,\n codeLine: 9,\n variables: { thread, 'new length': array.length },\n highlightIndex: array.length - 1,\n activeReaders: [...activeReaders],\n });\n }\n }\n\n steps.push({\n operation: 'done',\n thread: '',\n oldArray: [...array],\n newArray: [...array],\n description: `✓ Done! Copy-on-write: O(1) reads, O(n) writes. Best for read-heavy, rarely-modified collections.`,\n codeLine: -1,\n variables: { finalSize: array.length },\n activeReaders: [],\n });\n\n return steps;\n}\n\nconst CopyOnWriteVisualizerComponent: React.FC<CopyOnWriteVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<COWStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateCOWSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = useCallback(() => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n }, [currentStep, steps.length, isPlaying]);\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleStep, handleStepBack, handlePlayPause, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n thread: '',\n oldArray: [],\n newArray: [],\n description: '',\n activeReaders: [],\n };\n\n const {\n oldArray,\n newArray,\n description,\n showCopy,\n highlightIndex,\n activeReaders,\n } = currentStepData;\n\n const renderArray = (\n arr: string[],\n label: string,\n isNew: boolean = false\n ) => (\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium text-gray-500 mb-2 text-center\">\n {label}\n </div>\n <div className=\"flex justify-center gap-1\">\n {arr.map((item, idx) => (\n <div\n key={idx}\n className={`w-10 h-10 flex items-center justify-center rounded border-2 font-medium transition-all ${\n isNew && idx === highlightIndex\n ? 'bg-green-500 border-green-600 text-white scale-110'\n : isNew\n ? 'bg-green-100 border-green-300 text-green-700'\n : 'bg-gray-100 border-gray-300 text-gray-700'\n }`}\n >\n {item}\n </div>\n ))}\n </div>\n </div>\n );\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-lime-50 to-green-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n CopyOnWriteArrayList\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-lime-100 text-lime-700 rounded\">\n Read: O(1)\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-green-100 text-green-700 rounded\">\n Write: O(n)\n </span>\n </div>\n </div>\n {/* Active Threads */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-500\">Readers:</span>\n {['R1', 'R2', 'R3'].map((r) => (\n <div\n key={r}\n className={`px-2 py-0.5 text-xs font-medium rounded transition-opacity ${\n activeReaders?.includes(r)\n ? 'bg-blue-500 text-white opacity-100'\n : 'bg-blue-100 text-blue-700 opacity-40'\n }`}\n >\n {r}\n </div>\n ))}\n <span className=\"text-xs text-gray-500 ml-2\">Writer:</span>\n <div\n className={`px-2 py-0.5 text-xs font-medium rounded ${\n currentStepData.thread === 'W1'\n ? 'bg-orange-500 text-white'\n : 'bg-orange-100 text-orange-700 opacity-40'\n }`}\n >\n W1\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Arrays Visualization */}\n <div className=\"mb-4 p-4 bg-gray-50 rounded-lg\">\n {showCopy ? (\n <div className=\"flex items-center gap-4\">\n {renderArray(oldArray, 'Old Array (readers use this)')}\n <div className=\"text-2xl text-gray-400\">→</div>\n {renderArray(newArray, 'New Array (being created)', true)}\n </div>\n ) : (\n <div className=\"flex justify-center\">\n {renderArray(\n newArray,\n 'Current Array',\n highlightIndex !== undefined\n )}\n </div>\n )}\n </div>\n\n {/* Key Insight */}\n <div className=\"mb-4 p-3 bg-lime-50 rounded-lg border border-lime-200\">\n <div className=\"text-xs text-lime-800\">\n <span className=\"font-medium\">Key insight:</span> During writes,\n old array continues serving readers. No reader ever sees partial\n state!\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n currentStepData.operation === 'copy'\n ? 'warning'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={COW_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"lime\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const CopyOnWriteVisualizer = React.memo(CopyOnWriteVisualizerComponent);\nexport default CopyOnWriteVisualizer;\n","import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Lock, Shield } from 'lucide-react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n VisualizationArea,\n} from '../shared';\n\ninterface ImmutableStep {\n operation: 'create' | 'tryModify' | 'derive' | 'init' | 'done';\n method?: string;\n original: string[];\n derived?: string[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n error?: boolean;\n showDerived?: boolean;\n}\n\ninterface ImmutableCollectionsVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst IMMUTABLE_CODE = [\n '// Java 9+ Immutable Collections',\n '',\n '// Creation - O(1) for small, O(n) copy',\n 'List.of(\"A\", \"B\", \"C\")',\n 'Set.of(1, 2, 3)',\n 'Map.of(\"k1\", \"v1\", \"k2\", \"v2\")',\n '',\n '// Modification attempts throw!',\n 'list.add(\"D\") // UnsupportedOp!',\n 'list.set(0, \"X\") // UnsupportedOp!',\n '',\n '// Safe derivation pattern',\n 'var newList = new ArrayList<>(list)',\n 'newList.add(\"D\") // Works!',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-violet-100', label: 'Immutable', border: '#c4b5fd' },\n { color: 'bg-green-100', label: 'Mutable copy', border: '#86efac' },\n { color: 'bg-red-100', label: 'Error', border: '#fca5a5' },\n];\n\nfunction generateImmutableSteps(): ImmutableStep[] {\n const steps: ImmutableStep[] = [];\n\n steps.push({\n operation: 'init',\n original: [],\n description:\n 'Immutable Collections (Java 9+): Thread-safe by design. No locks needed - nothing can change!',\n codeLine: -1,\n });\n\n // Create immutable list\n steps.push({\n operation: 'create',\n method: 'List.of()',\n original: ['A', 'B', 'C'],\n description:\n 'List.of(\"A\", \"B\", \"C\") → Creates unmodifiable List. Compact, no extra memory overhead.',\n codeLine: 3,\n variables: { size: 3, type: 'ImmutableList' },\n });\n\n // Try to add\n steps.push({\n operation: 'tryModify',\n method: 'add()',\n original: ['A', 'B', 'C'],\n description:\n 'list.add(\"D\") → UnsupportedOperationException! Immutable means NO modifications.',\n codeLine: 8,\n variables: { method: 'add', result: 'Exception!' },\n error: true,\n });\n\n // Try to set\n steps.push({\n operation: 'tryModify',\n method: 'set()',\n original: ['A', 'B', 'C'],\n description:\n 'list.set(0, \"X\") → UnsupportedOperationException! Even index-based changes fail.',\n codeLine: 9,\n variables: { method: 'set', result: 'Exception!' },\n error: true,\n });\n\n // Try to remove\n steps.push({\n operation: 'tryModify',\n method: 'remove()',\n original: ['A', 'B', 'C'],\n description:\n 'list.remove(0) → UnsupportedOperationException! No element can be removed.',\n codeLine: 8,\n variables: { method: 'remove', result: 'Exception!' },\n error: true,\n });\n\n // Derive new collection\n steps.push({\n operation: 'derive',\n method: 'new ArrayList<>()',\n original: ['A', 'B', 'C'],\n derived: ['A', 'B', 'C'],\n description:\n 'new ArrayList<>(list) → Create mutable copy. Original stays unchanged forever!',\n codeLine: 12,\n variables: { copied: 3 },\n showDerived: true,\n });\n\n // Modify derived\n steps.push({\n operation: 'derive',\n method: 'newList.add()',\n original: ['A', 'B', 'C'],\n derived: ['A', 'B', 'C', 'D'],\n description:\n 'newList.add(\"D\") → Works! Mutable copy can be modified. Original unchanged.',\n codeLine: 13,\n variables: { newSize: 4, originalSize: 3 },\n showDerived: true,\n });\n\n steps.push({\n operation: 'done',\n original: ['A', 'B', 'C'],\n description:\n '✓ Immutable = Thread-safe without locks. Share freely between threads!',\n codeLine: -1,\n variables: { 'thread-safe': 'always' },\n });\n\n return steps;\n}\n\nconst ImmutableCollectionsVisualizerComponent: React.FC<\n ImmutableCollectionsVisualizerProps\n> = ({ showControls = true, showCode = true, className = '' }) => {\n const [speed, setSpeed] = useState(25);\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [steps, setSteps] = useState<ImmutableStep[]>([]);\n\n const playingRef = useRef(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const initialize = useCallback(() => {\n const newSteps = generateImmutableSteps();\n setSteps(newSteps);\n setCurrentStep(0);\n setIsPlaying(false);\n playingRef.current = false;\n }, []);\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n useEffect(() => {\n if (isPlaying && currentStep < steps.length - 1) {\n playingRef.current = true;\n const delay = Math.max(100, 2000 - speed * 19);\n\n timeoutRef.current = setTimeout(() => {\n if (playingRef.current) {\n setCurrentStep((prev) => prev + 1);\n }\n }, delay);\n } else if (currentStep >= steps.length - 1) {\n setIsPlaying(false);\n playingRef.current = false;\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isPlaying, currentStep, steps.length, speed]);\n\n const handlePlayPause = () => {\n if (currentStep >= steps.length - 1) {\n setCurrentStep(0);\n }\n setIsPlaying(!isPlaying);\n playingRef.current = !isPlaying;\n };\n\n const handleStep = useCallback(() => {\n if (currentStep < steps.length - 1) {\n setCurrentStep((prev) => prev + 1);\n }\n }, [currentStep, steps.length]);\n\n const handleStepBack = useCallback(() => {\n if (currentStep > 0) {\n setCurrentStep((prev) => prev - 1);\n }\n }, [currentStep]);\n\n const handleReset = () => {\n setIsPlaying(false);\n playingRef.current = false;\n setCurrentStep(0);\n };\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (\n e.target instanceof HTMLInputElement ||\n e.target instanceof HTMLTextAreaElement\n ) {\n return;\n }\n // Don't intercept browser shortcuts (Ctrl/Cmd + key)\n if (e.ctrlKey || e.metaKey) {\n return;\n }\n switch (e.key) {\n case 'p':\n case 'P':\n e.preventDefault();\n handlePlayPause();\n break;\n case '[':\n e.preventDefault();\n if (!isPlaying) handleStepBack();\n break;\n case ']':\n e.preventDefault();\n if (!isPlaying) handleStep();\n break;\n case 'r':\n case 'R':\n e.preventDefault();\n handleReset();\n break;\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- handlePlayPause excluded to prevent infinite loop\n }, [handleStep, handleStepBack, isPlaying]);\n\n const currentStepData = steps[currentStep] || {\n operation: 'init',\n original: [],\n description: '',\n };\n\n const { original, derived, description, error, showDerived } =\n currentStepData;\n\n return (\n <div\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-violet-50 to-purple-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">\n Immutable Collections\n </h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-violet-100 text-violet-700 rounded flex items-center gap-1\">\n <Lock className=\"w-3 h-3\" />\n Unmodifiable\n </span>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded flex items-center gap-1\">\n <Shield className=\"w-3 h-3\" />\n Thread-safe\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={350}>\n {/* Collections Display */}\n <div className=\"mb-4 space-y-4\">\n {/* Original Immutable */}\n {original.length > 0 && (\n <div className=\"p-4 bg-violet-50 rounded-lg border-2 border-violet-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Lock className=\"w-4 h-4 text-violet-600\" />\n <span className=\"text-sm font-medium text-violet-700\">\n Immutable List (List.of)\n </span>\n </div>\n <div className=\"flex gap-2\">\n {original.map((item, idx) => (\n <div\n key={idx}\n className={`w-12 h-12 flex items-center justify-center rounded-lg border-2 font-bold transition-all ${\n error\n ? 'bg-red-100 border-red-300 text-red-700 animate-pulse'\n : 'bg-violet-100 border-violet-300 text-violet-700'\n }`}\n >\n {item}\n </div>\n ))}\n {error && (\n <div className=\"flex items-center text-red-600 text-sm font-medium ml-2\">\n ✗ Cannot modify!\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Derived Mutable */}\n {showDerived && derived && (\n <div className=\"p-4 bg-green-50 rounded-lg border-2 border-green-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-medium text-green-700\">\n Mutable Copy (ArrayList)\n </span>\n </div>\n <div className=\"flex gap-2\">\n {derived.map((item, idx) => (\n <div\n key={idx}\n className={`w-12 h-12 flex items-center justify-center rounded-lg border-2 font-bold ${\n idx === derived.length - 1 &&\n derived.length > original.length\n ? 'bg-green-500 border-green-600 text-white'\n : 'bg-green-100 border-green-300 text-green-700'\n }`}\n >\n {item}\n </div>\n ))}\n <div className=\"flex items-center text-green-600 text-sm font-medium ml-2\">\n ✓ Modifiable\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Benefits */}\n <div className=\"mb-4 p-3 bg-gray-100 rounded-lg\">\n <div className=\"text-xs text-gray-600 grid grid-cols-3 gap-2\">\n <div className=\"text-center\">\n <div className=\"font-medium text-violet-700\">No Locks</div>\n <div className=\"text-gray-500\">Thread-safe by nature</div>\n </div>\n <div className=\"text-center\">\n <div className=\"font-medium text-violet-700\">Compact</div>\n <div className=\"text-gray-500\">Optimized memory</div>\n </div>\n <div className=\"text-center\">\n <div className=\"font-medium text-violet-700\">\n Safe Sharing\n </div>\n <div className=\"text-gray-500\">Pass freely</div>\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={\n error\n ? 'error'\n : currentStepData.operation === 'done'\n ? 'success'\n : 'default'\n }\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-56 flex-shrink-0 space-y-2\">\n <CodePanel\n code={IMMUTABLE_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"violet\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const ImmutableCollectionsVisualizer = React.memo(\n ImmutableCollectionsVisualizerComponent\n);\nexport default ImmutableCollectionsVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n VisualizationArea,\n useVisualizerPlayback,\n} from '../shared';\n\ninterface HeapObject {\n id: string;\n size: number;\n age: number;\n reachable: boolean;\n generation: 'eden' | 'survivor0' | 'survivor1' | 'old';\n}\n\ninterface GCStep {\n operation:\n | 'init'\n | 'allocate'\n | 'mark'\n | 'sweep'\n | 'promote'\n | 'minor_gc'\n | 'major_gc'\n | 'done';\n objects: HeapObject[];\n eden: string[];\n survivor0: string[];\n survivor1: string[];\n old: string[];\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightObjects?: string[];\n gcType?: 'minor' | 'major';\n activeSurvivor?: 0 | 1;\n}\n\ninterface GCVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst GC_CODE = [\n '// JVM Generational GC',\n '',\n '// 1. Object Allocation',\n 'Object obj = new Object(); // Eden',\n '',\n '// 2. Minor GC (Young Gen)',\n 'for (obj in eden + survivor_from) {',\n ' if (isReachable(obj)) {',\n ' if (obj.age >= threshold) {',\n ' promote(obj, oldGen);',\n ' } else {',\n ' copy(obj, survivor_to);',\n ' obj.age++;',\n ' }',\n ' }',\n '}',\n '',\n '// 3. Major GC (Old Gen)',\n 'mark(); // Mark reachable objects',\n 'sweep(); // Free unreachable',\n];\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-400', label: 'Reachable' },\n { color: 'bg-red-400', label: 'Unreachable (garbage)' },\n { color: 'bg-yellow-400', label: 'Being collected' },\n { color: 'bg-blue-400', label: 'Promoted' },\n];\n\nconst PROMOTION_THRESHOLD = 3;\n\nfunction generateGCSteps(): GCStep[] {\n const steps: GCStep[] = [];\n let objects: HeapObject[] = [];\n let eden: string[] = [];\n let survivor0: string[] = [];\n let survivor1: string[] = [];\n let old: string[] = [];\n let objCounter = 0;\n let activeSurvivor: 0 | 1 = 0;\n\n const createObject = (reachable: boolean): HeapObject => ({\n id: `obj${++objCounter}`,\n size: Math.floor(Math.random() * 3) + 1,\n age: 0,\n reachable,\n generation: 'eden',\n });\n\n // Initial state\n steps.push({\n operation: 'init',\n objects: [],\n eden: [],\n survivor0: [],\n survivor1: [],\n old: [],\n description: 'JVM Heap initialized. Young Gen: Eden + 2 Survivor spaces. Old Gen for long-lived objects.',\n codeLine: 0,\n activeSurvivor: 0,\n });\n\n // Allocate objects in Eden\n for (let i = 0; i < 5; i++) {\n const obj = createObject(i % 2 === 0 || i === 1); // Some reachable, some not\n objects.push(obj);\n eden.push(obj.id);\n\n steps.push({\n operation: 'allocate',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Allocate ${obj.id} in Eden (size: ${obj.size}KB). ${obj.reachable ? 'Referenced' : 'No references'}.`,\n codeLine: 3,\n variables: { allocated: obj.id, edenUsed: eden.length },\n highlightObjects: [obj.id],\n activeSurvivor,\n });\n }\n\n // Minor GC #1\n steps.push({\n operation: 'minor_gc',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: 'Eden full! Triggering Minor GC (Young Generation collection).',\n codeLine: 5,\n gcType: 'minor',\n activeSurvivor,\n });\n\n // Mark phase\n const reachableInYoung = objects.filter(\n (o) => o.reachable && (eden.includes(o.id) || survivor0.includes(o.id) || survivor1.includes(o.id))\n );\n\n steps.push({\n operation: 'mark',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Mark phase: Found ${reachableInYoung.length} reachable objects in Young Gen.`,\n codeLine: 7,\n highlightObjects: reachableInYoung.map((o) => o.id),\n activeSurvivor,\n });\n\n // Move survivors to survivor space\n const targetSurvivor = activeSurvivor === 0 ? survivor1 : survivor0;\n const targetKey = activeSurvivor === 0 ? 'survivor1' : 'survivor0';\n\n for (const obj of reachableInYoung) {\n obj.age++;\n obj.generation = targetKey as 'survivor0' | 'survivor1';\n targetSurvivor.push(obj.id);\n }\n\n // Clear eden and source survivor\n const garbage = objects.filter(\n (o) => !o.reachable && (eden.includes(o.id) || survivor0.includes(o.id) || survivor1.includes(o.id))\n );\n objects = objects.filter((o) => o.reachable || old.includes(o.id));\n eden = [];\n if (activeSurvivor === 0) {\n survivor0 = [];\n } else {\n survivor1 = [];\n }\n\n steps.push({\n operation: 'sweep',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Copy ${reachableInYoung.length} survivors to S${activeSurvivor === 0 ? 1 : 0}. Freed ${garbage.length} objects. Eden cleared.`,\n codeLine: 11,\n variables: { survivors: reachableInYoung.length, freed: garbage.length },\n highlightObjects: reachableInYoung.map((o) => o.id),\n activeSurvivor: activeSurvivor === 0 ? 1 : 0,\n });\n\n activeSurvivor = activeSurvivor === 0 ? 1 : 0;\n\n // More allocations\n for (let i = 0; i < 4; i++) {\n const obj = createObject(i < 2);\n objects.push(obj);\n eden.push(obj.id);\n }\n\n steps.push({\n operation: 'allocate',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Allocated 4 more objects in Eden. Preparing for next Minor GC.`,\n codeLine: 3,\n variables: { edenUsed: eden.length },\n activeSurvivor,\n });\n\n // Minor GC #2 - simulate multiple cycles to show promotion\n for (let gc = 0; gc < 2; gc++) {\n steps.push({\n operation: 'minor_gc',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Minor GC #${gc + 2}: Collecting Young Generation.`,\n codeLine: 5,\n gcType: 'minor',\n activeSurvivor,\n });\n\n const allYoung = [...eden, ...(activeSurvivor === 0 ? survivor0 : survivor1)];\n const reachable = objects.filter((o) => o.reachable && allYoung.includes(o.id));\n const toPromote = reachable.filter((o) => o.age >= PROMOTION_THRESHOLD);\n const toSurvivor = reachable.filter((o) => o.age < PROMOTION_THRESHOLD);\n\n // Promote old objects\n for (const obj of toPromote) {\n obj.generation = 'old';\n old.push(obj.id);\n }\n\n if (toPromote.length > 0) {\n steps.push({\n operation: 'promote',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Promoted ${toPromote.length} objects to Old Gen (age >= ${PROMOTION_THRESHOLD}).`,\n codeLine: 9,\n variables: { promoted: toPromote.length, threshold: PROMOTION_THRESHOLD },\n highlightObjects: toPromote.map((o) => o.id),\n activeSurvivor,\n });\n }\n\n // Move survivors\n const targetSurv = activeSurvivor === 0 ? survivor1 : survivor0;\n for (const obj of toSurvivor) {\n obj.age++;\n obj.generation = (activeSurvivor === 0 ? 'survivor1' : 'survivor0') as 'survivor0' | 'survivor1';\n if (!targetSurv.includes(obj.id)) {\n targetSurv.push(obj.id);\n }\n }\n\n // Clear\n const freedCount = allYoung.length - reachable.length;\n objects = objects.filter((o) => o.reachable || !allYoung.includes(o.id));\n eden = [];\n if (activeSurvivor === 0) {\n survivor0 = [];\n } else {\n survivor1 = [];\n }\n\n steps.push({\n operation: 'sweep',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Minor GC complete. Freed ${freedCount} objects. Survivors: ${toSurvivor.length}.`,\n codeLine: 15,\n variables: { freed: freedCount, survivors: toSurvivor.length },\n activeSurvivor: activeSurvivor === 0 ? 1 : 0,\n });\n\n activeSurvivor = activeSurvivor === 0 ? 1 : 0;\n\n // Allocate more\n if (gc < 1) {\n for (let i = 0; i < 3; i++) {\n const obj = createObject(true);\n objects.push(obj);\n eden.push(obj.id);\n }\n }\n }\n\n // Major GC\n // Make some old gen objects unreachable\n const oldObjs = objects.filter((o) => old.includes(o.id));\n if (oldObjs.length > 0) {\n oldObjs[0].reachable = false;\n }\n\n steps.push({\n operation: 'major_gc',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: 'Old Gen filling up! Triggering Major GC (Full GC).',\n codeLine: 17,\n gcType: 'major',\n activeSurvivor,\n });\n\n // Mark\n const reachableOld = objects.filter((o) => o.reachable && old.includes(o.id));\n const unreachableOld = objects.filter((o) => !o.reachable && old.includes(o.id));\n\n steps.push({\n operation: 'mark',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Major GC Mark: ${reachableOld.length} reachable, ${unreachableOld.length} unreachable in Old Gen.`,\n codeLine: 18,\n highlightObjects: [...reachableOld.map((o) => o.id), ...unreachableOld.map((o) => o.id)],\n activeSurvivor,\n });\n\n // Sweep old gen\n objects = objects.filter((o) => o.reachable || !old.includes(o.id));\n old = old.filter((id) => objects.find((o) => o.id === id && o.reachable));\n\n steps.push({\n operation: 'sweep',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `Major GC Sweep: Freed ${unreachableOld.length} objects from Old Gen.`,\n codeLine: 19,\n variables: { freed: unreachableOld.length, remaining: old.length },\n activeSurvivor,\n });\n\n // Final state\n const totalObjects = objects.length;\n steps.push({\n operation: 'done',\n objects: objects.map((o) => ({ ...o })),\n eden: [...eden],\n survivor0: [...survivor0],\n survivor1: [...survivor1],\n old: [...old],\n description: `GC Demo complete! ${totalObjects} live objects. Young Gen uses copy collector, Old Gen uses mark-sweep.`,\n codeLine: -1,\n variables: { total: totalObjects, eden: eden.length, survivors: survivor0.length + survivor1.length, old: old.length },\n activeSurvivor,\n });\n\n return steps;\n}\n\nconst GCVisualizerComponent: React.FC<GCVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'gc-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'gc', scrollToId: VISUALIZER_ID });\n\n const [showDetails, setShowDetails] = useState(true);\n const generateSteps = useMemo(() => generateGCSteps, []);\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<GCStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n objects: [],\n eden: [],\n survivor0: [],\n survivor1: [],\n old: [],\n description: '',\n };\n\n const { objects, eden, survivor0, survivor1, old, highlightObjects, description, gcType, activeSurvivor } =\n stepData;\n\n const toggleDetails = useCallback(() => {\n setShowDetails((prev) => !prev);\n }, []);\n\n const getObjectStyle = (obj: HeapObject): string => {\n const isHighlighted = highlightObjects?.includes(obj.id);\n\n if (isHighlighted && stepData.operation === 'promote') {\n return 'bg-blue-400 text-white ring-2 ring-blue-300';\n }\n if (isHighlighted && !obj.reachable) {\n return 'bg-red-400 text-white ring-2 ring-red-300';\n }\n if (isHighlighted) {\n return 'bg-yellow-400 text-gray-900 ring-2 ring-yellow-300';\n }\n if (!obj.reachable) {\n return 'bg-red-300 text-red-800';\n }\n return 'bg-green-400 text-white';\n };\n\n const renderGeneration = (\n name: string,\n ids: string[],\n color: string,\n capacity: number\n ) => {\n const genObjects = objects.filter((o) => ids.includes(o.id));\n const fillPercent = Math.min((ids.length / capacity) * 100, 100);\n\n return (\n <div className=\"mb-3\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-gray-700\">{name}</span>\n <span className=\"text-[10px] text-gray-500\">\n {ids.length}/{capacity}\n </span>\n </div>\n <div className={`h-12 ${color} rounded border border-gray-300 relative overflow-hidden`}>\n <div\n className=\"absolute inset-y-0 left-0 bg-opacity-30 bg-gray-500 transition-all duration-300\"\n style={{ width: `${fillPercent}%` }}\n />\n <div className=\"absolute inset-0 flex flex-wrap items-center gap-1 p-1\">\n {genObjects.map((obj) => (\n <div\n key={obj.id}\n className={`px-1.5 py-0.5 text-[9px] font-medium rounded transition-all duration-200 ${getObjectStyle(obj)}`}\n title={`${obj.id} (age: ${obj.age}, ${obj.reachable ? 'reachable' : 'garbage'})`}\n >\n {obj.id.replace('obj', '')}\n {showDetails && <span className=\"opacity-70\">:{obj.age}</span>}\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n };\n\n const getStatusVariant = () => {\n if (gcType === 'major') return 'error' as const;\n if (gcType === 'minor') return 'warning' as const;\n if (stepData.operation === 'done') return 'success' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-purple-50 to-pink-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">JVM Garbage Collection</h3>\n <div className=\"flex gap-2\">\n <span className=\"px-2 py-0.5 text-xs font-medium bg-purple-100 text-purple-700 rounded\">\n Generational GC\n </span>\n {gcType && (\n <span\n className={`px-2 py-0.5 text-xs font-medium rounded ${\n gcType === 'major'\n ? 'bg-red-100 text-red-700'\n : 'bg-yellow-100 text-yellow-700'\n }`}\n >\n {gcType === 'major' ? 'Major GC' : 'Minor GC'}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <button\n onClick={toggleDetails}\n className={`px-3 py-1 text-xs font-medium rounded transition-colors ${\n showDetails\n ? 'bg-purple-500 text-white'\n : 'bg-gray-200 text-gray-700'\n }`}\n >\n {showDetails ? 'Hide Ages' : 'Show Ages'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={400} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Heap Layout */}\n <div className=\"mb-4\">\n <div className=\"text-sm font-medium text-gray-700 mb-2\">\n JVM Heap Memory\n </div>\n\n {/* Young Generation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs font-semibold text-blue-700 mb-2\">\n Young Generation\n </div>\n {renderGeneration('Eden Space', eden, 'bg-blue-100', 8)}\n <div className=\"grid grid-cols-2 gap-2\">\n <div className={activeSurvivor === 0 ? 'ring-2 ring-blue-400 rounded' : ''}>\n {renderGeneration('Survivor 0 (From)', survivor0, 'bg-cyan-100', 4)}\n </div>\n <div className={activeSurvivor === 1 ? 'ring-2 ring-blue-400 rounded' : ''}>\n {renderGeneration('Survivor 1 (To)', survivor1, 'bg-cyan-100', 4)}\n </div>\n </div>\n </div>\n\n {/* Old Generation */}\n <div className=\"p-3 bg-amber-50 rounded-lg\">\n <div className=\"text-xs font-semibold text-amber-700 mb-2\">\n Old Generation (Tenured)\n </div>\n {renderGeneration('Old Space', old, 'bg-amber-100', 12)}\n </div>\n </div>\n\n {/* GC Info */}\n <div className=\"mb-4 p-3 bg-gray-50 rounded-lg\">\n <div className=\"text-xs text-gray-700 grid grid-cols-2 gap-2\">\n <div>\n <span className=\"font-semibold\">Minor GC:</span> Collects Young Gen\n </div>\n <div>\n <span className=\"font-semibold\">Major GC:</span> Collects Old Gen\n </div>\n <div>\n <span className=\"font-semibold\">Promotion:</span> age {'>='} {PROMOTION_THRESHOLD}\n </div>\n <div>\n <span className=\"font-semibold\">Algorithm:</span> Copy + Mark-Sweep\n </div>\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={GC_CODE}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"purple\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const GCVisualizer = React.memo(GCVisualizerComponent);\nexport default GCVisualizer;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport {\n CodePanel,\n HelpPanel,\n ControlPanel,\n Legend,\n StatusPanel,\n ShareButton,\n useUrlState,\n VisualizationArea,\n useVisualizerPlayback,\n} from '../shared';\n\ninterface TableRow {\n id: number;\n name: string;\n foreignKey?: number | null;\n}\n\ninterface JoinResult {\n leftRow: TableRow | null;\n rightRow: TableRow | null;\n matched: boolean;\n}\n\ntype JoinType = 'inner' | 'left' | 'right' | 'full';\n\ninterface SQLJoinStep {\n operation: 'init' | 'scan' | 'compare' | 'match' | 'no_match' | 'include_null' | 'done';\n joinType: JoinType;\n leftTable: TableRow[];\n rightTable: TableRow[];\n results: JoinResult[];\n currentLeftIndex: number;\n currentRightIndex: number;\n description: string;\n codeLine?: number;\n variables?: Record<string, string | number>;\n highlightLeft?: number;\n highlightRight?: number;\n highlightResult?: number;\n}\n\ninterface SQLJoinVisualizerProps {\n showControls?: boolean;\n showCode?: boolean;\n className?: string;\n}\n\nconst EMPLOYEES: TableRow[] = [\n { id: 1, name: 'Alice', foreignKey: 101 },\n { id: 2, name: 'Bob', foreignKey: 102 },\n { id: 3, name: 'Charlie', foreignKey: null },\n { id: 4, name: 'Diana', foreignKey: 101 },\n];\n\nconst DEPARTMENTS: TableRow[] = [\n { id: 101, name: 'Engineering' },\n { id: 102, name: 'Marketing' },\n { id: 103, name: 'Sales' },\n];\n\nconst JOIN_CODES: Record<JoinType, string[]> = {\n inner: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'INNER JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns only matching rows',\n '-- from both tables',\n '',\n 'Algorithm: Nested Loop',\n 'for each row in employees:',\n ' for each row in departments:',\n ' if e.dept_id == d.id:',\n ' emit (e, d)',\n ],\n left: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'LEFT JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns ALL rows from left',\n '-- + matching rows from right',\n '-- NULL if no match on right',\n '',\n 'for each row in employees:',\n ' matched = false',\n ' for each row in departments:',\n ' if e.dept_id == d.id:',\n ' emit (e, d); matched=true',\n ' if not matched:',\n ' emit (e, NULL)',\n ],\n right: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'RIGHT JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns ALL rows from right',\n '-- + matching rows from left',\n '-- NULL if no match on left',\n '',\n 'for each row in departments:',\n ' matched = false',\n ' for each row in employees:',\n ' if e.dept_id == d.id:',\n ' emit (e, d); matched=true',\n ' if not matched:',\n ' emit (NULL, d)',\n ],\n full: [\n 'SELECT e.name, d.name',\n 'FROM employees e',\n 'FULL OUTER JOIN departments d',\n ' ON e.dept_id = d.id',\n '',\n '-- Returns ALL rows from both',\n '-- NULL where no match exists',\n '',\n '// Step 1: LEFT JOIN logic',\n '// Step 2: Add unmatched right',\n '',\n 'Combines LEFT + RIGHT results',\n 'removing duplicates',\n ],\n};\n\nconst LEGEND_ITEMS = [\n { color: 'bg-green-400', label: 'Matched rows' },\n { color: 'bg-blue-400', label: 'Current comparison' },\n { color: 'bg-yellow-400', label: 'NULL (no match)' },\n { color: 'bg-gray-300', label: 'Not included' },\n];\n\nfunction generateJoinSteps(joinType: JoinType): SQLJoinStep[] {\n const steps: SQLJoinStep[] = [];\n const results: JoinResult[] = [];\n const leftTable = [...EMPLOYEES];\n const rightTable = [...DEPARTMENTS];\n const matchedRight = new Set<number>();\n\n // Initial state\n steps.push({\n operation: 'init',\n joinType,\n leftTable,\n rightTable,\n results: [],\n currentLeftIndex: -1,\n currentRightIndex: -1,\n description: `${joinType.toUpperCase()} JOIN: Combining employees (left) with departments (right).`,\n codeLine: 0,\n });\n\n // Process based on join type\n if (joinType === 'inner' || joinType === 'left' || joinType === 'full') {\n for (let i = 0; i < leftTable.length; i++) {\n const leftRow = leftTable[i];\n let foundMatch = false;\n\n steps.push({\n operation: 'scan',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: -1,\n description: `Scanning left table: ${leftRow.name} (dept_id: ${leftRow.foreignKey ?? 'NULL'})`,\n codeLine: joinType === 'inner' ? 9 : 9,\n variables: { employee: leftRow.name, dept_id: leftRow.foreignKey ?? 'NULL' },\n highlightLeft: i,\n });\n\n for (let j = 0; j < rightTable.length; j++) {\n const rightRow = rightTable[j];\n\n steps.push({\n operation: 'compare',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Compare: ${leftRow.foreignKey ?? 'NULL'} == ${rightRow.id}?`,\n codeLine: joinType === 'inner' ? 11 : 12,\n variables: { left_key: leftRow.foreignKey ?? 'NULL', right_key: rightRow.id },\n highlightLeft: i,\n highlightRight: j,\n });\n\n if (leftRow.foreignKey === rightRow.id) {\n foundMatch = true;\n matchedRight.add(j);\n results.push({ leftRow, rightRow, matched: true });\n\n steps.push({\n operation: 'match',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Match found! ${leftRow.name} works in ${rightRow.name}.`,\n codeLine: joinType === 'inner' ? 12 : 13,\n highlightLeft: i,\n highlightRight: j,\n highlightResult: results.length - 1,\n });\n }\n }\n\n // Handle no match for LEFT/FULL JOIN\n if (!foundMatch && (joinType === 'left' || joinType === 'full')) {\n results.push({ leftRow, rightRow: null, matched: false });\n\n steps.push({\n operation: 'include_null',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: -1,\n description: `No match for ${leftRow.name}. Include with NULL department.`,\n codeLine: 15,\n highlightLeft: i,\n highlightResult: results.length - 1,\n });\n } else if (!foundMatch && joinType === 'inner') {\n steps.push({\n operation: 'no_match',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: -1,\n description: `No match for ${leftRow.name}. Skipped (INNER JOIN).`,\n codeLine: 11,\n highlightLeft: i,\n });\n }\n }\n }\n\n // For RIGHT or FULL JOIN: add unmatched right rows\n if (joinType === 'right' || joinType === 'full') {\n for (let j = 0; j < rightTable.length; j++) {\n if (joinType === 'right' || !matchedRight.has(j)) {\n const rightRow = rightTable[j];\n let foundMatch = false;\n\n if (joinType === 'right') {\n steps.push({\n operation: 'scan',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: -1,\n currentRightIndex: j,\n description: `Scanning right table: ${rightRow.name} (id: ${rightRow.id})`,\n codeLine: 9,\n highlightRight: j,\n });\n\n for (let i = 0; i < leftTable.length; i++) {\n const leftRow = leftTable[i];\n\n steps.push({\n operation: 'compare',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Compare: ${leftRow.foreignKey ?? 'NULL'} == ${rightRow.id}?`,\n codeLine: 12,\n highlightLeft: i,\n highlightRight: j,\n });\n\n if (leftRow.foreignKey === rightRow.id) {\n foundMatch = true;\n results.push({ leftRow, rightRow, matched: true });\n\n steps.push({\n operation: 'match',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: i,\n currentRightIndex: j,\n description: `Match found! ${leftRow.name} works in ${rightRow.name}.`,\n codeLine: 13,\n highlightLeft: i,\n highlightRight: j,\n highlightResult: results.length - 1,\n });\n }\n }\n }\n\n if (!foundMatch && !matchedRight.has(j)) {\n results.push({ leftRow: null, rightRow, matched: false });\n\n steps.push({\n operation: 'include_null',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: -1,\n currentRightIndex: j,\n description: `No employee in ${rightRow.name}. Include with NULL employee.`,\n codeLine: joinType === 'right' ? 15 : 10,\n highlightRight: j,\n highlightResult: results.length - 1,\n });\n }\n }\n }\n }\n\n // Final state\n steps.push({\n operation: 'done',\n joinType,\n leftTable,\n rightTable,\n results: [...results],\n currentLeftIndex: -1,\n currentRightIndex: -1,\n description: `${joinType.toUpperCase()} JOIN complete! ${results.length} rows returned.`,\n codeLine: -1,\n variables: { total_rows: results.length },\n });\n\n return steps;\n}\n\nconst SQLJoinVisualizerComponent: React.FC<SQLJoinVisualizerProps> = ({\n showControls = true,\n showCode = true,\n className = '',\n}) => {\n const VISUALIZER_ID = 'sqljoin-visualizer';\n const { copyUrlToClipboard } = useUrlState({ prefix: 'sqljoin', scrollToId: VISUALIZER_ID });\n\n const [joinType, setJoinType] = useState<JoinType>('inner');\n\n const generateSteps = useMemo(\n () => () => generateJoinSteps(joinType),\n [joinType]\n );\n\n const {\n steps,\n currentStep,\n currentStepData,\n isPlaying,\n speed,\n setSpeed,\n handlePlayPause,\n handleStep,\n handleStepBack,\n handleReset,\n } = useVisualizerPlayback<SQLJoinStep>({\n generateSteps,\n });\n\n const stepData = currentStepData || {\n operation: 'init' as const,\n joinType: 'inner' as const,\n leftTable: EMPLOYEES,\n rightTable: DEPARTMENTS,\n results: [],\n currentLeftIndex: -1,\n currentRightIndex: -1,\n description: '',\n };\n\n const {\n leftTable,\n rightTable,\n results,\n highlightLeft,\n highlightRight,\n highlightResult,\n description,\n } = stepData;\n\n const handleJoinTypeChange = useCallback((type: JoinType) => {\n setJoinType(type);\n }, []);\n\n const getRowStyle = (index: number, isLeft: boolean): string => {\n const highlight = isLeft ? highlightLeft : highlightRight;\n if (index === highlight) {\n return 'bg-blue-400 text-white';\n }\n return 'bg-white';\n };\n\n const getResultStyle = (index: number, result: JoinResult): string => {\n if (index === highlightResult) {\n return result.matched ? 'bg-green-400 text-white' : 'bg-yellow-400 text-gray-900';\n }\n if (result.matched) {\n return 'bg-green-100';\n }\n return 'bg-yellow-100';\n };\n\n const getStatusVariant = () => {\n if (stepData.operation === 'match') return 'success' as const;\n if (stepData.operation === 'no_match') return 'error' as const;\n if (stepData.operation === 'include_null') return 'warning' as const;\n if (stepData.operation === 'done') return 'success' as const;\n return 'default' as const;\n };\n\n const handleShare = useCallback(async () => {\n return copyUrlToClipboard({ step: currentStep });\n }, [copyUrlToClipboard, currentStep]);\n\n return (\n <div\n id={VISUALIZER_ID}\n className={`bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden ${className}`}\n >\n {/* Header */}\n <div className=\"px-4 py-3 bg-gradient-to-r from-cyan-50 to-blue-50 border-b border-gray-200\">\n <div className=\"flex items-center justify-between flex-wrap gap-2\">\n <div className=\"flex items-center gap-3\">\n <h3 className=\"font-semibold text-gray-900\">SQL JOIN Operations</h3>\n <span className=\"px-2 py-0.5 text-xs font-medium bg-cyan-100 text-cyan-700 rounded\">\n {joinType.toUpperCase()} JOIN\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShareButton onShare={handleShare} />\n <div className=\"flex gap-1\">\n {(['inner', 'left', 'right', 'full'] as JoinType[]).map((type) => (\n <button\n key={type}\n onClick={() => handleJoinTypeChange(type)}\n className={`px-2 py-1 text-xs font-medium rounded transition-colors ${\n joinType === type\n ? 'bg-cyan-500 text-white'\n : 'bg-gray-200 text-gray-700 hover:bg-gray-300'\n }`}\n >\n {type.toUpperCase()}\n </button>\n ))}\n </div>\n </div>\n </div>\n </div>\n\n {/* Visualization Area */}\n <div className=\"p-4\">\n <div className={`flex gap-4 ${showCode ? 'flex-col lg:flex-row' : ''}`}>\n {/* Main Visualization */}\n <VisualizationArea minHeight={450} className={showCode ? 'flex-1' : 'w-full'}>\n {/* Tables */}\n <div className=\"grid grid-cols-2 gap-4 mb-4\">\n {/* Left Table (Employees) */}\n <div>\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">\n employees (Left)\n </div>\n <div className=\"border border-gray-300 rounded overflow-hidden\">\n <div className=\"grid grid-cols-3 bg-gray-100 text-[10px] font-semibold text-gray-600\">\n <div className=\"px-2 py-1 border-r\">id</div>\n <div className=\"px-2 py-1 border-r\">name</div>\n <div className=\"px-2 py-1\">dept_id</div>\n </div>\n {leftTable.map((row, idx) => (\n <div\n key={row.id}\n className={`grid grid-cols-3 text-[10px] border-t transition-colors ${getRowStyle(idx, true)}`}\n >\n <div className=\"px-2 py-1 border-r\">{row.id}</div>\n <div className=\"px-2 py-1 border-r\">{row.name}</div>\n <div className=\"px-2 py-1\">{row.foreignKey ?? 'NULL'}</div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Right Table (Departments) */}\n <div>\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">\n departments (Right)\n </div>\n <div className=\"border border-gray-300 rounded overflow-hidden\">\n <div className=\"grid grid-cols-2 bg-gray-100 text-[10px] font-semibold text-gray-600\">\n <div className=\"px-2 py-1 border-r\">id</div>\n <div className=\"px-2 py-1\">name</div>\n </div>\n {rightTable.map((row, idx) => (\n <div\n key={row.id}\n className={`grid grid-cols-2 text-[10px] border-t transition-colors ${getRowStyle(idx, false)}`}\n >\n <div className=\"px-2 py-1 border-r\">{row.id}</div>\n <div className=\"px-2 py-1\">{row.name}</div>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Result Table */}\n <div className=\"mb-4\">\n <div className=\"text-xs font-semibold text-gray-700 mb-2\">\n Result ({results.length} rows)\n </div>\n <div className=\"border border-gray-300 rounded overflow-hidden max-h-40 overflow-y-auto\">\n <div className=\"grid grid-cols-2 bg-gray-100 text-[10px] font-semibold text-gray-600 sticky top-0\">\n <div className=\"px-2 py-1 border-r\">e.name</div>\n <div className=\"px-2 py-1\">d.name</div>\n </div>\n {results.length > 0 ? (\n results.map((result, idx) => (\n <div\n key={idx}\n className={`grid grid-cols-2 text-[10px] border-t transition-colors ${getResultStyle(idx, result)}`}\n >\n <div className=\"px-2 py-1 border-r\">\n {result.leftRow?.name ?? <span className=\"text-gray-400\">NULL</span>}\n </div>\n <div className=\"px-2 py-1\">\n {result.rightRow?.name ?? <span className=\"text-gray-400\">NULL</span>}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-[10px] text-gray-400 text-center py-2\">\n No results yet\n </div>\n )}\n </div>\n </div>\n\n {/* Join Type Explanation */}\n <div className=\"mb-4 p-3 bg-blue-50 rounded-lg\">\n <div className=\"text-xs text-blue-700\">\n <strong>{joinType.toUpperCase()} JOIN:</strong>\n {joinType === 'inner' && ' Returns only rows with matches in BOTH tables.'}\n {joinType === 'left' && ' Returns ALL rows from left + matching rows from right (NULL if no match).'}\n {joinType === 'right' && ' Returns ALL rows from right + matching rows from left (NULL if no match).'}\n {joinType === 'full' && ' Returns ALL rows from BOTH tables (NULL where no match exists).'}\n </div>\n </div>\n\n {/* Status */}\n <StatusPanel\n description={description}\n currentStep={currentStep}\n totalSteps={steps.length}\n variant={getStatusVariant()}\n />\n </VisualizationArea>\n\n {/* Code Panel */}\n {showCode && (\n <div className=\"w-full lg:w-64 flex-shrink-0 space-y-2\">\n <CodePanel\n code={JOIN_CODES[joinType]}\n activeLine={currentStepData?.codeLine ?? -1}\n variables={currentStepData?.variables}\n />\n <HelpPanel />\n </div>\n )}\n </div>\n </div>\n\n {/* Controls */}\n {showControls && (\n <div className=\"px-4 py-3 bg-gray-50 border-t border-gray-200\">\n <ControlPanel\n isPlaying={isPlaying}\n currentStep={currentStep}\n totalSteps={steps.length}\n speed={speed}\n onPlayPause={handlePlayPause}\n onStep={handleStep}\n onStepBack={handleStepBack}\n onReset={handleReset}\n onSpeedChange={setSpeed}\n accentColor=\"cyan\"\n />\n <Legend items={LEGEND_ITEMS} />\n </div>\n )}\n </div>\n );\n};\n\nexport const SQLJoinVisualizer = React.memo(SQLJoinVisualizerComponent);\nexport default SQLJoinVisualizer;\n"],"names":["Code2","ACCENT_COLORS","Edit2","ALGORITHM_NAMES","ALGORITHM_COMPLEXITIES","LEGEND_ITEMS","generateBubbleSortSteps","generateSelectionSortSteps","generateInsertionSortSteps","generateQuickSortSteps","generateMergeSortSteps","STEP_GENERATORS","generateRandomArray","generateGraph","BUCKET_COUNT","OPERATIONS","simpleHash","INITIAL_CAPACITY"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]}
|